Merge "Add options consumer support to test builders."
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() {