Update tests of -checkdiscard in the standalone main dex list generator
This adds testing of the MainDexListGenerator through the testing
infrastructure.
Bug: 116774422
Change-Id: I3fc18de0c42ac15e2bd62f3a359cae3af0d9a877
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 1be9b3a..14dd1ae 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -75,7 +75,7 @@
if (!mainDexRootSet.checkDiscarded.isEmpty()) {
new DiscardedChecker(
- mainDexRootSet, mainDexClasses.getClasses(), appView.appInfo(), options)
+ mainDexRootSet, mainDexClasses.getClasses(), appView.appInfo(), options)
.run();
}
// Print -whyareyoukeeping results if any.
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java b/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java
new file mode 100644
index 0000000..392a72b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, 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;
+
+public class GenerateMainDexListResult
+ extends TestBaseResult<GenerateMainDexListResult, GenerateMainDexListRunResult> {
+
+ GenerateMainDexListResult(TestState state) {
+ super(state);
+ }
+
+ @Override
+ public GenerateMainDexListResult self() {
+ return this;
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
new file mode 100644
index 0000000..b9842f2
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, 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;
+
+import java.util.List;
+
+public class GenerateMainDexListRunResult extends TestRunResult<GenerateMainDexListRunResult> {
+
+ List<String> mainDexList;
+
+ public GenerateMainDexListRunResult(List<String> mainDexList) {
+ super(null, null);
+ this.mainDexList = mainDexList;
+ }
+
+ @Override
+ protected GenerateMainDexListRunResult self() {
+ return this;
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
new file mode 100644
index 0000000..6eae670
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
@@ -0,0 +1,64 @@
+// Copyright (c) 2019, 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;
+
+import com.android.tools.r8.GenerateMainDexListCommand.Builder;
+import com.android.tools.r8.debug.DebugTestConfig;
+import com.android.tools.r8.errors.Unimplemented;
+import com.android.tools.r8.origin.Origin;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+public class GenerateMainDexListTestBuilder
+ extends TestBaseBuilder<
+ GenerateMainDexListCommand,
+ Builder,
+ GenerateMainDexListResult,
+ GenerateMainDexListRunResult,
+ GenerateMainDexListTestBuilder> {
+
+ private GenerateMainDexListTestBuilder(TestState state, Builder builder) {
+ super(state, builder);
+ }
+
+ public static GenerateMainDexListTestBuilder create(TestState state) {
+ return new GenerateMainDexListTestBuilder(state, GenerateMainDexListCommand.builder());
+ }
+
+ @Override
+ GenerateMainDexListTestBuilder self() {
+ return this;
+ }
+
+ @Override
+ public GenerateMainDexListRunResult run(String mainClass)
+ throws IOException, CompilationFailedException {
+ throw new Unimplemented("No support for running with a main class");
+ }
+
+ @Override
+ public GenerateMainDexListRunResult run(Class mainClass)
+ throws IOException, CompilationFailedException {
+ throw new Unimplemented("No support for running with a main class");
+ }
+
+ public DebugTestConfig debugConfig() {
+ throw new Unimplemented("No support for debug configuration");
+ }
+
+ public GenerateMainDexListRunResult run() throws CompilationFailedException {
+ return new GenerateMainDexListRunResult(GenerateMainDexList.run(builder.build()));
+ }
+
+ public GenerateMainDexListTestBuilder addMainDexRules(Collection<String> rules) {
+ builder.addMainDexRules(new ArrayList<>(rules), Origin.unknown());
+ return self();
+ }
+
+ public GenerateMainDexListTestBuilder addMainDexRules(String... rules) {
+ return addMainDexRules(Arrays.asList(rules));
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index c24ed3b..1df6808 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -103,6 +103,10 @@
return ProguardTestBuilder.create(new TestState(temp));
}
+ public static GenerateMainDexListTestBuilder testForMainDexListGenerator(TemporaryFolder temp) {
+ return GenerateMainDexListTestBuilder.create(new TestState(temp));
+ }
+
public R8TestBuilder testForR8(Backend backend) {
return testForR8(temp, backend);
}
@@ -131,6 +135,10 @@
return testForProguard(temp);
}
+ public GenerateMainDexListTestBuilder testForMainDexListGenerator() {
+ return testForMainDexListGenerator(temp);
+ }
+
public enum Backend {
CF,
DEX
diff --git a/src/test/java/com/android/tools/r8/TestBaseBuilder.java b/src/test/java/com/android/tools/r8/TestBaseBuilder.java
new file mode 100644
index 0000000..5fcd1b5
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestBaseBuilder.java
@@ -0,0 +1,50 @@
+// Copyright (c) 2019, 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;
+
+import com.android.tools.r8.origin.Origin;
+import java.nio.file.Path;
+import java.util.Collection;
+
+public abstract class TestBaseBuilder<
+ C extends BaseCommand,
+ B extends BaseCommand.Builder<C, B>,
+ CR extends TestBaseResult<CR, RR>,
+ RR extends TestRunResult,
+ T extends TestBaseBuilder<C, B, CR, RR, T>>
+ extends TestBuilder<RR, T> {
+
+ final B builder;
+
+ TestBaseBuilder(TestState state, B builder) {
+ super(state);
+ this.builder = builder;
+ }
+
+ @Override
+ public T addProgramClassFileData(Collection<byte[]> classes) {
+ for (byte[] clazz : classes) {
+ builder.addClassProgramData(clazz, Origin.unknown());
+ }
+ return self();
+ }
+
+ @Override
+ public T addProgramFiles(Collection<Path> files) {
+ builder.addProgramFiles(files);
+ return self();
+ }
+
+ @Override
+ public T addLibraryFiles(Collection<Path> files) {
+ builder.addLibraryFiles(files);
+ return self();
+ }
+
+ public T addMainDexListFiles(Collection<Path> files) {
+ builder.addMainDexListFiles(files);
+ return self();
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/TestBaseResult.java b/src/test/java/com/android/tools/r8/TestBaseResult.java
new file mode 100644
index 0000000..e7623a3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestBaseResult.java
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, 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;
+
+public abstract class TestBaseResult<CR extends TestBaseResult<CR, RR>, RR extends TestRunResult> {
+ final TestState state;
+
+ TestBaseResult(TestState state) {
+ this.state = state;
+ }
+
+ public abstract CR self();
+}
diff --git a/src/test/java/com/android/tools/r8/TestCompileResult.java b/src/test/java/com/android/tools/r8/TestCompileResult.java
index 9700d56..d74fab5 100644
--- a/src/test/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/TestCompileResult.java
@@ -26,19 +26,17 @@
import org.hamcrest.Matcher;
public abstract class TestCompileResult<
- CR extends TestCompileResult<CR, RR>, RR extends TestRunResult> {
+ CR extends TestCompileResult<CR, RR>, RR extends TestRunResult>
+ extends TestBaseResult<CR, RR> {
- final TestState state;
public final AndroidApp app;
final List<Path> additionalRunClassPath = new ArrayList<>();
TestCompileResult(TestState state, AndroidApp app) {
- this.state = state;
+ super(state);
this.app = app;
}
- public abstract CR self();
-
public abstract Backend getBackend();
public abstract TestDiagnosticMessages getDiagnosticMessages();
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index cbd0cb9..77dc0df 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -5,7 +5,6 @@
import com.android.tools.r8.TestBase.Backend;
import com.android.tools.r8.debug.DebugTestConfig;
-import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -24,7 +23,7 @@
CR extends TestCompileResult<CR, RR>,
RR extends TestRunResult,
T extends TestCompilerBuilder<C, B, CR, RR, T>>
- extends TestBuilder<RR, T> {
+ extends TestBaseBuilder<C, B, CR, RR, T> {
public static final Consumer<InternalOptions> DEFAULT_OPTIONS =
new Consumer<InternalOptions>() {
@@ -32,7 +31,6 @@
public void accept(InternalOptions options) {}
};
- final B builder;
final Backend backend;
// Default initialized setup. Can be overwritten if needed.
@@ -44,8 +42,7 @@
private PrintStream stdout = null;
TestCompilerBuilder(TestState state, B builder, Backend backend) {
- super(state);
- this.builder = builder;
+ super(state, builder);
this.backend = backend;
defaultLibrary = TestBase.runtimeJar(backend);
programConsumer = TestBase.emptyConsumer(backend);
@@ -135,30 +132,10 @@
return self();
}
- public T addMainDexListFiles(Collection<Path> files) {
- builder.addMainDexListFiles(files);
- return self();
- }
-
- @Override
- public T addProgramClassFileData(Collection<byte[]> classes) {
- for (byte[] clazz : classes) {
- builder.addClassProgramData(clazz, Origin.unknown());
- }
- return self();
- }
-
- @Override
- public T addProgramFiles(Collection<Path> files) {
- builder.addProgramFiles(files);
- return self();
- }
-
@Override
public T addLibraryFiles(Collection<Path> files) {
defaultLibrary = null;
- builder.addLibraryFiles(files);
- return self();
+ return super.addLibraryFiles(files);
}
public T noDesugaring() {
diff --git a/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java b/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java
index 16958a6..125c364 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java
@@ -5,16 +5,10 @@
package com.android.tools.r8.maindexlist.checkdiscard;
import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.GenerateMainDexList;
-import com.android.tools.r8.GenerateMainDexListCommand;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8Command;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import java.util.List;
import org.junit.Assert;
@@ -54,33 +48,24 @@
this.command = command;
}
-
public void runTestWithR8(String checkDiscardRule) throws Exception {
- R8Command command =
- ToolHelper.prepareR8CommandBuilder(
- readClasses(HelloWorldMain.class, MainDexClass.class, NonMainDexClass.class))
- .addMainDexRules(
- ImmutableList.of(keepMainProguardConfiguration(HelloWorldMain.class)),
- Origin.unknown())
- .addMainDexRules(ImmutableList.of(checkDiscardRule), Origin.unknown())
- .setOutput(temp.getRoot().toPath(), OutputMode.DexIndexed)
- .setMode(CompilationMode.RELEASE)
- .setDisableTreeShaking(true)
- .setDisableMinification(true)
- .build();
- ToolHelper.runR8(command);
+ testForR8(Backend.DEX)
+ .addProgramClasses(CLASSES)
+ .setMinApi(AndroidApiLevel.K)
+ .addMainDexRules(keepMainProguardConfiguration(HelloWorldMain.class))
+ .addMainDexRules(checkDiscardRule)
+ .noTreeShaking()
+ .noMinification()
+ .compile();
}
public void runTestWithGenerator(String checkDiscardRule) throws Exception {
- GenerateMainDexListCommand.Builder builder =
- GenerateMainDexListCommand.builder()
- .addProgramFiles(ListUtils.map(CLASSES, ToolHelper::getClassFileForTestClass))
- .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
- .addMainDexRules(
- ImmutableList.of(keepMainProguardConfiguration(HelloWorldMain.class)),
- Origin.unknown())
- .addMainDexRules(ImmutableList.of(checkDiscardRule), Origin.unknown());
- GenerateMainDexList.run(builder.build());
+ testForMainDexListGenerator()
+ .addProgramClasses(CLASSES)
+ .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+ .addMainDexRules(keepMainProguardConfiguration(HelloWorldMain.class))
+ .addMainDexRules(checkDiscardRule)
+ .run();
}
public void runTest(String checkDiscardRule, boolean shouldFail) throws Exception {