Add options consumer support to test builders.
Change-Id: I91712188793d09a0104b247d28582d2739b74208
diff --git a/src/test/java/com/android/tools/r8/D8TestBuilder.java b/src/test/java/com/android/tools/r8/D8TestBuilder.java
index 368e8e4..21a5e0e 100644
--- a/src/test/java/com/android/tools/r8/D8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/D8TestBuilder.java
@@ -5,9 +5,11 @@
import com.android.tools.r8.D8Command.Builder;
import com.android.tools.r8.TestBase.Backend;
+import com.android.tools.r8.utils.InternalOptions;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collection;
+import java.util.function.Consumer;
public class D8TestBuilder extends TestCompilerBuilder<D8Command, Builder, D8TestBuilder> {
@@ -28,8 +30,9 @@
}
@Override
- void internalCompile(Builder builder) throws CompilationFailedException {
- D8.run(builder.build());
+ void internalCompile(Builder builder, Consumer<InternalOptions> optionsConsumer)
+ throws CompilationFailedException {
+ ToolHelper.runD8(builder, optionsConsumer);
}
public D8TestBuilder addClasspathClasses(Class<?>... classes) {
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index 50e659c..74b40b0 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -6,10 +6,13 @@
import com.android.tools.r8.R8Command.Builder;
import com.android.tools.r8.TestBase.Backend;
import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.List;
+import java.util.function.Consumer;
public class R8TestBuilder extends TestCompilerBuilder<R8Command, Builder, R8TestBuilder> {
@@ -32,11 +35,17 @@
}
@Override
- public void internalCompile(Builder builder) throws CompilationFailedException {
+ void internalCompile(Builder builder, Consumer<InternalOptions> optionsConsumer)
+ throws CompilationFailedException {
if (enableInliningAnnotations) {
ToolHelper.allowTestProguardOptions(builder);
}
- R8.run(builder.build());
+ ToolHelper.runR8WithoutResult(builder.build(), optionsConsumer);
+ }
+
+ public R8TestBuilder addDataResources(List<DataEntryResource> resources) {
+ resources.forEach(builder.getAppBuilder()::addDataResource);
+ return self();
}
public R8TestBuilder addKeepRules(String... rules) {
@@ -81,4 +90,9 @@
}
return self();
}
+
+ public R8TestBuilder enableProguardTestOptions() {
+ builder.allowTestProguardOptions();
+ return self();
+ }
}
diff --git a/src/test/java/com/android/tools/r8/TestCompileResult.java b/src/test/java/com/android/tools/r8/TestCompileResult.java
index 9996dde..4e7cf37 100644
--- a/src/test/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/TestCompileResult.java
@@ -7,8 +7,10 @@
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.io.IOException;
import java.nio.file.Path;
+import java.util.concurrent.ExecutionException;
public class TestCompileResult {
private final TestState state;
@@ -32,6 +34,10 @@
}
}
+ public CodeInspector inspector() throws IOException, ExecutionException {
+ return new CodeInspector(app);
+ }
+
private TestRunResult runJava(String mainClass) throws IOException {
Path out = state.getNewTempFolder().resolve("out.zip");
app.writeToZip(out, OutputMode.ClassFile);
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index c6af2c7..db25352 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -6,9 +6,11 @@
import com.android.tools.r8.TestBase.Backend;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidAppConsumers;
+import com.android.tools.r8.utils.InternalOptions;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Collection;
+import java.util.function.Consumer;
public abstract class TestCompilerBuilder<
C extends BaseCompilerCommand,
@@ -16,6 +18,12 @@
T extends TestCompilerBuilder<C, B, T>>
extends TestBuilder<T> {
+ public static final Consumer<InternalOptions> DEFAULT_OPTIONS =
+ new Consumer<InternalOptions>() {
+ @Override
+ public void accept(InternalOptions options) {}
+ };
+
private final B builder;
private final Backend backend;
@@ -23,6 +31,7 @@
private Path defaultLibrary;
private ProgramConsumer programConsumer;
private AndroidApiLevel defaultMinApiLevel = ToolHelper.getMinApiLevelForDexVm();
+ private Consumer<InternalOptions> optionsConsumer = DEFAULT_OPTIONS;
TestCompilerBuilder(TestState state, B builder, Backend backend) {
super(state);
@@ -34,7 +43,13 @@
abstract T self();
- abstract void internalCompile(B builder) throws CompilationFailedException;
+ abstract void internalCompile(B builder, Consumer<InternalOptions> optionsConsumer)
+ throws CompilationFailedException;
+
+ public T addOptionsModification(Consumer<InternalOptions> optionsConsumer) {
+ this.optionsConsumer = this.optionsConsumer.andThen(optionsConsumer);
+ return self();
+ }
public TestCompileResult compile() throws CompilationFailedException {
AndroidAppConsumers sink = new AndroidAppConsumers();
@@ -45,7 +60,7 @@
if (backend == Backend.DEX && defaultMinApiLevel != null) {
builder.setMinApiLevel(defaultMinApiLevel.getLevel());
}
- internalCompile(builder);
+ internalCompile(builder, optionsConsumer);
return new TestCompileResult(getState(), backend, sink.build());
}
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 4fa8738..692a6fa 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -876,6 +876,14 @@
return runR8WithFullResult(command, optionsConsumer);
}
+ public static void runR8WithoutResult(
+ R8Command command, Consumer<InternalOptions> optionsConsumer)
+ throws CompilationFailedException {
+ InternalOptions internalOptions = command.getInternalOptions();
+ optionsConsumer.accept(internalOptions);
+ R8.runForTesting(command.getInputApp(), internalOptions);
+ }
+
public static AndroidApp runR8WithFullResult(
R8Command command, Consumer<InternalOptions> optionsConsumer)
throws CompilationFailedException {
@@ -933,6 +941,14 @@
return compatSink.build();
}
+ public static void runD8WithoutResult(
+ D8Command command, Consumer<InternalOptions> optionsConsumer)
+ throws CompilationFailedException {
+ InternalOptions internalOptions = command.getInternalOptions();
+ optionsConsumer.accept(internalOptions);
+ D8.runForTesting(command.getInputApp(), internalOptions);
+ }
+
public static AndroidApp runDexer(String fileName, String outDir, String... extraArgs)
throws IOException {
List<String> args = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/naming/AdaptResourceFileContentsTest.java b/src/test/java/com/android/tools/r8/naming/AdaptResourceFileContentsTest.java
index 9ba82a9..b03c257 100644
--- a/src/test/java/com/android/tools/r8/naming/AdaptResourceFileContentsTest.java
+++ b/src/test/java/com/android/tools/r8/naming/AdaptResourceFileContentsTest.java
@@ -17,19 +17,16 @@
import com.android.tools.r8.DataResourceConsumer;
import com.android.tools.r8.DataResourceProvider.Visitor;
import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.R8Command;
-import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.TestCompileResult;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatibilityTestBase;
-import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.ArchiveResourceProvider;
import com.android.tools.r8.utils.FileUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import com.google.common.io.ByteStreams;
import java.io.File;
-import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.util.Arrays;
@@ -47,6 +44,12 @@
@RunWith(Parameterized.class)
public class AdaptResourceFileContentsTest extends ProguardCompatibilityTestBase {
+ private static final List<Class<?>> CLASSES =
+ ImmutableList.of(
+ AdaptResourceFileContentsTestClass.class,
+ AdaptResourceFileContentsTestClass.A.class,
+ AdaptResourceFileContentsTestClass.B.class);
+
private Backend backend;
@Parameterized.Parameters(name = "Backend: {0}")
@@ -171,9 +174,9 @@
@Test
public void testEnabled() throws Exception {
+ String pgConf = getProguardConfigWithNeverInline(true, null);
CustomDataResourceConsumer dataResourceConsumer = new CustomDataResourceConsumer();
- AndroidApp out =
- compileWithR8(getProguardConfigWithNeverInline(true, null), dataResourceConsumer);
+ CodeInspector inspector = compileWithR8(pgConf, dataResourceConsumer).inspector();
// Check that the data resources have changed as expected.
checkAllAreChanged(
@@ -182,8 +185,7 @@
dataResourceConsumer.get("resource-all-changed.txt"), originalAllChangedResource);
// Check that the new names are consistent with the actual application code.
- checkAllArePresent(
- dataResourceConsumer.get("resource-all-present.txt"), new CodeInspector(out));
+ checkAllArePresent(dataResourceConsumer.get("resource-all-present.txt"), inspector);
// Check that the data resources have not changed unexpectedly.
checkAllAreUnchanged(
@@ -315,32 +317,22 @@
}
}
- private AndroidApp compileWithR8(String proguardConfig, DataResourceConsumer dataResourceConsumer)
- throws CompilationFailedException, IOException {
- R8Command command =
- ToolHelper.allowTestProguardOptions(
- ToolHelper.prepareR8CommandBuilder(getAndroidApp(), emptyConsumer(backend))
- .addProguardConfiguration(ImmutableList.of(proguardConfig), Origin.unknown()))
- .addLibraryFiles(runtimeJar(backend))
- .build();
- return ToolHelper.runR8(
- command,
- options -> {
- // TODO(christofferqa): Class inliner should respect -neverinline.
- options.enableClassInlining = false;
- options.enableVerticalClassMerging = true;
- options.dataResourceConsumer = dataResourceConsumer;
- });
- }
-
- private AndroidApp getAndroidApp() throws IOException {
- AndroidApp.Builder builder = AndroidApp.builder();
- builder.addProgramFiles(
- ToolHelper.getClassFileForTestClass(AdaptResourceFileContentsTestClass.class),
- ToolHelper.getClassFileForTestClass(AdaptResourceFileContentsTestClass.A.class),
- ToolHelper.getClassFileForTestClass(AdaptResourceFileContentsTestClass.B.class));
- getDataResources().forEach(builder::addDataResource);
- return builder.build();
+ private TestCompileResult compileWithR8(
+ String proguardConfig, DataResourceConsumer dataResourceConsumer)
+ throws CompilationFailedException {
+ return testForR8(backend)
+ .addProgramClasses(CLASSES)
+ .addDataResources(getDataResources())
+ .enableProguardTestOptions()
+ .addKeepRules(proguardConfig)
+ .addOptionsModification(
+ o -> {
+ // TODO(christofferqa): Class inliner should respect -neverinline.
+ o.enableClassInlining = false;
+ o.enableVerticalClassMerging = true;
+ o.dataResourceConsumer = dataResourceConsumer;
+ })
+ .compile();
}
private List<DataEntryResource> getDataResources() {