[Metadata] Add test for not renaming enum values in metadata
Bug: b/259389417
Change-Id: Ibf13f00e38b77d9f198ab5556c6fb5b9f59cb0a0
diff --git a/src/test/java/com/android/tools/r8/JvmTestBuilder.java b/src/test/java/com/android/tools/r8/JvmTestBuilder.java
index e1ab7a6..8b56639 100644
--- a/src/test/java/com/android/tools/r8/JvmTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/JvmTestBuilder.java
@@ -107,7 +107,8 @@
throw new RuntimeException(e);
}
} else {
- throw new Unimplemented("No support for adding file: " + file);
+ assert Files.isDirectory(file);
+ classpath.add(file);
}
}
return self();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmpty.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmptyTest.java
similarity index 95%
rename from src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmpty.java
rename to src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmptyTest.java
index 7a7aec4..d8a78c9 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmpty.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmptyTest.java
@@ -22,7 +22,7 @@
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
-public class MetadataRewriteDoNotEmitValuesIfEmpty extends KotlinMetadataTestBase {
+public class MetadataRewriteDoNotEmitValuesIfEmptyTest extends KotlinMetadataTestBase {
private final Set<String> nullableFieldKeys = Sets.newHashSet("pn", "xs", "xi");
@@ -35,7 +35,7 @@
private final TestParameters parameters;
- public MetadataRewriteDoNotEmitValuesIfEmpty(
+ public MetadataRewriteDoNotEmitValuesIfEmptyTest(
TestParameters parameters, KotlinTestParameters kotlinParameters) {
super(kotlinParameters);
this.parameters = parameters;
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteEnumTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteEnumTest.java
new file mode 100644
index 0000000..939eb30
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteEnumTest.java
@@ -0,0 +1,97 @@
+// Copyright (c) 2022, 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.kotlin.metadata;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import java.nio.file.Path;
+import java.util.Collection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/** This is a regression test for b/259389417. */
+@RunWith(Parameterized.class)
+public class MetadataRewriteEnumTest extends KotlinMetadataTestBase {
+
+ private final String[] EXPECTED =
+ new String[] {"UP", "RIGHT", "DOWN", "LEFT", "UP", "RIGHT", "DOWN", "LEFT"};
+ private final String DIRECTION_TYPE_NAME = PKG + ".enum_lib.Direction";
+
+ private final TestParameters parameters;
+
+ @Parameterized.Parameters(name = "{0}, {1}")
+ public static Collection<Object[]> data() {
+ return buildParameters(
+ getTestParameters().withCfRuntimes().build(),
+ getKotlinTestParameters().withAllCompilersAndTargetVersions().build());
+ }
+
+ public MetadataRewriteEnumTest(TestParameters parameters, KotlinTestParameters kotlinParameters) {
+ super(kotlinParameters);
+ this.parameters = parameters;
+ }
+
+ private static final KotlinCompileMemoizer jarMap =
+ getCompileMemoizer(getKotlinFileInTest(PKG_PREFIX + "/enum_lib", "lib"));
+
+ @Test
+ public void smokeTest() throws Exception {
+ Path libJar = jarMap.getForConfiguration(kotlinc, targetVersion);
+ Path output =
+ kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion)
+ .addClasspathFiles(libJar)
+ .addSourceFiles(getKotlinFileInTest(PKG_PREFIX + "/enum_app", "main"))
+ .compile();
+ testForRuntime(parameters)
+ .addProgramFiles(
+ libJar, output, kotlinc.getKotlinStdlibJar(), kotlinc.getKotlinReflectJar())
+ .run(parameters.getRuntime(), PKG + ".enum_app.MainKt")
+ .assertSuccessWithOutputLines(EXPECTED);
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ R8TestCompileResult r8libResult =
+ testForR8(parameters.getBackend())
+ .addProgramFiles(jarMap.getForConfiguration(kotlinc, targetVersion))
+ .addClasspathFiles(kotlinc.getKotlinStdlibJar())
+ .addKeepKotlinMetadata()
+ .addKeepEnumsRule()
+ .addKeepClassRules(DIRECTION_TYPE_NAME)
+ .addKeepClassAndMembersRulesWithAllowObfuscation(DIRECTION_TYPE_NAME)
+ .compile()
+ .inspect(
+ inspector -> {
+ ClassSubject direction = inspector.clazz(DIRECTION_TYPE_NAME);
+ assertThat(direction, isPresentAndNotRenamed());
+ direction.allFields().forEach(field -> assertTrue(field.isRenamed()));
+ });
+ Path libJar = r8libResult.writeToZip();
+ Path output =
+ kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion)
+ .addClasspathFiles(libJar)
+ .addSourceFiles(getKotlinFileInTest(PKG_PREFIX + "/enum_app", "main"))
+ .compile();
+ Path path =
+ testForR8(parameters.getBackend())
+ .addClasspathFiles(kotlinc.getKotlinStdlibJar(), kotlinc.getKotlinReflectJar(), libJar)
+ .addProgramFiles(output)
+ .addKeepAllClassesRule()
+ .addApplyMapping(r8libResult.getProguardMap())
+ .compile()
+ .writeToZip();
+ // TODO(b/259389417): We should rename enum values in metadata.
+ testForRuntime(parameters)
+ .addProgramFiles(libJar, kotlinc.getKotlinStdlibJar(), kotlinc.getKotlinReflectJar(), path)
+ .run(parameters.getRuntime(), PKG + ".enum_app.MainKt")
+ .assertFailureWithErrorThatThrows(NoSuchFieldError.class);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/enum_app/main.kt b/src/test/java/com/android/tools/r8/kotlin/metadata/enum_app/main.kt
new file mode 100644
index 0000000..ff23216
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/enum_app/main.kt
@@ -0,0 +1,16 @@
+// 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.kotlin.metadata.enum_app
+
+import com.android.tools.r8.kotlin.metadata.enum_lib.Direction
+
+fun main() {
+ println(Direction.UP)
+ println(Direction.RIGHT)
+ println(Direction.DOWN)
+ println(Direction.LEFT)
+
+ Direction::class.java.enumConstants.forEach { println(it) }
+}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/enum_lib/lib.kt b/src/test/java/com/android/tools/r8/kotlin/metadata/enum_lib/lib.kt
new file mode 100644
index 0000000..0423b6d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/enum_lib/lib.kt
@@ -0,0 +1,9 @@
+// Copyright (c) 2022, 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.kotlin.metadata.enum_lib
+
+enum class Direction {
+ UP, RIGHT, DOWN, LEFT
+}