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