Add test building from compiler dump
Change-Id: Icb68c6ccf3e738535e5438c43aaaa7eefc14aa37
diff --git a/src/test/java/com/android/tools/r8/dump/CompilerDumpTest.java b/src/test/java/com/android/tools/r8/dump/CompilerDumpTest.java
new file mode 100644
index 0000000..509f85f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/dump/CompilerDumpTest.java
@@ -0,0 +1,87 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.dump;
+
+import static org.junit.Assert.fail;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.DumpInputFlags;
+import com.android.tools.r8.utils.StringUtils;
+import java.nio.file.Path;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class CompilerDumpTest extends TestBase {
+
+ @Parameter() public TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ private static final String EXPECTED_OUTPUT = StringUtils.lines("Hello, world!");
+
+ @Test
+ public void testD8() throws Exception {
+ // Create a D8 dump.
+ parameters.assumeDexRuntime();
+ Path dumpFile = temp.newFile("dump.zip").toPath();
+ try {
+ testForD8(parameters.getBackend())
+ .addInnerClasses(getClass())
+ .setMinApi(parameters)
+ .addOptionsModification(
+ options -> options.setDumpInputFlags(DumpInputFlags.dumpToFile(dumpFile)))
+ .compile();
+ fail("Expected to fail compilation when creating a duump");
+ } catch (CompilationFailedException ignored) {
+ }
+
+ // Compile the dump.
+ CompilerDump dump = CompilerDump.fromArchive(dumpFile, temp.newFolder().toPath());
+ testForD8(parameters.getBackend())
+ .applyCompilerDump(dump)
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ // Create an R8 dump.
+ Path dumpFile = temp.newFile("dump.zip").toPath();
+ try {
+ testForR8(parameters.getBackend())
+ .addInnerClasses(getClass())
+ .addKeepMainRule(TestClass.class)
+ .setMinApi(parameters)
+ .addOptionsModification(
+ options -> options.setDumpInputFlags(DumpInputFlags.dumpToFile(dumpFile)))
+ .compile();
+ fail("Expected to fail compilation when creating a duump");
+ } catch (CompilationFailedException ignored) {
+ }
+
+ // Compile the dump.
+ CompilerDump dump = CompilerDump.fromArchive(dumpFile, temp.newFolder().toPath());
+ testForR8(parameters.getBackend())
+ .applyCompilerDump(dump)
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
+ }
+
+ static class TestClass {
+
+ public static void main(String[] args) {
+ System.out.println("Hello, world!");
+ }
+ }
+}
diff --git a/src/test/testbase/java/com/android/tools/r8/TestBaseBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestBaseBuilder.java
index c9740c3..6746b89 100644
--- a/src/test/testbase/java/com/android/tools/r8/TestBaseBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestBaseBuilder.java
@@ -5,12 +5,15 @@
package com.android.tools.r8;
import com.android.tools.r8.ProgramResource.Kind;
+import com.android.tools.r8.dump.CompilerDump;
+import com.android.tools.r8.dump.DumpOptions;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.ListUtils;
import com.google.common.collect.ImmutableMap;
+import java.io.IOException;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collection;
@@ -124,4 +127,12 @@
}
};
}
+
+ public T applyCompilerDump(CompilerDump dump) throws IOException {
+ DumpOptions options = dump.getBuildProperties();
+ addLibraryFiles(dump.getLibraryArchive());
+ addClasspathFiles(dump.getClasspathArchive());
+ addProgramFiles(dump.getProgramArchive());
+ return self();
+ }
}
diff --git a/src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java
index 4056b00..8d74d9d 100644
--- a/src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -11,6 +11,8 @@
import com.android.tools.r8.TestBase.Backend;
import com.android.tools.r8.benchmarks.BenchmarkResults;
import com.android.tools.r8.debug.DebugTestConfig;
+import com.android.tools.r8.dump.CompilerDump;
+import com.android.tools.r8.dump.DumpOptions;
import com.android.tools.r8.optimize.argumentpropagation.ArgumentPropagatorEventConsumer;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.MethodStateCollectionByReference;
import com.android.tools.r8.testing.AndroidBuildVersion;
@@ -721,4 +723,18 @@
builder = null;
}
}
+
+ public T applyCompilerDump(CompilerDump dump) throws IOException {
+ super.applyCompilerDump(dump);
+ DumpOptions options = dump.getBuildProperties();
+ setMinApi(options.getMinApi());
+ applyIf(
+ dump.hasDesugaredLibrary(),
+ b ->
+ b.enableCoreLibraryDesugaring(
+ LibraryDesugaringTestConfiguration.forSpecification(
+ dump.getDesugaredLibraryFile())));
+ setMode(options.getCompilationMode());
+ return self();
+ }
}
diff --git a/src/test/testbase/java/com/android/tools/r8/TestShrinkerBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestShrinkerBuilder.java
index 2c07a9a..57d2137 100644
--- a/src/test/testbase/java/com/android/tools/r8/TestShrinkerBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestShrinkerBuilder.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.TestBase.Backend;
import com.android.tools.r8.dexsplitter.SplitterTestBase.RunInterface;
+import com.android.tools.r8.dump.CompilerDump;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.references.TypeReference;
@@ -628,4 +629,10 @@
}
return builder.append(");").toString();
}
+
+ public T applyCompilerDump(CompilerDump dump) throws IOException {
+ super.applyCompilerDump(dump);
+ addKeepRuleFiles(dump.getProguardConfigFile());
+ return self();
+ }
}
diff --git a/src/test/testbase/java/com/android/tools/r8/dump/CompilerDump.java b/src/test/testbase/java/com/android/tools/r8/dump/CompilerDump.java
index 46d5ec1..c95193c 100644
--- a/src/test/testbase/java/com/android/tools/r8/dump/CompilerDump.java
+++ b/src/test/testbase/java/com/android/tools/r8/dump/CompilerDump.java
@@ -18,7 +18,11 @@
public static CompilerDump fromArchive(Path dumpArchive, Path dumpExtractionDirectory)
throws IOException {
ZipUtils.unzip(dumpArchive, dumpExtractionDirectory);
- return new CompilerDump(dumpExtractionDirectory);
+ return fromDirectory(dumpExtractionDirectory);
+ }
+
+ public static CompilerDump fromDirectory(Path dumpDirectory) {
+ return new CompilerDump(dumpDirectory);
}
public CompilerDump(Path directory) {