Migrate MissingInterfaceTest and also check for missing iface type
Bug: 167145686
Change-Id: I6e9a01d6c128b6cb395e4148f9ff5e3e8575ef63
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
index 3387ff2..e88d379 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
@@ -233,7 +233,7 @@
}
public boolean verifyAllocatedTypesAreLive(
- Set<DexType> liveTypes, DexDefinitionSupplier definitions) {
+ Set<DexType> liveTypes, Set<DexType> missingTypes, DexDefinitionSupplier definitions) {
for (DexProgramClass clazz : classesWithAllocationSiteTracking.keySet()) {
assert liveTypes.contains(clazz.getType());
}
@@ -244,7 +244,9 @@
assert liveTypes.contains(iface.getType());
}
for (DexType iface : instantiatedLambdas.keySet()) {
- assert definitions.definitionFor(iface).isNotProgramClass() || liveTypes.contains(iface);
+ assert missingTypes.contains(iface)
+ || definitions.definitionFor(iface).isNotProgramClass()
+ || liveTypes.contains(iface);
}
return true;
}
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 9061db8..632c74c 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -361,7 +361,8 @@
private void verify() {
assert keepInfo.verifyPinnedTypesAreLive(liveTypes);
- assert objectAllocationInfoCollection.verifyAllocatedTypesAreLive(liveTypes, this);
+ assert objectAllocationInfoCollection.verifyAllocatedTypesAreLive(
+ liveTypes, missingTypes, this);
}
private static KeepInfoCollection extendPinnedItems(
diff --git a/src/test/java/com/android/tools/r8/shaking/MissingInterfaceTest.java b/src/test/java/com/android/tools/r8/shaking/MissingInterfaceTest.java
index 3da5958..7254ee6 100644
--- a/src/test/java/com/android/tools/r8/shaking/MissingInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/MissingInterfaceTest.java
@@ -4,115 +4,97 @@
package com.android.tools.r8.shaking;
import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8Command;
import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApp;
import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
-import java.util.List;
-import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
-interface GoingToBeMissed {
- void onSomeEvent(long soLong);
-}
-
-class TestClassForB112849320 {
- GoingToBeMissed instance;
- void foo(GoingToBeMissed instance) {
- System.out.println("B112849320");
- this.instance = instance;
- }
-
- void bar() {
- instance.onSomeEvent(8L);
- }
-
- public static void main(String[] args) {
- TestClassForB112849320 self = new TestClassForB112849320();
- self.foo(l -> {
- if (l > 0) {
- System.out.println(l);
- }
- });
- self.bar();
- }
-}
-
+@RunWith(Parameterized.class)
public class MissingInterfaceTest extends TestBase {
- private static String MAIN_NAME = TestClassForB112849320.class.getCanonicalName();
- private Path libJar;
- private Path libDex;
- @Before
- public void setUp() throws Exception {
- libJar = writeToJar(ImmutableList.of(ToolHelper.getClassAsBytes(GoingToBeMissed.class)));
- libDex = temp.getRoot().toPath().resolve("lib.zip");
- AndroidApp libApp = ToolHelper.runD8(readClasses(GoingToBeMissed.class));
- libApp.writeToZip(libDex, OutputMode.DexIndexed);
+ private final TestParameters parameters;
+ private final String[] EXPECTED = new String[] {"B112849320", "8"};
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ public MissingInterfaceTest(TestParameters parameters) {
+ this.parameters = parameters;
}
@Test
public void test_missingInterface() throws Exception {
- List<String> config = ImmutableList.of(
- "-printmapping",
- "-keep class " + MAIN_NAME + " {",
- " public static void main(...);",
- "}"
- );
- R8Command.Builder builder = R8Command.builder();
- builder.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClassForB112849320.class));
- builder.addLibraryFiles(ToolHelper.getDefaultAndroidJar());
- builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
- builder.setMinApiLevel(ToolHelper.getMinApiLevelForDexVm().getLevel());
- builder.addProguardConfiguration(config, Origin.unknown());
- AndroidApp processedApp = ToolHelper.runR8(builder.build(), options -> {
- options.enableInlining = false;
- });
-
- Path outDex = temp.getRoot().toPath().resolve("dex.zip");
- processedApp.writeToZip(outDex, OutputMode.DexIndexed);
- ProcessResult artResult = ToolHelper.runArtRaw(
- ImmutableList.of(outDex.toString(), libDex.toString()), MAIN_NAME, null);
- assertNotEquals(0, artResult.exitCode);
- assertThat(artResult.stdout, containsString("B112849320"));
- assertNotEquals(-1, artResult.stderr.indexOf("AbstractMethodError"));
+ testForR8(parameters.getBackend())
+ .addProgramClasses(TestClassForB112849320.class)
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(TestClassForB112849320.class)
+ .addOptionsModification(options -> options.enableInlining = false)
+ .allowDiagnosticWarningMessages(
+ parameters.isCfRuntime() || !parameters.canUseDefaultAndStaticInterfaceMethods())
+ .compile()
+ .addRunClasspathFiles(
+ buildOnDexRuntime(
+ parameters,
+ writeToJar(ImmutableList.of(ToolHelper.getClassAsBytes(GoingToBeMissed.class)))))
+ .run(parameters.getRuntime(), TestClassForB112849320.class)
+ .forCfRuntime(r -> r.assertSuccessWithOutputLines(EXPECTED))
+ .otherwise(
+ r -> {
+ r.assertStdoutMatches(containsString("B112849320"));
+ r.assertFailureWithErrorThatThrows(AbstractMethodError.class);
+ });
}
+
@Test
public void test_passingInterfaceAsLib() throws Exception {
- List<String> config = ImmutableList.of(
- "-printmapping",
- "-keep class " + MAIN_NAME + " {",
- " public static void main(...);",
- "}"
- );
- R8Command.Builder builder = R8Command.builder();
- builder.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClassForB112849320.class));
- builder.addLibraryFiles(ToolHelper.getDefaultAndroidJar(), libJar);
- builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
- builder.setMinApiLevel(ToolHelper.getMinApiLevelForDexVm().getLevel());
- builder.addProguardConfiguration(config, Origin.unknown());
- AndroidApp processedApp = ToolHelper.runR8(builder.build(), options -> {
- options.enableInlining = false;
- });
-
- Path outDex = temp.getRoot().toPath().resolve("dex.zip");
- processedApp.writeToZip(outDex, OutputMode.DexIndexed);
- ProcessResult artResult = ToolHelper.runArtRaw(
- ImmutableList.of(outDex.toString(), libDex.toString()), MAIN_NAME, null);
- assertEquals(0, artResult.exitCode);
- assertThat(artResult.stdout, containsString("B112849320"));
- assertEquals(-1, artResult.stderr.indexOf("AbstractMethodError"));
+ Path lib = writeToJar(ImmutableList.of(ToolHelper.getClassAsBytes(GoingToBeMissed.class)));
+ testForR8(parameters.getBackend())
+ .addProgramClasses(TestClassForB112849320.class)
+ .addLibraryFiles(lib)
+ .addDefaultRuntimeLibrary(parameters)
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(TestClassForB112849320.class)
+ .addOptionsModification(options -> options.enableInlining = false)
+ .addRunClasspathFiles(buildOnDexRuntime(parameters, lib))
+ .run(parameters.getRuntime(), TestClassForB112849320.class)
+ .assertSuccessWithOutputLines(EXPECTED);
}
+ interface GoingToBeMissed {
+ void onSomeEvent(long soLong);
+ }
+
+ public static class TestClassForB112849320 {
+ GoingToBeMissed instance;
+
+ void foo(GoingToBeMissed instance) {
+ System.out.println("B112849320");
+ this.instance = instance;
+ }
+
+ void bar() {
+ instance.onSomeEvent(8L);
+ }
+
+ public static void main(String[] args) {
+ TestClassForB112849320 self = new TestClassForB112849320();
+ self.foo(
+ l -> {
+ if (l > 0) {
+ System.out.println(l);
+ }
+ });
+ self.bar();
+ }
+ }
}