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);
}