Update compiler API test for assertions configuration with handler

Bug: 209445989
Change-Id: Ic7c27cc746ad6bc4c97ec7466f50000043ba9883
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java
index 100567d..33aab91 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java
@@ -6,6 +6,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.compilerapi.mockdata.MockClass;
+import com.android.tools.r8.compilerapi.mockdata.MockClassWithAssertion;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -70,6 +71,10 @@
     return MockClass.class;
   }
 
+  public Class<?> getMockClassWithAssertion() {
+    return MockClassWithAssertion.class;
+  }
+
   public Path getJava8RuntimeJar() {
     return Paths.get("third_party", "openjdk", "openjdk-rt-1.8", "rt.jar");
   }
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
index 38b2889..24e1de1 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
@@ -8,8 +8,10 @@
 import static com.android.tools.r8.ToolHelper.isTestingR8Lib;
 
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.compilerapi.assertionconfiguration.AssertionConfigurationTest;
 import com.android.tools.r8.compilerapi.mapid.CustomMapIdTest;
 import com.android.tools.r8.compilerapi.mockdata.MockClass;
+import com.android.tools.r8.compilerapi.mockdata.MockClassWithAssertion;
 import com.android.tools.r8.compilerapi.sourcefile.CustomSourceFileTest;
 import com.android.tools.r8.compilerapi.testsetup.ApiTestingSetUpTest;
 import com.google.common.collect.ImmutableList;
@@ -32,7 +34,7 @@
           CustomSourceFileTest.ApiTest.class);
 
   private static final List<Class<? extends CompilerApiTest>> CLASSES_PENDING_BINARY_COMPATIBILITY =
-      ImmutableList.of();
+      ImmutableList.of(AssertionConfigurationTest.ApiTest.class);
 
   private final TemporaryFolder temp;
 
@@ -57,7 +59,7 @@
 
   @Override
   public List<Class<?>> getAdditionalClassesForTests() {
-    return ImmutableList.of(CompilerApiTest.class, MockClass.class);
+    return ImmutableList.of(CompilerApiTest.class, MockClass.class, MockClassWithAssertion.class);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/compilerapi/assertionconfiguration/AssertionConfigurationTest.java b/src/test/java/com/android/tools/r8/compilerapi/assertionconfiguration/AssertionConfigurationTest.java
new file mode 100644
index 0000000..bc6a6ab
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compilerapi/assertionconfiguration/AssertionConfigurationTest.java
@@ -0,0 +1,125 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.compilerapi.assertionconfiguration;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import com.android.tools.r8.D8;
+import com.android.tools.r8.D8Command;
+import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.ProgramConsumer;
+import com.android.tools.r8.R8;
+import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.compilerapi.CompilerApiTest;
+import com.android.tools.r8.compilerapi.CompilerApiTestRunner;
+import com.android.tools.r8.compilerapi.mockdata.MockClassWithAssertion;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.utils.ThrowingBiConsumer;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import java.nio.file.Path;
+import org.junit.Test;
+
+public class AssertionConfigurationTest extends CompilerApiTestRunner {
+
+  static MethodReference assertionHandler =
+      Reference.methodFromDescriptor(
+          "Lcom/example/SomeClass;", "assertionHandler", "(Ljava/lang/AssertionError;)V");
+
+  public AssertionConfigurationTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  public Class<? extends CompilerApiTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    ApiTest test = new ApiTest(ApiTest.PARAMETERS);
+    assertEquals(assertionHandler, ApiTest.assertionHandler);
+    runTest(test::runD8);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    ApiTest test = new ApiTest(ApiTest.PARAMETERS);
+    runTest(test::runR8);
+  }
+
+  private boolean invokesAssertionHandler(InstructionSubject instruction) {
+    return instruction.isInvokeStatic()
+        && ((InvokeInstructionSubject) instruction)
+            .invokedMethod()
+            .asMethodReference()
+            .equals(assertionHandler);
+  }
+
+  private void runTest(ThrowingBiConsumer<ProgramConsumer, MethodReference, Exception> test)
+      throws Exception {
+    Path output = temp.newFolder().toPath().resolve("out.jar");
+    test.accept(new DexIndexedConsumer.ArchiveConsumer(output), assertionHandler);
+
+    // TODO(b/209445989): This should be true when the assertion handler support is implemented.
+    assertFalse(
+        new CodeInspector(output)
+            .clazz(MockClassWithAssertion.class)
+            .uniqueMethodWithName("main")
+            .streamInstructions()
+            .anyMatch(this::invokesAssertionHandler));
+  }
+
+  public static class ApiTest extends CompilerApiTest {
+
+    static MethodReference assertionHandler =
+        Reference.methodFromDescriptor(
+            "Lcom/example/SomeClass;", "assertionHandler", "(Ljava/lang/AssertionError;)V");
+
+    public ApiTest(Object parameters) {
+      super(parameters);
+    }
+
+    public void runD8(ProgramConsumer programConsumer, MethodReference assertionHandler)
+        throws Exception {
+      D8.run(
+          D8Command.builder()
+              .addClassProgramData(getBytesForClass(getMockClassWithAssertion()), Origin.unknown())
+              .addLibraryFiles(getJava8RuntimeJar())
+              .addAssertionsConfiguration(
+                  builder -> builder.setAssertionHandler(assertionHandler).setScopeAll().build())
+              .setProgramConsumer(programConsumer)
+              .build());
+    }
+
+    public void runR8(ProgramConsumer programConsumer, MethodReference assertionHandler)
+        throws Exception {
+      R8.run(
+          R8Command.builder()
+              .addClassProgramData(getBytesForClass(getMockClassWithAssertion()), Origin.unknown())
+              .addProguardConfiguration(
+                  getKeepMainRules(getMockClassWithAssertion()), Origin.unknown())
+              .addLibraryFiles(getJava8RuntimeJar())
+              .addAssertionsConfiguration(
+                  builder -> builder.setAssertionHandler(assertionHandler).setScopeAll().build())
+              .setProgramConsumer(programConsumer)
+              .build());
+    }
+
+    @Test
+    public void testD8() throws Exception {
+      runD8(DexIndexedConsumer.emptyConsumer(), assertionHandler);
+    }
+
+    @Test
+    public void testR8() throws Exception {
+      runR8(DexIndexedConsumer.emptyConsumer(), assertionHandler);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/compilerapi/mockdata/MockClassWithAssertion.java b/src/test/java/com/android/tools/r8/compilerapi/mockdata/MockClassWithAssertion.java
new file mode 100644
index 0000000..df42fbd
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compilerapi/mockdata/MockClassWithAssertion.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.compilerapi.mockdata;
+
+// Class to use as data for the compilation.
+public class MockClassWithAssertion {
+
+  public static void main(String[] args) {
+    assert false;
+  }
+}
diff --git a/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1 b/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
index 2eb184c..1ed1587 100644
--- a/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
+++ b/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
@@ -1 +1 @@
-d321d4da9002b8d9a59c45f3f3ba9506592d91f9
\ No newline at end of file
+572f60a32e9fa5971f4e36db2a9d87c30fb5e88d
\ No newline at end of file