Migrate legacy tests using AsmTestBase::ensureException.
Bug: 167145686
Bug: 167535447
Bug: 69835274
Change-Id: Iaf9fdaf4117dbd2b31f95a049b7039fb88c3d9eb
diff --git a/src/test/java/com/android/tools/r8/AsmTestBase.java b/src/test/java/com/android/tools/r8/AsmTestBase.java
index 6195ea0..4a24331 100644
--- a/src/test/java/com/android/tools/r8/AsmTestBase.java
+++ b/src/test/java/com/android/tools/r8/AsmTestBase.java
@@ -21,18 +21,6 @@
public class AsmTestBase extends TestBase {
- protected void ensureException(String main, Class<? extends Throwable> exceptionClass,
- byte[]... classes) throws Exception {
- ensureExceptionThrown(runOnJavaRaw(main, classes), exceptionClass);
- AndroidApp app = buildAndroidApp(classes);
- ensureExceptionThrown(runOnArtRaw(compileWithD8(app), main), exceptionClass);
- ensureExceptionThrown(runOnArtRaw(compileWithR8(app), main), exceptionClass);
- ensureExceptionThrown(
- runOnArtRaw(compileWithR8(app, keepMainProguardConfiguration(main) + "-dontobfuscate\n"),
- main),
- exceptionClass);
- }
-
protected void ensureSameOutput(String main, AndroidApiLevel apiLevel, byte[]... classes)
throws Exception {
ensureSameOutput(main, apiLevel, Collections.emptyList(), classes);
diff --git a/src/test/java/com/android/tools/r8/desugar/staticinterfacemethod/MissingMethodTest.java b/src/test/java/com/android/tools/r8/desugar/staticinterfacemethod/MissingMethodTest.java
index 4106cd58..f147d3b 100644
--- a/src/test/java/com/android/tools/r8/desugar/staticinterfacemethod/MissingMethodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/staticinterfacemethod/MissingMethodTest.java
@@ -3,15 +3,58 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.desugar.staticinterfacemethod;
-import com.android.tools.r8.AsmTestBase;
-import org.junit.Ignore;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRunResult;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
-public class MissingMethodTest extends AsmTestBase {
+@RunWith(Parameterized.class)
+public class MissingMethodTest extends TestBase {
- @Ignore("b/69835274")
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ private final TestParameters parameters;
+
+ public MissingMethodTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
@Test
- public void testDesugarInvokeMissingMethod() throws Exception {
- ensureException("Main", NoSuchMethodError.class, InterfaceDump.dump(), MainDump.dump());
+ public void testReference() throws Exception {
+ TestRunResult<?> result =
+ testForRuntime(parameters)
+ .addProgramClassFileData(InterfaceDump.dump(), MainDump.dump())
+ .run(parameters.getRuntime(), "Main");
+ if (parameters.isDexRuntime()
+ && parameters.getApiLevel().isLessThan(apiLevelWithStaticInterfaceMethodsSupport())) {
+ // TODO(b/69835274): Desugaring should preserve exception.
+ result.assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
+ } else {
+ result.assertFailureWithErrorThatThrows(NoSuchMethodError.class);
+ }
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ TestRunResult<?> result =
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(InterfaceDump.dump(), MainDump.dump())
+ .addKeepMainRule("Main")
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), "Main");
+ if (parameters.isDexRuntime()
+ && parameters.getApiLevel().isLessThan(apiLevelWithStaticInterfaceMethodsSupport())) {
+ // TODO(b/69835274): Desugaring should preserve exception.
+ result.assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
+ } else {
+ result.assertFailureWithErrorThatThrows(NoSuchMethodError.class);
+ }
}
}
diff --git a/src/test/java/com/android/tools/r8/resolution/AsmBasedTests.java b/src/test/java/com/android/tools/r8/resolution/AsmBasedTests.java
deleted file mode 100644
index 7264dd7..0000000
--- a/src/test/java/com/android/tools/r8/resolution/AsmBasedTests.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2017, 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.resolution;
-
-import com.android.tools.r8.AsmTestBase;
-import com.android.tools.r8.resolution.shadowing1.AClassDump;
-import com.android.tools.r8.resolution.shadowing1.InterfaceDump;
-import com.android.tools.r8.resolution.shadowing1.MainDump;
-import com.android.tools.r8.resolution.shadowing1.SubInterfaceDump;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class AsmBasedTests extends AsmTestBase {
-
- @Test
- @Ignore("b/69356146")
- public void defaultMethodShadowedByStatic() throws Exception {
- ensureException("Main", IncompatibleClassChangeError.class,
- InterfaceDump.dump(),
- SubInterfaceDump.dump(),
- AClassDump.dump(),
- MainDump.dump());
- }
-
- @Test
- @Ignore("b/69356146")
- public void invokeDefaultMethodViaStatic() throws Exception {
- ensureException("Main", IncompatibleClassChangeError.class,
- com.android.tools.r8.resolution.invokestaticinterfacedefault.InterfaceDump.dump(),
- com.android.tools.r8.resolution.invokestaticinterfacedefault.MainDump.dump());
-
- }
-}
diff --git a/src/test/java/com/android/tools/r8/resolution/DefaultMethodShadowedByStaticTest.java b/src/test/java/com/android/tools/r8/resolution/DefaultMethodShadowedByStaticTest.java
new file mode 100644
index 0000000..19424d8
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/resolution/DefaultMethodShadowedByStaticTest.java
@@ -0,0 +1,69 @@
+// Copyright (c) 2017, 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.resolution;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRunResult;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.resolution.shadowing1.AClassDump;
+import com.android.tools.r8.resolution.shadowing1.InterfaceDump;
+import com.android.tools.r8.resolution.shadowing1.MainDump;
+import com.android.tools.r8.resolution.shadowing1.SubInterfaceDump;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class DefaultMethodShadowedByStaticTest extends TestBase {
+
+ private final List<byte[]> CLASSES =
+ ImmutableList.of(
+ InterfaceDump.dump(), SubInterfaceDump.dump(), AClassDump.dump(), MainDump.dump());
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ private final TestParameters parameters;
+
+ public DefaultMethodShadowedByStaticTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testReference() throws Exception {
+ TestRunResult<?> result =
+ testForRuntime(parameters)
+ .addProgramClassFileData(CLASSES)
+ .run(parameters.getRuntime(), "Main");
+ if (parameters.isDexRuntime()
+ && (parameters.getApiLevel().isLessThan(apiLevelWithStaticInterfaceMethodsSupport())
+ || parameters.getDexRuntimeVersion().equals(Version.V7_0_0))) {
+ // TODO(b/167535447): Desugaring should preserve the error.
+ result.assertSuccessWithOutputLines("42");
+ } else if (parameters.isDexRuntime()
+ && parameters.getDexRuntimeVersion().equals(Version.V7_0_0)) {
+ // Note: VM 7.0.0 without desugaring of defaults will incorrectly allow the virtual dispatch.
+ result.assertSuccessWithOutputLines("42");
+ } else {
+ result.assertFailureWithErrorThatThrows(IncompatibleClassChangeError.class);
+ }
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(CLASSES)
+ .addKeepMainRule("Main")
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), "Main")
+ .assertFailureWithErrorThatThrows(IncompatibleClassChangeError.class);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/resolution/InvokeDefaultMethodViaStaticTest.java b/src/test/java/com/android/tools/r8/resolution/InvokeDefaultMethodViaStaticTest.java
new file mode 100644
index 0000000..2080b42
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/resolution/InvokeDefaultMethodViaStaticTest.java
@@ -0,0 +1,68 @@
+// Copyright (c) 2017, 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.resolution;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRunResult;
+import com.android.tools.r8.resolution.invokestaticinterfacedefault.InterfaceDump;
+import com.android.tools.r8.resolution.invokestaticinterfacedefault.MainDump;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class InvokeDefaultMethodViaStaticTest extends TestBase {
+
+ private static final List<byte[]> CLASSES =
+ ImmutableList.of(InterfaceDump.dump(), MainDump.dump());
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ private final TestParameters parameters;
+
+ public InvokeDefaultMethodViaStaticTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testReference() throws Exception {
+ TestRunResult<?> result =
+ testForRuntime(parameters)
+ .addProgramClassFileData(CLASSES)
+ .run(parameters.getRuntime(), "Main");
+ if (parameters.isDexRuntime()
+ && parameters.getApiLevel().isLessThan(apiLevelWithDefaultInterfaceMethodsSupport())) {
+ // TODO(b/167535447): Desugaring should preserve the error.
+ result.assertFailureWithErrorThatThrows(NoSuchMethodError.class);
+ } else {
+ result.assertFailureWithErrorThatThrows(IncompatibleClassChangeError.class);
+ }
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ TestRunResult<?> result =
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(CLASSES)
+ .addKeepMainRule("Main")
+ .setMinApi(parameters.getApiLevel())
+ .addOptionsModification(o -> o.testing.allowInvokeErrors = true)
+ .run(parameters.getRuntime(), "Main");
+ if (parameters.isDexRuntime()
+ && parameters.getApiLevel().isLessThan(apiLevelWithDefaultInterfaceMethodsSupport())) {
+ // TODO(b/167535447): Desugaring should preserve the error.
+ result.assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
+ } else {
+ result.assertFailureWithErrorThatThrows(IncompatibleClassChangeError.class);
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/resolution/invokestaticinterfacedefault/InterfaceDump.java b/src/test/java/com/android/tools/r8/resolution/invokestaticinterfacedefault/InterfaceDump.java
index 56d67aa..37a6f2b 100644
--- a/src/test/java/com/android/tools/r8/resolution/invokestaticinterfacedefault/InterfaceDump.java
+++ b/src/test/java/com/android/tools/r8/resolution/invokestaticinterfacedefault/InterfaceDump.java
@@ -22,7 +22,7 @@
*/
public class InterfaceDump implements Opcodes {
- public static byte[] dump() throws Exception {
+ public static byte[] dump() {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
diff --git a/src/test/java/com/android/tools/r8/resolution/invokestaticinterfacedefault/MainDump.java b/src/test/java/com/android/tools/r8/resolution/invokestaticinterfacedefault/MainDump.java
index 15f12b9..0de68a4 100644
--- a/src/test/java/com/android/tools/r8/resolution/invokestaticinterfacedefault/MainDump.java
+++ b/src/test/java/com/android/tools/r8/resolution/invokestaticinterfacedefault/MainDump.java
@@ -14,7 +14,7 @@
*/
public class MainDump implements Opcodes {
- public static byte[] dump() throws Exception {
+ public static byte[] dump() {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
diff --git a/src/test/java/com/android/tools/r8/resolution/shadowing1/AClassDump.java b/src/test/java/com/android/tools/r8/resolution/shadowing1/AClassDump.java
index 9701db0..7f1be60 100644
--- a/src/test/java/com/android/tools/r8/resolution/shadowing1/AClassDump.java
+++ b/src/test/java/com/android/tools/r8/resolution/shadowing1/AClassDump.java
@@ -19,7 +19,7 @@
*/
public class AClassDump implements Opcodes {
- public static byte[] dump() throws Exception {
+ public static byte[] dump() {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
diff --git a/src/test/java/com/android/tools/r8/resolution/shadowing1/InterfaceDump.java b/src/test/java/com/android/tools/r8/resolution/shadowing1/InterfaceDump.java
index 603071a..cc8b019 100644
--- a/src/test/java/com/android/tools/r8/resolution/shadowing1/InterfaceDump.java
+++ b/src/test/java/com/android/tools/r8/resolution/shadowing1/InterfaceDump.java
@@ -11,7 +11,7 @@
public class InterfaceDump implements Opcodes {
- public static byte[] dump() throws Exception {
+ public static byte[] dump() {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
diff --git a/src/test/java/com/android/tools/r8/resolution/shadowing1/MainDump.java b/src/test/java/com/android/tools/r8/resolution/shadowing1/MainDump.java
index 09bd3b2..b21c15f 100644
--- a/src/test/java/com/android/tools/r8/resolution/shadowing1/MainDump.java
+++ b/src/test/java/com/android/tools/r8/resolution/shadowing1/MainDump.java
@@ -23,7 +23,7 @@
*/
public class MainDump implements Opcodes {
- public static byte[] dump() throws Exception {
+ public static byte[] dump() {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
diff --git a/src/test/java/com/android/tools/r8/resolution/shadowing1/SubInterfaceDump.java b/src/test/java/com/android/tools/r8/resolution/shadowing1/SubInterfaceDump.java
index f70cf4f..7e51c28 100644
--- a/src/test/java/com/android/tools/r8/resolution/shadowing1/SubInterfaceDump.java
+++ b/src/test/java/com/android/tools/r8/resolution/shadowing1/SubInterfaceDump.java
@@ -11,7 +11,7 @@
public class SubInterfaceDump implements Opcodes {
- public static byte[] dump() throws Exception {
+ public static byte[] dump() {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;