Merge commit '022dc79967baae9cabee9900da2740526af1f153' into dev-release

Change-Id: I7c949c25e45cb6359ca40cec5a05c63f38dabfb9
diff --git a/d8_r8/test/build.gradle.kts b/d8_r8/test/build.gradle.kts
index 2f81edc..2bd2638 100644
--- a/d8_r8/test/build.gradle.kts
+++ b/d8_r8/test/build.gradle.kts
@@ -25,8 +25,9 @@
 val r8WithRelocatedDepsTask = projectTask("main", "r8WithRelocatedDeps")
 val mainSourcesTask = projectTask("main", "sourcesJar")
 val resourceShrinkerSourcesTask = projectTask("resourceshrinker", "sourcesJar")
+val javaTestBaseJarTask = projectTask("testbase", "testJar")
+val javaTestBaseDepsJar = projectTask("testbase", "depsJar")
 val java8TestJarTask = projectTask("tests_java_8", "testJar")
-val java8TestsDepsJarTask = projectTask("tests_java_8", "depsJar")
 val bootstrapTestsDepsJarTask = projectTask("tests_bootstrap", "depsJar")
 val testsJava8SourceSetDependenciesTask = projectTask("tests_java_8", "sourceSetDependencyTask")
 
@@ -62,27 +63,39 @@
   }
 
   val packageTestDeps by registering(Jar::class) {
-    dependsOn(bootstrapTestsDepsJarTask, java8TestsDepsJarTask)
+    dependsOn(bootstrapTestsDepsJarTask, javaTestBaseDepsJar)
     from(bootstrapTestsDepsJarTask.outputs.getFiles().map(::zipTree))
-    from(java8TestsDepsJarTask.outputs.getFiles().map(::zipTree))
+    from(javaTestBaseDepsJar.outputs.getFiles().map(::zipTree))
     exclude("META-INF/*.kotlin_module", "**/*.kotlin_metadata")
     duplicatesStrategy = DuplicatesStrategy.EXCLUDE
     destinationDirectory.set(getRoot().resolveAll("build", "libs"))
     archiveFileName.set("test_deps_all.jar")
   }
 
-  // When testing R8 lib with relocated deps we must relocate kotlinx.metadata in the tests, since
-  // types from kotlinx.metadata are used on the R8 main/R8 test boundary.
-  //
-  // This is not needed when testing R8 lib excluding deps since we simply include the deps on the
-  // classpath at runtime.
-  val relocateTestsForR8LibWithRelocatedDeps by registering(Exec::class) {
-    dependsOn(packageTests, r8WithRelocatedDepsTask)
-    val r8WithRelocatedDepsJar = r8WithRelocatedDepsTask.getSingleOutputFile()
-    val testJar = packageTests.getSingleOutputFile()
-    inputs.files(r8WithRelocatedDepsJar, testJar)
-    val outputJar = file(Paths.get("build", "libs", "r8tests-relocated.jar"))
+  val packageTestBase by registering(Jar::class) {
+    dependsOn(javaTestBaseJarTask)
+    from(javaTestBaseJarTask.outputs.files.map(::zipTree))
+    exclude("META-INF/*.kotlin_module", "**/*.kotlin_metadata")
+    destinationDirectory.set(getRoot().resolveAll("build", "libs"))
+    archiveFileName.set("r8test_base.jar")
+  }
+
+  val packageTestBaseExcludeKeep by registering(Jar::class) {
+    dependsOn(packageTestBase)
+    from(zipTree(packageTestBase.getSingleOutputFile()))
+    // TODO(b/328353718): we have com.android.tools.r8.Keep in both test_base and main
+    exclude("com/android/tools/r8/Keep.class")
+    archiveFileName.set("r8test_base_no_keep.jar")
+  }
+
+
+  fun Exec.executeRelocator(jarProvider: TaskProvider<*>, artifactName: String) {
+    dependsOn(r8WithRelocatedDepsTask, jarProvider)
+    val outputJar = file(Paths.get("build", "libs", artifactName))
     outputs.file(outputJar)
+    val r8WithRelocatedDepsJar = r8WithRelocatedDepsTask.getSingleOutputFile()
+    val testJar = jarProvider.getSingleOutputFile()
+    inputs.files(r8WithRelocatedDepsJar, testJar)
     commandLine = baseCompilerCommandLine(
       r8WithRelocatedDepsJar,
       "relocator",
@@ -94,28 +107,37 @@
              "kotlinx.metadata.**->com.android.tools.r8.jetbrains.kotlinx.metadata"))
   }
 
+  // When testing R8 lib with relocated deps we must relocate kotlinx.metadata in the tests, since
+  // types from kotlinx.metadata are used on the R8 main/R8 test boundary.
+  //
+  // This is not needed when testing R8 lib excluding deps since we simply include the deps on the
+  // classpath at runtime.
+  val relocateTestsForR8LibWithRelocatedDeps by registering(Exec::class) {
+    executeRelocator(packageTests, "r8tests-relocated.jar")
+  }
+
+  val relocateTestBaseForR8LibWithRelocatedDeps by registering(Exec::class) {
+    executeRelocator(packageTestBase, "r8testbase-relocated.jar")
+  }
+
   fun Exec.generateKeepRulesForR8Lib(
-          targetJarProvider: Task, testJarProvider: TaskProvider<*>, artifactName: String) {
+          targetJarProvider: Task, testJarProviders: List<TaskProvider<*>>, artifactName: String) {
     dependsOn(
             mainDepsJarTask,
             packageTestDeps,
             r8WithRelocatedDepsTask,
-            targetJarProvider,
-            testJarProvider)
+            targetJarProvider)
+    testJarProviders.forEach(::dependsOn)
     val mainDepsJar = mainDepsJarTask.getSingleOutputFile()
     val rtJar = resolve(ThirdPartyDeps.java8Runtime, "rt.jar").getSingleFile()
     val r8WithRelocatedDepsJar = r8WithRelocatedDepsTask.getSingleOutputFile()
     val targetJar = targetJarProvider.getSingleOutputFile()
     val testDepsJar = packageTestDeps.getSingleOutputFile()
-    val testJar = testJarProvider.getSingleOutputFile()
-    inputs.files(mainDepsJar, rtJar, r8WithRelocatedDepsJar, targetJar, testDepsJar, testJar)
+    inputs.files(mainDepsJar, rtJar, r8WithRelocatedDepsJar, targetJar, testDepsJar)
+    inputs.files(testJarProviders.map{it.getSingleOutputFile()})
     val output = file(Paths.get("build", "libs", artifactName))
     outputs.file(output)
-    commandLine = baseCompilerCommandLine(
-            r8WithRelocatedDepsJar,
-            "tracereferences",
-            listOf(
-                    "--keep-rules",
+    val argList = mutableListOf("--keep-rules",
                     "--allowobfuscation",
                     "--lib",
                     "$rtJar",
@@ -125,23 +147,30 @@
                     "$testDepsJar",
                     "--target",
                     "$targetJar",
-                    "--source",
-                    "$testJar",
                     "--output",
-                    "$output"))
+                    "$output")
+    testJarProviders.forEach{
+      argList.add("--source")
+      argList.add("${it.getSingleOutputFile()}")
+    }
+    commandLine = baseCompilerCommandLine(
+            r8WithRelocatedDepsJar,
+            "tracereferences",
+            argList
+    )
   }
 
   val generateKeepRulesForR8LibWithRelocatedDeps by registering(Exec::class) {
     generateKeepRulesForR8Lib(
             r8WithRelocatedDepsTask,
-            relocateTestsForR8LibWithRelocatedDeps,
+            listOf(relocateTestsForR8LibWithRelocatedDeps, relocateTestBaseForR8LibWithRelocatedDeps),
             "generated-keep-rules-r8lib.txt")
   }
 
   val generateKeepRulesForR8LibNoDeps by registering(Exec::class) {
     generateKeepRulesForR8Lib(
             swissArmyKnifeTask,
-            packageTests,
+            listOf(packageTests, packageTestBase),
             "generated-keep-rules-r8lib-exclude-deps.txt")
   }
 
@@ -237,40 +266,48 @@
           keepRulesFileProvider: TaskProvider<Task>,
           r8JarProvider: Task,
           testJarProvider: TaskProvider<*>,
-          artifactName: String) {
+          artifactName: String,
+          addTestBaseClasspath: Boolean) {
     dependsOn(
             keepRulesFileProvider,
             packageTestDeps,
             relocateTestsForR8LibWithRelocatedDeps,
             r8JarProvider,
             r8WithRelocatedDepsTask,
-            testJarProvider)
+            testJarProvider,
+            packageTestBaseExcludeKeep)
     val keepRulesFile = keepRulesFileProvider.getSingleOutputFile()
     val rtJar = resolve(ThirdPartyDeps.java8Runtime, "rt.jar").getSingleFile()
     val r8Jar = r8JarProvider.getSingleOutputFile()
     val r8WithRelocatedDepsJar = r8WithRelocatedDepsTask.getSingleOutputFile()
+    val testBaseJar = packageTestBaseExcludeKeep.getSingleOutputFile()
     val testDepsJar = packageTestDeps.getSingleOutputFile()
     val testJar = testJarProvider.getSingleOutputFile()
     inputs.files(keepRulesFile, rtJar, r8Jar, r8WithRelocatedDepsJar, testDepsJar, testJar)
     val outputJar = getRoot().resolveAll("build", "libs", artifactName)
     outputs.file(outputJar)
+    val args = mutableListOf(
+      "--classfile",
+      "--debug",
+      "--lib",
+      "$rtJar",
+      "--classpath",
+      "$r8Jar",
+      "--classpath",
+      "$testDepsJar",
+      "--output",
+      "$outputJar",
+      "--pg-conf",
+      "$keepRulesFile",
+      "$testJar")
+    if (addTestBaseClasspath) {
+      args.add("--classpath")
+      args.add("$testBaseJar")
+    }
     commandLine = baseCompilerCommandLine(
             r8WithRelocatedDepsJar,
             "r8",
-            listOf(
-                    "--classfile",
-                    "--debug",
-                    "--lib",
-                    "$rtJar",
-                    "--classpath",
-                    "$r8Jar",
-                    "--classpath",
-                    "$testDepsJar",
-                    "--output",
-                    "$outputJar",
-                    "--pg-conf",
-                    "$keepRulesFile",
-                    "$testJar"))
+            args)
   }
 
   val rewriteTestsForR8LibWithRelocatedDeps by registering(Exec::class) {
@@ -278,7 +315,17 @@
             generateTestKeepRulesR8LibWithRelocatedDeps,
             r8WithRelocatedDepsTask,
             relocateTestsForR8LibWithRelocatedDeps,
-            "r8libtestdeps-cf.jar")
+            "r8libtestdeps-cf.jar",
+            true)
+  }
+
+  val rewriteTestBaseForR8LibWithRelocatedDeps by registering(Exec::class) {
+    rewriteTestsForR8Lib(
+            generateTestKeepRulesR8LibWithRelocatedDeps,
+            r8WithRelocatedDepsTask,
+            relocateTestBaseForR8LibWithRelocatedDeps,
+            "r8libtestbase-cf.jar",
+            false)
   }
 
   val rewriteTestsForR8LibNoDeps by registering(Exec::class) {
@@ -286,7 +333,8 @@
             generateTestKeepRulesR8LibNoDeps,
             swissArmyKnifeTask,
             packageTests,
-            "r8lib-exclude-deps-testdeps-cf.jar")
+            "r8lib-exclude-deps-testdeps-cf.jar",
+            true)
   }
 
   val cleanUnzipTests by registering(Delete::class) {
@@ -302,6 +350,13 @@
     into(outputDir)
   }
 
+  val unzipTestBase by registering(Copy::class) {
+    dependsOn(cleanUnzipTests, packageTestBase)
+    val outputDir = file("${buildDir}/unpacked/testbase")
+    from(zipTree(packageTestBase.getSingleOutputFile()))
+    into(outputDir)
+  }
+
   fun Copy.unzipRewrittenTestsForR8Lib(
           rewrittenTestJarProvider: TaskProvider<Exec>, outDirName: String) {
     dependsOn(rewrittenTestJarProvider)
@@ -340,8 +395,10 @@
             r8Lib,
             r8WithRelocatedDepsTask,
             testsJava8SourceSetDependenciesTask,
+            rewriteTestBaseForR8LibWithRelocatedDeps,
             unzipRewrittenTests,
             unzipTests,
+            unzipTestBase,
             gradle.includedBuild("shared").task(":downloadDeps"))
     if (!project.hasProperty("no_internal")) {
       dependsOn(gradle.includedBuild("shared").task(":downloadDepsInternal"))
@@ -356,9 +413,12 @@
     classpath = files(
             packageTestDeps.get().getOutputs().getFiles(),
             r8LibJar,
-            unzipRewrittenTests.get().getOutputs().getFiles())
+            unzipRewrittenTests.get().getOutputs().getFiles(),
+            rewriteTestBaseForR8LibWithRelocatedDeps.getSingleOutputFile())
     testClassesDirs = unzipRewrittenTests.get().getOutputs().getFiles()
     systemProperty("TEST_DATA_LOCATION", unzipTests.getSingleOutputFile())
+    systemProperty("TESTBASE_DATA_LOCATION", unzipTestBase.getSingleOutputFile())
+
     systemProperty(
       "BUILD_PROP_KEEPANNO_RUNTIME_PATH",
       keepAnnoCompileTask.getOutputs().getFiles().getAsPath().split(File.pathSeparator)[0])
@@ -408,4 +468,4 @@
 
 fun TaskOutputs.getSingleOutputFile(): File = getFiles().getSingleFile()
 
-fun TaskProvider<*>.getSingleOutputFile(): File = get().getSingleOutputFile()
\ No newline at end of file
+fun TaskProvider<*>.getSingleOutputFile(): File = get().getSingleOutputFile()
diff --git a/d8_r8/test/settings.gradle.kts b/d8_r8/test/settings.gradle.kts
index 5c2726d..d114948 100644
--- a/d8_r8/test/settings.gradle.kts
+++ b/d8_r8/test/settings.gradle.kts
@@ -28,6 +28,7 @@
 includeBuild(root.resolve("keepanno"))
 includeBuild(root.resolve("main"))
 includeBuild(root.resolve("resourceshrinker"))
+includeBuild(root.resolve("test_modules").resolve("testbase"))
 includeBuild(root.resolve("test_modules").resolve("tests_bootstrap"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_8"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_9"))
diff --git a/d8_r8/test_modules/testbase/build.gradle.kts b/d8_r8/test_modules/testbase/build.gradle.kts
new file mode 100644
index 0000000..2d66a1c
--- /dev/null
+++ b/d8_r8/test_modules/testbase/build.gradle.kts
@@ -0,0 +1,117 @@
+// Copyright (c) 2024, 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.
+
+import org.gradle.api.JavaVersion
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+  `kotlin-dsl`
+  `java-library`
+  id("dependencies-plugin")
+}
+
+val root = getRoot()
+
+java {
+  sourceSets.main.configure {
+    java {
+      srcDir(root.resolveAll("src", "test", "testbase", "java"))
+    }
+  }
+
+  // We are using a new JDK to compile to an older language version, which is not directly
+  // compatible with java toolchains.
+  sourceCompatibility = JavaVersion.VERSION_1_8
+  targetCompatibility = JavaVersion.VERSION_1_8
+}
+
+// If we depend on keepanno by referencing the project source outputs we get an error regarding
+// incompatible java class file version. By depending on the jar we circumvent that.
+val keepAnnoJarTask = projectTask("keepanno", "jar")
+val keepAnnoCompileTask = projectTask("keepanno", "compileJava")
+val mainCompileTask = projectTask("main", "compileJava")
+val mainDepsJarTask = projectTask("main", "depsJar")
+val resourceShrinkerJavaCompileTask = projectTask("resourceshrinker", "compileJava")
+val resourceShrinkerKotlinCompileTask = projectTask("resourceshrinker", "compileKotlin")
+val resourceShrinkerDepsJarTask = projectTask("resourceshrinker", "depsJar")
+
+dependencies {
+  implementation(keepAnnoJarTask.outputs.files)
+  implementation(mainCompileTask.outputs.files)
+  implementation(projectTask("main", "processResources").outputs.files)
+  implementation(resourceShrinkerJavaCompileTask.outputs.files)
+  implementation(resourceShrinkerKotlinCompileTask.outputs.files)
+  implementation(resourceShrinkerDepsJarTask.outputs.files)
+  implementation(Deps.asm)
+  implementation(Deps.asmCommons)
+  implementation(Deps.asmUtil)
+  implementation(Deps.gson)
+  implementation(Deps.guava)
+  implementation(Deps.javassist)
+  implementation(Deps.junit)
+  implementation(Deps.kotlinStdLib)
+  implementation(Deps.kotlinReflect)
+  implementation(Deps.kotlinMetadata)
+  implementation(resolve(ThirdPartyDeps.ddmLib,"ddmlib.jar"))
+  implementation(resolve(ThirdPartyDeps.jasmin,"jasmin-2.4.jar"))
+  implementation(resolve(ThirdPartyDeps.jdwpTests,"apache-harmony-jdwp-tests-host.jar"))
+  implementation(Deps.fastUtil)
+  implementation(Deps.smali)
+  implementation(Deps.smaliUtil)
+}
+
+
+fun testDependencies() : FileCollection {
+  return sourceSets
+    .test
+    .get()
+    .compileClasspath
+    .filter {
+        "$it".contains("third_party")
+          && !"$it".contains("errorprone")
+          && !"$it".contains("third_party/gradle")
+    }
+}
+
+tasks {
+  withType<JavaCompile> {
+    dependsOn(gradle.includedBuild("keepanno").task(":jar"))
+    dependsOn(gradle.includedBuild("resourceshrinker").task(":jar"))
+    dependsOn(gradle.includedBuild("main").task(":compileJava"))
+    dependsOn(gradle.includedBuild("main").task(":processResources"))
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
+  }
+
+  withType<JavaExec> {
+    if (name.endsWith("main()")) {
+      // IntelliJ pass the main execution through a stream which is
+      // not compatible with gradle configuration cache.
+      notCompatibleWithConfigurationCache("JavaExec created by IntelliJ")
+    }
+  }
+
+  withType<KotlinCompile> {
+    enabled = false
+  }
+
+  val testJar by registering(Jar::class) {
+    from(sourceSets.main.get().output)
+    // TODO(b/296486206): Seems like IntelliJ has a problem depending on test source sets. Renaming
+    //  this from the default name (testbase.jar) will allow IntelliJ to find the resources in
+    //  the jar and not show red underlines. However, navigation to base classes will not work.
+    archiveFileName.set("not_named_testbase.jar")
+  }
+
+  val depsJar by registering(Jar::class) {
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
+    dependsOn(gradle.includedBuild("keepanno").task(":jar"))
+    dependsOn(gradle.includedBuild("resourceshrinker").task(":jar"))
+    from(testDependencies().map(::zipTree))
+    from(resourceShrinkerDepsJarTask.outputs.getFiles().map(::zipTree))
+    from(keepAnnoJarTask.outputs.getFiles().map(::zipTree))
+    exclude("com/android/tools/r8/keepanno/annotations/**")
+    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+    archiveFileName.set("deps.jar")
+  }
+}
diff --git a/d8_r8/test_modules/testbase/settings.gradle.kts b/d8_r8/test_modules/testbase/settings.gradle.kts
new file mode 100644
index 0000000..97fe72b
--- /dev/null
+++ b/d8_r8/test_modules/testbase/settings.gradle.kts
@@ -0,0 +1,33 @@
+// Copyright (c) 2024, 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.
+
+pluginManagement {
+  repositories {
+    maven {
+      url = uri("file:../../../third_party/dependencies_plugin")
+    }
+    maven {
+      url = uri("file:../../../third_party/dependencies")
+    }
+  }
+}
+
+dependencyResolutionManagement {
+  repositories {
+    maven {
+      url = uri("file:../../../third_party/dependencies")
+    }
+  }
+}
+
+rootProject.name = "testbase"
+
+val root = rootProject.projectDir.parentFile.parentFile
+includeBuild(root.resolve("shared"))
+includeBuild(root.resolve("keepanno"))
+includeBuild(root.resolve("resourceshrinker"))
+
+// We need to include src/main as a composite-build otherwise our test-modules
+// will compete with the test to compile the source files.
+includeBuild(root.resolve("main"))
diff --git a/d8_r8/test_modules/tests_bootstrap/build.gradle.kts b/d8_r8/test_modules/tests_bootstrap/build.gradle.kts
index 2b3af66..0be47ab 100644
--- a/d8_r8/test_modules/tests_bootstrap/build.gradle.kts
+++ b/d8_r8/test_modules/tests_bootstrap/build.gradle.kts
@@ -25,6 +25,9 @@
   targetCompatibility = JavaVersion.VERSION_1_8
 }
 
+val testbaseJavaCompileTask = projectTask("testbase", "compileJava")
+val testbaseDepsJarTask = projectTask("testbase", "depsJar")
+
 val testsJava8Jar = projectTask("tests_java_8", "testJar")
 val keepAnnoJarTask = projectTask("keepanno", "jar")
 val keepAnnoCompileTask = projectTask("keepanno", "compileJava")
@@ -40,14 +43,8 @@
   implementation(resourceShrinkerJavaCompileTask.outputs.files)
   implementation(resourceShrinkerKotlinCompileTask.outputs.files)
   implementation(resourceShrinkerDepsJarTask.outputs.files)
-  implementation(Deps.asm)
-  implementation(Deps.asmCommons)
-  implementation(Deps.asmUtil)
-  implementation(Deps.gson)
-  implementation(Deps.guava)
-  implementation(Deps.junit)
-  implementation(Deps.kotlinMetadata)
-  implementation(Deps.fastUtil)
+  implementation(testbaseDepsJarTask.outputs.files)
+  implementation(testbaseJavaCompileTask.outputs.files)
 }
 
 fun testDependencies() : FileCollection {
diff --git a/d8_r8/test_modules/tests_bootstrap/settings.gradle.kts b/d8_r8/test_modules/tests_bootstrap/settings.gradle.kts
index b79b3eb..5f5d322 100644
--- a/d8_r8/test_modules/tests_bootstrap/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_bootstrap/settings.gradle.kts
@@ -32,3 +32,4 @@
 includeBuild(root.resolve("test_modules").resolve("tests_java_8"))
 includeBuild(root.resolve("keepanno"))
 includeBuild(root.resolve("resourceshrinker"))
+includeBuild(root.resolve("test_modules").resolve("testbase"))
diff --git a/d8_r8/test_modules/tests_java_8/build.gradle.kts b/d8_r8/test_modules/tests_java_8/build.gradle.kts
index 98ab1c9..779cd6c 100644
--- a/d8_r8/test_modules/tests_java_8/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_8/build.gradle.kts
@@ -28,6 +28,10 @@
   targetCompatibility = JavaVersion.VERSION_1_8
 }
 
+
+val testbaseJavaCompileTask = projectTask("testbase", "compileJava")
+val testbaseDepsJarTask = projectTask("testbase", "depsJar")
+
 // If we depend on keepanno by referencing the project source outputs we get an error regarding
 // incompatible java class file version. By depending on the jar we circumvent that.
 val keepAnnoJarTask = projectTask("keepanno", "jar")
@@ -45,22 +49,8 @@
   implementation(resourceShrinkerJavaCompileTask.outputs.files)
   implementation(resourceShrinkerKotlinCompileTask.outputs.files)
   implementation(resourceShrinkerDepsJarTask.outputs.files)
-  implementation(Deps.asm)
-  implementation(Deps.asmCommons)
-  implementation(Deps.asmUtil)
-  implementation(Deps.gson)
-  implementation(Deps.guava)
-  implementation(Deps.javassist)
-  implementation(Deps.junit)
-  implementation(Deps.kotlinStdLib)
-  implementation(Deps.kotlinReflect)
-  implementation(Deps.kotlinMetadata)
-  implementation(resolve(ThirdPartyDeps.ddmLib,"ddmlib.jar"))
-  implementation(resolve(ThirdPartyDeps.jasmin,"jasmin-2.4.jar"))
-  implementation(resolve(ThirdPartyDeps.jdwpTests,"apache-harmony-jdwp-tests-host.jar"))
-  implementation(Deps.fastUtil)
-  implementation(Deps.smali)
-  implementation(Deps.smaliUtil)
+  implementation(testbaseDepsJarTask.outputs.files)
+  implementation(testbaseJavaCompileTask.outputs.files)
 }
 
 val sourceSetDependenciesTasks = arrayOf(
@@ -102,9 +92,11 @@
     commandLine("python3", createArtTestsScript)
   }
   "compileTestJava" {
+    dependsOn(testbaseJavaCompileTask)
     dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
   }
   withType<JavaCompile> {
+    dependsOn(testbaseJavaCompileTask)
     dependsOn(createArtTests)
     dependsOn(gradle.includedBuild("keepanno").task(":jar"))
     dependsOn(gradle.includedBuild("resourceshrinker").task(":jar"))
@@ -139,6 +131,9 @@
     dependsOn(sourceSetDependencyTask)
     systemProperty("TEST_DATA_LOCATION",
                    layout.buildDirectory.dir("classes/java/test").get().toString())
+    systemProperty("TESTBASE_DATA_LOCATION",
+                   testbaseJavaCompileTask.outputs.files.getAsPath().split(File.pathSeparator)[0])
+
     systemProperty(
       "BUILD_PROP_KEEPANNO_RUNTIME_PATH",
       keepAnnoCompileTask.outputs.files.getAsPath().split(File.pathSeparator)[0])
@@ -164,16 +159,4 @@
     //  the jar and not show red underlines. However, navigation to base classes will not work.
     archiveFileName.set("not_named_tests_java_8.jar")
   }
-
-  val depsJar by registering(Jar::class) {
-    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
-    dependsOn(gradle.includedBuild("keepanno").task(":jar"))
-    dependsOn(gradle.includedBuild("resourceshrinker").task(":jar"))
-    from(testDependencies().map(::zipTree))
-    from(resourceShrinkerDepsJarTask.outputs.getFiles().map(::zipTree))
-    from(keepAnnoJarTask.outputs.getFiles().map(::zipTree))
-    exclude("com/android/tools/r8/keepanno/annotations/**")
-    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
-    archiveFileName.set("deps.jar")
-  }
 }
diff --git a/d8_r8/test_modules/tests_java_8/settings.gradle.kts b/d8_r8/test_modules/tests_java_8/settings.gradle.kts
index d54c456..a28a94f 100644
--- a/d8_r8/test_modules/tests_java_8/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_java_8/settings.gradle.kts
@@ -31,6 +31,7 @@
 // We need to include src/main as a composite-build otherwise our test-modules
 // will compete with the test to compile the source files.
 includeBuild(root.resolve("main"))
+includeBuild(root.resolve("test_modules").resolve("testbase"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_9"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_10"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_11"))
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ConstructorEntryPoint.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ConstructorEntryPoint.java
index 49532c6..24efc9a 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ConstructorEntryPoint.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ConstructorEntryPoint.java
@@ -6,6 +6,7 @@
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.ConstNumber;
 import com.android.tools.r8.ir.code.InvokeType;
 import com.android.tools.r8.ir.code.Position;
@@ -36,21 +37,23 @@
  * </code>
  */
 public class ConstructorEntryPoint extends SyntheticSourceCode {
+
   private final DexField classIdField;
   private final int extraNulls;
+  private final ProgramMethod method;
   private final Int2ReferenceSortedMap<DexMethod> typeConstructors;
 
   public ConstructorEntryPoint(
       Int2ReferenceSortedMap<DexMethod> typeConstructors,
-      DexMethod newConstructor,
+      ProgramMethod method,
       DexField classIdField,
       int extraNulls,
       Position position) {
-    super(newConstructor.holder, newConstructor, position);
-
-    this.typeConstructors = typeConstructors;
+    super(method, position);
     this.classIdField = classIdField;
     this.extraNulls = extraNulls;
+    this.method = method;
+    this.typeConstructors = typeConstructors;
   }
 
   private boolean hasClassIdField() {
@@ -95,25 +98,17 @@
   }
 
   /** Assign the given register to the class id field. */
-  void addRegisterClassIdAssignment(int idRegister) {
+  void addRegisterClassIdAssignment(int classIdRegister) {
     assert hasClassIdField();
-    add(builder -> builder.addInstancePut(idRegister, getReceiverRegister(), classIdField));
-  }
-
-  /** Assign the given constant integer value to the class id field. */
-  void addConstantRegisterClassIdAssignment(int classId) {
-    assert hasClassIdField();
-    int idRegister = nextRegister(ValueType.INT);
-    add(builder -> builder.addIntConst(idRegister, classId));
-    addRegisterClassIdAssignment(idRegister);
+    add(builder -> builder.addInstancePut(classIdRegister, getReceiverRegister(), classIdField));
   }
 
   protected void prepareMultiConstructorInstructions() {
     int typeConstructorCount = typeConstructors.size();
     // The class id register is always the first synthetic argument.
-    int idRegister = getParamRegister(method.getArity() - 1 - extraNulls);
+    int classIdRegister = getParamRegister(method.getArity() - 1 - extraNulls);
     if (hasClassIdField()) {
-      addRegisterClassIdAssignment(idRegister);
+      addRegisterClassIdAssignment(classIdRegister);
     }
 
     int[] keys = new int[typeConstructorCount - 1];
@@ -121,7 +116,7 @@
     IntBox fallthrough = new IntBox();
     int switchIndex = lastInstructionIndex();
     add(
-        builder -> builder.addSwitch(idRegister, keys, fallthrough.get(), offsets),
+        builder -> builder.addSwitch(classIdRegister, keys, fallthrough.get(), offsets),
         builder -> endsSwitch(builder, switchIndex, fallthrough.get(), offsets));
 
     int index = 0;
@@ -148,7 +143,10 @@
   protected void prepareSingleConstructorInstructions() {
     Entry<DexMethod> entry = typeConstructors.int2ReferenceEntrySet().first();
     if (hasClassIdField()) {
-      addConstantRegisterClassIdAssignment(entry.getIntKey());
+      int classIdRegister = nextRegister(ValueType.INT);
+      int classIdValue = entry.getIntKey();
+      add(builder -> builder.addIntConst(classIdRegister, classIdValue));
+      addRegisterClassIdAssignment(classIdRegister);
     }
     addConstructorInvoke(entry.getValue());
     add(IRBuilder::addReturn, endsBlock);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteHorizontalClassMergerCode.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteHorizontalClassMergerCode.java
index 031fa97..9aada42 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteHorizontalClassMergerCode.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteHorizontalClassMergerCode.java
@@ -24,7 +24,7 @@
   public abstract void addExtraUnusedArguments(int numberOfUnusedArguments);
 
   @Override
-  public boolean isHorizontalClassMergerCode() {
+  public final boolean isHorizontalClassMergerCode() {
     return true;
   }
 
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
index 5f1815b..559f14f 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
@@ -252,7 +252,6 @@
   }
 
   private Code getNewCode(
-      DexMethod newMethodReference,
       boolean needsClassId,
       int extraNulls) {
     if (hasInstanceInitializerDescription()) {
@@ -261,7 +260,6 @@
     assert useSyntheticMethod();
     return new ConstructorEntryPointSynthesizedCode(
         createClassIdToInstanceInitializerMap(),
-        newMethodReference,
         group.hasClassIdField() ? group.getClassIdField() : null,
         extraNulls);
   }
@@ -349,7 +347,7 @@
           DexEncodedMethod.syntheticBuilder()
               .setMethod(newMethodReference)
               .setAccessFlags(getNewAccessFlags())
-              .setCode(getNewCode(newMethodReference, needsClassId, extraUnusedParameters.size()))
+              .setCode(getNewCode(needsClassId, extraUnusedParameters.size()))
               .setClassFileVersion(getNewClassFileVersion())
               .setApiLevelForDefinition(representativeMethod.getApiLevelForDefinition())
               .setApiLevelForCode(representativeMethod.getApiLevelForCode())
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ConstructorEntryPointSynthesizedCode.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ConstructorEntryPointSynthesizedCode.java
index 706a4fe..b0cfa19 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ConstructorEntryPointSynthesizedCode.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ConstructorEntryPointSynthesizedCode.java
@@ -36,18 +36,15 @@
 
 public class ConstructorEntryPointSynthesizedCode extends IncompleteHorizontalClassMergerCode {
 
-  private final DexMethod newConstructor;
   private final DexField classIdField;
   private int extraNulls;
   private final Int2ReferenceSortedMap<DexMethod> typeConstructors;
 
   public ConstructorEntryPointSynthesizedCode(
       Int2ReferenceSortedMap<DexMethod> typeConstructors,
-      DexMethod newConstructor,
       DexField classIdField,
       int extraNulls) {
     this.typeConstructors = typeConstructors;
-    this.newConstructor = newConstructor;
     this.classIdField = classIdField;
     this.extraNulls = extraNulls;
   }
@@ -81,11 +78,6 @@
   }
 
   @Override
-  public boolean isHorizontalClassMergerCode() {
-    return true;
-  }
-
-  @Override
   public LirCode<Integer> toLirCode(
       AppView<? extends AppInfoWithClassHierarchy> appView,
       ProgramMethod method,
@@ -128,8 +120,7 @@
             .setIsD8R8Synthesized(true)
             .build();
     SourceCode sourceCode =
-        new ConstructorEntryPoint(
-            typeConstructors, newConstructor, classIdField, extraNulls, position);
+        new ConstructorEntryPoint(typeConstructors, method, classIdField, extraNulls, position);
     return IRBuilder.create(method, appView, sourceCode).build(method, conversionOptions);
   }
 
@@ -144,7 +135,7 @@
       RewrittenPrototypeDescription protoChanges) {
     SourceCode sourceCode =
         new ConstructorEntryPoint(
-            typeConstructors, newConstructor, classIdField, extraNulls, callerPosition);
+            typeConstructors, method, classIdField, extraNulls, callerPosition);
     return IRBuilder.createForInlining(
             method, appView, codeLens, sourceCode, valueNumberGenerator, protoChanges)
         .build(context, MethodConversionOptions.nonConverting());
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
index 791577a..9eeb1f9 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
+import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexMethod;
@@ -30,6 +31,7 @@
     WIDENING,  // initial analysis, including fixed-point iteration for phis and updating with less
                // specific info, e.g., removing assume nodes.
     NARROWING, // updating with more specific info, e.g., passing the return value of the inlinee.
+    PROPAGATE, // effectively NARROWING_OR_WIDENING
     NO_CHANGE  // utility to ensure types are up to date
   }
 
@@ -100,6 +102,20 @@
     removeRedundantAssumeInstructions(redundantAssumeConsumer);
   }
 
+  public void propagate(Iterable<? extends Value> values) {
+    analyzeValues(values, Mode.PROPAGATE);
+  }
+
+  public void propagateWithAssumeRemoval(Iterable<? extends Value> values) {
+    propagateWithAssumeRemoval(values, ConsumerUtils.emptyConsumer());
+  }
+
+  public void propagateWithAssumeRemoval(
+      Iterable<? extends Value> values, Consumer<Assume> redundantAssumeConsumer) {
+    propagate(values);
+    removeRedundantAssumeInstructions(redundantAssumeConsumer);
+  }
+
   private void removeRedundantAssumeInstructions(Consumer<Assume> redundantAssumeConsumer) {
     Set<Value> affectedValuesFromAssumeRemoval = Sets.newIdentityHashSet();
     while (assumeRemover.removeRedundantAssumeInstructions(
@@ -204,11 +220,18 @@
       return;
     }
 
-    if (mode == Mode.WIDENING) {
-      value.widening(appView, type);
-    } else {
-      assert mode == Mode.NARROWING;
-      value.narrowing(appView, code.context(), type);
+    switch (mode) {
+      case NARROWING:
+        value.narrowing(appView, code.context(), type);
+        break;
+      case PROPAGATE:
+        value.setType(type);
+        break;
+      case WIDENING:
+        value.widening(appView, type);
+        break;
+      default:
+        throw new Unreachable();
     }
 
     // propagate the type change to (instruction) users if any.
diff --git a/src/main/java/com/android/tools/r8/ir/code/Return.java b/src/main/java/com/android/tools/r8/ir/code/Return.java
index 1efb557..4e89ab8 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Return.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Return.java
@@ -122,7 +122,10 @@
   @Override
   public ConstraintWithTarget inliningConstraint(
       InliningConstraints inliningConstraints, ProgramMethod context) {
-    return inliningConstraints.forReturn();
+    if (hasReturnValue()) {
+      return inliningConstraints.forReturn(returnValue().getType(), context);
+    }
+    return inliningConstraints.forReturnVoid();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java
index 4f42153..9e18843 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java
@@ -97,15 +97,23 @@
                   methodProcessor,
                   methodProcessingContext);
           if (removeResult != RemoveCheckCastInstructionIfTrivialResult.NO_REMOVALS) {
-            assert removeResult == RemoveCheckCastInstructionIfTrivialResult.REMOVED_CAST_DO_NARROW;
             hasChanged = true;
             needToRemoveTrivialPhis |= hasPhiUsers;
             int blockSizeBeforeAssumeRemoval = block.size();
             Instruction previous = it.peekPrevious();
-            affectedValues.narrowingWithAssumeRemoval(
-                appView,
-                code,
-                typeAnalysis -> typeAnalysis.setKeepRedundantBlocksAfterAssumeRemoval(true));
+            if (removeResult == RemoveCheckCastInstructionIfTrivialResult.REMOVED_CAST_DO_NARROW) {
+              affectedValues.narrowingWithAssumeRemoval(
+                  appView,
+                  code,
+                  typeAnalysis -> typeAnalysis.setKeepRedundantBlocksAfterAssumeRemoval(true));
+            } else {
+              assert removeResult
+                  == RemoveCheckCastInstructionIfTrivialResult.REMOVED_CAST_DO_PROPAGATE;
+              affectedValues.propagateWithAssumeRemoval(
+                  appView,
+                  code,
+                  typeAnalysis -> typeAnalysis.setKeepRedundantBlocksAfterAssumeRemoval(true));
+            }
             if (block.size() != blockSizeBeforeAssumeRemoval) {
               it = previous != null ? block.listIterator(code, previous) : block.listIterator(code);
             }
@@ -142,7 +150,8 @@
 
   enum RemoveCheckCastInstructionIfTrivialResult {
     NO_REMOVALS,
-    REMOVED_CAST_DO_NARROW
+    REMOVED_CAST_DO_NARROW,
+    REMOVED_CAST_DO_PROPAGATE
   }
 
   private enum InstanceOfResult {
@@ -264,7 +273,10 @@
               .build();
       it.replaceCurrentInstruction(replacement);
       assert replacement.lookupSingleTarget(appView, context) != null;
-      return RemoveCheckCastInstructionIfTrivialResult.REMOVED_CAST_DO_NARROW;
+      if (checkCast.object().getType().isNullable()) {
+        return RemoveCheckCastInstructionIfTrivialResult.REMOVED_CAST_DO_NARROW;
+      }
+      return RemoveCheckCastInstructionIfTrivialResult.REMOVED_CAST_DO_PROPAGATE;
     }
 
     // If the cast is guaranteed to succeed and only there to ensure the program type checks, then
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AffectedValues.java b/src/main/java/com/android/tools/r8/ir/optimize/AffectedValues.java
index 681eb9e..2258b27 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AffectedValues.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AffectedValues.java
@@ -51,6 +51,16 @@
     }
   }
 
+  public void propagateWithAssumeRemoval(
+      AppView<?> appView, IRCode code, Consumer<TypeAnalysis> typeAnalysisConsumer) {
+    if (hasNext()) {
+      TypeAnalysis typeAnalysis = new TypeAnalysis(appView, code);
+      typeAnalysisConsumer.accept(typeAnalysis);
+      typeAnalysis.propagateWithAssumeRemoval(this);
+      clear();
+    }
+  }
+
   public void widening(AppView<?> appView, IRCode code) {
     if (hasNext()) {
       new TypeAnalysis(appView, code).widening(this);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index 8f61ce7..a9a29a2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -17,6 +17,7 @@
 import com.android.tools.r8.graph.FieldResolutionResult.SingleFieldResolutionResult;
 import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.InvokeType;
 import com.android.tools.r8.ir.optimize.Inliner.Constraint;
 import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
@@ -244,7 +245,15 @@
     return ConstraintWithTarget.ALWAYS;
   }
 
-  public ConstraintWithTarget forReturn() {
+  public ConstraintWithTarget forReturn(TypeElement returnType, ProgramMethod context) {
+    // If the return value is not an instance of the static return type, then do not inline.
+    if (returnType.lessThanOrEqual(context.getReturnType().toTypeElement(appView), appView)) {
+      return ConstraintWithTarget.ALWAYS;
+    }
+    return ConstraintWithTarget.NEVER;
+  }
+
+  public ConstraintWithTarget forReturnVoid() {
     return ConstraintWithTarget.ALWAYS;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
index 4e3bf9c..de4b6c8 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
@@ -6,29 +6,25 @@
 
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DebugLocalInfo;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.CatchHandlers;
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.DexSourceCode;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.SourceCode;
+import com.android.tools.r8.utils.ArrayUtils;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 
+@Deprecated
 public abstract class SyntheticSourceCode implements SourceCode {
+
   protected final static Predicate<IRBuilder> doesNotEndBlock = x -> false;
   protected final static Predicate<IRBuilder> endsBlock = x -> true;
 
-  // TODO(b/146124603): Remove these fields as optimizations (e.g., merging) could invalidate them.
-  protected final DexType receiver;
-  protected final DexMethod method;
-  protected final DexProto proto;
-
   // The next free register, note that we always
   // assign each value a new (next available) register.
   private int nextRegister = 0;
@@ -43,22 +39,15 @@
 
   private final Position position;
 
-  protected SyntheticSourceCode(DexType receiver, DexMethod method, Position position) {
-    assert method != null;
-    this.receiver = receiver;
-    this.method = method;
-    this.proto = method.proto;
+  protected SyntheticSourceCode(ProgramMethod method, Position position) {
     this.position = position;
 
     // Initialize register values for receiver and arguments
-    this.receiverRegister = receiver != null ? nextRegister(ValueType.OBJECT) : -1;
-
-    DexType[] params = proto.parameters.values;
-    int paramCount = params.length;
-    this.paramRegisters = new int[paramCount];
-    for (int i = 0; i < paramCount; i++) {
-      this.paramRegisters[i] = nextRegister(ValueType.fromDexType(params[i]));
-    }
+    this.receiverRegister = nextRegister(ValueType.OBJECT);
+    this.paramRegisters =
+        ArrayUtils.initialize(
+            new int[method.getParameters().size()],
+            i -> nextRegister(ValueType.fromDexType(method.getParameter(i))));
   }
 
   protected final void add(Consumer<IRBuilder> constructor) {
@@ -77,7 +66,6 @@
   }
 
   protected final int getReceiverRegister() {
-    assert receiver != null;
     assert receiverRegister >= 0;
     return receiverRegister;
   }
diff --git a/src/main/java/com/android/tools/r8/utils/ArrayUtils.java b/src/main/java/com/android/tools/r8/utils/ArrayUtils.java
index 0e57243..8dbaecf 100644
--- a/src/main/java/com/android/tools/r8/utils/ArrayUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ArrayUtils.java
@@ -14,6 +14,7 @@
 import java.util.function.Function;
 import java.util.function.IntFunction;
 import java.util.function.IntPredicate;
+import java.util.function.IntUnaryOperator;
 import java.util.function.Predicate;
 
 public class ArrayUtils {
@@ -70,6 +71,13 @@
     return array;
   }
 
+  public static int[] initialize(int[] array, IntUnaryOperator fn) {
+    for (int i = 0; i < array.length; i++) {
+      array[i] = fn.applyAsInt(i);
+    }
+    return array;
+  }
+
   public static <T> T[] initialize(T[] array, IntFunction<T> fn) {
     for (int i = 0; i < array.length; i++) {
       array[i] = fn.apply(i);
diff --git a/src/test/bootstrap/com/android/tools/r8/bootstrap/RetraceStackTraceFunctionalCompositionTest.java b/src/test/bootstrap/com/android/tools/r8/bootstrap/RetraceStackTraceFunctionalCompositionTest.java
index 7fcb455..35f157d 100644
--- a/src/test/bootstrap/com/android/tools/r8/bootstrap/RetraceStackTraceFunctionalCompositionTest.java
+++ b/src/test/bootstrap/com/android/tools/r8/bootstrap/RetraceStackTraceFunctionalCompositionTest.java
@@ -16,7 +16,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.dex.Marker.Backend;
 import com.android.tools.r8.retrace.ProguardMapProducer;
 import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.Retrace;
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsCollection.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsCollection.java
index a960739..14b10f4 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsCollection.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsCollection.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.benchmarks;
 
-import com.android.tools.r8.benchmarks.BenchmarkRunner.ResultMode;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java
index fc6540e..e0bb9f193 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.benchmarks;
 
-import com.android.tools.r8.benchmarks.BenchmarkRunner.ResultMode;
 import it.unimi.dsi.fastutil.longs.LongArrayList;
 import it.unimi.dsi.fastutil.longs.LongList;
 import java.util.Set;
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsWarmup.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsWarmup.java
index 86b1dc4..2ac97a6 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsWarmup.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsWarmup.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.benchmarks;
 
-import com.android.tools.r8.benchmarks.BenchmarkRunner.ResultMode;
 import it.unimi.dsi.fastutil.longs.LongArrayList;
 import it.unimi.dsi.fastutil.longs.LongList;
 
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkRunner.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkRunner.java
index f210e18..2fed6dc 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkRunner.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkRunner.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.benchmarks;
 
-import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.benchmarks.BenchmarkResults.ResultMode;
 
 public class BenchmarkRunner {
 
@@ -11,20 +11,10 @@
     void run(BenchmarkResults results) throws Exception;
   }
 
-  public enum ResultMode {
-    AVERAGE,
-    SUM;
-
-    @Override
-    public String toString() {
-      return StringUtils.toLowerCase(name());
-    }
-  }
-
   private final BenchmarkConfig config;
   private int warmups = 0;
   private int iterations = 1;
-  private ResultMode resultMode = ResultMode.AVERAGE;
+  private ResultMode resultMode = BenchmarkResults.ResultMode.AVERAGE;
 
   private BenchmarkRunner(BenchmarkConfig config) {
     this.config = config;
@@ -45,12 +35,12 @@
   }
 
   public BenchmarkRunner reportResultAverage() {
-    resultMode = ResultMode.AVERAGE;
+    resultMode = BenchmarkResults.ResultMode.AVERAGE;
     return this;
   }
 
   public BenchmarkRunner reportResultSum() {
-    resultMode = ResultMode.SUM;
+    resultMode = BenchmarkResults.ResultMode.SUM;
     return this;
   }
 
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinStdLibCompilationTest.java b/src/test/java/com/android/tools/r8/debug/KotlinStdLibCompilationTest.java
index 0939bd2..19d0631 100644
--- a/src/test/java/com/android/tools/r8/debug/KotlinStdLibCompilationTest.java
+++ b/src/test/java/com/android/tools/r8/debug/KotlinStdLibCompilationTest.java
@@ -58,11 +58,12 @@
               if (kotlinTestParameters.isNewerThanOrEqualTo(KotlinCompilerVersion.KOTLINC_1_8_0)
                   && parameters.isDexRuntime()
                   && parameters.getApiLevel().isLessThan(AndroidApiLevel.N)) {
-                // Kotlin stdlib has references to classes introduced at API level 24.
+                // Kotlin stdlib has references to classes introduced in API level 24 and
+                // java.lang.AutoCloseable introduced in API level 19.
                 diagnostics.assertWarningsCount(
                     kotlinTestParameters.isOlderThanOrEqualTo(KotlinCompilerVersion.KOTLINC_1_9_21)
                         ? 2
-                        : 3);
+                        : (parameters.getApiLevel().isLessThan(AndroidApiLevel.K)) ? 4 : 3);
                 diagnostics.assertAllWarningsMatch(
                     DiagnosticsMatcher.diagnosticType(InterfaceDesugarMissingTypeDiagnostic.class));
               } else {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedByteReturnPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedByteReturnPropagationTest.java
index 3043c57..a9f0afe 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedByteReturnPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedByteReturnPropagationTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.optimize.boxedprimitives.BoxedBooleanReturnPropagationTest.Main;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedCharacterReturnPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedCharacterReturnPropagationTest.java
index 6542212..cca4303 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedCharacterReturnPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedCharacterReturnPropagationTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.optimize.boxedprimitives.BoxedByteReturnPropagationTest.Main;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedDoubleReturnPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedDoubleReturnPropagationTest.java
index a383a2d..c3944d5 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedDoubleReturnPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedDoubleReturnPropagationTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.optimize.boxedprimitives.BoxedCharacterReturnPropagationTest.Main;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedFloatReturnPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedFloatReturnPropagationTest.java
index ca68794..2b7ba63 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedFloatReturnPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedFloatReturnPropagationTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.optimize.boxedprimitives.BoxedCharacterReturnPropagationTest.Main;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedIntegerReturnPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedIntegerReturnPropagationTest.java
index 0f205ea..bc39ab8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedIntegerReturnPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedIntegerReturnPropagationTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.optimize.boxedprimitives.BoxedCharacterReturnPropagationTest.Main;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedLongReturnPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedLongReturnPropagationTest.java
index e588489..53aebf8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedLongReturnPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedLongReturnPropagationTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.optimize.boxedprimitives.BoxedCharacterReturnPropagationTest.Main;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedShortReturnPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedShortReturnPropagationTest.java
index 3c8b0b8..fecac90 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedShortReturnPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedShortReturnPropagationTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.optimize.boxedprimitives.BoxedCharacterReturnPropagationTest.Main;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java
index 74aed3a..c4c57c0 100644
--- a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java
@@ -9,6 +9,7 @@
 import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 
+import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
 import com.android.tools.r8.KotlinTestBase;
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
@@ -66,9 +67,16 @@
     // Get the Kotlin lambdas in the input.
     KotlinLambdasInInput lambdasInInput =
         KotlinLambdasInInput.create(getProgramFiles(), getTestName());
-    assertEquals(2, lambdasInInput.getNumberOfJStyleLambdas());
     assertEquals(
-        kotlinParameters.getLambdaGeneration().isInvokeDynamic() ? 6 : 7,
+        kotlinParameters.getLambdaGeneration().isInvokeDynamic()
+                && kotlinParameters.getCompilerVersion() == KotlinCompilerVersion.KOTLIN_DEV
+            ? 8
+            : 2,
+        lambdasInInput.getNumberOfJStyleLambdas());
+    assertEquals(
+        kotlinParameters.getLambdaGeneration().isInvokeDynamic()
+            ? (kotlinParameters.getCompilerVersion() == KotlinCompilerVersion.KOTLIN_DEV ? 0 : 6)
+            : 7,
         lambdasInInput.getNumberOfKStyleLambdas());
 
     testForR8(parameters.getBackend())
@@ -90,7 +98,13 @@
   private void inspect(
       HorizontallyMergedClassesInspector inspector, KotlinLambdasInInput lambdasInInput) {
     // All J-style Kotlin lambdas should be merged into one class.
-    inspector.assertIsCompleteMergeGroup(lambdasInInput.getJStyleLambdas());
+    if (kotlinParameters
+        .getCompilerVersion()
+        .isLessThanOrEqualTo(KotlinCompilerVersion.KOTLINC_1_9_21)) {
+      inspector.assertIsCompleteMergeGroup(lambdasInInput.getJStyleLambdas());
+    } else {
+      assertEquals(4, inspector.getMergeGroups().size());
+    }
 
     // The remaining lambdas are not merged.
     inspector.assertClassReferencesNotMerged(lambdasInInput.getKStyleLambdas());
diff --git a/src/test/java/com/android/tools/r8/repackage/MappingFileAfterRepackagingTest.java b/src/test/java/com/android/tools/r8/repackage/MappingFileAfterRepackagingTest.java
new file mode 100644
index 0000000..9290be4
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/repackage/MappingFileAfterRepackagingTest.java
@@ -0,0 +1,90 @@
+// Copyright (c) 2024, 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.repackage;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.StringUtils;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Reproduction of b/328837166. */
+@RunWith(Parameterized.class)
+public class MappingFileAfterRepackagingTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameter(1)
+  public boolean repackage;
+
+  @Parameters(name = "{0}, repackage: {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
+  }
+
+  @Test
+  public void test() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(Main.class)
+        .addHorizontallyMergedClassesInspector(
+            inspector -> inspector.assertIsCompleteMergeGroup(A.class, B.class))
+        .applyIf(repackage, testBuilder -> testBuilder.addKeepRules("-repackageclasses"))
+        .enableInliningAnnotations()
+        .setMinApi(parameters)
+        .compile()
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("A")
+        .apply(
+            runResult -> {
+              long syntheticMatches =
+                  StringUtils.splitLines(runResult.proguardMap()).stream()
+                      .filter(
+                          line ->
+                              line.contains(
+                                  "java.lang.String MappingFileAfterRepackagingTest$A.toString()"))
+                      .count();
+              assertEquals(repackage ? 2 : 0, syntheticMatches);
+
+              long unqualifiedMatches =
+                  StringUtils.splitLines(runResult.proguardMap()).stream()
+                      .filter(line -> line.contains("java.lang.String toString()"))
+                      .count();
+              assertEquals(repackage ? 1 : 3, unqualifiedMatches);
+            });
+  }
+
+  static class Main {
+
+    public static void main(String[] args) {
+      System.out.println((System.currentTimeMillis() > 0 ? new A() : new B()));
+    }
+  }
+
+  public static class A {
+
+    @NeverInline
+    public String toString() {
+      System.out.print("");
+      return "A";
+    }
+  }
+
+  static class B {
+
+    public String toString() {
+      return "B";
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayOfConstClassArraysTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayOfConstClassArraysTest.java
index b37c8a2..d2afb69 100644
--- a/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayOfConstClassArraysTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayOfConstClassArraysTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.rewrite.arrays.ConstClassArrayWithUniqueValuesTest.TestClass;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayOfStringArraysTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayOfStringArraysTest.java
index d238b1a..5aaed9c 100644
--- a/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayOfStringArraysTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayOfStringArraysTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.rewrite.arrays.ArrayOfConstClassArraysTest.TestClass;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
diff --git a/src/test/java/com/android/tools/r8/AlwaysClassInline.java b/src/test/testbase/java/com/android/tools/r8/AlwaysClassInline.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/AlwaysClassInline.java
rename to src/test/testbase/java/com/android/tools/r8/AlwaysClassInline.java
diff --git a/src/test/java/com/android/tools/r8/AlwaysInline.java b/src/test/testbase/java/com/android/tools/r8/AlwaysInline.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/AlwaysInline.java
rename to src/test/testbase/java/com/android/tools/r8/AlwaysInline.java
diff --git a/src/test/java/com/android/tools/r8/AsmTestBase.java b/src/test/testbase/java/com/android/tools/r8/AsmTestBase.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/AsmTestBase.java
rename to src/test/testbase/java/com/android/tools/r8/AsmTestBase.java
diff --git a/src/test/java/com/android/tools/r8/AssumeMayHaveSideEffects.java b/src/test/testbase/java/com/android/tools/r8/AssumeMayHaveSideEffects.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/AssumeMayHaveSideEffects.java
rename to src/test/testbase/java/com/android/tools/r8/AssumeMayHaveSideEffects.java
diff --git a/src/test/java/com/android/tools/r8/AssumeNoClassInitializationSideEffects.java b/src/test/testbase/java/com/android/tools/r8/AssumeNoClassInitializationSideEffects.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/AssumeNoClassInitializationSideEffects.java
rename to src/test/testbase/java/com/android/tools/r8/AssumeNoClassInitializationSideEffects.java
diff --git a/src/test/java/com/android/tools/r8/AssumeNoSideEffects.java b/src/test/testbase/java/com/android/tools/r8/AssumeNoSideEffects.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/AssumeNoSideEffects.java
rename to src/test/testbase/java/com/android/tools/r8/AssumeNoSideEffects.java
diff --git a/src/test/java/com/android/tools/r8/AssumeNotNull.java b/src/test/testbase/java/com/android/tools/r8/AssumeNotNull.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/AssumeNotNull.java
rename to src/test/testbase/java/com/android/tools/r8/AssumeNotNull.java
diff --git a/src/test/java/com/android/tools/r8/CheckEnumUnboxed.java b/src/test/testbase/java/com/android/tools/r8/CheckEnumUnboxed.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/CheckEnumUnboxed.java
rename to src/test/testbase/java/com/android/tools/r8/CheckEnumUnboxed.java
diff --git a/src/test/java/com/android/tools/r8/CollectorsUtils.java b/src/test/testbase/java/com/android/tools/r8/CollectorsUtils.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/CollectorsUtils.java
rename to src/test/testbase/java/com/android/tools/r8/CollectorsUtils.java
diff --git a/src/test/java/com/android/tools/r8/D8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/D8TestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/D8TestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/D8TestCompileResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/D8TestCompileResult.java
rename to src/test/testbase/java/com/android/tools/r8/D8TestCompileResult.java
diff --git a/src/test/java/com/android/tools/r8/D8TestRunResult.java b/src/test/testbase/java/com/android/tools/r8/D8TestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/D8TestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/D8TestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/DXTestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/DXTestCompileResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/DXTestCompileResult.java
rename to src/test/testbase/java/com/android/tools/r8/DXTestCompileResult.java
diff --git a/src/test/java/com/android/tools/r8/DXTestRunResult.java b/src/test/testbase/java/com/android/tools/r8/DXTestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/DXTestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/DXTestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/DesugarTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/DesugarTestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/DesugarTestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/DesugarTestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/DesugarTestConfiguration.java b/src/test/testbase/java/com/android/tools/r8/DesugarTestConfiguration.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/DesugarTestConfiguration.java
rename to src/test/testbase/java/com/android/tools/r8/DesugarTestConfiguration.java
diff --git a/src/test/java/com/android/tools/r8/DesugarTestRunResult.java b/src/test/testbase/java/com/android/tools/r8/DesugarTestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/DesugarTestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/DesugarTestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/DeviceRunner.java b/src/test/testbase/java/com/android/tools/r8/DeviceRunner.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/DeviceRunner.java
rename to src/test/testbase/java/com/android/tools/r8/DeviceRunner.java
diff --git a/src/test/java/com/android/tools/r8/Dex2OatTestRunResult.java b/src/test/testbase/java/com/android/tools/r8/Dex2OatTestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/Dex2OatTestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/Dex2OatTestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/DiagnosticsChecker.java b/src/test/testbase/java/com/android/tools/r8/DiagnosticsChecker.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/DiagnosticsChecker.java
rename to src/test/testbase/java/com/android/tools/r8/DiagnosticsChecker.java
diff --git a/src/test/java/com/android/tools/r8/DiagnosticsMatcher.java b/src/test/testbase/java/com/android/tools/r8/DiagnosticsMatcher.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/DiagnosticsMatcher.java
rename to src/test/testbase/java/com/android/tools/r8/DiagnosticsMatcher.java
diff --git a/src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/ExternalR8TestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/ExternalR8TestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/ExternalR8TestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/ExternalR8TestCompileResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ExternalR8TestCompileResult.java
rename to src/test/testbase/java/com/android/tools/r8/ExternalR8TestCompileResult.java
diff --git a/src/test/java/com/android/tools/r8/ExternalR8TestRunResult.java b/src/test/testbase/java/com/android/tools/r8/ExternalR8TestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ExternalR8TestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/ExternalR8TestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java b/src/test/testbase/java/com/android/tools/r8/GenerateMainDexListResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/GenerateMainDexListResult.java
rename to src/test/testbase/java/com/android/tools/r8/GenerateMainDexListResult.java
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java b/src/test/testbase/java/com/android/tools/r8/GenerateMainDexListRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/GenerateMainDexListRunResult.java
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/IntermediateCfD8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/IntermediateCfD8TestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/IntermediateCfD8TestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/IntermediateCfD8TestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/JavaCompilerTool.java b/src/test/testbase/java/com/android/tools/r8/JavaCompilerTool.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/JavaCompilerTool.java
rename to src/test/testbase/java/com/android/tools/r8/JavaCompilerTool.java
diff --git a/src/test/java/com/android/tools/r8/Jdk9TestUtils.java b/src/test/testbase/java/com/android/tools/r8/Jdk9TestUtils.java
similarity index 76%
rename from src/test/java/com/android/tools/r8/Jdk9TestUtils.java
rename to src/test/testbase/java/com/android/tools/r8/Jdk9TestUtils.java
index 8b6bfbb..302927b 100644
--- a/src/test/java/com/android/tools/r8/Jdk9TestUtils.java
+++ b/src/test/testbase/java/com/android/tools/r8/Jdk9TestUtils.java
@@ -6,13 +6,14 @@
 
 import static com.android.tools.r8.desugar.LibraryFilesHelper.getJdk9LibraryFiles;
 
+import com.android.tools.r8.desugar.LibraryFilesHelper;
 import org.junit.rules.TemporaryFolder;
 
 public class Jdk9TestUtils {
 
   public static ThrowableConsumer<R8FullTestBuilder> addJdk9LibraryFiles(
       TemporaryFolder temporaryFolder) {
-    return builder -> builder.addLibraryFiles(getJdk9LibraryFiles(temporaryFolder));
+    return builder -> builder.addLibraryFiles(LibraryFilesHelper.getJdk9LibraryFiles(temporaryFolder));
   }
 
 }
diff --git a/src/test/java/com/android/tools/r8/JvmTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/JvmTestBuilder.java
similarity index 97%
rename from src/test/java/com/android/tools/r8/JvmTestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/JvmTestBuilder.java
index f919181..0423904 100644
--- a/src/test/java/com/android/tools/r8/JvmTestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/JvmTestBuilder.java
@@ -5,6 +5,7 @@
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.debug.CfDebugTestConfig;
+import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.testing.AndroidBuildVersion;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -152,7 +153,8 @@
   }
 
   public JvmTestBuilder addTestClasspath() {
-    return addClasspath(ToolHelper.getClassPathForTests());
+    return addClasspath(ToolHelper.getClassPathForTests())
+        .addClasspath(ToolHelper.getTestBaseclassPath());
   }
 
   public JvmTestBuilder enablePreview() {
diff --git a/src/test/java/com/android/tools/r8/JvmTestRunResult.java b/src/test/testbase/java/com/android/tools/r8/JvmTestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/JvmTestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/JvmTestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/Keep.java b/src/test/testbase/java/com/android/tools/r8/Keep.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/Keep.java
rename to src/test/testbase/java/com/android/tools/r8/Keep.java
diff --git a/src/test/java/com/android/tools/r8/KeepConstantArguments.java b/src/test/testbase/java/com/android/tools/r8/KeepConstantArguments.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/KeepConstantArguments.java
rename to src/test/testbase/java/com/android/tools/r8/KeepConstantArguments.java
diff --git a/src/test/java/com/android/tools/r8/KeepUnusedArguments.java b/src/test/testbase/java/com/android/tools/r8/KeepUnusedArguments.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/KeepUnusedArguments.java
rename to src/test/testbase/java/com/android/tools/r8/KeepUnusedArguments.java
diff --git a/src/test/java/com/android/tools/r8/KeepUnusedReturnValue.java b/src/test/testbase/java/com/android/tools/r8/KeepUnusedReturnValue.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/KeepUnusedReturnValue.java
rename to src/test/testbase/java/com/android/tools/r8/KeepUnusedReturnValue.java
diff --git a/src/test/java/com/android/tools/r8/KotlinCompilerTool.java b/src/test/testbase/java/com/android/tools/r8/KotlinCompilerTool.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/KotlinCompilerTool.java
rename to src/test/testbase/java/com/android/tools/r8/KotlinCompilerTool.java
diff --git a/src/test/java/com/android/tools/r8/KotlinTestBase.java b/src/test/testbase/java/com/android/tools/r8/KotlinTestBase.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/KotlinTestBase.java
rename to src/test/testbase/java/com/android/tools/r8/KotlinTestBase.java
diff --git a/src/test/java/com/android/tools/r8/KotlinTestParameters.java b/src/test/testbase/java/com/android/tools/r8/KotlinTestParameters.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/KotlinTestParameters.java
rename to src/test/testbase/java/com/android/tools/r8/KotlinTestParameters.java
diff --git a/src/test/java/com/android/tools/r8/KotlinTestParametersCollection.java b/src/test/testbase/java/com/android/tools/r8/KotlinTestParametersCollection.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/KotlinTestParametersCollection.java
rename to src/test/testbase/java/com/android/tools/r8/KotlinTestParametersCollection.java
diff --git a/src/test/java/com/android/tools/r8/L8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/L8TestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/L8TestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/L8TestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/L8TestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/L8TestCompileResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/L8TestCompileResult.java
rename to src/test/testbase/java/com/android/tools/r8/L8TestCompileResult.java
diff --git a/src/test/java/com/android/tools/r8/L8TestRunResult.java b/src/test/testbase/java/com/android/tools/r8/L8TestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/L8TestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/L8TestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/LibraryDesugaringTestConfiguration.java b/src/test/testbase/java/com/android/tools/r8/LibraryDesugaringTestConfiguration.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/LibraryDesugaringTestConfiguration.java
rename to src/test/testbase/java/com/android/tools/r8/LibraryDesugaringTestConfiguration.java
diff --git a/src/test/java/com/android/tools/r8/MarkerMatcher.java b/src/test/testbase/java/com/android/tools/r8/MarkerMatcher.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/MarkerMatcher.java
rename to src/test/testbase/java/com/android/tools/r8/MarkerMatcher.java
diff --git a/src/test/java/com/android/tools/r8/NeverClassInline.java b/src/test/testbase/java/com/android/tools/r8/NeverClassInline.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NeverClassInline.java
rename to src/test/testbase/java/com/android/tools/r8/NeverClassInline.java
diff --git a/src/test/java/com/android/tools/r8/NeverInline.java b/src/test/testbase/java/com/android/tools/r8/NeverInline.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NeverInline.java
rename to src/test/testbase/java/com/android/tools/r8/NeverInline.java
diff --git a/src/test/java/com/android/tools/r8/NeverPropagateValue.java b/src/test/testbase/java/com/android/tools/r8/NeverPropagateValue.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NeverPropagateValue.java
rename to src/test/testbase/java/com/android/tools/r8/NeverPropagateValue.java
diff --git a/src/test/java/com/android/tools/r8/NeverReprocessClassInitializer.java b/src/test/testbase/java/com/android/tools/r8/NeverReprocessClassInitializer.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NeverReprocessClassInitializer.java
rename to src/test/testbase/java/com/android/tools/r8/NeverReprocessClassInitializer.java
diff --git a/src/test/java/com/android/tools/r8/NeverReprocessMethod.java b/src/test/testbase/java/com/android/tools/r8/NeverReprocessMethod.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NeverReprocessMethod.java
rename to src/test/testbase/java/com/android/tools/r8/NeverReprocessMethod.java
diff --git a/src/test/java/com/android/tools/r8/NeverSingleCallerInline.java b/src/test/testbase/java/com/android/tools/r8/NeverSingleCallerInline.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NeverSingleCallerInline.java
rename to src/test/testbase/java/com/android/tools/r8/NeverSingleCallerInline.java
diff --git a/src/test/java/com/android/tools/r8/NoAccessModification.java b/src/test/testbase/java/com/android/tools/r8/NoAccessModification.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoAccessModification.java
rename to src/test/testbase/java/com/android/tools/r8/NoAccessModification.java
diff --git a/src/test/java/com/android/tools/r8/NoFieldTypeStrengthening.java b/src/test/testbase/java/com/android/tools/r8/NoFieldTypeStrengthening.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoFieldTypeStrengthening.java
rename to src/test/testbase/java/com/android/tools/r8/NoFieldTypeStrengthening.java
diff --git a/src/test/java/com/android/tools/r8/NoHorizontalClassMerging.java b/src/test/testbase/java/com/android/tools/r8/NoHorizontalClassMerging.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoHorizontalClassMerging.java
rename to src/test/testbase/java/com/android/tools/r8/NoHorizontalClassMerging.java
diff --git a/src/test/java/com/android/tools/r8/NoInliningOfDefaultInitializer.java b/src/test/testbase/java/com/android/tools/r8/NoInliningOfDefaultInitializer.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoInliningOfDefaultInitializer.java
rename to src/test/testbase/java/com/android/tools/r8/NoInliningOfDefaultInitializer.java
diff --git a/src/test/java/com/android/tools/r8/NoMethodStaticizing.java b/src/test/testbase/java/com/android/tools/r8/NoMethodStaticizing.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoMethodStaticizing.java
rename to src/test/testbase/java/com/android/tools/r8/NoMethodStaticizing.java
diff --git a/src/test/java/com/android/tools/r8/NoParameterReordering.java b/src/test/testbase/java/com/android/tools/r8/NoParameterReordering.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoParameterReordering.java
rename to src/test/testbase/java/com/android/tools/r8/NoParameterReordering.java
diff --git a/src/test/java/com/android/tools/r8/NoParameterTypeStrengthening.java b/src/test/testbase/java/com/android/tools/r8/NoParameterTypeStrengthening.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoParameterTypeStrengthening.java
rename to src/test/testbase/java/com/android/tools/r8/NoParameterTypeStrengthening.java
diff --git a/src/test/java/com/android/tools/r8/NoRedundantFieldLoadElimination.java b/src/test/testbase/java/com/android/tools/r8/NoRedundantFieldLoadElimination.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoRedundantFieldLoadElimination.java
rename to src/test/testbase/java/com/android/tools/r8/NoRedundantFieldLoadElimination.java
diff --git a/src/test/java/com/android/tools/r8/NoReturnTypeStrengthening.java b/src/test/testbase/java/com/android/tools/r8/NoReturnTypeStrengthening.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoReturnTypeStrengthening.java
rename to src/test/testbase/java/com/android/tools/r8/NoReturnTypeStrengthening.java
diff --git a/src/test/java/com/android/tools/r8/NoUnusedInterfaceRemoval.java b/src/test/testbase/java/com/android/tools/r8/NoUnusedInterfaceRemoval.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoUnusedInterfaceRemoval.java
rename to src/test/testbase/java/com/android/tools/r8/NoUnusedInterfaceRemoval.java
diff --git a/src/test/java/com/android/tools/r8/NoVerticalClassMerging.java b/src/test/testbase/java/com/android/tools/r8/NoVerticalClassMerging.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/NoVerticalClassMerging.java
rename to src/test/testbase/java/com/android/tools/r8/NoVerticalClassMerging.java
diff --git a/src/test/java/com/android/tools/r8/OriginMatcher.java b/src/test/testbase/java/com/android/tools/r8/OriginMatcher.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/OriginMatcher.java
rename to src/test/testbase/java/com/android/tools/r8/OriginMatcher.java
diff --git a/src/test/java/com/android/tools/r8/PositionMatcher.java b/src/test/testbase/java/com/android/tools/r8/PositionMatcher.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/PositionMatcher.java
rename to src/test/testbase/java/com/android/tools/r8/PositionMatcher.java
diff --git a/src/test/java/com/android/tools/r8/ProguardTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/ProguardTestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ProguardTestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/ProguardTestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/ProguardTestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/ProguardTestCompileResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ProguardTestCompileResult.java
rename to src/test/testbase/java/com/android/tools/r8/ProguardTestCompileResult.java
diff --git a/src/test/java/com/android/tools/r8/ProguardTestRunResult.java b/src/test/testbase/java/com/android/tools/r8/ProguardTestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ProguardTestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/ProguardTestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/ProguardVersion.java b/src/test/testbase/java/com/android/tools/r8/ProguardVersion.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ProguardVersion.java
rename to src/test/testbase/java/com/android/tools/r8/ProguardVersion.java
diff --git a/src/test/java/com/android/tools/r8/R8CompatTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8CompatTestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/R8CompatTestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/R8CompatTestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/R8FullTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8FullTestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/R8FullTestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/R8FullTestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/testbase/java/com/android/tools/r8/R8RunArtTestsTest.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
rename to src/test/testbase/java/com/android/tools/r8/R8RunArtTestsTest.java
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
similarity index 97%
rename from src/test/java/com/android/tools/r8/R8TestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
index 5184c82..a9c431a 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.androidresources.AndroidResourceTestingUtils.AndroidTestResource;
 import com.android.tools.r8.benchmarks.BenchmarkResults;
+import com.android.tools.r8.dexsplitter.SplitterTestBase;
 import com.android.tools.r8.dexsplitter.SplitterTestBase.RunInterface;
 import com.android.tools.r8.dexsplitter.SplitterTestBase.SplitRunner;
 import com.android.tools.r8.errors.Unreachable;
@@ -44,6 +45,7 @@
 import com.android.tools.r8.utils.Pair;
 import com.android.tools.r8.utils.SemanticVersion;
 import com.android.tools.r8.utils.SourceFileTemplateProvider;
+import com.android.tools.r8.utils.codeinspector.Matchers;
 import java.io.IOException;
 import java.lang.annotation.Annotation;
 import java.nio.file.Path;
@@ -172,7 +174,7 @@
       case NONE:
         if (allowUnusedProguardConfigurationRules) {
           compileResult
-              .assertAllInfosMatch(proguardConfigurationRuleDoesNotMatch())
+              .assertAllInfosMatch(Matchers.proguardConfigurationRuleDoesNotMatch())
               .assertNoErrorMessages()
               .assertNoWarningMessages();
         } else {
@@ -186,9 +188,9 @@
         throw new Unreachable();
     }
     if (allowUnusedProguardConfigurationRules) {
-      compileResult.assertInfoThatMatches(proguardConfigurationRuleDoesNotMatch());
+      compileResult.assertInfoThatMatches(Matchers.proguardConfigurationRuleDoesNotMatch());
     } else {
-      compileResult.assertNoInfoThatMatches(proguardConfigurationRuleDoesNotMatch());
+      compileResult.assertNoInfoThatMatches(Matchers.proguardConfigurationRuleDoesNotMatch());
     }
     return compileResult;
   }
@@ -855,7 +857,7 @@
   public T addFeatureSplit(Class<?>... classes) throws IOException {
     Path path = getState().getNewTempFile("feature.zip");
     builder.addFeatureSplit(
-        builder -> simpleSplitProvider(builder, path, getState().getTempFolder(), classes));
+        builder -> SplitterTestBase.simpleSplitProvider(builder, path, getState().getTempFolder(), classes));
     features.add(path);
     return self();
   }
@@ -865,7 +867,7 @@
     Path path = getState().getNewTempFolder().resolve("feature.zip");
     builder.addFeatureSplit(
         builder ->
-            splitWithNonJavaFile(builder, path, getState().getTempFolder(), nonJavaFiles, classes));
+            SplitterTestBase.splitWithNonJavaFile(builder, path, getState().getTempFolder(), nonJavaFiles, classes));
     features.add(path);
     return self();
   }
diff --git a/src/test/java/com/android/tools/r8/R8TestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/R8TestCompileResult.java
similarity index 97%
rename from src/test/java/com/android/tools/r8/R8TestCompileResult.java
rename to src/test/testbase/java/com/android/tools/r8/R8TestCompileResult.java
index 336eb75..9b51098 100644
--- a/src/test/java/com/android/tools/r8/R8TestCompileResult.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8TestCompileResult.java
@@ -25,6 +25,7 @@
 import com.android.tools.r8.utils.ZipUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.Matchers;
 import com.android.tools.r8.utils.graphinspector.GraphInspector;
 import java.io.IOException;
 import java.io.UncheckedIOException;
@@ -238,18 +239,18 @@
       throws IOException {
     assert getBackend() == runtime.getBackend();
     ClassSubject mainClassSubject = inspector().clazz(SplitRunner.class);
-    assertThat("Did you forget a keep rule for the main method?", mainClassSubject, isPresent());
+    assertThat("Did you forget a keep rule for the main method?", mainClassSubject, Matchers.isPresent());
     assertThat(
         "Did you forget a keep rule for the main method?",
         mainClassSubject.mainMethod(),
-        isPresent());
+        Matchers.isPresent());
     ClassSubject mainFeatureClassSubject = featureInspector(feature).clazz(mainFeatureClass);
     assertThat(
-        "Did you forget a keep rule for the run method?", mainFeatureClassSubject, isPresent());
+        "Did you forget a keep rule for the run method?", mainFeatureClassSubject, Matchers.isPresent());
     assertThat(
         "Did you forget a keep rule for the run method?",
         mainFeatureClassSubject.uniqueMethodWithOriginalName("run"),
-        isPresent());
+        Matchers.isPresent());
     String[] args = new String[2 + featureDependencies.length];
     args[0] = mainFeatureClassSubject.getFinalName();
     args[1] = feature.toString();
diff --git a/src/test/java/com/android/tools/r8/R8TestRunResult.java b/src/test/testbase/java/com/android/tools/r8/R8TestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/R8TestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/R8TestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/RelocatorTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/RelocatorTestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/RelocatorTestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/RelocatorTestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/RelocatorTestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/RelocatorTestCompileResult.java
similarity index 89%
rename from src/test/java/com/android/tools/r8/RelocatorTestCompileResult.java
rename to src/test/testbase/java/com/android/tools/r8/RelocatorTestCompileResult.java
index 1f58f84..f3c624c 100644
--- a/src/test/java/com/android/tools/r8/RelocatorTestCompileResult.java
+++ b/src/test/testbase/java/com/android/tools/r8/RelocatorTestCompileResult.java
@@ -16,10 +16,12 @@
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
 import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.Matchers;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.concurrent.ExecutionException;
 import org.hamcrest.Matcher;
+import org.hamcrest.MatcherAssert;
 
 public class RelocatorTestCompileResult extends TestRunResult<RelocatorTestCompileResult> {
 
@@ -86,7 +88,7 @@
               String relocatedName =
                   newPrefix + clazz.getFinalName().substring(originalPrefix.length());
               ClassSubject relocatedClass = relocatedInspector.clazz(relocatedName);
-              assertThat(relocatedClass, isPresent());
+              MatcherAssert.assertThat(relocatedClass, Matchers.isPresent());
             }
           }
         });
@@ -97,13 +99,13 @@
     inspect(
         inspector -> {
           for (FoundClassSubject clazz : inspector.allClasses()) {
-            assertThat(clazz.getFinalSignatureAttribute(), not(containsString(originalPrefix)));
+            MatcherAssert.assertThat(clazz.getFinalSignatureAttribute(), not(containsString(originalPrefix)));
             for (FoundMethodSubject method : clazz.allMethods()) {
-              assertThat(
+              MatcherAssert.assertThat(
                   method.getJvmMethodSignatureAsString(), not(containsString(originalPrefix)));
             }
             for (FoundFieldSubject field : clazz.allFields()) {
-              assertThat(field.getJvmFieldSignatureAsString(), not(containsString(originalPrefix)));
+              MatcherAssert.assertThat(field.getJvmFieldSignatureAsString(), not(containsString(originalPrefix)));
             }
           }
         });
diff --git a/src/test/java/com/android/tools/r8/ReprocessClassInitializer.java b/src/test/testbase/java/com/android/tools/r8/ReprocessClassInitializer.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ReprocessClassInitializer.java
rename to src/test/testbase/java/com/android/tools/r8/ReprocessClassInitializer.java
diff --git a/src/test/java/com/android/tools/r8/ReprocessMethod.java b/src/test/testbase/java/com/android/tools/r8/ReprocessMethod.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ReprocessMethod.java
rename to src/test/testbase/java/com/android/tools/r8/ReprocessMethod.java
diff --git a/src/test/java/com/android/tools/r8/SingleTestRunResult.java b/src/test/testbase/java/com/android/tools/r8/SingleTestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/SingleTestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/SingleTestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/SoftVerificationErrorJarGenerator.java b/src/test/testbase/java/com/android/tools/r8/SoftVerificationErrorJarGenerator.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/SoftVerificationErrorJarGenerator.java
rename to src/test/testbase/java/com/android/tools/r8/SoftVerificationErrorJarGenerator.java
diff --git a/src/test/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java b/src/test/testbase/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java
similarity index 95%
rename from src/test/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java
rename to src/test/testbase/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java
index b345c16..df94fbc 100644
--- a/src/test/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java
+++ b/src/test/testbase/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java
@@ -20,9 +20,11 @@
 import com.android.tools.r8.utils.ZipUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.Matchers;
 import java.io.File;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import org.hamcrest.MatcherAssert;
 
 public class SoftVerificationErrorJarRunner extends TestBase {
 
@@ -108,11 +110,11 @@
             + (isOutlined ? "ApiCallerOutlined" : "ApiCallerInlined")
             + (numberOfClasses - 1);
     ClassSubject clazz = inspector.clazz(name);
-    assertThat(clazz, isPresent());
+    MatcherAssert.assertThat(clazz, Matchers.isPresent());
     if (isOutlined) {
       ClassSubject apiCallerInlined =
           inspector.clazz("com.example.softverificationsample.ApiCallerInlined");
-      assertThat(apiCallerInlined, isPresent());
+      MatcherAssert.assertThat(apiCallerInlined, Matchers.isPresent());
     }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/TestAppViewBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestAppViewBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestAppViewBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/TestAppViewBuilder.java
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/testbase/java/com/android/tools/r8/TestBase.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestBase.java
rename to src/test/testbase/java/com/android/tools/r8/TestBase.java
diff --git a/src/test/java/com/android/tools/r8/TestBaseBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestBaseBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestBaseBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/TestBaseBuilder.java
diff --git a/src/test/java/com/android/tools/r8/TestBaseResult.java b/src/test/testbase/java/com/android/tools/r8/TestBaseResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestBaseResult.java
rename to src/test/testbase/java/com/android/tools/r8/TestBaseResult.java
diff --git a/src/test/java/com/android/tools/r8/TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/TestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/TestBuilderCollection.java b/src/test/testbase/java/com/android/tools/r8/TestBuilderCollection.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestBuilderCollection.java
rename to src/test/testbase/java/com/android/tools/r8/TestBuilderCollection.java
diff --git a/src/test/java/com/android/tools/r8/TestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/TestCompileResult.java
similarity index 98%
rename from src/test/java/com/android/tools/r8/TestCompileResult.java
rename to src/test/testbase/java/com/android/tools/r8/TestCompileResult.java
index 9c29aa2..545a36e 100644
--- a/src/test/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestCompileResult.java
@@ -31,6 +31,7 @@
 import com.android.tools.r8.utils.TriFunction;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.Matchers;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ObjectArrays;
@@ -51,6 +52,7 @@
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.hamcrest.Matcher;
+import org.hamcrest.MatcherAssert;
 
 public abstract class TestCompileResult<
         CR extends TestCompileResult<CR, RR>, RR extends TestRunResult<RR>>
@@ -177,7 +179,7 @@
   public RR run(String mainClass) throws IOException {
     assert !libraryDesugaringTestConfiguration.isEnabled();
     ClassSubject mainClassSubject = inspector().clazz(mainClass);
-    assertThat(mainClassSubject, isPresent());
+    MatcherAssert.assertThat(mainClassSubject, Matchers.isPresent());
     switch (getBackend()) {
       case DEX:
         return runArt(
@@ -216,7 +218,7 @@
         }
       }
     }
-    assertThat("Did you forget a keep rule for the main method?", mainClassSubject, isPresent());
+    assertThat("Did you forget a keep rule for the main method?", mainClassSubject, Matchers.isPresent());
     if (runtime.isDex()) {
       return runArt(runtime, mainClassSubject.getFinalName(), args);
     }
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestCompilerBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java
diff --git a/src/test/java/com/android/tools/r8/TestCondition.java b/src/test/testbase/java/com/android/tools/r8/TestCondition.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestCondition.java
rename to src/test/testbase/java/com/android/tools/r8/TestCondition.java
diff --git a/src/test/java/com/android/tools/r8/TestDiagnostic.java b/src/test/testbase/java/com/android/tools/r8/TestDiagnostic.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestDiagnostic.java
rename to src/test/testbase/java/com/android/tools/r8/TestDiagnostic.java
diff --git a/src/test/java/com/android/tools/r8/TestDiagnosticMessages.java b/src/test/testbase/java/com/android/tools/r8/TestDiagnosticMessages.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestDiagnosticMessages.java
rename to src/test/testbase/java/com/android/tools/r8/TestDiagnosticMessages.java
diff --git a/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java b/src/test/testbase/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
rename to src/test/testbase/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
diff --git a/src/test/java/com/android/tools/r8/TestParameters.java b/src/test/testbase/java/com/android/tools/r8/TestParameters.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestParameters.java
rename to src/test/testbase/java/com/android/tools/r8/TestParameters.java
diff --git a/src/test/java/com/android/tools/r8/TestParametersBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestParametersBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestParametersBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/TestParametersBuilder.java
diff --git a/src/test/java/com/android/tools/r8/TestParametersCollection.java b/src/test/testbase/java/com/android/tools/r8/TestParametersCollection.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestParametersCollection.java
rename to src/test/testbase/java/com/android/tools/r8/TestParametersCollection.java
diff --git a/src/test/java/com/android/tools/r8/TestRunResult.java b/src/test/testbase/java/com/android/tools/r8/TestRunResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestRunResult.java
rename to src/test/testbase/java/com/android/tools/r8/TestRunResult.java
diff --git a/src/test/java/com/android/tools/r8/TestRunResultCollection.java b/src/test/testbase/java/com/android/tools/r8/TestRunResultCollection.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestRunResultCollection.java
rename to src/test/testbase/java/com/android/tools/r8/TestRunResultCollection.java
diff --git a/src/test/java/com/android/tools/r8/TestRuntime.java b/src/test/testbase/java/com/android/tools/r8/TestRuntime.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestRuntime.java
rename to src/test/testbase/java/com/android/tools/r8/TestRuntime.java
diff --git a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestShrinkerBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/TestShrinkerBuilder.java
diff --git a/src/test/java/com/android/tools/r8/TestState.java b/src/test/testbase/java/com/android/tools/r8/TestState.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/TestState.java
rename to src/test/testbase/java/com/android/tools/r8/TestState.java
diff --git a/src/test/java/com/android/tools/r8/ThrowableConsumer.java b/src/test/testbase/java/com/android/tools/r8/ThrowableConsumer.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ThrowableConsumer.java
rename to src/test/testbase/java/com/android/tools/r8/ThrowableConsumer.java
diff --git a/src/test/java/com/android/tools/r8/ThrowingBiFunction.java b/src/test/testbase/java/com/android/tools/r8/ThrowingBiFunction.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ThrowingBiFunction.java
rename to src/test/testbase/java/com/android/tools/r8/ThrowingBiFunction.java
diff --git a/src/test/java/com/android/tools/r8/ThrowingFunction.java b/src/test/testbase/java/com/android/tools/r8/ThrowingFunction.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/ThrowingFunction.java
rename to src/test/testbase/java/com/android/tools/r8/ThrowingFunction.java
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/testbase/java/com/android/tools/r8/ToolHelper.java
similarity index 98%
rename from src/test/java/com/android/tools/r8/ToolHelper.java
rename to src/test/testbase/java/com/android/tools/r8/ToolHelper.java
index b92a8dc..d3481a6 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/testbase/java/com/android/tools/r8/ToolHelper.java
@@ -165,6 +165,14 @@
       }
     }
 
+    public Path getTestBaseClassLocation() {
+      String testbaseDataLocation = System.getProperty("TESTBASE_DATA_LOCATION");
+      if (testbaseDataLocation != null) {
+        return Paths.get(testbaseDataLocation);
+      }
+      throw new Unreachable("TESTBASE_DATA_LOCATION not set from gradle");
+    }
+
     public static TestDataSourceSet computeLegacyOrGradleSpecifiedLocation() {
       return TestDataSourceSet.SPECIFIED_BY_GRADLE_PROPERTY;
     }
@@ -1512,6 +1520,10 @@
     return getClassPathForTestDataSourceSet(computeLegacyOrGradleSpecifiedLocation());
   }
 
+  public static Path getTestBaseclassPath() {
+    return computeLegacyOrGradleSpecifiedLocation().getTestBaseClassLocation();
+  }
+
   public static Path getClassPathForTestDataSourceSet(TestDataSourceSet sourceSet) {
     return sourceSet.getBuildDir();
   }
@@ -1563,11 +1575,15 @@
 
   public static Path getClassFileForTestClass(Class<?> clazz, TestDataSourceSet sourceSet) {
     List<String> parts = getNamePartsForTestClass(clazz);
+    Path filePath = Paths.get("", parts.toArray(StringUtils.EMPTY_ARRAY));
     Path resolve =
         getClassPathForTestDataSourceSet(sourceSet)
-            .resolve(Paths.get("", parts.toArray(StringUtils.EMPTY_ARRAY)));
+            .resolve(filePath);
     if (!Files.exists(resolve)) {
-      throw new RuntimeException("Could not find: " + resolve.toString());
+      resolve = sourceSet.getTestBaseClassLocation().resolve(filePath);
+      if (!Files.exists(resolve)) {
+        throw new RuntimeException("Could not find: " + resolve.toString());
+      }
     }
     return resolve;
   }
diff --git a/src/test/java/com/android/tools/r8/VmTestRunner.java b/src/test/testbase/java/com/android/tools/r8/VmTestRunner.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/VmTestRunner.java
rename to src/test/testbase/java/com/android/tools/r8/VmTestRunner.java
diff --git a/src/test/java/com/android/tools/r8/androidresources/AndroidResourceTestingUtils.java b/src/test/testbase/java/com/android/tools/r8/androidresources/AndroidResourceTestingUtils.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/androidresources/AndroidResourceTestingUtils.java
rename to src/test/testbase/java/com/android/tools/r8/androidresources/AndroidResourceTestingUtils.java
diff --git a/src/test/java/com/android/tools/r8/androidresources/Resources.java b/src/test/testbase/java/com/android/tools/r8/androidresources/Resources.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/androidresources/Resources.java
rename to src/test/testbase/java/com/android/tools/r8/androidresources/Resources.java
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java b/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java
rename to src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResults.java b/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkResults.java
similarity index 86%
rename from src/test/java/com/android/tools/r8/benchmarks/BenchmarkResults.java
rename to src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkResults.java
index 25e2958..3e52ba7 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResults.java
+++ b/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkResults.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.benchmarks;
 
-import com.android.tools.r8.benchmarks.BenchmarkRunner.ResultMode;
+import com.android.tools.r8.utils.StringUtils;
 
 public interface BenchmarkResults {
   // Append a runtime result. This may be summed or averaged depending on the benchmark set up.
@@ -28,4 +28,14 @@
   static String prettyMetric(String name, BenchmarkMetric metric, String value) {
     return name + "(" + metric.name() + "): " + value;
   }
+
+  enum ResultMode {
+    AVERAGE,
+    SUM;
+
+    @Override
+    public String toString() {
+      return StringUtils.toLowerCase(name());
+    }
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/debug/CfDebugTestConfig.java b/src/test/testbase/java/com/android/tools/r8/debug/CfDebugTestConfig.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/debug/CfDebugTestConfig.java
rename to src/test/testbase/java/com/android/tools/r8/debug/CfDebugTestConfig.java
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestConfig.java b/src/test/testbase/java/com/android/tools/r8/debug/DebugTestConfig.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/debug/DebugTestConfig.java
rename to src/test/testbase/java/com/android/tools/r8/debug/DebugTestConfig.java
diff --git a/src/test/java/com/android/tools/r8/debug/DexDebugTestConfig.java b/src/test/testbase/java/com/android/tools/r8/debug/DexDebugTestConfig.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/debug/DexDebugTestConfig.java
rename to src/test/testbase/java/com/android/tools/r8/debug/DexDebugTestConfig.java
diff --git a/src/test/java/com/android/tools/r8/desugar/LibraryFilesHelper.java b/src/test/testbase/java/com/android/tools/r8/desugar/LibraryFilesHelper.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/LibraryFilesHelper.java
rename to src/test/testbase/java/com/android/tools/r8/desugar/LibraryFilesHelper.java
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
rename to src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
rename to src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/CompilationSpecification.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/CompilationSpecification.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/CompilationSpecification.java
rename to src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/CompilationSpecification.java
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/CustomLibrarySpecification.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/CustomLibrarySpecification.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/CustomLibrarySpecification.java
rename to src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/CustomLibrarySpecification.java
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
rename to src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
rename to src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/TestingKeepRuleConsumer.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/TestingKeepRuleConsumer.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/TestingKeepRuleConsumer.java
rename to src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/TestingKeepRuleConsumer.java
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java b/src/test/testbase/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
rename to src/test/testbase/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
diff --git a/src/test/java/com/android/tools/r8/diagnosticinspector/DiagnosticSubject.java b/src/test/testbase/java/com/android/tools/r8/diagnosticinspector/DiagnosticSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/diagnosticinspector/DiagnosticSubject.java
rename to src/test/testbase/java/com/android/tools/r8/diagnosticinspector/DiagnosticSubject.java
diff --git a/src/test/java/com/android/tools/r8/diagnosticinspector/FoundDiagnosticSubject.java b/src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundDiagnosticSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/diagnosticinspector/FoundDiagnosticSubject.java
rename to src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundDiagnosticSubject.java
diff --git a/src/test/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionContextSubject.java b/src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionContextSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionContextSubject.java
rename to src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionContextSubject.java
diff --git a/src/test/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionInfoSubject.java b/src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionInfoSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionInfoSubject.java
rename to src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionInfoSubject.java
diff --git a/src/test/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionsDiagnosticSubject.java b/src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionsDiagnosticSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionsDiagnosticSubject.java
rename to src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundMissingDefinitionsDiagnosticSubject.java
diff --git a/src/test/java/com/android/tools/r8/diagnosticinspector/FoundStringDiagnosticSubject.java b/src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundStringDiagnosticSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/diagnosticinspector/FoundStringDiagnosticSubject.java
rename to src/test/testbase/java/com/android/tools/r8/diagnosticinspector/FoundStringDiagnosticSubject.java
diff --git a/src/test/java/com/android/tools/r8/dump/CompilerDump.java b/src/test/testbase/java/com/android/tools/r8/dump/CompilerDump.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/dump/CompilerDump.java
rename to src/test/testbase/java/com/android/tools/r8/dump/CompilerDump.java
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java b/src/test/testbase/java/com/android/tools/r8/jasmin/JasminBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/jasmin/JasminBuilder.java
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java b/src/test/testbase/java/com/android/tools/r8/jasmin/JasminTestBase.java
similarity index 98%
rename from src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
rename to src/test/testbase/java/com/android/tools/r8/jasmin/JasminTestBase.java
index 20de747..899696d 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
+++ b/src/test/testbase/java/com/android/tools/r8/jasmin/JasminTestBase.java
@@ -15,14 +15,11 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.Path;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.function.Consumer;
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java b/src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java
rename to src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java b/src/test/testbase/java/com/android/tools/r8/naming/retrace/StackTrace.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
rename to src/test/testbase/java/com/android/tools/r8/naming/retrace/StackTrace.java
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java b/src/test/testbase/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
rename to src/test/testbase/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileClassRule.java b/src/test/testbase/java/com/android/tools/r8/profile/art/model/ExternalArtProfileClassRule.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileClassRule.java
rename to src/test/testbase/java/com/android/tools/r8/profile/art/model/ExternalArtProfileClassRule.java
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileMethodRule.java b/src/test/testbase/java/com/android/tools/r8/profile/art/model/ExternalArtProfileMethodRule.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileMethodRule.java
rename to src/test/testbase/java/com/android/tools/r8/profile/art/model/ExternalArtProfileMethodRule.java
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileRule.java b/src/test/testbase/java/com/android/tools/r8/profile/art/model/ExternalArtProfileRule.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileRule.java
rename to src/test/testbase/java/com/android/tools/r8/profile/art/model/ExternalArtProfileRule.java
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileClassRuleInspector.java b/src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileClassRuleInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileClassRuleInspector.java
rename to src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileClassRuleInspector.java
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java b/src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
similarity index 94%
rename from src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
rename to src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
index e6f9092..fb96468 100644
--- a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
+++ b/src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
@@ -18,6 +18,7 @@
 import java.util.HashSet;
 import java.util.Set;
 import java.util.function.Consumer;
+import org.hamcrest.MatcherAssert;
 
 public class ArtProfileInspector {
 
@@ -61,7 +62,7 @@
   }
 
   public ArtProfileInspector assertContainsClassRule(ClassReference classReference) {
-    assertThat(artProfile, ArtProfileMatchers.containsClassRule(classReference));
+    MatcherAssert.assertThat(artProfile, ArtProfileMatchers.containsClassRule(classReference));
     checkedClassReferences.add(classReference);
     return this;
   }
@@ -85,7 +86,7 @@
   }
 
   public ArtProfileInspector assertContainsMethodRule(MethodReference methodReference) {
-    assertThat(artProfile, ArtProfileMatchers.containsMethodRule(methodReference));
+    MatcherAssert.assertThat(artProfile, ArtProfileMatchers.containsMethodRule(methodReference));
     checkedMethodReferences.add(methodReference);
     return this;
   }
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMatchers.java b/src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileMatchers.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMatchers.java
rename to src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileMatchers.java
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMethodRuleInspector.java b/src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileMethodRuleInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMethodRuleInspector.java
rename to src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileMethodRuleInspector.java
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileTestingUtils.java b/src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileTestingUtils.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileTestingUtils.java
rename to src/test/testbase/java/com/android/tools/r8/profile/art/utils/ArtProfileTestingUtils.java
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliBuilder.java b/src/test/testbase/java/com/android/tools/r8/smali/SmaliBuilder.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/smali/SmaliBuilder.java
rename to src/test/testbase/java/com/android/tools/r8/smali/SmaliBuilder.java
diff --git a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java b/src/test/testbase/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
rename to src/test/testbase/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
diff --git a/src/test/java/com/android/tools/r8/testing/AndroidBuildVersion.java b/src/test/testbase/java/com/android/tools/r8/testing/AndroidBuildVersion.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/testing/AndroidBuildVersion.java
rename to src/test/testbase/java/com/android/tools/r8/testing/AndroidBuildVersion.java
diff --git a/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java b/src/test/testbase/java/com/android/tools/r8/transformers/ClassFileTransformer.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
rename to src/test/testbase/java/com/android/tools/r8/transformers/ClassFileTransformer.java
diff --git a/src/test/java/com/android/tools/r8/transformers/ClassTransformer.java b/src/test/testbase/java/com/android/tools/r8/transformers/ClassTransformer.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/transformers/ClassTransformer.java
rename to src/test/testbase/java/com/android/tools/r8/transformers/ClassTransformer.java
diff --git a/src/test/java/com/android/tools/r8/transformers/MethodTransformer.java b/src/test/testbase/java/com/android/tools/r8/transformers/MethodTransformer.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/transformers/MethodTransformer.java
rename to src/test/testbase/java/com/android/tools/r8/transformers/MethodTransformer.java
diff --git a/src/test/java/com/android/tools/r8/utils/ApkUtils.java b/src/test/testbase/java/com/android/tools/r8/utils/ApkUtils.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/ApkUtils.java
rename to src/test/testbase/java/com/android/tools/r8/utils/ApkUtils.java
diff --git a/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java b/src/test/testbase/java/com/android/tools/r8/utils/ArtErrorParser.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
rename to src/test/testbase/java/com/android/tools/r8/utils/ArtErrorParser.java
diff --git a/src/test/java/com/android/tools/r8/utils/ForwardingOutputStream.java b/src/test/testbase/java/com/android/tools/r8/utils/ForwardingOutputStream.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/ForwardingOutputStream.java
rename to src/test/testbase/java/com/android/tools/r8/utils/ForwardingOutputStream.java
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/testbase/java/com/android/tools/r8/utils/Smali.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/Smali.java
rename to src/test/testbase/java/com/android/tools/r8/utils/Smali.java
diff --git a/src/test/java/com/android/tools/r8/utils/TestDescriptionWatcher.java b/src/test/testbase/java/com/android/tools/r8/utils/TestDescriptionWatcher.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/TestDescriptionWatcher.java
rename to src/test/testbase/java/com/android/tools/r8/utils/TestDescriptionWatcher.java
diff --git a/src/test/java/com/android/tools/r8/utils/ThrowingOutputStream.java b/src/test/testbase/java/com/android/tools/r8/utils/ThrowingOutputStream.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/ThrowingOutputStream.java
rename to src/test/testbase/java/com/android/tools/r8/utils/ThrowingOutputStream.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmClassSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmClassSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmClassSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmClassSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmFunctionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmFunctionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmFunctionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmFunctionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmPackageSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmPackageSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmPackageSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmPackageSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmPropertySubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmPropertySubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmPropertySubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmPropertySubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmTypeAliasSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmTypeAliasSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmTypeAliasSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmTypeAliasSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmTypeParameterSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmTypeParameterSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmTypeParameterSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentKmTypeParameterSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationMatchers.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AnnotationMatchers.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationMatchers.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AnnotationMatchers.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ArgumentPropagatorCodeScannerResultInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ArgumentPropagatorCodeScannerResultInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/ArgumentPropagatorCodeScannerResultInspector.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ArgumentPropagatorCodeScannerResultInspector.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchIterator.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CfTryCatchIterator.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchIterator.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CfTryCatchIterator.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastCfInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CheckCastCfInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastCfInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CheckCastCfInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CheckCastInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CheckCastInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchIterator.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/DexTryCatchIterator.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchIterator.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/DexTryCatchIterator.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/EnumUnboxingInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/EnumUnboxingInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/EnumUnboxingInspector.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/EnumUnboxingInspector.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FilteredTryCatchIterator.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FilteredTryCatchIterator.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FilteredTryCatchIterator.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FilteredTryCatchIterator.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmClassSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmClassSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmClassSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmClassSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmConstructorSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmConstructorSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmConstructorSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmConstructorSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmDeclarationContainerSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmDeclarationContainerSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmDeclarationContainerSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmDeclarationContainerSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmFunctionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmFunctionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmFunctionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmFunctionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmPackageSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmPackageSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmPackageSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmPackageSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmPropertySubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmPropertySubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmPropertySubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmPropertySubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmTypeAliasSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmTypeAliasSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmTypeAliasSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmTypeAliasSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmTypeParameterSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmTypeParameterSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmTypeParameterSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundKmTypeParameterSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/HorizontallyMergedClassesInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/HorizontallyMergedClassesInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/HorizontallyMergedClassesInspector.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/HorizontallyMergedClassesInspector.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionOffsetSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InstructionOffsetSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/InstructionOffsetSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InstructionOffsetSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmClassSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmClassSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmClassSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmClassSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmClassifierSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmClassifierSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmClassifierSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmClassifierSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmConstructorSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmConstructorSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmConstructorSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmConstructorSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmDeclarationContainerSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmDeclarationContainerSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmDeclarationContainerSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmDeclarationContainerSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmFunctionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmFunctionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmFunctionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmFunctionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmPackageSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmPackageSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmPackageSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmPackageSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmPropertySubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmPropertySubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmPropertySubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmPropertySubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeAliasSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeAliasSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeAliasSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeAliasSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeParameterSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeParameterSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeParameterSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeParameterSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeParameterSubjectMixin.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeParameterSubjectMixin.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeParameterSubjectMixin.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeParameterSubjectMixin.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeProjectionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeProjectionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeProjectionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeProjectionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmTypeSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/KmValueParameterSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmValueParameterSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/KmValueParameterSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/KmValueParameterSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/LineNumberTable.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/LineNumberTable.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/LineNumberTable.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/LineNumberTable.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/LocalVariableTable.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/LocalVariableTable.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/LocalVariableTable.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/LocalVariableTable.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/Main.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/Main.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/Main.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/Main.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/Matchers.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/Matchers.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodMatchers.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/MethodMatchers.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/MethodMatchers.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/MethodMatchers.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MinificationInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/MinificationInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/MinificationInspector.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/MinificationInspector.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/RangeSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/RangeSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/RangeSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/RangeSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/RecordComponentSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/RecordComponentSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/RecordComponentSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/RecordComponentSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/RepackagingInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/RepackagingInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/RepackagingInspector.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/RepackagingInspector.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/Subject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/Subject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/Subject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/Subject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchCfInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/SwitchCfInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/SwitchCfInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/SwitchCfInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchInstructionSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/SwitchInstructionSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/SwitchInstructionSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/SwitchInstructionSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchIterator.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/TryCatchIterator.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchIterator.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/TryCatchIterator.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/VerticallyMergedClassesInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/VerticallyMergedClassesInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/VerticallyMergedClassesInspector.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/VerticallyMergedClassesInspector.java
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java
rename to src/test/testbase/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java
diff --git a/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
similarity index 100%
rename from src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
rename to src/test/testbase/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
diff --git a/src/test/java/dalvik/annotation/optimization/ReachabilitySensitive.java b/src/test/testbase/java/dalvik/annotation/optimization/ReachabilitySensitive.java
similarity index 100%
rename from src/test/java/dalvik/annotation/optimization/ReachabilitySensitive.java
rename to src/test/testbase/java/dalvik/annotation/optimization/ReachabilitySensitive.java
diff --git a/src/test/java/dalvik/system/PathClassLoader.java b/src/test/testbase/java/dalvik/system/PathClassLoader.java
similarity index 100%
rename from src/test/java/dalvik/system/PathClassLoader.java
rename to src/test/testbase/java/dalvik/system/PathClassLoader.java