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