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) {