Update library-extends-program test for P+ android.jar
Bug: 142399427
Change-Id: I063f16cdea6db8f8ace3da0e159ad75d2e5bdd51
diff --git a/src/test/java/com/android/tools/r8/classlookup/LibraryClassExtendsProgramClassTest.java b/src/test/java/com/android/tools/r8/classlookup/LibraryClassExtendsProgramClassTest.java
index 231f2c1..5cbb40d 100644
--- a/src/test/java/com/android/tools/r8/classlookup/LibraryClassExtendsProgramClassTest.java
+++ b/src/test/java/com/android/tools/r8/classlookup/LibraryClassExtendsProgramClassTest.java
@@ -5,21 +5,25 @@
package com.android.tools.r8.classlookup;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.R8FullTestBuilder;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.jasmin.JasminBuilder;
+import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSet.Builder;
import java.util.List;
+import java.util.Set;
+import org.hamcrest.CoreMatchers;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -37,6 +41,13 @@
@RunWith(Parameterized.class)
public class LibraryClassExtendsProgramClassTest extends TestBase {
+ private static String[] libraryClassesExtendingTestCase =
+ new String[] {
+ "android.test.InstrumentationTestCase",
+ "android.test.AndroidTestCase",
+ "android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests"
+ };
+
private static List<byte[]> junitClasses;
@BeforeClass
@@ -57,8 +68,15 @@
this.parameters = parameters;
}
+ // The default library in the test runner is chosen to be the first one with at least the API
+ // level. The junit testing framework was removed in P.
+ private boolean libraryContainsJUnit() {
+ return parameters.isDexRuntime()
+ && parameters.getApiLevel().getLevel() < AndroidApiLevel.P.getLevel();
+ }
+
private void checkClassesInResult(CodeInspector inspector) {
- if (parameters.isDexRuntime()) {
+ if (libraryContainsJUnit()) {
noClassesInResult(inspector);
} else {
testCaseClassInResult(inspector);
@@ -76,9 +94,21 @@
assertThat(inspector.clazz(TestClass.class), isPresent());
}
+ private void checkDiagnostics(List<Diagnostic> diagnostics) {
+ Builder<String> builder = ImmutableSet.builder();
+ for (String libraryClass : libraryClassesExtendingTestCase) {
+ builder.add(
+ "Library class " + libraryClass + " extends program class junit.framework.TestCase");
+ }
+ Set<String> expected = builder.build();
+ for (Diagnostic diagnostic : diagnostics) {
+ assertThat(expected, CoreMatchers.hasItem(diagnostic.getDiagnosticMessage()));
+ }
+ assertEquals(expected.size(), diagnostics.size());
+ }
+
@Test
public void testFullMode() throws Exception {
- assumeFalse(parameters.getApiLevel().getLevel() == 28);
testForR8(parameters.getBackend())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(TestClass.class)
@@ -93,7 +123,6 @@
@Test
public void testCompatibilityMode() throws Exception {
- assumeFalse(parameters.getApiLevel().getLevel() == 28);
testForR8Compat(parameters.getBackend())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(TestClass.class)
@@ -119,56 +148,52 @@
}
@Test
- public void testFullModeError() {
- assumeFalse(parameters.getApiLevel().getLevel() == 28);
- assumeTrue("Only run for Dex backend", parameters.isDexRuntime());
+ public void testFullModeError() throws Exception {
+ R8FullTestBuilder builder =
+ testForR8(parameters.getBackend())
+ .setMinApi(parameters.getApiLevel())
+ .addProgramClasses(TestClass.class)
+ .addProgramClassFileData(junitClasses)
+ .addKeepAllClassesRule()
+ .addOptionsModification(options -> options.lookupLibraryBeforeProgram = false);
+ if (!libraryContainsJUnit()) {
+ builder.compile().inspect(this::testCaseClassInResult).assertNoMessages();
+ return;
+ }
try {
- testForR8(parameters.getBackend())
- .setMinApi(parameters.getApiLevel())
- .addProgramClasses(TestClass.class)
- .addProgramClassFileData(junitClasses)
- .addKeepAllClassesRule()
- .addOptionsModification(options -> options.lookupLibraryBeforeProgram = false)
- .compile();
- fail("Succeeded in full mode");
+ builder.compileWithExpectedDiagnostics(
+ diagnostics -> {
+ diagnostics.assertOnlyErrors();
+ checkDiagnostics(diagnostics.getErrors());
+ });
+ fail("Expected compilation failure");
} catch (CompilationFailedException e) {
- // Ignore.
+ // Expected exception.
}
}
@Test
public void testCompatibilityModeWarning() throws Exception {
- assumeFalse(parameters.getApiLevel().getLevel() == 28);
- assumeTrue("Only run for Dex backend", parameters.isDexRuntime());
- R8TestCompileResult result =
- testForR8Compat(parameters.getBackend())
- .setMinApi(parameters.getApiLevel())
- .addProgramClasses(TestClass.class)
- .addProgramClassFileData(junitClasses)
- .addKeepAllClassesRule()
- .addOptionsModification(options -> options.lookupLibraryBeforeProgram = false)
- .compile()
- .assertOnlyWarnings();
-
- String[] libraryClassesExtendingTestCase = new String[]{
- "android.test.InstrumentationTestCase",
- "android.test.AndroidTestCase",
- "android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests"
- };
-
- result.getDiagnosticMessages().assertWarningsCount(libraryClassesExtendingTestCase.length);
-
- for (String name : libraryClassesExtendingTestCase) {
- result
- .assertWarningMessageThatMatches(
- containsString(
- "Library class " + name + " extends program class junit.framework.TestCase"));
- }
+ testForR8Compat(parameters.getBackend())
+ .setMinApi(parameters.getApiLevel())
+ .addProgramClasses(TestClass.class)
+ .addProgramClassFileData(junitClasses)
+ .addKeepAllClassesRule()
+ .addOptionsModification(options -> options.lookupLibraryBeforeProgram = false)
+ .compileWithExpectedDiagnostics(
+ diagnostics -> {
+ if (libraryContainsJUnit()) {
+ diagnostics.assertOnlyWarnings();
+ checkDiagnostics(diagnostics.getWarnings());
+ } else {
+ diagnostics.assertNoMessages();
+ }
+ })
+ .inspect(this::testCaseClassInResult);
}
@Test
public void testWithDontWarn() throws Exception {
- assumeTrue("Only run for Dex backend", parameters.isDexRuntime());
testForR8(parameters.getBackend())
.setMinApi(parameters.getApiLevel())
.addProgramClassFileData(junitClasses)