Convert desugared library test

Bug: b:231287675
Change-Id: Ia6e1298b1d5a8f55c06ead7771649bef3b564ac5
diff --git a/src/test/java/com/android/tools/r8/TestParametersBuilder.java b/src/test/java/com/android/tools/r8/TestParametersBuilder.java
index cf33980..59d2bc6 100644
--- a/src/test/java/com/android/tools/r8/TestParametersBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestParametersBuilder.java
@@ -187,6 +187,7 @@
 
   private boolean enableApiLevels = false;
   private boolean enableApiLevelsForCf = false;
+  private boolean onlyDexRuntimeApiLevel = false;
 
   private Predicate<AndroidApiLevel> apiLevelFilter = param -> false;
   private List<AndroidApiLevel> explicitApiLevels = new ArrayList<>();
@@ -202,6 +203,12 @@
     return withApiFilter(api -> true);
   }
 
+  public TestParametersBuilder withOnlyDexRuntimeApiLevel() {
+    enableApiLevels = true;
+    onlyDexRuntimeApiLevel = true;
+    return this;
+  }
+
   public TestParametersBuilder enableApiLevelsForCf() {
     enableApiLevelsForCf = true;
     return this;
@@ -266,6 +273,10 @@
     if (runtime.isCf() && !enableApiLevelsForCf) {
       return Stream.of(new TestParameters(runtime));
     }
+    AndroidApiLevel vmLevel = runtime.maxSupportedApiLevel();
+    if (onlyDexRuntimeApiLevel) {
+      return Stream.of(new TestParameters(runtime, vmLevel));
+    }
     List<AndroidApiLevel> sortedApiLevels =
         AndroidApiLevel.getAndroidApiLevelsSorted().stream()
             .filter(apiLevelFilter)
@@ -273,7 +284,6 @@
     if (sortedApiLevels.isEmpty()) {
       return Stream.of();
     }
-    AndroidApiLevel vmLevel = runtime.maxSupportedApiLevel();
     AndroidApiLevel lowestApplicable = sortedApiLevels.get(0);
     if (vmLevel.getLevel() < lowestApplicable.getLevel()) {
       return Stream.of();
@@ -281,6 +291,9 @@
     if (sortedApiLevels.size() > 1) {
       for (int i = sortedApiLevels.size() - 1; i >= 0; i--) {
         AndroidApiLevel highestApplicable = sortedApiLevels.get(i);
+        if (onlyDexRuntimeApiLevel) {
+          return Stream.of(new TestParameters(runtime, highestApplicable));
+        }
         if (highestApplicable.getLevel() <= vmLevel.getLevel()
             && lowestApplicable != highestApplicable) {
           Set<AndroidApiLevel> set = new TreeSet<>();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
index 6ade9c9..91fa3d5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
@@ -6,6 +6,9 @@
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
 import static org.hamcrest.CoreMatchers.allOf;
 import static org.hamcrest.CoreMatchers.containsString;
 
@@ -13,13 +16,16 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.errors.DesugaredLibraryMismatchDiagnostic;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.Box;
+import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
-import java.util.Collection;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -29,20 +35,30 @@
 public class DesugaredLibraryMismatchTest extends DesugaredLibraryTestBase {
 
   private final TestParameters parameters;
-  private final AndroidApiLevel apiLevel;
+  private final CompilationSpecification compilationSpecification;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
 
-  @Parameters(name = "API level: {1}")
-  public static Collection<Object[]> data() {
+  @Parameters(name = "{0}, spec: {1}, {2}")
+  public static List<Object[]> data() {
     return buildParameters(
-        getTestParameters().withNoneRuntime().build(),
-        new AndroidApiLevel[] {
-          AndroidApiLevel.LATEST, AndroidApiLevel.O, AndroidApiLevel.N_MR1, AndroidApiLevel.B
-        });
+        getTestParameters()
+            .withDexRuntime(Version.first())
+            .withDexRuntime(Version.V7_0_0)
+            .withDexRuntime(Version.V8_1_0)
+            .withDexRuntime(Version.last())
+            .withOnlyDexRuntimeApiLevel()
+            .build(),
+        getJdk8Jdk11(),
+        ImmutableList.of(D8_L8DEBUG));
   }
 
-  public DesugaredLibraryMismatchTest(TestParameters parameters, AndroidApiLevel apiLevel) {
+  public DesugaredLibraryMismatchTest(
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification) {
     this.parameters = parameters;
-    this.apiLevel = apiLevel;
+    this.compilationSpecification = compilationSpecification;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
   }
 
   @Test
@@ -51,21 +67,19 @@
     Path libraryDex =
         testForD8(Backend.DEX)
             .addProgramClasses(Library.class)
-            .setMinApi(apiLevel)
+            .setMinApi(parameters.getApiLevel())
             .compile()
             .writeToZip();
 
     // Combine DEX input without library desugaring with dexing with library desugaring.
     try {
-      testForD8()
-          .addLibraryFiles(getLibraryFile())
+      testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
           .addProgramFiles(libraryDex)
           .addProgramClasses(TestRunner.class)
-          .setMinApi(apiLevel)
-          .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel))
           .compileWithExpectedDiagnostics(
               diagnostics -> {
-                if (requiresAnyCoreLibDesugaring(apiLevel)) {
+                if (requiresAnyCoreLibDesugaring(
+                    parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)) {
                   diagnostics.assertNoInfos();
                   diagnostics.assertAllWarningsMatch(
                       diagnosticMessage(
@@ -89,17 +103,14 @@
     Path desugaredLibrary =
         testForD8(Backend.CF)
             .addProgramClasses(Library.class)
-            .setMinApi(apiLevel)
+            .setMinApi(parameters.getApiLevel())
             .compile()
             .writeToZip();
 
     // Combine CF desugared input without library desugaring with dexing with library desugaring.
-    testForD8()
-        .addLibraryFiles(getLibraryFile())
+    testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
         .addProgramFiles(desugaredLibrary)
         .addProgramClasses(TestRunner.class)
-        .setMinApi(apiLevel)
-        .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel))
         .compile();
   }
 
@@ -109,7 +120,7 @@
     Path desugaredLibrary =
         testForD8(Backend.CF)
             .addProgramClasses(Library.class)
-            .setMinApi(apiLevel)
+            .setMinApi(parameters.getApiLevel())
             .compile()
             .writeToZip();
 
@@ -117,17 +128,14 @@
     Path desugaredLibraryDex =
         testForD8(Backend.DEX)
             .addProgramFiles(desugaredLibrary)
-            .setMinApi(apiLevel)
+            .setMinApi(parameters.getApiLevel())
             .disableDesugaring()
             .compile()
             .writeToZip();
 
-    testForD8()
-        .addLibraryFiles(getLibraryFile())
+    testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
         .addProgramFiles(desugaredLibraryDex)
         .addProgramClasses(TestRunner.class)
-        .setMinApi(apiLevel)
-        .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel))
         .compile();
   }
 
@@ -137,8 +145,9 @@
     Path desugaredLibrary =
         testForD8(Backend.CF)
             .addProgramClasses(Library.class)
-            .setMinApi(apiLevel)
-            .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel))
+            .setMinApi(parameters.getApiLevel())
+            .enableCoreLibraryDesugaring(
+                LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
             .compile()
             .writeToZip();
 
@@ -147,10 +156,10 @@
       testForD8()
           .addProgramFiles(desugaredLibrary)
           .addProgramClasses(TestRunner.class)
-          .setMinApi(apiLevel)
+          .setMinApi(parameters.getApiLevel())
           .compileWithExpectedDiagnostics(
               diagnostics -> {
-                if (requiresAnyCoreLibDesugaring(apiLevel)) {
+                if (requiresAnyCoreLibDesugaring(parameters.getApiLevel())) {
                   diagnostics.assertOnlyErrors();
                   diagnostics.assertErrorsMatch(
                       diagnosticType(DesugaredLibraryMismatchDiagnostic.class));
@@ -166,11 +175,9 @@
   public void testMergeLibraryDesugaredWithNotLibraryDesugared() throws Exception {
     // DEX code with library desugaring.
     Path libraryDex =
-        testForD8(Backend.DEX)
-            .addLibraryFiles(getLibraryFile())
+        testForDesugaredLibrary(
+                parameters, libraryDesugaringSpecification, compilationSpecification)
             .addProgramClasses(Library.class)
-            .setMinApi(apiLevel)
-            .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel))
             .compile()
             .writeToZip();
 
@@ -178,7 +185,7 @@
     Path programDex =
         testForD8(Backend.DEX)
             .addProgramClasses(TestRunner.class)
-            .setMinApi(apiLevel)
+            .setMinApi(parameters.getApiLevel())
             .compile()
             .writeToZip();
 
@@ -186,10 +193,11 @@
       testForD8()
           .addProgramFiles(libraryDex)
           .addProgramFiles(programDex)
-          .setMinApi(apiLevel)
+          .setMinApi(parameters.getApiLevel())
           .compileWithExpectedDiagnostics(
               diagnostics -> {
-                if (requiresAnyCoreLibDesugaring(apiLevel)) {
+                if (requiresAnyCoreLibDesugaring(
+                    parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)) {
                   diagnostics.assertOnlyErrors();
                   diagnostics.assertErrorsMatch(
                       diagnosticType(DesugaredLibraryMismatchDiagnostic.class));
@@ -209,10 +217,10 @@
     Path libraryDex =
         testForD8(Backend.DEX)
             .addProgramClasses(Library.class)
-            .setMinApi(apiLevel)
+            .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(
                 LibraryDesugaringTestConfiguration.builder()
-                    .setMinApi(apiLevel)
+                    .setMinApi(parameters.getApiLevel())
                     // Minimal configuration with a different identifier.
                     // The j$.time is rewritten because empty flags are equivalent to an empty
                     // specification, and no marker is set for empty specifications.
@@ -241,7 +249,7 @@
     Path programDex =
         testForD8(Backend.DEX)
             .addProgramClasses(TestRunner.class)
-            .setMinApi(apiLevel)
+            .setMinApi(parameters.getApiLevel())
             .compile()
             .writeToZip();
 
@@ -249,7 +257,7 @@
       testForD8()
           .addProgramFiles(libraryDex)
           .addProgramFiles(programDex)
-          .setMinApi(apiLevel)
+          .setMinApi(parameters.getApiLevel())
           .compileWithExpectedDiagnostics(
               diagnostics -> {
                 diagnostics.assertOnlyErrors();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
index 1a7981a..2bd0f31 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
@@ -5,23 +5,21 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
 import static org.hamcrest.core.StringContains.containsString;
 
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.L8Command;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.StringResource;
-import com.android.tools.r8.TestDiagnosticMessagesImpl;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.BooleanUtils;
-import java.nio.file.Path;
-import java.util.Arrays;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class DesugaredLibraryWarningTest extends DesugaredLibraryTestBase {
@@ -36,44 +34,44 @@
           + "-keep class j$.util.function.Function { *; }";
 
   private final TestParameters parameters;
-  private final boolean shrinkDesugaredLibrary;
+  private final CompilationSpecification compilationSpecification;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
 
-  @Parameterized.Parameters(name = "{1}, shrinkDesugaredLibrary: {0}")
+  @Parameters(name = "{0}, spec: {1}, {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build());
+        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        getJdk8Jdk11(),
+        ImmutableList.of(D8_L8DEBUG, D8_L8SHRINK));
   }
 
-  public DesugaredLibraryWarningTest(boolean shrinkDesugaredLibrary, TestParameters parameters) {
-    this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+  public DesugaredLibraryWarningTest(
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification) {
     this.parameters = parameters;
+    this.compilationSpecification = compilationSpecification;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
   }
 
   @Test
   public void testDesugaredLibraryContent() throws Exception {
-    TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
-    Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
-    L8Command.Builder l8Builder =
-        L8Command.builder(diagnosticsHandler)
-            .addLibraryFiles(getLibraryFile())
-            .addProgramFiles(ToolHelper.getDesugarJDKLibs())
-            .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
-            .setMode(shrinkDesugaredLibrary ? CompilationMode.RELEASE : CompilationMode.DEBUG)
-            .addDesugaredLibraryConfiguration(
-                StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
-            .setMinApiLevel(parameters.getApiLevel().getLevel())
-            .setOutput(desugaredLib, OutputMode.DexIndexed);
-    if (shrinkDesugaredLibrary) {
-      l8Builder.addProguardConfiguration(
-          Arrays.asList(FUNCTION_KEEP.split(System.lineSeparator())), Origin.unknown());
-    }
-    ToolHelper.runL8(l8Builder.build(), options -> {});
-    if (isJDK11DesugaredLibrary()) {
-      diagnosticsHandler.assertNoErrors();
-      diagnosticsHandler.assertAllWarningsMatch(
-          diagnosticMessage(containsString("Specification conversion")));
-    } else {
-      diagnosticsHandler.assertNoMessages();
-    }
+    testForL8(parameters.getApiLevel())
+        .apply(
+            l8TestBuilder ->
+                libraryDesugaringSpecification.configureL8TestBuilder(
+                    l8TestBuilder, compilationSpecification.isL8Shrink(), FUNCTION_KEEP))
+        .compile()
+        .inspectDiagnosticMessages(
+            diagnosticsHandler -> {
+              if (libraryDesugaringSpecification != JDK8) {
+                diagnosticsHandler.assertNoErrors();
+                diagnosticsHandler.assertAllWarningsMatch(
+                    diagnosticMessage(containsString("Specification conversion")));
+              } else {
+
+                diagnosticsHandler.assertNoMessages();
+              }
+            });
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
index 1245c7e..44ee001 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
@@ -4,12 +4,14 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary;
 
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
 import static org.hamcrest.core.StringContains.containsString;
 
-import com.android.tools.r8.D8TestRunResult;
-import com.android.tools.r8.R8TestRunResult;
+import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.utils.StringUtils;
 import java.time.LocalDate;
 import java.util.List;
@@ -21,69 +23,41 @@
 @RunWith(Parameterized.class)
 public class DesugaredLocalDateReflectedTypePassedToStaticType extends DesugaredLibraryTestBase {
 
-  private final TestParameters parameters;
-  private final boolean shrinkDesugaredLibrary;
   private static final String EXPECTED = StringUtils.lines("1992");
 
-  @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}")
+  private final TestParameters parameters;
+  private final CompilationSpecification compilationSpecification;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+
+  @Parameters(name = "{0}, spec: {1}, {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        getTestParameters().withDexRuntimes().withAllApiLevels().build(), BooleanUtils.values());
+        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        getJdk8Jdk11(),
+        DEFAULT_SPECIFICATIONS);
   }
 
   public DesugaredLocalDateReflectedTypePassedToStaticType(
-      TestParameters parameters, boolean shrinkDesugaredLibrary) {
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification) {
     this.parameters = parameters;
-    this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+    this.compilationSpecification = compilationSpecification;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
   }
 
   @Test
-  public void testD8() throws Exception {
-    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
-    D8TestRunResult runResult =
-        testForD8()
-            .addLibraryFiles(getLibraryFile())
-            .addInnerClasses(DesugaredLocalDateReflectedTypePassedToStaticType.class)
-            .setMinApi(parameters.getApiLevel())
-            .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
-            .setIncludeClassesChecksum(true)
-            .compile()
-            .addDesugaredCoreLibraryRunClassPath(
-                this::buildDesugaredLibrary,
-                parameters.getApiLevel(),
-                keepRuleConsumer.get(),
-                shrinkDesugaredLibrary)
-            .run(parameters.getRuntime(), Main.class);
-    if (shrinkDesugaredLibrary && requiresTimeDesugaring(parameters)) {
-      runResult.assertFailureWithErrorThatMatches(
-          containsString("java.lang.NoSuchMethodException"));
-    } else {
-      runResult.assertSuccessWithOutput(EXPECTED);
-    }
-  }
-
-  @Test
-  public void testR8() throws Exception {
-    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
-    R8TestRunResult runResult =
-        testForR8(parameters.getBackend())
-            .addLibraryFiles(getLibraryFile())
+  public void testDate() throws Exception {
+    SingleTestRunResult<?> run =
+        testForDesugaredLibrary(
+                parameters, libraryDesugaringSpecification, compilationSpecification)
             .addInnerClasses(DesugaredLocalDateReflectedTypePassedToStaticType.class)
             .addKeepMainRule(Main.class)
-            .setMinApi(parameters.getApiLevel())
-            .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
-            .compile()
-            .addDesugaredCoreLibraryRunClassPath(
-                this::buildDesugaredLibrary,
-                parameters.getApiLevel(),
-                keepRuleConsumer.get(),
-                shrinkDesugaredLibrary)
             .run(parameters.getRuntime(), Main.class);
-    if (shrinkDesugaredLibrary && requiresTimeDesugaring(parameters)) {
-      runResult.assertFailureWithErrorThatMatches(
-          containsString("java.lang.NoSuchMethodException"));
+    if (compilationSpecification.isL8Shrink() && requiresTimeDesugaring(parameters)) {
+      run.assertFailureWithErrorThatMatches(containsString("java.lang.NoSuchMethodException"));
     } else {
-      runResult.assertSuccessWithOutput(EXPECTED);
+      run.assertSuccessWithOutput(EXPECTED);
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
index ebc0f68..43dc91b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
@@ -4,13 +4,15 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary;
 
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
 import static org.hamcrest.core.StringContains.containsString;
 
-import com.android.tools.r8.D8TestRunResult;
-import com.android.tools.r8.R8TestRunResult;
+import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper.DexVm;
-import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.List;
 import org.junit.Test;
@@ -21,63 +23,36 @@
 @RunWith(Parameterized.class)
 public class DesugaredLocalDateReflectionTest extends DesugaredLibraryTestBase {
 
-  private final TestParameters parameters;
-  private final boolean shrinkDesugaredLibrary;
   private static final String EXPECTED = StringUtils.lines("1992");
 
-  @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}")
+  private final TestParameters parameters;
+  private final CompilationSpecification compilationSpecification;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+
+  @Parameters(name = "{0}, spec: {1}, {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        getTestParameters().withDexRuntimes().withAllApiLevels().build(), BooleanUtils.values());
+        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        getJdk8Jdk11(),
+        DEFAULT_SPECIFICATIONS);
   }
 
   public DesugaredLocalDateReflectionTest(
-      TestParameters parameters, boolean shrinkDesugaredLibrary) {
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification) {
     this.parameters = parameters;
-    this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+    this.compilationSpecification = compilationSpecification;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
   }
 
   @Test
-  public void testD8() throws Exception {
-    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
-    D8TestRunResult runResult =
-        testForD8()
-            .addLibraryFiles(getLibraryFile())
-            .addInnerClasses(DesugaredLocalDateReflectionTest.class)
-            .setMinApi(parameters.getApiLevel())
-            .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
-            .setIncludeClassesChecksum(true)
-            .compile()
-            .addDesugaredCoreLibraryRunClassPath(
-                this::buildDesugaredLibrary,
-                parameters.getApiLevel(),
-                keepRuleConsumer.get(),
-                shrinkDesugaredLibrary)
-            .run(parameters.getRuntime(), Main.class);
-    if (parameters.getRuntime().asDex().getVm().isNewerThan(DexVm.ART_7_0_0_HOST)) {
-      runResult.assertSuccessWithOutput(EXPECTED);
-    } else {
-      runResult.assertFailureWithErrorThatMatches(
-          containsString("java.lang.ClassNotFoundException: java.time.LocalDate"));
-    }
-  }
-
-  @Test
-  public void testR8() throws Exception {
-    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
-    R8TestRunResult runResult =
-        testForR8(parameters.getBackend())
-            .addLibraryFiles(getLibraryFile())
-            .addInnerClasses(DesugaredLocalDateReflectionTest.class)
+  public void testDate() throws Exception {
+    SingleTestRunResult<?> runResult =
+        testForDesugaredLibrary(
+                parameters, libraryDesugaringSpecification, compilationSpecification)
+            .addInnerClasses(getClass())
             .addKeepMainRule(Main.class)
-            .setMinApi(parameters.getApiLevel())
-            .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
-            .compile()
-            .addDesugaredCoreLibraryRunClassPath(
-                this::buildDesugaredLibrary,
-                parameters.getApiLevel(),
-                keepRuleConsumer.get(),
-                shrinkDesugaredLibrary)
             .run(parameters.getRuntime(), Main.class);
     if (parameters.getRuntime().asDex().getVm().isNewerThan(DexVm.ART_7_0_0_HOST)) {
       runResult.assertSuccessWithOutput(EXPECTED);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
index 139103d..6c1f23f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
@@ -4,12 +4,15 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary;
 
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
 import static org.hamcrest.core.StringContains.containsString;
 
-import com.android.tools.r8.D8TestRunResult;
-import com.android.tools.r8.R8TestRunResult;
+import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.utils.StringUtils;
 import java.time.LocalDate;
 import java.util.List;
@@ -22,65 +25,37 @@
 public class DesugaredReflectedDesugaredTypePassedToStaticTypeTest
     extends DesugaredLibraryTestBase {
 
-  private final TestParameters parameters;
-  private final boolean shrinkDesugaredLibrary;
   private static final String EXPECTED = StringUtils.lines("1992", "1992");
+  private final TestParameters parameters;
+  private final CompilationSpecification compilationSpecification;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
 
-  @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}")
+  @Parameters(name = "{0}, spec: {1}, {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        getTestParameters().withDexRuntimes().withAllApiLevels().build(), BooleanUtils.values());
+        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        getJdk8Jdk11(),
+        DEFAULT_SPECIFICATIONS);
   }
 
   public DesugaredReflectedDesugaredTypePassedToStaticTypeTest(
-      TestParameters parameters, boolean shrinkDesugaredLibrary) {
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification) {
     this.parameters = parameters;
-    this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+    this.compilationSpecification = compilationSpecification;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
   }
 
   @Test
-  public void testD8() throws Exception {
-    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
-    D8TestRunResult runResult =
-        testForD8()
-            .addLibraryFiles(getLibraryFile())
-            .addInnerClasses(DesugaredReflectedDesugaredTypePassedToStaticTypeTest.class)
-            .setMinApi(parameters.getApiLevel())
-            .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
-            .setIncludeClassesChecksum(true)
-            .compile()
-            .addDesugaredCoreLibraryRunClassPath(
-                this::buildDesugaredLibrary,
-                parameters.getApiLevel(),
-                keepRuleConsumer.get(),
-                shrinkDesugaredLibrary)
-            .run(parameters.getRuntime(), Main.class);
-    if (!requiresTimeDesugaring(parameters)) {
-      runResult.assertFailureWithErrorThatMatches(
-          containsString("java.lang.ClassNotFoundException: j$.time.LocalDate"));
-    } else {
-      runResult.assertSuccessWithOutput(EXPECTED);
-    }
-  }
-
-  @Test
-  public void testR8() throws Exception {
-    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
-    R8TestRunResult runResult =
-        testForR8(parameters.getBackend())
-            .addLibraryFiles(getLibraryFile())
-            .addInnerClasses(DesugaredReflectedDesugaredTypePassedToStaticTypeTest.class)
+  public void testDate() throws Exception {
+    SingleTestRunResult<?> runResult =
+        testForDesugaredLibrary(
+                parameters, libraryDesugaringSpecification, compilationSpecification)
+            .addInnerClasses(getClass())
             .addKeepMainRule(Main.class)
-            .setMinApi(parameters.getApiLevel())
-            .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
-            .compile()
-            .addDesugaredCoreLibraryRunClassPath(
-                this::buildDesugaredLibrary,
-                parameters.getApiLevel(),
-                keepRuleConsumer.get(),
-                shrinkDesugaredLibrary)
             .run(parameters.getRuntime(), Main.class);
-    if (!requiresTimeDesugaring(parameters)) {
+    if (!requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) {
       runResult.assertFailureWithErrorThatMatches(
           containsString("java.lang.ClassNotFoundException: j$.time.LocalDate"));
     } else {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
index b112609..49c1b94 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.TestCompileResult;
 import com.android.tools.r8.TestCompilerBuilder;
+import com.android.tools.r8.TestCompilerBuilder.DiagnosticsConsumer;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.TestShrinkerBuilder;
@@ -220,8 +221,19 @@
   }
 
   public DesugaredLibraryTestCompileResult<T> compile() throws Exception {
-    // We compile first to generate the keep rules for the l8 compilation.
     TestCompileResult<?, ? extends SingleTestRunResult<?>> compile = builder.compile();
+    return internalCompile(compile);
+  }
+
+  public DesugaredLibraryTestCompileResult<T> compileWithExpectedDiagnostics(
+      DiagnosticsConsumer consumer) throws Exception {
+    TestCompileResult<?, ? extends SingleTestRunResult<?>> compile =
+        builder.compileWithExpectedDiagnostics(consumer);
+    return internalCompile(compile);
+  }
+
+  private DesugaredLibraryTestCompileResult<T> internalCompile(
+      TestCompileResult<?, ? extends SingleTestRunResult<?>> compile) throws Exception {
     String keepRule = keepRuleConsumer == null ? null : keepRuleConsumer.get();
     L8TestCompileResult l8Compile = compileDesugaredLibrary(keepRule);
     D8TestCompileResult customLibCompile = compileCustomLib();