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;