Add more tests of enums in annotations
Test of R8 processed CF code revealing issues when compiled to DEX.
Bug: b/236691999
Change-Id: I225cccc77e13eb290570fcc072f657d756046e18
diff --git a/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java
index 3292cda..577abc0d 100644
--- a/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java
@@ -7,17 +7,21 @@
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.ProguardVersion;
+import com.android.tools.r8.R8FullTestBuilder;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.TestShrinkerBuilder;
+import com.android.tools.r8.TestState;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import java.nio.file.Path;
import java.util.List;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -39,7 +43,21 @@
getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
}
- private static String EXPECTED_RESULT = StringUtils.lines("TEST_ONE", "TEST_TWO");
+ private static final String EXPECTED_RESULT = StringUtils.lines("TEST_ONE", "TEST_TWO");
+
+ public static Path r8cf;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ r8cf =
+ R8FullTestBuilder.create(new TestState(getStaticTemp()), Backend.CF)
+ .addInnerClasses(EnumArrayInAnnotationTest.class)
+ .addKeepMainRule(Main.class)
+ .addKeepEnumsRule()
+ .addKeepRuntimeVisibleAnnotations()
+ .compile()
+ .writeToZip();
+ }
@Test
public void testRuntime() throws Exception {
@@ -74,6 +92,23 @@
}
@Test
+ public void testR8WithR8Input() throws Exception {
+ assumeTrue(useGenericEnumsRule);
+ testForR8(parameters.getBackend())
+ .addProgramFiles(r8cf)
+ .addKeepMainRule(Main.class)
+ .addKeepEnumsRule()
+ .setMinApi(parameters.getApiLevel())
+ .addKeepRuntimeVisibleAnnotations()
+ .run(parameters.getRuntime(), Main.class)
+ .applyIf(
+ parameters.isDexRuntime(),
+ // TODO(b/236691999): This should not fail.
+ r -> r.assertFailureWithErrorThatThrows(NoSuchFieldError.class),
+ r -> r.assertSuccessWithOutput(EXPECTED_RESULT));
+ }
+
+ @Test
public void testProguard() throws Exception {
assumeTrue(parameters.isCfRuntime());
testForProguard(ProguardVersion.V7_0_0)
@@ -87,7 +122,7 @@
"-keepclassmembernames enum "
+ EnumArrayInAnnotationTest.Enum.class.getTypeName()
+ " { <fields>; }"))
- .addKeepRules("-dontwarn " + getClass().getTypeName())
+ .addDontWarn(getClass())
.addKeepRuntimeVisibleAnnotations()
.run(parameters.getRuntime(), Main.class)
.applyIf(
diff --git a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
index 2e4b77f..75d0c90 100644
--- a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
@@ -7,16 +7,20 @@
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.ProguardVersion;
+import com.android.tools.r8.R8FullTestBuilder;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestShrinkerBuilder;
+import com.android.tools.r8.TestState;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import java.nio.file.Path;
import java.util.List;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -38,13 +42,28 @@
getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
}
- private static String EXPECTED_RESULT = StringUtils.lines("TEST_ONE");
+ private static final String EXPECTED_RESULT = StringUtils.lines("TEST_ONE");
+
+ public static Path r8cf;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ // Prepare a R8 processed JAR keeping Main with annotations and generic enum rule.
+ r8cf =
+ R8FullTestBuilder.create(new TestState(getStaticTemp()), Backend.CF)
+ .addInnerClasses(EnumInAnnotationTest.class)
+ .addKeepMainRule(Main.class)
+ .addKeepEnumsRule()
+ .addKeepRuntimeVisibleAnnotations()
+ .compile()
+ .writeToZip();
+ }
@Test
public void testRuntime() throws Exception {
assumeTrue(useGenericEnumsRule);
testForRuntime(parameters)
- .addInnerClasses(EnumInAnnotationTest.class)
+ .addInnerClasses(getClass())
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutput(EXPECTED_RESULT);
}
@@ -69,12 +88,28 @@
})
.setMinApi(parameters.getApiLevel())
.addKeepRuntimeVisibleAnnotations()
- .compile()
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutput(EXPECTED_RESULT);
}
@Test
+ public void testR8WithR8Input() throws Exception {
+ assumeTrue(useGenericEnumsRule);
+ testForR8(parameters.getBackend())
+ .addProgramFiles(r8cf)
+ .addKeepMainRule(Main.class)
+ .addKeepEnumsRule()
+ .setMinApi(parameters.getApiLevel())
+ .addKeepRuntimeVisibleAnnotations()
+ .run(parameters.getRuntime(), Main.class)
+ .applyIf(
+ parameters.isDexRuntime(),
+ // TODO(b/236691999): This should not fail.
+ r -> r.assertFailureWithErrorThatThrows(NoSuchFieldError.class),
+ r -> r.assertSuccessWithOutput(EXPECTED_RESULT));
+ }
+
+ @Test
public void testProguard() throws Exception {
assumeTrue(parameters.isCfRuntime());
testForProguard(ProguardVersion.V7_0_0)
@@ -89,7 +124,7 @@
"-keepclassmembernames class "
+ EnumInAnnotationTest.Enum.class.getTypeName()
+ " { <fields>; }"))
- .addKeepRules("-dontwarn " + getClass().getTypeName())
+ .addDontWarn(getClass())
.addKeepRuntimeVisibleAnnotations()
.compile()
.run(parameters.getRuntime(), Main.class)