Add enableServiceLoader() to D8TestBuilder

Change-Id: I8b851bf0f3e78ece27ada4aa1eef064cf39ad559
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 6664691..7d7227d 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -239,7 +239,7 @@
             executor);
       }
 
-      if (options.testing.enableD8ResourcesPassThrough) {
+      if (options.testing.enableD8MetaInfServicesPassThrough) {
         appView.setAppServices(AppServices.builder(appView).build());
       }
       timing.end();
diff --git a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
index 90e458c..e9b35f4 100644
--- a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
+++ b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
@@ -76,7 +76,7 @@
   public DataDirectoryResource adaptIfNeeded(DataDirectoryResource directory) {
     // First check if this directory should even be in the output.
     if (options.getProguardConfiguration() == null) {
-      assert options.testing.enableD8ResourcesPassThrough;
+      assert options.testing.enableD8MetaInfServicesPassThrough;
       return null;
     }
     if (!options.getProguardConfiguration().getKeepDirectories().matches(directory.getName())) {
@@ -91,7 +91,7 @@
       Function<ProguardConfiguration, ProguardPathFilter> getFilter) {
     final ProguardConfiguration proguardConfiguration = options.getProguardConfiguration();
     if (proguardConfiguration == null) {
-      assert options.testing.enableD8ResourcesPassThrough;
+      assert options.testing.enableD8MetaInfServicesPassThrough;
       return false;
     }
     ProguardPathFilter filter = getFilter.apply(proguardConfiguration);
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 5997bc3..74b8fd1 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2387,9 +2387,10 @@
     public boolean testEnableTestAssertions = false;
     public boolean keepMetadataInR8IfNotRewritten = true;
 
-    // Flag to allow processing of resources in D8. A data resource consumer still needs to be
-    // specified.
-    public boolean enableD8ResourcesPassThrough = false;
+    // Flag to pass through the resources in META-INF/services in D8. A data resource consumer
+    // still needs to be specified as well. Please consider using enableServiceLoader() on the
+    // TestBuilder if possible.
+    public boolean enableD8MetaInfServicesPassThrough = false;
 
     public boolean verifyKeptGraphInfo = false;
 
diff --git a/src/test/bootstrap/com/android/tools/r8/bootstrap/HelloWorldCompiledOnArtTest.java b/src/test/bootstrap/com/android/tools/r8/bootstrap/HelloWorldCompiledOnArtTest.java
index 8ea8e39..1f89e1e 100644
--- a/src/test/bootstrap/com/android/tools/r8/bootstrap/HelloWorldCompiledOnArtTest.java
+++ b/src/test/bootstrap/com/android/tools/r8/bootstrap/HelloWorldCompiledOnArtTest.java
@@ -127,11 +127,7 @@
     return testForDesugaredLibrary(
             parameters, libraryDesugaringSpecification, compilationSpecification)
         .addProgramFiles(ToolHelper.getR8WithRelocatedDeps())
-        .addOptionsModification(
-            options -> {
-              options.testing.enableD8ResourcesPassThrough = true;
-              options.dataResourceConsumer = options.programConsumer.getDataResourceConsumer();
-            })
+        .enableServiceLoader()
         .setTrackDesugaredApiConversions()
         .compile()
         .inspectDiagnosticMessages(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java
index 52b9842..fdab037 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java
@@ -86,14 +86,10 @@
         .addProgramFiles(compiledJars.getForConfiguration(kotlinParameters))
         .addProgramFiles(kotlinc.getKotlinStdlibJar())
         .addProgramFiles(kotlinc.getKotlinReflectJar())
+        .enableServiceLoader()
         .applyIf(
             compilationSpecification.isProgramShrink(),
             builder -> builder.addProgramFiles(kotlinc.getKotlinAnnotationJar()))
-        .addOptionsModification(
-            options -> {
-              options.testing.enableD8ResourcesPassThrough = true;
-              options.dataResourceConsumer = options.programConsumer.getDataResourceConsumer();
-            })
         .addKeepMainRule(PKG + ".MainKt")
         .addKeepAllClassesRule()
         .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS)
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInnerClassTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInnerClassTest.java
index 54f2a97..9362fb1 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInnerClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInnerClassTest.java
@@ -134,12 +134,7 @@
         .addProgramFiles(kotlinc.getKotlinStdlibJar(), kotlinc.getKotlinReflectJar(), jar)
         .setMinApi(parameters)
         .setProgramConsumer(programConsumer)
-        .addOptionsModification(
-            options -> {
-              // Needed for passing kotlin_builtin files to output.
-              options.testing.enableD8ResourcesPassThrough = true;
-              options.dataResourceConsumer = options.programConsumer.getDataResourceConsumer();
-            })
+        .enableServiceLoader()
         .run(parameters.getRuntime(), PKG_NESTED_REFLECT + ".MainKt")
         .assertSuccessWithOutput(expected);
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/syntheticmethodforannotations/KotlinMetadataTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/syntheticmethodforannotations/KotlinMetadataTest.java
index dfd2bd9..18440e9 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/syntheticmethodforannotations/KotlinMetadataTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/syntheticmethodforannotations/KotlinMetadataTest.java
@@ -90,11 +90,7 @@
         .addProgramFiles(kotlinc.getKotlinReflectJar())
         .addProgramFiles(kotlinc.getKotlinAnnotationJar())
         .setMinApi(parameters)
-        .addOptionsModification(
-            options -> {
-              options.testing.enableD8ResourcesPassThrough = true;
-              options.dataResourceConsumer = options.programConsumer.getDataResourceConsumer();
-            })
+        .enableServiceLoader()
         .run(parameters.getRuntime(), MAIN)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
   }
@@ -121,11 +117,6 @@
         .allowUnusedDontWarnPatterns()
         .allowDiagnosticMessages()
         .setMinApi(parameters)
-        .addOptionsModification(
-            options -> {
-              options.testing.enableD8ResourcesPassThrough = true;
-              options.dataResourceConsumer = options.programConsumer.getDataResourceConsumer();
-            })
         .compile()
         .inspect(this::verifyRewrittenExtension)
         .run(parameters.getRuntime(), MAIN)
@@ -186,11 +177,6 @@
         .allowUnusedDontWarnPatterns()
         .allowDiagnosticMessages()
         .setMinApi(parameters)
-        .addOptionsModification(
-            options -> {
-              options.testing.enableD8ResourcesPassThrough = true;
-              options.dataResourceConsumer = options.programConsumer.getDataResourceConsumer();
-            })
         .compile()
         .run(parameters.getRuntime(), MAIN)
         .assertSuccessWithOutputLines(EXPECTED_FALSE_OUTPUT);
diff --git a/src/test/java/com/android/tools/r8/kotlin/reflection/KotlinReflectTest.java b/src/test/java/com/android/tools/r8/kotlin/reflection/KotlinReflectTest.java
index 2149835..c30873e 100644
--- a/src/test/java/com/android/tools/r8/kotlin/reflection/KotlinReflectTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/reflection/KotlinReflectTest.java
@@ -77,11 +77,7 @@
         .addProgramFiles(kotlinc.getKotlinReflectJar())
         .setProgramConsumer(new ArchiveConsumer(output.toPath(), true))
         .setMinApi(parameters)
-        .addOptionsModification(
-            options -> {
-              options.testing.enableD8ResourcesPassThrough = true;
-              options.dataResourceConsumer = options.programConsumer.getDataResourceConsumer();
-            })
+        .enableServiceLoader()
         .run(parameters.getRuntime(), PKG + ".SimpleReflectKt")
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/reflection/ReflectiveConstructionWithInlineClassTest.java b/src/test/java/com/android/tools/r8/kotlin/reflection/ReflectiveConstructionWithInlineClassTest.java
index ab5b651..ce78703 100644
--- a/src/test/java/com/android/tools/r8/kotlin/reflection/ReflectiveConstructionWithInlineClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/reflection/ReflectiveConstructionWithInlineClassTest.java
@@ -80,11 +80,7 @@
         .addProgramFiles(kotlinc.getKotlinStdlibJar())
         .addProgramFiles(kotlinc.getKotlinReflectJar())
         .setMinApi(parameters)
-        .addOptionsModification(
-            options -> {
-              options.testing.enableD8ResourcesPassThrough = true;
-              options.dataResourceConsumer = options.programConsumer.getDataResourceConsumer();
-            })
+        .enableServiceLoader()
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
   }
diff --git a/src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java
index 57aa6cc..73265f7 100644
--- a/src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java
@@ -41,6 +41,7 @@
   private List<ExternalArtProfile> residualArtProfiles = new ArrayList<>();
   private Box<D8BuildMetadata> buildMetadata;
   private boolean androidPlatformBuild = false;
+  private boolean serviceLoaderSupport = false;
 
   @Override
   public boolean isD8TestBuilder() {
@@ -97,6 +98,14 @@
       builder.setBuildMetadataConsumer(buildMetadata::set);
     }
     builder.setEnableExperimentalMissingLibraryApiModeling(enableMissingLibraryApiModeling);
+    if (serviceLoaderSupport) {
+      optionsConsumer =
+          optionsConsumer.andThen(
+              options -> {
+                options.testing.enableD8MetaInfServicesPassThrough = true;
+                options.dataResourceConsumer = options.programConsumer.getDataResourceConsumer();
+              });
+    }
     ToolHelper.runAndBenchmarkD8(builder, optionsConsumer, benchmarkResults);
     return new D8TestCompileResult(
         getState(),
@@ -192,4 +201,9 @@
     androidPlatformBuild = true;
     return self();
   }
+
+  public D8TestBuilder enableServiceLoader() {
+    serviceLoaderSupport = true;
+    return self();
+  }
 }
diff --git a/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
index 3ef85b4..2fa54ac 100644
--- a/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
@@ -681,4 +681,9 @@
         new ArtProfileForRewriting(artProfileProvider, residualArtProfileConsumer));
     return this;
   }
+
+  public DesugaredLibraryTestBuilder<T> enableServiceLoader() {
+    withD8TestBuilder(D8TestBuilder::enableServiceLoader);
+    return this;
+  }
 }