Convert desugared library tests

Introduce inspectL8

Bug: b:231287675
Change-Id: Ic29b0a6553c2a53e4a93750211bb28d6bf7af2f6
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
index b258db7..3ae7873 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
@@ -4,55 +4,53 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
 
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertTrue;
 
-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.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
-import java.nio.file.Path;
 import java.util.List;
 import java.util.stream.Collectors;
 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 ConversionsPresentTest extends DesugaredLibraryTestBase {
 
   private final TestParameters parameters;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
 
-  @Parameterized.Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withDexRuntimes().withAllApiLevels().build();
+  private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.O;
+
+  @Parameters(name = "{0}, spec: {1}")
+  public static List<Object[]> data() {
+    return buildParameters(getConversionParametersUpToExcluding(MIN_SUPPORTED), getJdk8Jdk11());
   }
 
-  public ConversionsPresentTest(TestParameters parameters) {
+  public ConversionsPresentTest(
+      TestParameters parameters, LibraryDesugaringSpecification libraryDesugaringSpecification) {
     this.parameters = parameters;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
   }
 
   @Test
   public void testConversionsDex() throws Exception {
-    TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
-    Path desugaredLib = temp.newFolder().toPath().resolve("conversion_dex.zip");
-    L8Command.Builder l8Builder =
-        L8Command.builder(diagnosticsHandler)
-            .addLibraryFiles(getLibraryFile())
-            .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
-            .addProgramFiles(ToolHelper.getDesugarJDKLibs())
-            .addDesugaredLibraryConfiguration(
-                StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
-            .setMinApiLevel(parameters.getApiLevel().getLevel())
-            .setOutput(desugaredLib, OutputMode.DexIndexed);
-    ToolHelper.runL8(l8Builder.build(), x -> {});
-    this.checkConversionGeneratedDex(new CodeInspector(desugaredLib));
+    testForL8(parameters.getApiLevel())
+        .addLibraryFiles(libraryDesugaringSpecification.getAndroidJar())
+        .noDefaultDesugarJDKLibs()
+        .addProgramFiles(libraryDesugaringSpecification.getDesugarJdkLibs())
+        .setDesugaredLibraryConfiguration(
+            StringResource.fromFile(libraryDesugaringSpecification.getSpecification()))
+        .compile()
+        .apply(c -> checkConversionGeneratedDex(c.inspector()));
   }
 
   private void checkConversionGeneratedDex(CodeInspector inspector) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
index b966b00..52539f9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
@@ -4,19 +4,23 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
 
+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 junit.framework.TestCase.assertEquals;
 
-import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestRuntime.DexRuntime;
-import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CustomLibrarySpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.Box;
+import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import java.nio.file.Path;
+import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -24,75 +28,62 @@
 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 DuplicateAPIDesugaredLibTest extends DesugaredLibraryTestBase {
 
   private final TestParameters parameters;
-  private final boolean shrinkDesugaredLibrary;
-  private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.N;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+  private final CompilationSpecification compilationSpecification;
+  private final boolean supportCallbacks;
 
-  @Parameterized.Parameters(name = "{0}, shrinkDesugaredLibrary: {1}")
+  private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.O;
+  private static final String EXPECTED_RESULT = StringUtils.lines(" 1 1.1 2 2.2", " 1 1.1 2 2.2");
+
+  @Parameters(name = "{0}, spec: {1}, {2}, callbacks: {3}")
   public static List<Object[]> data() {
     return buildParameters(
-        getConversionParametersUpToExcluding(MIN_SUPPORTED), BooleanUtils.values());
+        getTestParameters()
+            .withDexRuntimesStartingFromIncluding(Version.V8_1_0)
+            .withApiLevel(AndroidApiLevel.B)
+            .build(),
+        getJdk8Jdk11(),
+        ImmutableList.of(D8_L8DEBUG),
+        BooleanUtils.values());
   }
 
-  public DuplicateAPIDesugaredLibTest(TestParameters parameters, boolean shrinkDesugaredLibrary) {
-    this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+  public DuplicateAPIDesugaredLibTest(
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification,
+      boolean supportCallbacks) {
     this.parameters = parameters;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
+    this.compilationSpecification = compilationSpecification;
+    this.supportCallbacks = supportCallbacks;
   }
 
   @Test
-  public void testLib() throws Exception {
-    for (Boolean supportAllCallbacksFromLibrary : BooleanUtils.values()) {
-      Box<Path> desugaredLibBox = new Box<>();
-      Path customLib =
-          testForD8()
-              .addProgramClasses(CustomLibClass.class)
-              .setMinApi(AndroidApiLevel.B)
-              .compile()
-              .writeToZip();
-      String stdOut =
-          testForD8()
-              .addLibraryFiles(getLibraryFile())
-              .setMinApi(AndroidApiLevel.B)
-              .addProgramClasses(Executor.class)
-              .addLibraryClasses(CustomLibClass.class)
-              .enableCoreLibraryDesugaring(
-                  LibraryDesugaringTestConfiguration.builder()
-                      .setMinApi(AndroidApiLevel.B)
-                      .dontAddRunClasspath()
-                      .build())
-              .compile()
-              .addDesugaredCoreLibraryRunClassPath(
-                  (AndroidApiLevel api) -> {
-                    desugaredLibBox.set(
-                        this.buildDesugaredLibrary(
-                            api,
-                            opt ->
-                                setDesugaredLibrarySpecificationForTesting(
-                                    opt,
-                                    configurationWithSupportAllCallbacksFromLibrary(
-                                        opt, true, parameters, supportAllCallbacksFromLibrary))));
-                    return desugaredLibBox.get();
-                  },
-                  AndroidApiLevel.B)
-              .addRunClasspathFiles(customLib)
-              .run(new DexRuntime(DexVm.ART_9_0_0_HOST), Executor.class)
-              .assertSuccess()
-              .getStdOut();
-      assertDupMethod(new CodeInspector(desugaredLibBox.get()), supportAllCallbacksFromLibrary);
-      assertLines2By2Correct(stdOut);
-    }
+  public void testLib() throws Throwable {
+    testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
+        .addProgramClasses(Executor.class)
+        .setCustomLibrarySpecification(
+            new CustomLibrarySpecification(CustomLibClass.class, MIN_SUPPORTED))
+        .addKeepMainRule(Executor.class)
+        .supportAllCallbacksFromLibrary(supportCallbacks)
+        .compile()
+        .inspectL8(this::assertDupMethod)
+        .run(parameters.getRuntime(), Executor.class)
+        .assertSuccessWithOutput(EXPECTED_RESULT);
   }
 
-  private void assertDupMethod(CodeInspector inspector, boolean supportAllCallbacksFromLibrary) {
+  private void assertDupMethod(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("j$.util.concurrent.ConcurrentHashMap");
     int numForEachMethods =
-        isJDK11DesugaredLibrary()
-            ? supportAllCallbacksFromLibrary ? 4 : 3
-            : supportAllCallbacksFromLibrary ? 2 : 1;
+        libraryDesugaringSpecification == JDK8
+            ? supportCallbacks ? 2 : 1
+            : supportCallbacks ? 4 : 3;
     assertEquals(
         numForEachMethods,
         clazz.virtualMethods().stream().filter(m -> m.getOriginalName().equals("forEach")).count());
@@ -108,6 +99,7 @@
       map.forEach(biConsumer);
       System.out.println();
       CustomLibClass.javaForEach(map, biConsumer);
+      System.out.println();
     }
   }
 
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 10c7e10..35bb41e 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
@@ -5,19 +5,24 @@
 package com.android.tools.r8.desugar.desugaredlibrary.test;
 
 import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.L8TestBuilder;
+import com.android.tools.r8.L8TestCompileResult;
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.R8TestBuilder;
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestBase.Backend;
+import com.android.tools.r8.TestCompileResult;
 import com.android.tools.r8.TestCompilerBuilder;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRunResult;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
+import com.android.tools.r8.utils.ConsumerUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import java.io.IOException;
 import java.nio.file.Path;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 import org.junit.Assume;
 
@@ -30,7 +35,7 @@
   private final TestCompilerBuilder<?, ?, ?, ?, ?> builder;
 
   private CustomLibrarySpecification customLibrarySpecification = null;
-  private Consumer<InternalOptions> l8OptionModifier = null;
+  private Consumer<InternalOptions> l8OptionModifier = ConsumerUtils.emptyConsumer();
   private TestingKeepRuleConsumer keepRuleConsumer = null;
 
   public DesugaredLibraryTestBuilder(
@@ -83,6 +88,12 @@
     return this;
   }
 
+  public DesugaredLibraryTestBuilder<T> addL8OptionsModification(
+      Consumer<InternalOptions> optionModifier) {
+    l8OptionModifier = l8OptionModifier.andThen(optionModifier);
+    return this;
+  }
+
   public DesugaredLibraryTestBuilder<T> addOptionsModification(
       Consumer<InternalOptions> optionModifier) {
     builder.addOptionsModification(optionModifier);
@@ -126,16 +137,38 @@
     return this;
   }
 
-  public DesugaredLibraryTestCompileResult<T> compile() throws CompilationFailedException {
+  public DesugaredLibraryTestCompileResult<T> compile() throws Exception {
+    // We compile first to generate the keep rules for the l8 compilation.
+    TestCompileResult<?, ?> compile = builder.compile();
+    String keepRule = keepRuleConsumer == null ? null : keepRuleConsumer.get();
+    L8TestCompileResult l8Compile = compileDesugaredLibrary(keepRule);
     return new DesugaredLibraryTestCompileResult<>(
         test,
-        builder.compile(),
+        compile,
         parameters,
         libraryDesugaringSpecification,
         compilationSpecification,
         customLibrarySpecification,
-        l8OptionModifier,
-        keepRuleConsumer == null ? null : keepRuleConsumer.get());
+        l8Compile);
+  }
+
+  private L8TestCompileResult compileDesugaredLibrary(String keepRule)
+      throws IOException, CompilationFailedException, ExecutionException {
+    return test.testForL8(parameters.getApiLevel(), parameters.getBackend())
+        .addProgramFiles(libraryDesugaringSpecification.getDesugarJdkLibs())
+        .addLibraryFiles(libraryDesugaringSpecification.getAndroidJar())
+        .setDesugaredLibraryConfiguration(libraryDesugaringSpecification.getSpecification())
+        .noDefaultDesugarJDKLibs()
+        .applyIf(
+            compilationSpecification.isL8Shrink(),
+            builder -> {
+              if (keepRule != null && !keepRule.trim().isEmpty()) {
+                builder.addGeneratedKeepRules(keepRule);
+              }
+            },
+            L8TestBuilder::setDebug)
+        .addOptionsModifier(l8OptionModifier)
+        .compile();
   }
 
   public TestRunResult<?> run(TestRuntime runtime, Class<?> mainClass, String... args)
@@ -150,18 +183,23 @@
 
   public DesugaredLibraryTestBuilder<T> supportAllCallbacksFromLibrary(
       boolean supportAllCallbacksFromLibrary) {
+    addL8OptionsModification(supportLibraryCallbackConsumer(supportAllCallbacksFromLibrary, true));
     builder.addOptionsModification(
-        opt ->
-            opt.setDesugaredLibrarySpecification(
-                DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecificationforTesting(
-                    StringResource.fromFile(libraryDesugaringSpecification.getSpecification()),
-                    opt.dexItemFactory(),
-                    opt.reporter,
-                    false,
-                    parameters.getApiLevel().getLevel(),
-                    builder ->
-                        builder.setSupportAllCallbacksFromLibrary(
-                            supportAllCallbacksFromLibrary))));
+        supportLibraryCallbackConsumer(supportAllCallbacksFromLibrary, false));
     return this;
   }
+
+  private Consumer<InternalOptions> supportLibraryCallbackConsumer(
+      boolean supportAllCallbacksFromLibrary, boolean libraryCompilation) {
+    return opt ->
+        opt.setDesugaredLibrarySpecification(
+            DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecificationforTesting(
+                StringResource.fromFile(libraryDesugaringSpecification.getSpecification()),
+                opt.dexItemFactory(),
+                opt.reporter,
+                libraryCompilation,
+                parameters.getApiLevel().getLevel(),
+                builder ->
+                    builder.setSupportAllCallbacksFromLibrary(supportAllCallbacksFromLibrary)));
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
index d315cd9..c45315e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
@@ -4,15 +4,13 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary.test;
 
-import com.android.tools.r8.L8TestBuilder;
+import com.android.tools.r8.L8TestCompileResult;
 import com.android.tools.r8.TestCompileResult;
 import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRunResult;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.ConsumerUtils;
-import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ThrowingConsumer;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.nio.file.Path;
@@ -26,8 +24,7 @@
   private final LibraryDesugaringSpecification libraryDesugaringSpecification;
   private final CompilationSpecification compilationSpecification;
   private final CustomLibrarySpecification customLibrarySpecification;
-  private Consumer<InternalOptions> l8OptionModifier;
-  private final String keepRule;
+  private final L8TestCompileResult l8Compile;
 
   public DesugaredLibraryTestCompileResult(
       T test,
@@ -36,17 +33,20 @@
       LibraryDesugaringSpecification libraryDesugaringSpecification,
       CompilationSpecification compilationSpecification,
       CustomLibrarySpecification customLibrarySpecification,
-      Consumer<InternalOptions> l8OptionModifier,
-      String keepRule) {
+      L8TestCompileResult l8Compile) {
     this.test = test;
     this.compileResult = compileResult;
     this.parameters = parameters;
     this.libraryDesugaringSpecification = libraryDesugaringSpecification;
     this.compilationSpecification = compilationSpecification;
     this.customLibrarySpecification = customLibrarySpecification;
-    this.l8OptionModifier =
-        l8OptionModifier != null ? l8OptionModifier : ConsumerUtils.emptyConsumer();
-    this.keepRule = keepRule;
+    this.l8Compile = l8Compile;
+  }
+
+  public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspectL8(
+      ThrowingConsumer<CodeInspector, E> consumer) throws Throwable {
+    l8Compile.inspect(consumer);
+    return this;
   }
 
   public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspect(
@@ -69,27 +69,11 @@
   public TestRunResult<?> run(TestRuntime runtime, String mainClassName, String... args)
       throws Exception {
 
-    Path desugaredLib =
-        test.testForL8(parameters.getApiLevel(), runtime.getBackend())
-            .addProgramFiles(libraryDesugaringSpecification.getDesugarJdkLibs())
-            .addLibraryFiles(libraryDesugaringSpecification.getAndroidJar())
-            .setDesugaredLibraryConfiguration(libraryDesugaringSpecification.getSpecification())
-            .noDefaultDesugarJDKLibs()
-            .applyIf(
-                compilationSpecification.isL8Shrink(),
-                builder -> {
-                  if (keepRule != null && !keepRule.trim().isEmpty()) {
-                    builder.addGeneratedKeepRules(keepRule);
-                  }
-                },
-                L8TestBuilder::setDebug)
-            .addOptionsModifier(l8OptionModifier)
-            .compile()
-            .writeToZip();
+    Path desugaredLibrary = l8Compile.writeToZip();
 
     if (runtime.getBackend().isCf()) {
       assert compilationSpecification.isCfToCf();
-      return compileResult.addRunClasspathFiles(desugaredLib).run(runtime, mainClassName);
+      return compileResult.addRunClasspathFiles(desugaredLibrary).run(runtime, mainClassName);
     }
 
     TestCompileResult<?, ?> actualCompileResult =
@@ -105,7 +89,7 @@
       actualCompileResult.addRunClasspathFiles(customLib);
     }
 
-    actualCompileResult.addRunClasspathFiles(desugaredLib);
+    actualCompileResult.addRunClasspathFiles(desugaredLibrary);
 
     return actualCompileResult.run(runtime, mainClassName, args);
   }