Test for repeated compilation of intermediates.

Bug: 189196772

Change-Id: I0e676c32ab1ecb86aac2ef261623cd79d5cae5a2
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
index 00d6d45..11ba133 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
@@ -3,14 +3,24 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.desugar.backports;
 
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
+import com.android.tools.r8.ByteDataView;
+import com.android.tools.r8.ClassFileConsumer;
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
+import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.desugar.backports.AbstractBackportTest.MiniAssert;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
@@ -24,6 +34,7 @@
 import com.google.common.collect.Sets;
 import com.google.common.collect.Sets.SetView;
 import java.nio.file.Path;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -191,6 +202,63 @@
         .inspect(this::checkExpectedSynthetics);
   }
 
+  @Test
+  public void testPerFileIntermediate() throws Exception {
+    ProcessResult result = runDoublePerFileCompilation(true);
+    // TODO(b/189196772): Should run with the expected output.
+    assertEquals(result.toString(), 1, result.exitCode);
+    assertNotEquals(EXPECTED, result.stdout);
+  }
+
+  @Test
+  public void testPerFileNonIntermediate() throws Exception {
+    try {
+      runDoublePerFileCompilation(false);
+      // TODO(b/189196772): Should expect the compilation to fail.
+    } catch (CompilationFailedException e) {
+      assertThat(
+          e.getMessage(),
+          containsString("Attempt at merging intermediate artifact without its context"));
+    }
+  }
+
+  public ProcessResult runDoublePerFileCompilation(boolean intermediate) throws Exception {
+    List<byte[]> outputsRoundOne = new ArrayList<>();
+    testForD8(Backend.CF)
+        .addProgramClasses(CLASSES)
+        .setMinApi(parameters.getApiLevel())
+        .setIntermediate(true /* First round is always intermediate. */)
+        .setProgramConsumer(
+            new ClassFileConsumer.ForwardingConsumer(null) {
+              @Override
+              public void accept(ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+                outputsRoundOne.add(data.copyByteData());
+              }
+            })
+        .compile();
+
+    List<Path> outputsRoundTwo = new ArrayList<>();
+    for (byte[] bytes : outputsRoundOne) {
+      outputsRoundTwo.add(
+          testForD8(parameters.getBackend())
+              .addProgramClassFileData(bytes)
+              .setMinApi(parameters.getApiLevel())
+              .setIntermediate(intermediate)
+              .compile()
+              .writeToZip());
+    }
+
+    if (parameters.isCfRuntime()) {
+      return ToolHelper.runJava(
+          parameters.getRuntime().asCf(), outputsRoundTwo, TestClass.class.getTypeName());
+    } else {
+      ArtCommandBuilder builder = new ArtCommandBuilder();
+      builder.setMainClass(TestClass.class.getTypeName());
+      outputsRoundTwo.forEach(p -> builder.appendClasspath(p.toAbsolutePath().toString()));
+      return ToolHelper.runArtRaw(builder);
+    }
+  }
+
   private void checkNoOriginalsAndNoInternalSynthetics(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {