Add cf-to-cf desugar test for library callbacks

Bug: 171867367
Bug: 172433489
Change-Id: I9f169e4ffb6a8ff079d467d1642a3a7a39fdb2f6
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
index c7465ca..5856c44 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -24,15 +24,20 @@
 import com.android.tools.r8.ir.desugar.DesugaredLibraryConfiguration;
 import com.android.tools.r8.ir.desugar.DesugaredLibraryConfigurationParser;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.tracereferences.TraceReferences;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.function.Consumer;
 
 public class DesugaredLibraryTestBase extends TestBase {
@@ -208,6 +213,50 @@
             builder -> builder.setSupportAllCallbacksFromLibrary(supportAllCallbacksFromLibrary));
   }
 
+  private Map<AndroidApiLevel, Path> desugaredLibraryClassFileCache = new HashMap<>();
+
+  // Build the desugared library in class file format.
+  public Path buildDesugaredLibraryClassFile(AndroidApiLevel apiLevel) throws Exception {
+    Path desugaredLib = desugaredLibraryClassFileCache.get(apiLevel);
+    if (desugaredLib != null) {
+      return desugaredLib;
+    }
+    desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs.jar");
+    L8Command.Builder l8Builder =
+        L8Command.builder()
+            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addProgramFiles(ToolHelper.getDesugarJDKLibs())
+            .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
+            .setMode(CompilationMode.DEBUG)
+            .addDesugaredLibraryConfiguration(
+                StringResource.fromFile(ToolHelper.DESUGAR_LIB_JSON_FOR_TESTING))
+            .setMinApiLevel(apiLevel.getLevel())
+            .setOutput(desugaredLib, OutputMode.ClassFile);
+    ToolHelper.runL8(l8Builder.build());
+    desugaredLibraryClassFileCache.put(apiLevel, desugaredLib);
+    return desugaredLib;
+  }
+
+  public String collectKeepRulesWithTraceReferences(
+      Path desugaredProgramClassFile, Path desugaredLibraryClassFile) throws Exception {
+    Path generatedKeepRules = temp.newFile().toPath();
+    TraceReferences.run(
+        "--format",
+        "keep",
+        "--lib",
+        ToolHelper.getAndroidJar(AndroidApiLevel.P).toString(),
+        "--target",
+        desugaredLibraryClassFile.toString(),
+        "--source",
+        desugaredProgramClassFile.toString(),
+        "--output",
+        generatedKeepRules.toString(),
+        "--map-diagnostics",
+        "error",
+        "info");
+    return FileUtils.readTextFile(generatedKeepRules, Charsets.UTF_8);
+  }
+
   public interface KeepRuleConsumer extends StringConsumer {
 
     String get();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
index 70b46ae..3e40117 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
@@ -7,21 +7,13 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
 
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.L8Command;
 import com.android.tools.r8.NeverInline;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestCompileResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.tracereferences.TraceReferences;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.ThrowingSupplier;
 import com.android.tools.r8.utils.codeinspector.CheckCastInstructionSubject;
@@ -32,13 +24,10 @@
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.android.tools.r8.utils.codeinspector.TryCatchSubject;
 import com.android.tools.r8.utils.codeinspector.TypeSubject;
-import com.google.common.base.Charsets;
-import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableSet;
 import java.nio.file.Path;
 import java.util.List;
 import java.util.Set;
-import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import org.junit.Assume;
 import org.junit.Test;
@@ -131,46 +120,6 @@
     assertEquals(expectedCatchGuards, foundCatchGuards);
   }
 
-  // Build the desugared library in class file format.
-  private Path buildDesugaredLibraryClassFile() throws Exception {
-    Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs.jar");
-    L8Command.Builder l8Builder =
-        L8Command.builder()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
-            .addProgramFiles(ToolHelper.getDesugarJDKLibs())
-            .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
-            .setMode(CompilationMode.DEBUG)
-            .addDesugaredLibraryConfiguration(
-                StringResource.fromFile(ToolHelper.DESUGAR_LIB_JSON_FOR_TESTING))
-            .setMinApiLevel(parameters.getApiLevel().getLevel())
-            .setOutput(desugaredLib, OutputMode.ClassFile);
-    ToolHelper.runL8(l8Builder.build());
-    return desugaredLib;
-  }
-
-  Supplier<Path> desugaredLibraryClassFile =
-      Suppliers.memoize(
-          () -> {
-            try {
-              return buildDesugaredLibraryClassFile();
-            } catch (Exception e) {
-              fail("Unexpected");
-              return null;
-            }
-          });
-
-  private String collectKeepRulesWithTraceReferences(
-      Path desugaredProgramClassFile, Path desugaredLibraryClassFile) throws Exception {
-    Path generatedKeepRules = temp.newFile().toPath();
-    TraceReferences.run(
-        "--format", "keep",
-        "--lib", ToolHelper.getAndroidJar(AndroidApiLevel.P).toString(),
-        "--target", desugaredLibraryClassFile.toString(),
-        "--source", desugaredProgramClassFile.toString(),
-        "--output", generatedKeepRules.toString());
-    return FileUtils.readTextFile(generatedKeepRules, Charsets.UTF_8);
-  }
-
   private String desugaredLibraryKeepRules(
       KeepRuleConsumer keepRuleConsumer, ThrowingSupplier<Path, Exception> programSupplier)
       throws Exception {
@@ -181,7 +130,7 @@
         if (traceReferencesKeepRules) {
           desugaredLibraryKeepRules =
               collectKeepRulesWithTraceReferences(
-                  programSupplier.get(), desugaredLibraryClassFile.get());
+                  programSupplier.get(), buildDesugaredLibraryClassFile(parameters.getApiLevel()));
         }
       }
     }
@@ -231,7 +180,7 @@
       // Run on the JVM with desugared library on classpath.
       testForJvm()
           .addProgramFiles(jar)
-          .addRunClasspathFiles(desugaredLibraryClassFile.get())
+          .addRunClasspathFiles(buildDesugaredLibraryClassFile(parameters.getApiLevel()))
           .run(parameters.getRuntime(), TestClass.class)
           .assertSuccessWithOutput(expectedOutput);
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
index 04630af..92d2394 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
@@ -102,6 +102,37 @@
   }
 
   @Test
+  public void testCallBackD8Cf() throws Exception {
+    // Use D8 to desugar with Java classfile output.
+    Path jar =
+        testForD8(Backend.CF)
+            .setMinApi(parameters.getApiLevel())
+            .addProgramClasses(Impl.class)
+            .addLibraryClasses(CustomLibClass.class)
+            .enableCoreLibraryDesugaring(parameters.getApiLevel(), new AbsentKeepRuleConsumer())
+            .compile()
+            .inspect(CallBackConversionTest::assertDuplicatedAPI)
+            .writeToZip();
+
+    // Convert to DEX without desugaring and run.
+    testForD8()
+        .addProgramFiles(jar)
+        .setMinApi(parameters.getApiLevel())
+        .disableDesugaring()
+        .compile()
+        .inspect(CallBackConversionTest::assertDuplicatedAPI)
+        .addDesugaredCoreLibraryRunClassPath(
+            this::buildDesugaredLibrary,
+            parameters.getApiLevel(),
+            collectKeepRulesWithTraceReferences(
+                jar, buildDesugaredLibraryClassFile(parameters.getApiLevel())),
+            shrinkDesugaredLibrary)
+        .addRunClasspathFiles(CUSTOM_LIB)
+        .run(parameters.getRuntime(), Impl.class)
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  @Test
   public void testCallBackR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)