Move Kotlin R8 optimization test resources

This CL moves the resources for tests com.android.tools.r8.kotlin.*
from the examplesKotlin directory into its own module.

In the future, we will also compile these tests with the Kotlin 1.8
backend. However the resources in examplesKotlin directory are also
compiled to .dex files with dx which cannot handle 1.8 output files
without desugaring.

Finally, we no longer compile the test resources to dex using gradle
because it's only used to compare runtime execution output. We will
compare with Java execution output instead.

Change-Id: I7a5e88643a1e5431bcdffaf84a5c0505491c2aa0
diff --git a/build.gradle b/build.gradle
index e0d28fa..d0a5968 100644
--- a/build.gradle
+++ b/build.gradle
@@ -179,6 +179,12 @@
             ]
         }
     }
+    kotlinR8TestResources {
+        java {
+            srcDirs = ['src/test/kotlinR8TestResources']
+        }
+        output.resourcesDir = 'build/classes/kotlinR8TestResources'
+    }
 }
 
 configurations {
@@ -226,6 +232,7 @@
     apiUsageSampleCompile sourceSets.main.output
     debugTestResourcesKotlinCompileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.2.0'
     examplesKotlinCompileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.2.0'
+    kotlinR8TestResourcesCompileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.2.0'
     apt 'com.google.auto.value:auto-value:1.5'
 }
 
@@ -1133,6 +1140,19 @@
     }
 }
 
+task buildKotlinR8TestResources {
+    def examplesDir = file("src/test/kotlinR8TestResources")
+    examplesDir.eachDir { dir ->
+        def name = dir.getName()
+        def taskName = "jar_kotlinR8TestResources_${name}"
+        task "${taskName}"(type: kotlin.Kotlinc) {
+            source = fileTree(dir: file("${examplesDir}/${name}"), include: '**/*.kt')
+            destination = file("build/test/kotlinR8TestResources/${name}.jar")
+        }
+        dependsOn taskName
+    }
+}
+
 task buildExamples {
     if (OperatingSystem.current().isMacOsX() || OperatingSystem.current().isWindows()) {
         logger.lifecycle("WARNING: Testing (including building examples) is only partially supported on your " +
@@ -1359,6 +1379,7 @@
         dependsOn downloadDeps
         dependsOn buildExamples
         dependsOn buildExamplesKotlin
+        dependsOn buildKotlinR8TestResources
         dependsOn buildSmali
         dependsOn jctfCommonJar
         dependsOn jctfTestsClasses
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index 8b2f183..018e89e 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -31,6 +31,9 @@
 // TODO(shertz) also run with backend 1.8
 public abstract class AbstractR8KotlinTestBase extends TestBase {
 
+  public static final String KOTLIN_R8_TEST_RESOURCES_BUILD_DIR =
+      ToolHelper.TESTS_BUILD_DIR + "/kotlinR8TestResources";
+
   protected final boolean allowAccessModification;
 
   protected AbstractR8KotlinTestBase(boolean allowAccessModification) {
@@ -122,11 +125,6 @@
     return getDexCode(methodSubject);
   }
 
-  private static String getNonOptimizedDexFile(String pkg) {
-    return Paths
-        .get(ToolHelper.EXAMPLES_KOTLIN_BUILD_DIR, pkg, ToolHelper.DEFAULT_DEX_FILENAME).toString();
-  }
-
   protected static MethodSubject checkMethodIsPresent(ClassSubject classSubject, String methodName,
       String methodReturnType,
       List<String> methodParameterTypes) {
@@ -150,23 +148,12 @@
         "}";
   }
 
-  protected void buildAndInspect(String folder, String mainClass, AndroidAppInspector inspector)
-      throws Exception {
-    buildRunAndInspect(folder, mainClass, inspector, true);
-  }
-
-  protected void buildRunAndInspect(String folder, String mainClass, AndroidAppInspector inspector)
-      throws Exception {
-    buildRunAndInspect(folder, mainClass, inspector, false);
-  }
-
-  public void buildRunAndInspect(String folder, String mainClass, AndroidAppInspector inspector,
-      boolean skipExecution)
+  protected void runTest(String folder, String mainClass, AndroidAppInspector inspector)
       throws Exception {
     Assume.assumeTrue(ToolHelper.artSupported());
 
     Path jarFile =
-        Paths.get(ToolHelper.EXAMPLES_KOTLIN_BUILD_DIR, folder + FileUtils.JAR_EXTENSION);
+        Paths.get(KOTLIN_R8_TEST_RESOURCES_BUILD_DIR, folder + FileUtils.JAR_EXTENSION);
 
     String proguardRules = buildProguardRules(mainClass);
 
@@ -175,29 +162,22 @@
     builder.addProgramFiles(jarFile);
     AndroidApp app = compileWithR8(builder.build(), proguardRules.toString());
 
-    // Compare original and generated DEX files.
-    String originalDexFile = getNonOptimizedDexFile(folder);
-
     // Materialize file for execution.
     Path generatedDexFile = temp.getRoot().toPath().resolve("classes.jar");
     app.writeToZip(generatedDexFile, OutputMode.DexIndexed);
 
-    if (!skipExecution) {
+    // Run with ART.
+    String artOutput =
+        ToolHelper.runArtNoVerificationErrors(generatedDexFile.toString(), mainClass);
 
-      // Run with ART.
-      String artOutput = ToolHelper
-          .checkArtOutputIdentical(originalDexFile, generatedDexFile.toString(), mainClass,
-              ToolHelper.getDexVm());
-
-      // Compare with Java.
-      ToolHelper.ProcessResult javaResult = ToolHelper.runJava(jarFile, mainClass);
-      if (javaResult.exitCode != 0) {
-        System.out.println(javaResult.stdout);
-        System.err.println(javaResult.stderr);
-        fail("JVM failed for: " + mainClass);
-      }
-      assertEquals("JVM and ART output differ", javaResult.stdout, artOutput);
+    // Compare with Java.
+    ToolHelper.ProcessResult javaResult = ToolHelper.runJava(jarFile, mainClass);
+    if (javaResult.exitCode != 0) {
+      System.out.println(javaResult.stdout);
+      System.err.println(javaResult.stderr);
+      fail("JVM failed for: " + mainClass);
     }
+    assertEquals("JVM and ART output differ", javaResult.stdout, artOutput);
 
     inspector.inspectApp(app);
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
index 7ebc004e..f97700f 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -51,7 +51,7 @@
   @Test
   public void test_dataclass_gettersOnly() throws Exception {
     final String mainClassName = "dataclass.MainGettersOnly";
-    buildAndInspect("dataclass", mainClassName, (app) -> {
+    runTest("dataclass", mainClassName, (app) -> {
       DexInspector dexInspector = new DexInspector(app);
       ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
 
@@ -85,7 +85,7 @@
   @Test
   public void test_dataclass_componentOnly() throws Exception {
     final String mainClassName = "dataclass.MainComponentOnly";
-    buildAndInspect("dataclass", mainClassName, (app) -> {
+    runTest("dataclass", mainClassName, (app) -> {
       DexInspector dexInspector = new DexInspector(app);
       ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
 
@@ -119,7 +119,7 @@
   @Test
   public void test_dataclass_componentPartial() throws Exception {
     final String mainClassName = "dataclass.MainComponentPartial";
-    buildAndInspect("dataclass", mainClassName, (app) -> {
+    runTest("dataclass", mainClassName, (app) -> {
       DexInspector dexInspector = new DexInspector(app);
       ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
 
@@ -151,7 +151,7 @@
   @Test
   public void test_dataclass_copy() throws Exception {
     final String mainClassName = "dataclass.MainCopy";
-    buildAndInspect("dataclass", mainClassName, (app) -> {
+    runTest("dataclass", mainClassName, (app) -> {
       DexInspector dexInspector = new DexInspector(app);
       ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
 
@@ -169,7 +169,7 @@
   @Test
   public void test_dataclass_copyDefault() throws Exception {
     final String mainClassName = "dataclass.MainCopyWithDefault";
-    buildAndInspect("dataclass", mainClassName, (app) -> {
+    runTest("dataclass", mainClassName, (app) -> {
       DexInspector dexInspector = new DexInspector(app);
       ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
 
diff --git a/src/test/examplesKotlin/dataclass/MainComponentOnly.kt b/src/test/kotlinR8TestResources/dataclass/MainComponentOnly.kt
similarity index 100%
rename from src/test/examplesKotlin/dataclass/MainComponentOnly.kt
rename to src/test/kotlinR8TestResources/dataclass/MainComponentOnly.kt
diff --git a/src/test/examplesKotlin/dataclass/MainComponentPartial.kt b/src/test/kotlinR8TestResources/dataclass/MainComponentPartial.kt
similarity index 100%
rename from src/test/examplesKotlin/dataclass/MainComponentPartial.kt
rename to src/test/kotlinR8TestResources/dataclass/MainComponentPartial.kt
diff --git a/src/test/examplesKotlin/dataclass/MainCopy.kt b/src/test/kotlinR8TestResources/dataclass/MainCopy.kt
similarity index 100%
rename from src/test/examplesKotlin/dataclass/MainCopy.kt
rename to src/test/kotlinR8TestResources/dataclass/MainCopy.kt
diff --git a/src/test/examplesKotlin/dataclass/MainCopyWithDefault.kt b/src/test/kotlinR8TestResources/dataclass/MainCopyWithDefault.kt
similarity index 100%
rename from src/test/examplesKotlin/dataclass/MainCopyWithDefault.kt
rename to src/test/kotlinR8TestResources/dataclass/MainCopyWithDefault.kt
diff --git a/src/test/examplesKotlin/dataclass/MainGettersOnly.kt b/src/test/kotlinR8TestResources/dataclass/MainGettersOnly.kt
similarity index 100%
rename from src/test/examplesKotlin/dataclass/MainGettersOnly.kt
rename to src/test/kotlinR8TestResources/dataclass/MainGettersOnly.kt
diff --git a/src/test/examplesKotlin/dataclass/Person.kt b/src/test/kotlinR8TestResources/dataclass/Person.kt
similarity index 100%
rename from src/test/examplesKotlin/dataclass/Person.kt
rename to src/test/kotlinR8TestResources/dataclass/Person.kt