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)