Cleanup and remove GMS Core tests

Change-Id: I758d22cc5a3e0f3a9fe59517222dc160f1c44788
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index 97a95be8..121e7c4 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -65,6 +65,7 @@
   private MainDexClassesCollector mainDexClassesCollector;
   private StringConsumer mainDexListConsumer;
   protected int minApiLevel = ToolHelper.getMinApiLevelForDexVm().getLevel();
+  private boolean optimizeMultidexForLinearAlloc = false;
   private Consumer<InternalOptions> optionsConsumer = DEFAULT_OPTIONS;
   private ByteArrayOutputStream stdout = null;
   private PrintStream oldStdout = null;
@@ -167,6 +168,7 @@
           : "Don't set the API level directly through BaseCompilerCommand.Builder in tests";
       builder.setMinApiLevel(minApiLevel);
     }
+    builder.setOptimizeMultidexForLinearAlloc(optimizeMultidexForLinearAlloc);
     if (useDefaultRuntimeLibrary) {
       if (backend == Backend.DEX) {
         assert builder.isMinApiLevelSet();
@@ -308,6 +310,11 @@
     return self();
   }
 
+  public T setOptimizeMultidexForLinearAlloc() {
+    this.optimizeMultidexForLinearAlloc = true;
+    return self();
+  }
+
   public T disableDesugaring() {
     builder.setDisableDesugaring(true);
     return self();
diff --git a/src/test/java/com/android/tools/r8/internal/D8GMSCoreV10DeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/D8GMSCoreV10DeployJarVerificationTest.java
deleted file mode 100644
index 7f685c5..0000000
--- a/src/test/java/com/android/tools/r8/internal/D8GMSCoreV10DeployJarVerificationTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2017, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.D8Command;
-import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.AndroidApp;
-import java.nio.file.Paths;
-import org.junit.Test;
-
-public class D8GMSCoreV10DeployJarVerificationTest extends GMSCoreDeployJarVerificationTest {
-
-  @Test
-  public void buildDebugFromDeployJar() throws Exception {
-    buildFromDeployJar(
-        CompilerUnderTest.D8, CompilationMode.DEBUG,
-        GMSCoreCompilationTestBase.GMSCORE_V10_DIR, false);
-  }
-
-  @Test
-  public void buildReleaseFromDeployJar() throws Exception {
-    buildFromDeployJar(
-        CompilerUnderTest.D8, CompilationMode.RELEASE,
-        GMSCoreCompilationTestBase.GMSCORE_V10_DIR, false);
-  }
-
-  @Test
-  public void testDeterminismDebugLegacyMultidexFromDeployJar() throws Exception {
-    D8Command.Builder builder =
-        D8Command.builder()
-            .addProgramFiles(Paths.get(GMSCORE_V10_DIR + DEPLOY_JAR))
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.K.getLevel()))
-            .setMode(CompilationMode.DEBUG)
-            .setMinApiLevel(AndroidApiLevel.K.getLevel())
-            .addMainDexListFiles(Paths.get(GMSCORE_V10_DIR + "main_dex_list.txt"));
-
-    AndroidApp app1 = runAndCheckVerification(builder, null);
-    D8Command.Builder builder2 =
-        D8Command.builder()
-            .addProgramFiles(Paths.get(GMSCORE_V10_DIR + DEPLOY_JAR))
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.K.getLevel()))
-            .setMode(CompilationMode.DEBUG)
-            .setMinApiLevel(AndroidApiLevel.K.getLevel())
-            .addMainDexListFiles(Paths.get(GMSCORE_V10_DIR + "main_dex_list.txt"));
-
-    AndroidApp app2 = runAndCheckVerification(builder2, null);
-    // Verify that the result of the two compilations was the same.
-    assertIdenticalApplications(app1, app2);
-  }
-
-  @Test
-  public void buildDebugLegagyMultidexForDexOptFromDeployJar() throws Exception {
-    D8Command.Builder builder =
-        D8Command.builder()
-            .addProgramFiles(Paths.get(GMSCORE_V10_DIR + DEPLOY_JAR))
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.K.getLevel()))
-            .setMode(CompilationMode.DEBUG)
-            .setMinApiLevel(AndroidApiLevel.K.getLevel())
-            .setOptimizeMultidexForLinearAlloc(true)
-            .addMainDexListFiles(Paths.get(GMSCORE_V10_DIR + "main_dex_list.txt"));
-
-    runAndCheckVerification(builder, null);
-  }
-
-  @Test
-  public void buildReleaseLegagyMultidexFromDeployJar() throws Exception {
-    D8Command.Builder builder =
-        D8Command.builder()
-            .addProgramFiles(Paths.get(GMSCORE_V10_DIR + DEPLOY_JAR))
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.K.getLevel()))
-            .setMode(CompilationMode.DEBUG)
-            .setMinApiLevel(AndroidApiLevel.K.getLevel())
-            .addMainDexListFiles(Paths.get(GMSCORE_V10_DIR + "main_dex_list.txt"));
-
-    runAndCheckVerification(builder, null);
-  }
-
-  @Test
-  public void buildReleaseLegagyMultidexForDexOptFromDeployJar() throws Exception {
-    D8Command.Builder builder =
-        D8Command.builder()
-            .addProgramFiles(Paths.get(GMSCORE_V10_DIR + DEPLOY_JAR))
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.K.getLevel()))
-            .setMode(CompilationMode.DEBUG)
-            .setMinApiLevel(AndroidApiLevel.K.getLevel())
-            .setOptimizeMultidexForLinearAlloc(true)
-            .addMainDexListFiles(Paths.get(GMSCORE_V10_DIR + "main_dex_list.txt"));
-
-    runAndCheckVerification(builder, null);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/D8GMSCoreV9DeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/D8GMSCoreV9DeployJarVerificationTest.java
deleted file mode 100644
index 25f4412..0000000
--- a/src/test/java/com/android/tools/r8/internal/D8GMSCoreV9DeployJarVerificationTest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2017, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
-import org.junit.Test;
-
-public class D8GMSCoreV9DeployJarVerificationTest extends GMSCoreDeployJarVerificationTest {
-
-  @Test
-  public void buildDebugFromDeployJar() throws Exception {
-    buildFromDeployJar(
-        CompilerUnderTest.D8, CompilationMode.DEBUG,
-        GMSCoreCompilationTestBase.GMSCORE_V9_DIR, true);
-  }
-
-  @Test
-  public void buildReleaseFromDeployJar() throws Exception {
-    buildFromDeployJar(
-        CompilerUnderTest.D8, CompilationMode.RELEASE,
-        GMSCoreCompilationTestBase.GMSCORE_V9_DIR, true);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/GMSCoreCompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/GMSCoreCompilationTestBase.java
index de9b402..4ed740b 100644
--- a/src/test/java/com/android/tools/r8/internal/GMSCoreCompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/GMSCoreCompilationTestBase.java
@@ -3,61 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.internal;
 
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
-import com.android.tools.r8.utils.InternalOptions;
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.nio.file.Paths;
-import java.util.concurrent.ExecutionException;
-import java.util.function.Consumer;
-
 public abstract class GMSCoreCompilationTestBase extends CompilationTestBase {
-  public static final String GMSCORE_V4_DIR = "third_party/gmscore/v4/";
-  public static final String GMSCORE_V5_DIR = "third_party/gmscore/v5/";
-  public static final String GMSCORE_V6_DIR = "third_party/gmscore/v6/";
-  public static final String GMSCORE_V7_DIR = "third_party/gmscore/v7/";
-  public static final String GMSCORE_V8_DIR = "third_party/gmscore/v8/";
-  public static final String GMSCORE_V9_DIR = "third_party/gmscore/gmscore_v9/";
-  public static final String GMSCORE_V10_DIR = "third_party/gmscore/gmscore_v10/";
-  public static final String GMSCORE_LATEST_DIR = "third_party/gmscore/latest/";
-
-  public static final int GMSCORE_V9_MAX_SIZE = 35000000;
-  public static final int GMSCORE_V10_MAX_SIZE = 35000000;
-  public static final int GMSCORE_LATEST_MAX_SIZE = 35000000;
-
-  static final String GMSCORE_APK = "GMSCore.apk";
-
   // Files pertaining to the full GMSCore build.
-  static final String PG_MAP = "GmsCore_prod_alldpi_release_all_locales_proguard.map";
   static final String PG_CONF = "GmsCore_prod_alldpi_release_all_locales_proguard.config";
   static final String DEPLOY_JAR = "GmsCore_prod_alldpi_release_all_locales_deploy.jar";
-  static final String REFERENCE_APK = "noshrink_x86_GmsCore_prod_alldpi_release_unsigned.apk";
-
-  public void runR8AndCheckVerification(CompilationMode mode, String version)
-      throws ExecutionException, IOException, CompilationFailedException {
-    runR8AndCheckVerification(mode, version, null);
-  }
-
-  public void runR8AndCheckVerification(
-      CompilationMode mode, String version, Consumer<InternalOptions> optionsConsumer)
-      throws ExecutionException, IOException, CompilationFailedException {
-    runAndCheckVerification(CompilerUnderTest.R8, mode, version, optionsConsumer);
-  }
-
-  private void runAndCheckVerification(
-      CompilerUnderTest compiler,
-      CompilationMode mode,
-      String version,
-      Consumer<InternalOptions> optionsConsumer)
-      throws ExecutionException, IOException, CompilationFailedException {
-    runAndCheckVerification(
-        compiler,
-        mode,
-        version + GMSCORE_APK,
-        null,
-        optionsConsumer,
-        ImmutableList.of(Paths.get(version, GMSCORE_APK).toString()));
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
deleted file mode 100644
index 634ff6f..0000000
--- a/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2016, 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.internal;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
-import com.android.tools.r8.shaking.ProguardRuleParserException;
-import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.InternalOptions;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.concurrent.ExecutionException;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-
-public class GMSCoreDeployJarVerificationTest extends GMSCoreCompilationTestBase {
-
-  public AndroidApp buildFromDeployJar(
-      CompilerUnderTest compiler, CompilationMode mode, String base, boolean hasReference)
-      throws ExecutionException, IOException, ProguardRuleParserException,
-      CompilationFailedException {
-    return runAndCheckVerification(
-        compiler, mode, hasReference ? base + REFERENCE_APK : null, null, base + DEPLOY_JAR);
-  }
-
-
-  public AndroidApp buildFromDeployJar(
-      CompilerUnderTest compiler, CompilationMode mode, String base, boolean hasReference,
-      Consumer<InternalOptions> optionsConsumer)
-      throws ExecutionException, IOException, ProguardRuleParserException,
-      CompilationFailedException {
-    return runAndCheckVerification(
-        compiler,
-        mode,
-        hasReference ? base + REFERENCE_APK : null,
-        null,
-        optionsConsumer,
-        Collections.singletonList(base + DEPLOY_JAR));
-  }
-
-  public AndroidApp buildFromDeployJar(
-      CompilerUnderTest compiler, CompilationMode mode, String base, boolean hasReference,
-      Consumer<InternalOptions> optionsConsumer, Supplier<DexIndexedConsumer> consumerSupplier)
-      throws ExecutionException, IOException, ProguardRuleParserException,
-      CompilationFailedException {
-    return runAndCheckVerification(
-        compiler,
-        mode,
-        hasReference ? base + REFERENCE_APK : null,
-        null,
-        optionsConsumer,
-        consumerSupplier,
-        Collections.singletonList(base + DEPLOY_JAR));
-  }
-
-}
diff --git a/src/test/java/com/android/tools/r8/internal/GMSCoreLatestTest.java b/src/test/java/com/android/tools/r8/internal/GMSCoreLatestTest.java
new file mode 100644
index 0000000..3beab34
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/internal/GMSCoreLatestTest.java
@@ -0,0 +1,133 @@
+// Copyright (c) 2019, 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.internal;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.core.AnyOf.anyOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ThrowableConsumer;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.AssertionUtils;
+import com.google.common.collect.Sets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class GMSCoreLatestTest extends GMSCoreCompilationTestBase {
+
+  private static final Path base = Paths.get("third_party/gmscore/latest/");
+
+  private static Path sanitizedLibrary;
+  private static Path sanitizedProguardConfiguration;
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters()
+        .withDexRuntime(Version.V9_0_0)
+        .withApiLevel(AndroidApiLevel.L)
+        .build();
+  }
+
+  public GMSCoreLatestTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @BeforeClass
+  public static void setup() throws Exception {
+    LibrarySanitizer librarySanitizer =
+        new LibrarySanitizer(getStaticTemp())
+            .addProguardConfigurationFiles(base.resolve(PG_CONF))
+            .sanitize();
+    sanitizedLibrary = librarySanitizer.getSanitizedLibrary();
+    sanitizedProguardConfiguration = librarySanitizer.getSanitizedProguardConfiguration();
+  }
+
+  @Test
+  public void testR8Determinism() throws Exception {
+    Map<String, String> idsRoundOne = new ConcurrentHashMap<>();
+    R8TestCompileResult compileResult =
+        compileWithR8(
+            builder ->
+                builder.addOptionsModification(
+                    options ->
+                        options.testing.processingContextsConsumer =
+                            id -> assertNull(idsRoundOne.put(id, id))));
+
+    compileResult.runDex2Oat(parameters.getRuntime()).assertNoVerificationErrors();
+
+    Map<String, String> idsRoundTwo = new ConcurrentHashMap<>();
+    R8TestCompileResult otherCompileResult =
+        compileWithR8(
+            builder ->
+                builder.addOptionsModification(
+                    options ->
+                        options.testing.processingContextsConsumer =
+                            id -> {
+                              AssertionUtils.assertNotNull(idsRoundOne.get(id));
+                              assertNull(idsRoundTwo.put(id, id));
+                            }));
+
+    // Verify that the result of the two compilations was the same.
+    assertEquals(
+        Collections.emptySet(),
+        Sets.symmetricDifference(idsRoundOne.keySet(), idsRoundTwo.keySet()));
+    assertIdenticalApplications(compileResult.getApp(), otherCompileResult.getApp());
+    assertEquals(compileResult.getProguardMap(), otherCompileResult.getProguardMap());
+  }
+
+  private R8TestCompileResult compileWithR8(ThrowableConsumer<R8FullTestBuilder> configuration)
+      throws Exception {
+    // Program files are included in Proguard configuration.
+    return testForR8(Backend.DEX)
+        .addLibraryFiles(sanitizedLibrary)
+        .addKeepRuleFiles(sanitizedProguardConfiguration)
+        .addDontWarn(
+            "android.hardware.location.IActivityRecognitionHardware",
+            "android.hardware.location.IFusedLocationHardware",
+            "android.location.FusedBatchOptions",
+            "android.location.GeocoderParams$1",
+            "android.location.ILocationManager",
+            "android.media.IRemoteDisplayCallback",
+            "android.media.RemoteDisplayState$RemoteDisplayInfo",
+            "com.android.internal.location.ProviderProperties",
+            "com.android.internal.location.ProviderRequest",
+            "com.google.protobuf.java_com_google_android_libraries_performance_primes_release"
+                + "_gmscore__primes_bcdd2915GeneratedExtensionRegistryLite$Loader")
+        .allowDiagnosticMessages()
+        .allowUnusedProguardConfigurationRules()
+        .setMinApi(parameters.getApiLevel())
+        .apply(configuration)
+        .compile()
+        .assertAllInfoMessagesMatch(
+            anyOf(
+                containsString("Ignoring option: -optimizations"),
+                containsString(
+                    "Invalid parameter counts in MethodParameter attributes. "
+                        + "This is likely due to Proguard having removed a parameter."),
+                containsString("Methods with invalid MethodParameter attributes:"),
+                containsString("Proguard configuration rule does not match anything")))
+        .assertAllWarningMessagesMatch(
+            anyOf(
+                containsString(
+                    "Expected stack map table for method with non-linear control flow. "
+                        + "In later version of R8, the method may be assumed not reachable."),
+                containsString("Ignoring option: -outjars")));
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/internal/GMSCoreV10Test.java b/src/test/java/com/android/tools/r8/internal/GMSCoreV10Test.java
new file mode 100644
index 0000000..30716fb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/internal/GMSCoreV10Test.java
@@ -0,0 +1,212 @@
+// Copyright (c) 2017, 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.internal;
+
+import static com.android.tools.r8.utils.AssertionUtils.assertNotNull;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.core.AnyOf.anyOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import com.android.tools.r8.D8TestBuilder;
+import com.android.tools.r8.D8TestCompileResult;
+import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestCompilerBuilder;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ThrowableConsumer;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.google.common.collect.Sets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class GMSCoreV10Test extends GMSCoreCompilationTestBase {
+
+  private static final Path base = Paths.get("third_party/gmscore/gmscore_v10/");
+
+  private static Path sanitizedLibrary;
+  private static Path sanitizedProguardConfiguration;
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters()
+        .withDexRuntime(Version.V9_0_0)
+        .withApiLevel(AndroidApiLevel.L)
+        .build();
+  }
+
+  public GMSCoreV10Test(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @BeforeClass
+  public static void setup() throws Exception {
+    LibrarySanitizer librarySanitizer =
+        new LibrarySanitizer(getStaticTemp())
+            .addProguardConfigurationFiles(base.resolve(PG_CONF))
+            .sanitize();
+    sanitizedLibrary = librarySanitizer.getSanitizedLibrary();
+    sanitizedProguardConfiguration = librarySanitizer.getSanitizedProguardConfiguration();
+  }
+
+  @Test
+  public void testR8Determinism() throws Exception {
+    Map<String, String> idsRoundOne = new ConcurrentHashMap<>();
+    R8TestCompileResult compileResult =
+        compileWithR8(
+            builder ->
+                builder.addOptionsModification(
+                    options ->
+                        options.testing.processingContextsConsumer =
+                            id -> assertNull(idsRoundOne.put(id, id))));
+
+    compileResult.runDex2Oat(parameters.getRuntime()).assertNoVerificationErrors();
+
+    Map<String, String> idsRoundTwo = new ConcurrentHashMap<>();
+    R8TestCompileResult otherCompileResult =
+        compileWithR8(
+            builder ->
+                builder.addOptionsModification(
+                    options ->
+                        options.testing.processingContextsConsumer =
+                            id -> {
+                              assertNotNull(idsRoundOne.get(id));
+                              assertNull(idsRoundTwo.put(id, id));
+                            }));
+
+    // Verify that the result of the two compilations was the same.
+    assertEquals(
+        Collections.emptySet(),
+        Sets.symmetricDifference(idsRoundOne.keySet(), idsRoundTwo.keySet()));
+    assertIdenticalApplications(compileResult.getApp(), otherCompileResult.getApp());
+    assertEquals(compileResult.getProguardMap(), otherCompileResult.getProguardMap());
+  }
+
+  @Test
+  public void testR8ForceJumboStringProcessing() throws Exception {
+    compileWithR8(
+            builder ->
+                builder.addOptionsModification(
+                    options -> options.testing.forceJumboStringProcessing = true))
+        .runDex2Oat(parameters.getRuntime())
+        .assertNoVerificationErrors();
+  }
+
+  @Test
+  public void testD8Debug() throws Exception {
+    compileWithD8Debug(ThrowableConsumer.empty());
+  }
+
+  @Test
+  public void testD8DebugLegacyMultidex() throws Exception {
+    compileWithD8Debug(
+            builder ->
+                builder
+                    .addMainDexListFiles(base.resolve("main_dex_list.txt"))
+                    .setMinApi(AndroidApiLevel.K))
+        .runDex2Oat(parameters.getRuntime())
+        .assertNoVerificationErrors();
+  }
+
+  @Test
+  public void testD8DebugLegacyMultidexDexOpt() throws Exception {
+    compileWithD8Debug(
+            builder ->
+                builder
+                    .addMainDexListFiles(base.resolve("main_dex_list.txt"))
+                    .setMinApi(AndroidApiLevel.K)
+                    .setOptimizeMultidexForLinearAlloc())
+        .runDex2Oat(parameters.getRuntime())
+        .assertNoVerificationErrors();
+  }
+
+  @Test
+  public void testD8Release() throws Exception {
+    compileWithD8Release(ThrowableConsumer.empty())
+        .runDex2Oat(parameters.getRuntime())
+        .assertNoVerificationErrors();
+  }
+
+  @Test
+  public void testD8ReleaseLegacyMultidex() throws Exception {
+    compileWithD8Release(
+            builder ->
+                builder
+                    .addMainDexListFiles(base.resolve("main_dex_list.txt"))
+                    .setMinApi(AndroidApiLevel.K))
+        .runDex2Oat(parameters.getRuntime())
+        .assertNoVerificationErrors();
+  }
+
+  @Test
+  public void buildD8ReleaseLegacyMultidexDexOpt() throws Exception {
+    compileWithD8Release(
+            builder ->
+                builder
+                    .addMainDexListFiles(base.resolve("main_dex_list.txt"))
+                    .setMinApi(AndroidApiLevel.K)
+                    .setOptimizeMultidexForLinearAlloc())
+        .runDex2Oat(parameters.getRuntime())
+        .assertNoVerificationErrors();
+  }
+
+  private D8TestCompileResult compileWithD8Debug(ThrowableConsumer<D8TestBuilder> configuration)
+      throws Exception {
+    return compileWithD8(configuration.andThen(TestCompilerBuilder::debug));
+  }
+
+  private D8TestCompileResult compileWithD8Release(ThrowableConsumer<D8TestBuilder> configuration)
+      throws Exception {
+    return compileWithD8(configuration.andThen(TestCompilerBuilder::release));
+  }
+
+  private D8TestCompileResult compileWithD8(ThrowableConsumer<D8TestBuilder> configuration)
+      throws Exception {
+    return testForD8()
+        .addProgramFiles(base.resolve(DEPLOY_JAR))
+        .setMinApi(AndroidApiLevel.L)
+        .apply(configuration)
+        .compile();
+  }
+
+  private R8TestCompileResult compileWithR8(ThrowableConsumer<R8FullTestBuilder> configuration)
+      throws Exception {
+    // Program files are included in Proguard configuration.
+    return testForR8(Backend.DEX)
+        .addLibraryFiles(sanitizedLibrary)
+        .addKeepRuleFiles(sanitizedProguardConfiguration)
+        .addDontWarn(
+            "android.hardware.location.IActivityRecognitionHardware",
+            "android.hardware.location.IFusedLocationHardware",
+            "android.location.FusedBatchOptions",
+            "android.location.GeocoderParams$1",
+            "android.location.ILocationManager",
+            "android.media.IRemoteDisplayCallback",
+            "android.media.RemoteDisplayState$RemoteDisplayInfo",
+            "com.android.internal.location.ProviderProperties",
+            "com.android.internal.location.ProviderRequest")
+        .allowDiagnosticMessages()
+        .allowUnusedProguardConfigurationRules()
+        .setMinApi(parameters.getApiLevel())
+        .apply(configuration)
+        .compile()
+        .assertAllInfoMessagesMatch(
+            anyOf(
+                containsString("Ignoring option: -optimizations"),
+                containsString("Proguard configuration rule does not match anything")))
+        .assertAllWarningMessagesMatch(containsString("Ignoring option: -outjars"));
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/internal/LibrarySanitizer.java b/src/test/java/com/android/tools/r8/internal/LibrarySanitizer.java
index 4a256bb..e43dd8e 100644
--- a/src/test/java/com/android/tools/r8/internal/LibrarySanitizer.java
+++ b/src/test/java/com/android/tools/r8/internal/LibrarySanitizer.java
@@ -14,6 +14,7 @@
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import org.junit.rules.TemporaryFolder;
 
@@ -56,6 +57,10 @@
     return this;
   }
 
+  LibrarySanitizer addProguardConfigurationFiles(Path... proguardConfigurationFiles) {
+    return addProguardConfigurationFiles(Arrays.asList(proguardConfigurationFiles));
+  }
+
   public Path getSanitizedLibrary() {
     return sanitizedLibrary;
   }
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreDeterministicTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreDeterministicTest.java
deleted file mode 100644
index cba792d..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreDeterministicTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (c) 2016, 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.internal;
-
-import static junit.framework.TestCase.assertEquals;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8Command;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.IROrdering.NondeterministicIROrdering;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.junit.Test;
-
-public class R8GMSCoreDeterministicTest extends GMSCoreCompilationTestBase {
-
-  private static class CompilationResult {
-    AndroidApp app;
-    String proguardMap;
-  }
-
-  private CompilationResult doRun() throws CompilationFailedException {
-    R8Command command =
-        R8Command.builder()
-            .setDisableTreeShaking(true)
-            .setDisableMinification(true)
-            .addProgramFiles(Paths.get(GMSCORE_V7_DIR, GMSCORE_APK))
-            .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
-            .setMinApiLevel(AndroidApiLevel.L.getLevel())
-            .build();
-    CompilationResult result = new CompilationResult();
-    result.app =
-        ToolHelper.runR8(
-            command,
-            options -> {
-              // For this test just do random shuffle.
-              options.testing.irOrdering = NondeterministicIROrdering.getInstance();
-              // Only use one thread to process to process in the order decided by the callback.
-              options.threadCount = 1;
-              // Ignore the missing classes.
-              options.ignoreMissingClasses = true;
-              // Store the generated Proguard map.
-              options.proguardMapConsumer =
-                  ToolHelper.consumeString(proguardMap -> result.proguardMap = proguardMap);
-            });
-    return result;
-  }
-
-  @Test
-  public void deterministic() throws Exception {
-    // Run two independent compilations.
-    CompilationResult result1 = doRun();
-    CompilationResult result2 = doRun();
-
-    // Check that the generated bytecode runs through the dex2oat verifier with no errors.
-    Path combinedInput = temp.getRoot().toPath().resolve("all.jar");
-    Path oatFile = temp.getRoot().toPath().resolve("all.oat");
-    result1.app.writeToZip(combinedInput, OutputMode.DexIndexed);
-    ToolHelper.runDex2Oat(combinedInput, oatFile);
-
-    // Verify that the result of the two compilations was the same.
-    assertIdenticalApplications(result1.app, result2.app);
-    assertEquals(result1.proguardMap, result2.proguardMap);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreFixedPointTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreFixedPointTest.java
deleted file mode 100644
index 67979ba..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreFixedPointTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2016, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.InternalOptions;
-import java.nio.file.Paths;
-import org.junit.Test;
-
-public class R8GMSCoreFixedPointTest extends GMSCoreCompilationTestBase {
-
-  @Test
-  public void fixedPoint() throws Exception {
-    // First compilation.
-    AndroidApp app = ToolHelper.builderFromProgramDirectory(Paths.get(GMSCORE_V7_DIR)).build();
-
-    AndroidApp app1 =
-        ToolHelper.runR8(
-            ToolHelper.prepareR8CommandBuilder(app)
-                .setMode(CompilationMode.DEBUG)
-                .setMinApiLevel(AndroidApiLevel.L.getLevel())
-                .build(),
-            this::configure);
-
-    // Second compilation.
-    // Add option --skip-outline-opt for second compilation. The second compilation can find
-    // additional outlining opportunities as member rebinding from the first compilation can move
-    // methods.
-    // See b/33410508 and b/33475705.
-    AndroidApp app2 =
-        ToolHelper.runR8(
-            ToolHelper.prepareR8CommandBuilder(app1)
-                .setMode(CompilationMode.DEBUG)
-                .setMinApiLevel(AndroidApiLevel.L.getLevel())
-                .build(),
-            this::configure);
-
-    assertIdenticalApplicationsUpToCode(app1, app2, false);
-  }
-
-  private void configure(InternalOptions options) {
-    options.ignoreMissingClasses = true;
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLatestTreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLatestTreeShakeJarVerificationTest.java
deleted file mode 100644
index d4e1e43..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLatestTreeShakeJarVerificationTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2019, 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.internal;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApp;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import org.junit.Test;
-
-public class R8GMSCoreLatestTreeShakeJarVerificationTest
-    extends R8GMSCoreTreeShakeJarVerificationTest {
-
-  private String proguardMap1 = null;
-  private String proguardMap2 = null;
-
-  @Test
-  public void buildAndTreeShakeFromDeployJar() throws Exception {
-    List<String> additionalProguardConfiguration =
-        ImmutableList.of(
-            ToolHelper.PROGUARD_SETTINGS_FOR_INTERNAL_APPS + "GmsCore_proguard.config");
-    Map<String, String> idsRoundOne = new ConcurrentHashMap<>();
-    AndroidApp app1 =
-        buildAndTreeShakeFromDeployJar(
-            CompilationMode.RELEASE,
-            GMSCORE_LATEST_DIR,
-            false,
-            GMSCORE_LATEST_MAX_SIZE,
-            additionalProguardConfiguration,
-            options -> {
-              options.testing.processingContextsConsumer =
-                  id -> assertNull(idsRoundOne.put(id, id));
-              options.proguardMapConsumer =
-                  ToolHelper.consumeString(proguardMap -> this.proguardMap1 = proguardMap);
-            });
-    Map<String, String> idsRoundTwo = new ConcurrentHashMap<>();
-    AndroidApp app2 =
-        buildAndTreeShakeFromDeployJar(
-            CompilationMode.RELEASE,
-            GMSCORE_LATEST_DIR,
-            false,
-            GMSCORE_LATEST_MAX_SIZE,
-            additionalProguardConfiguration,
-            options -> {
-              options.testing.processingContextsConsumer =
-                  id -> {
-                    assertNotNull(idsRoundOne.get(id));
-                    assertNull(idsRoundTwo.put(id, id));
-                  };
-              options.proguardMapConsumer =
-                  ToolHelper.consumeString(proguardMap -> this.proguardMap2 = proguardMap);
-            });
-
-    // Verify that the result of the two compilations was the same.
-    assertEquals(
-        Collections.emptySet(),
-        Sets.symmetricDifference(idsRoundOne.keySet(), idsRoundTwo.keySet()));
-    assertIdenticalApplications(app1, app2);
-    assertEquals(proguardMap1, proguardMap2);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreTreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreTreeShakeJarVerificationTest.java
deleted file mode 100644
index c577d60..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreTreeShakeJarVerificationTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2016, 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.internal;
-
-import static org.junit.Assert.assertTrue;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
-import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.InternalOptions;
-import com.google.common.collect.ImmutableList;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Consumer;
-
-public class R8GMSCoreTreeShakeJarVerificationTest extends GMSCoreCompilationTestBase {
-
-  public AndroidApp buildAndTreeShakeFromDeployJar(
-      CompilationMode mode,
-      String base,
-      boolean hasReference,
-      int maxSize,
-      Consumer<InternalOptions> optionsConsumer)
-      throws Exception {
-    return buildAndTreeShakeFromDeployJar(
-        mode, base, hasReference, maxSize, ImmutableList.of(), optionsConsumer);
-  }
-
-  public AndroidApp buildAndTreeShakeFromDeployJar(
-      CompilationMode mode,
-      String base,
-      boolean hasReference,
-      int maxSize,
-      List<String> additionalProguardConfigurations,
-      Consumer<InternalOptions> optionsConsumer)
-      throws Exception {
-    List<String> proguardConfigurations = new ArrayList<>(additionalProguardConfigurations);
-    proguardConfigurations.add(base + PG_CONF);
-    AndroidApp app =
-        runAndCheckVerification(
-            CompilerUnderTest.R8,
-            mode,
-            hasReference ? base + REFERENCE_APK : null,
-            proguardConfigurations,
-            optionsConsumer,
-            // Don't pass any inputs. The input will be read from the -injars in the Proguard
-            // configuration file.
-            ImmutableList.of());
-    int bytes = app.applicationSize();
-    assertTrue("Expected max size of " + maxSize + ", got " + bytes, bytes < maxSize);
-    return app;
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java
deleted file mode 100644
index 2c2adbf..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2017, 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.internal;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.DexIndexedConsumer.ArchiveConsumer;
-import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApp;
-import com.google.common.collect.Sets;
-import java.io.File;
-import java.util.Collections;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import org.junit.Test;
-
-public class R8GMSCoreV10DeployJarVerificationTest extends GMSCoreDeployJarVerificationTest {
-
-  private String proguardMap1 = null;
-  private String proguardMap2 = null;
-
-  @Test
-  public void buildFromDeployJar() throws Exception {
-    File tempFolder = temp.newFolder();
-    File app1Zip = new File(tempFolder, "app1.zip");
-    Map<String, String> idsRoundOne = new ConcurrentHashMap<>();
-    AndroidApp app1 =
-        buildFromDeployJar(
-            CompilerUnderTest.R8,
-            CompilationMode.RELEASE,
-            GMSCoreCompilationTestBase.GMSCORE_V10_DIR,
-            false,
-            options -> {
-              options.testing.processingContextsConsumer =
-                  id -> assertNull(idsRoundOne.put(id, id));
-              options.proguardMapConsumer =
-                  ToolHelper.consumeString(proguardMap -> this.proguardMap1 = proguardMap);
-            },
-            () -> new ArchiveConsumer(app1Zip.toPath(), true));
-
-    File app2Zip = new File(tempFolder, "app2.zip");
-    Map<String, String> idsRoundTwo = new ConcurrentHashMap<>();
-    AndroidApp app2 =
-        buildFromDeployJar(
-            CompilerUnderTest.R8,
-            CompilationMode.RELEASE,
-            GMSCoreCompilationTestBase.GMSCORE_V10_DIR,
-            false,
-            options -> {
-              options.testing.processingContextsConsumer =
-                  id -> {
-                    assertNotNull(idsRoundOne.get(id));
-                    assertNull(idsRoundTwo.put(id, id));
-                  };
-              options.proguardMapConsumer =
-                  ToolHelper.consumeString(proguardMap -> this.proguardMap2 = proguardMap);
-            },
-            () -> new ArchiveConsumer(app2Zip.toPath(), true));
-
-    // Verify that the result of the two compilations was the same.
-    assertEquals(
-        Collections.emptySet(),
-        Sets.symmetricDifference(idsRoundOne.keySet(), idsRoundTwo.keySet()));
-    assertIdenticalApplications(app1, app2);
-    assertIdenticalZipFiles(app1Zip, app2Zip);
-    assertEquals(proguardMap1, proguardMap2);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10JumboStringTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10JumboStringTest.java
deleted file mode 100644
index 365dc58..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10JumboStringTest.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2019, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import org.junit.Test;
-
-public class R8GMSCoreV10JumboStringTest extends R8GMSCoreTreeShakeJarVerificationTest {
-
-  @Test
-  public void verify() throws Exception {
-    buildAndTreeShakeFromDeployJar(
-        CompilationMode.RELEASE,
-        GMSCORE_V10_DIR,
-        false,
-        GMSCORE_V10_MAX_SIZE,
-        options -> options.testing.forceJumboStringProcessing = true);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10TreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10TreeShakeJarVerificationTest.java
deleted file mode 100644
index dc78be2..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10TreeShakeJarVerificationTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2017, 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.internal;
-
-import static com.android.tools.r8.utils.AssertionUtils.assertNotNull;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApp;
-import com.google.common.collect.Sets;
-import java.util.Collections;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import org.junit.Test;
-
-public class R8GMSCoreV10TreeShakeJarVerificationTest
-    extends R8GMSCoreTreeShakeJarVerificationTest {
-
-  private String proguardMap1 = null;
-  private String proguardMap2 = null;
-
-  @Test
-  public void buildAndTreeShakeFromDeployJar() throws Exception {
-    Map<String, String> idsRoundOne = new ConcurrentHashMap<>();
-    AndroidApp app1 =
-        buildAndTreeShakeFromDeployJar(
-            CompilationMode.RELEASE,
-            GMSCORE_V10_DIR,
-            false,
-            GMSCORE_V10_MAX_SIZE,
-            options -> {
-              options.testing.processingContextsConsumer =
-                  id -> assertNull(idsRoundOne.put(id, id));
-              options.proguardMapConsumer =
-                  ToolHelper.consumeString(proguardMap -> this.proguardMap1 = proguardMap);
-            });
-    Map<String, String> idsRoundTwo = new ConcurrentHashMap<>();
-    AndroidApp app2 =
-        buildAndTreeShakeFromDeployJar(
-            CompilationMode.RELEASE,
-            GMSCORE_V10_DIR,
-            false,
-            GMSCORE_V10_MAX_SIZE,
-            options -> {
-              options.testing.processingContextsConsumer =
-                  id -> {
-                    assertNotNull(idsRoundOne.get(id));
-                    assertNull(idsRoundTwo.put(id, id));
-                  };
-              options.proguardMapConsumer =
-                  ToolHelper.consumeString(proguardMap -> this.proguardMap2 = proguardMap);
-            });
-
-    // Verify that the result of the two compilations was the same.
-    assertEquals(
-        Collections.emptySet(),
-        Sets.symmetricDifference(idsRoundOne.keySet(), idsRoundTwo.keySet()));
-    assertIdenticalApplications(app1, app2);
-    assertEquals(proguardMap1, proguardMap2);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV4VerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV4VerificationTest.java
deleted file mode 100644
index 1b650e5..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV4VerificationTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2016, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import org.junit.Test;
-
-public class R8GMSCoreV4VerificationTest extends GMSCoreCompilationTestBase {
-  @Test
-  public void verify() throws Exception {
-    runR8AndCheckVerification(CompilationMode.RELEASE, GMSCORE_V4_DIR);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV5VerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV5VerificationTest.java
deleted file mode 100644
index df73644..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV5VerificationTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2016, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import org.junit.Test;
-
-public class R8GMSCoreV5VerificationTest extends GMSCoreCompilationTestBase {
-  @Test
-  public void verify() throws Exception {
-    runR8AndCheckVerification(CompilationMode.RELEASE, GMSCORE_V5_DIR);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV6VerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV6VerificationTest.java
deleted file mode 100644
index a872ff5..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV6VerificationTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2016, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import org.junit.Test;
-
-public class R8GMSCoreV6VerificationTest extends GMSCoreCompilationTestBase {
-  @Test
-  public void verify() throws Exception {
-    runR8AndCheckVerification(CompilationMode.RELEASE, GMSCORE_V6_DIR);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV7VerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV7VerificationTest.java
deleted file mode 100644
index 2cda255..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV7VerificationTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2016, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import org.junit.Test;
-
-public class R8GMSCoreV7VerificationTest extends GMSCoreCompilationTestBase {
-
-  @Test
-  public void verify() throws Exception {
-    runR8AndCheckVerification(CompilationMode.RELEASE, GMSCORE_V7_DIR);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV8VerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV8VerificationTest.java
deleted file mode 100644
index 3f48336..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV8VerificationTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2016, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import org.junit.Test;
-
-public class R8GMSCoreV8VerificationTest extends GMSCoreCompilationTestBase {
-
-  @Test
-  public void verify() throws Exception {
-    runR8AndCheckVerification(CompilationMode.RELEASE, GMSCORE_V8_DIR);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV9DeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV9DeployJarVerificationTest.java
deleted file mode 100644
index fb06e84..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV9DeployJarVerificationTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2017, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
-import org.junit.Test;
-
-public class R8GMSCoreV9DeployJarVerificationTest extends GMSCoreDeployJarVerificationTest {
-
-  @Test
-  public void buildFromDeployJar() throws Exception {
-    buildFromDeployJar(
-        CompilerUnderTest.R8, CompilationMode.RELEASE,
-        GMSCoreCompilationTestBase.GMSCORE_V9_DIR, true);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV9TreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV9TreeShakeJarVerificationTest.java
deleted file mode 100644
index a9e28c9..0000000
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV9TreeShakeJarVerificationTest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2017, 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.internal;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.StringConsumer.FileConsumer;
-import java.io.File;
-import java.nio.file.Path;
-import org.junit.Test;
-
-public class R8GMSCoreV9TreeShakeJarVerificationTest extends R8GMSCoreTreeShakeJarVerificationTest {
-
-  @Test
-  public void buildAndTreeShakeFromDeployJar() throws Exception {
-    Path proguardMapPath = File.createTempFile("mapping", ".txt", temp.getRoot()).toPath();
-    buildAndTreeShakeFromDeployJar(
-        CompilationMode.RELEASE,
-        GMSCORE_V9_DIR,
-        true,
-        GMSCORE_V9_MAX_SIZE,
-        options -> options.proguardMapConsumer = new FileConsumer(proguardMapPath));
-  }
-}