Clean and rename test for backports and min API levels.
Change-Id: I07a7c46b8a8be6cdb6979279618b1fb58bc6c211
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/ApiLevelBackportsTest.java b/src/test/java/com/android/tools/r8/desugar/backports/ApiLevelBackportsTest.java
new file mode 100644
index 0000000..5dac547
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/backports/ApiLevelBackportsTest.java
@@ -0,0 +1,128 @@
+// Copyright (c) 2020, 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.desugar.backports;
+
+import static org.hamcrest.core.StringContains.containsString;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+@RunWith(Parameterized.class)
+public class ApiLevelBackportsTest extends TestBase {
+
+ private final TestParameters parameters;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withDexRuntimesStartingFromIncluding(Version.V9_0_0).build();
+ }
+
+ public ApiLevelBackportsTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void backportSucceedsOnSupportedApiLevel() throws Exception {
+ testForD8()
+ .addProgramClassFileData(Dump.mainWithMathMultiplyExactLongInt())
+ .setMinApi(AndroidApiLevel.B)
+ .run(parameters.getRuntime(), "Test")
+ .assertSuccessWithOutputLines("4");
+ }
+
+ @Test
+ public void warningForNonPlatformBuild() throws Exception {
+ testForD8()
+ .addProgramClassFileData(Dump.mainWithMathMultiplyExactLongInt())
+ .setMinApi(30)
+ .compile()
+ .assertOnlyWarnings()
+ .assertWarningMessageThatMatches(
+ containsString("An API level of 30 is not supported by this compiler"))
+ .run(parameters.getRuntime(), "Test")
+ .assertFailureWithErrorThatMatches(
+ containsString("java.lang.NoSuchMethodError: No static method multiplyExact(JI)J"));
+ }
+
+ @Test
+ public void noWarningForPlatformBuild() throws Exception {
+ testForD8()
+ .addProgramClassFileData(Dump.mainWithMathMultiplyExactLongInt())
+ .setMinApi(AndroidApiLevel.magicApiLevelUsedByAndroidPlatformBuild)
+ .run(parameters.getRuntime(), "Test")
+ .assertFailureWithErrorThatMatches(
+ containsString("java.lang.NoSuchMethodError: No static method multiplyExact(JI)J"));
+ }
+
+ static class Dump implements Opcodes {
+
+ // Code for:
+ //
+ // class Test {
+ // public static void main(String[] args) {
+ // // Call Math.multiplyExact(long, int), which is not in Android Q.
+ // System.out.println(Math.multiplyExact(2L, 2));
+ // }
+ // }
+ //
+ static byte[] mainWithMathMultiplyExactLongInt() {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ MethodVisitor methodVisitor;
+
+ classWriter.visit(V1_8, ACC_SUPER, "Test", null, "java/lang/Object", null);
+
+ classWriter.visitSource("Test.java", null);
+
+ {
+ methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(1, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+ methodVisitor.visitInsn(RETURN);
+ methodVisitor.visitMaxs(1, 1);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(3, label0);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn(Long.valueOf(2L));
+ methodVisitor.visitLdcInsn(Integer.valueOf(2));
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC, "java/lang/Math", "multiplyExact", "(JI)J", false);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(J)V", false);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(4, label1);
+ methodVisitor.visitInsn(RETURN);
+ methodVisitor.visitMaxs(5, 1);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/NoBackportForAndroidPlatform.java b/src/test/java/com/android/tools/r8/desugar/backports/NoBackportForAndroidPlatform.java
deleted file mode 100644
index 47081ab..0000000
--- a/src/test/java/com/android/tools/r8/desugar/backports/NoBackportForAndroidPlatform.java
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (c) 2020, 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.desugar.backports;
-
-import static org.hamcrest.core.StringContains.containsString;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-@RunWith(Parameterized.class)
-public class NoBackportForAndroidPlatform extends TestBase implements Opcodes {
-
- private final TestParameters parameters;
-
- @Parameterized.Parameters(name = "{0}")
- public static TestParametersCollection data() {
- // The use of high API level will produce dex files with high DEX version, so only run on high
- // API level VMs.
- return getTestParameters()
- .withDexRuntimes()
- .withApiLevelsStartingAtIncluding(AndroidApiLevel.P)
- .build();
- }
-
- public NoBackportForAndroidPlatform(TestParameters parameters) {
- this.parameters = parameters;
- }
-
- @Test
- public void backportSucceedsOnSupportedApiLevel() throws Exception {
- testForD8()
- .addProgramClassFileData(mainWithMathMultiplyExactLongInt())
- .setMinApi(AndroidApiLevel.B)
- .run(parameters.getRuntime(), "Test")
- .assertSuccessWithOutputLines("4");
- }
-
- @Test
- public void warningForNonPlatformBuild() throws Exception {
- testForD8()
- .addProgramClassFileData(mainWithMathMultiplyExactLongInt())
- .setMinApi(30)
- .compile()
- .assertOnlyWarnings()
- .assertWarningMessageThatMatches(
- containsString("An API level of 30 is not supported by this compiler"))
- .run(parameters.getRuntime(), "Test")
- .assertFailureWithErrorThatMatches(
- containsString("java.lang.NoSuchMethodError: No static method multiplyExact(JI)J"));
- }
-
- @Test
- public void noWarningForPlatformBuild() throws Exception {
- testForD8()
- .addProgramClassFileData(mainWithMathMultiplyExactLongInt())
- .setMinApi(AndroidApiLevel.magicApiLevelUsedByAndroidPlatformBuild)
- .run(parameters.getRuntime(), "Test")
- .assertFailureWithErrorThatMatches(
- containsString("java.lang.NoSuchMethodError: No static method multiplyExact(JI)J"));
- }
-
- // Code for:
- //
- // class Test {
- // public static void main(String[] args) {
- // // Call Math.multiplyExact(long, int), which is not in Android Q.
- // System.out.println(Math.multiplyExact(2L, 2));
- // }
- // }
- //
- private byte[] mainWithMathMultiplyExactLongInt() {
-
- ClassWriter classWriter = new ClassWriter(0);
- MethodVisitor methodVisitor;
-
- classWriter.visit(V1_8, ACC_SUPER, "Test", null, "java/lang/Object", null);
-
- classWriter.visitSource("Test.java", null);
-
- {
- methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null);
- methodVisitor.visitCode();
- Label label0 = new Label();
- methodVisitor.visitLabel(label0);
- methodVisitor.visitLineNumber(1, label0);
- methodVisitor.visitVarInsn(ALOAD, 0);
- methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
- methodVisitor.visitInsn(RETURN);
- methodVisitor.visitMaxs(1, 1);
- methodVisitor.visitEnd();
- }
- {
- methodVisitor =
- classWriter.visitMethod(
- ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
- methodVisitor.visitCode();
- Label label0 = new Label();
- methodVisitor.visitLabel(label0);
- methodVisitor.visitLineNumber(3, label0);
- methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
- methodVisitor.visitLdcInsn(Long.valueOf(2L));
- methodVisitor.visitLdcInsn(Integer.valueOf(2));
- methodVisitor.visitMethodInsn(
- INVOKESTATIC, "java/lang/Math", "multiplyExact", "(JI)J", false);
- methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(J)V", false);
- Label label1 = new Label();
- methodVisitor.visitLabel(label1);
- methodVisitor.visitLineNumber(4, label1);
- methodVisitor.visitInsn(RETURN);
- methodVisitor.visitMaxs(5, 1);
- methodVisitor.visitEnd();
- }
- classWriter.visitEnd();
-
- return classWriter.toByteArray();
- }
-}