Parameterize ServiceLoaderRewritingTest wrt. the optimization being enabled

Bug: b/291923475
Change-Id: I0c048b4c512dd03a4287fab60b26656e91abddd9
diff --git a/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceLoaderRewritingTest.java b/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceLoaderRewritingTest.java
index 939e90b5..d72e523 100644
--- a/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceLoaderRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceLoaderRewritingTest.java
@@ -6,13 +6,15 @@
 
 import static com.android.tools.r8.ToolHelper.DexVm.Version.V7_0_0;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.util.List;
 import java.util.NoSuchElementException;
@@ -148,13 +150,28 @@
     }
   }
 
-  @Parameterized.Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  @Parameterized.Parameters(name = "{0}, enableRewriting: {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
   }
 
-  public ServiceLoaderRewritingTest(TestParameters parameters) {
-    super(parameters);
+  public ServiceLoaderRewritingTest(TestParameters parameters, boolean enableRewriting) {
+    super(parameters, enableRewriting);
+  }
+
+  private void expectRewritten(CodeInspector inspector) {
+    long found = getServiceLoaderLoads(inspector);
+    if (enableRewriting) {
+      assertEquals(0, found);
+    } else {
+      assertNotEquals(0, found);
+    }
+  }
+
+  private boolean isDexV7() {
+    // Runtime uses boot classloader rather than system classloader on this version.
+    return parameters.isDexRuntime() && parameters.getDexRuntimeVersion() == V7_0_0;
   }
 
   @Test
@@ -165,37 +182,48 @@
         .compile()
         .run(parameters.getRuntime(), MainRunner.class)
         .assertFailureWithErrorThatThrows(NoSuchElementException.class)
-        .inspectFailure(inspector -> assertEquals(0, getServiceLoaderLoads(inspector)));
+        .inspectFailure(this::expectRewritten);
   }
 
   @Test
-  public void testRewritings() throws IOException, CompilationFailedException, ExecutionException {
+  public void testRewritings() throws Exception {
     serviceLoaderTest(Service.class, ServiceImpl.class)
         .addKeepMainRule(MainRunner.class)
         .compile()
         .run(parameters.getRuntime(), MainRunner.class)
-        .assertSuccessWithOutput(EXPECTED_OUTPUT)
-        .inspect(
-            inspector -> {
-              List<String> lines = dataResourceConsumer.get("META-INF/services/com.example.Foo");
-              assertEquals(0, getServiceLoaderLoads(inspector));
-              verifyServiceMetaInf(inspector, Service.class, ServiceImpl.class);
-            });
+        .applyIf(
+            !isDexV7(),
+            runResult ->
+                runResult
+                    .assertSuccessWithOutput(EXPECTED_OUTPUT)
+                    .inspect(
+                        inspector -> {
+                          expectRewritten(inspector);
+                          verifyServiceMetaInf(inspector, Service.class, ServiceImpl.class);
+                        }),
+            runResult ->
+                runResult.assertFailureWithErrorThatThrows(ServiceConfigurationError.class));
   }
 
   @Test
-  public void testRewritingWithMultiple()
-      throws IOException, CompilationFailedException, ExecutionException {
+  public void testRewritingWithMultiple() throws Exception {
     serviceLoaderTest(Service.class, ServiceImpl.class, ServiceImpl2.class)
         .addKeepMainRule(MainRunner.class)
         .compile()
         .run(parameters.getRuntime(), MainRunner.class)
-        .assertSuccessWithOutput(EXPECTED_OUTPUT + StringUtils.lines("Hello World 2!"))
-        .inspect(
-            inspector -> {
-              assertEquals(0, getServiceLoaderLoads(inspector));
-              verifyServiceMetaInf(inspector, Service.class, ServiceImpl.class, ServiceImpl2.class);
-            });
+        .applyIf(
+            !isDexV7(),
+            runResult ->
+                runResult
+                    .assertSuccessWithOutput(EXPECTED_OUTPUT + StringUtils.lines("Hello World 2!"))
+                    .inspect(
+                        inspector -> {
+                          expectRewritten(inspector);
+                          verifyServiceMetaInf(
+                              inspector, Service.class, ServiceImpl.class, ServiceImpl2.class);
+                        }),
+            runResult ->
+                runResult.assertFailureWithErrorThatThrows(ServiceConfigurationError.class));
   }
 
   @Test
@@ -208,7 +236,7 @@
         .assertSuccessWithOutput(StringUtils.lines("Hello World!"))
         .inspect(
             inspector -> {
-              assertEquals(0, getServiceLoaderLoads(inspector));
+              expectRewritten(inspector);
               verifyServiceMetaInf(inspector, Service.class, ServiceImpl.class, ServiceImpl2.class);
             });
   }
@@ -217,8 +245,8 @@
   public void testDoNoRewrite() throws IOException, CompilationFailedException, ExecutionException {
     serviceLoaderTest(Service.class, ServiceImpl.class)
         .addKeepMainRule(OtherRunner.class)
-        .allowDiagnosticInfoMessages()
-        .compileWithExpectedDiagnostics(REWRITER_DIAGNOSTICS)
+        .allowDiagnosticInfoMessages(enableRewriting)
+        .compileWithExpectedDiagnostics(expectedDiagnostics)
         .run(parameters.getRuntime(), OtherRunner.class)
         .assertSuccessWithOutput(EXPECTED_OUTPUT)
         .inspect(
@@ -233,8 +261,8 @@
       throws IOException, CompilationFailedException, ExecutionException {
     serviceLoaderTest(Service.class, ServiceImplNoDefaultConstructor.class)
         .addKeepMainRule(MainRunner.class)
-        .allowDiagnosticInfoMessages()
-        .compileWithExpectedDiagnostics(REWRITER_DIAGNOSTICS)
+        .allowDiagnosticInfoMessages(enableRewriting)
+        .compileWithExpectedDiagnostics(expectedDiagnostics)
         .run(parameters.getRuntime(), MainRunner.class)
         .assertFailureWithErrorThatThrows(ServiceConfigurationError.class);
   }
@@ -244,8 +272,8 @@
       throws IOException, CompilationFailedException, ExecutionException {
     serviceLoaderTest(Service.class, MainRunner.class)
         .addKeepMainRule(MainRunner.class)
-        .allowDiagnosticInfoMessages()
-        .compileWithExpectedDiagnostics(REWRITER_DIAGNOSTICS)
+        .allowDiagnosticInfoMessages(enableRewriting)
+        .compileWithExpectedDiagnostics(expectedDiagnostics)
         .run(parameters.getRuntime(), MainRunner.class)
         .assertFailureWithErrorThatThrows(ServiceConfigurationError.class);
   }
@@ -256,11 +284,11 @@
     // This throws a ServiceConfigurationError only on Android 7.
     serviceLoaderTest(Service.class, ServiceImplNonPublicConstructor.class)
         .addKeepMainRule(MainRunner.class)
-        .allowDiagnosticInfoMessages()
-        .compileWithExpectedDiagnostics(REWRITER_DIAGNOSTICS)
+        .allowDiagnosticInfoMessages(enableRewriting)
+        .compileWithExpectedDiagnostics(expectedDiagnostics)
         .run(parameters.getRuntime(), MainRunner.class)
         .applyIf(
-            parameters.isCfRuntime() || parameters.getDexRuntimeVersion() != V7_0_0,
+            !isDexV7(),
             runResult -> runResult.assertSuccessWithOutput(EXPECTED_OUTPUT),
             runResult ->
                 runResult.assertFailureWithErrorThatThrows(ServiceConfigurationError.class));
@@ -273,8 +301,8 @@
         .addKeepMainRule(EscapingRunner.class)
         .enableInliningAnnotations()
         .addDontObfuscate()
-        .allowDiagnosticInfoMessages()
-        .compileWithExpectedDiagnostics(REWRITER_DIAGNOSTICS)
+        .allowDiagnosticInfoMessages(enableRewriting)
+        .compileWithExpectedDiagnostics(expectedDiagnostics)
         .run(parameters.getRuntime(), EscapingRunner.class)
         .assertSuccessWithOutput(EXPECTED_OUTPUT)
         .inspect(
@@ -290,8 +318,8 @@
     serviceLoaderTest(Service.class, ServiceImpl.class)
         .addKeepMainRule(LoadWhereClassLoaderIsPhi.class)
         .enableInliningAnnotations()
-        .allowDiagnosticInfoMessages()
-        .compileWithExpectedDiagnostics(REWRITER_DIAGNOSTICS)
+        .allowDiagnosticInfoMessages(enableRewriting)
+        .compileWithExpectedDiagnostics(expectedDiagnostics)
         .run(parameters.getRuntime(), LoadWhereClassLoaderIsPhi.class)
         .assertSuccessWithOutputLines("Hello World!")
         .inspect(
@@ -312,8 +340,8 @@
     serviceLoaderTest(Service.class, ServiceImpl.class)
         .addKeepMainRule(MainRunner.class)
         .addKeepClassRules(Service.class)
-        .allowDiagnosticInfoMessages()
-        .compileWithExpectedDiagnostics(REWRITER_DIAGNOSTICS)
+        .allowDiagnosticInfoMessages(enableRewriting)
+        .compileWithExpectedDiagnostics(expectedDiagnostics)
         .run(parameters.getRuntime(), MainRunner.class)
         .assertSuccessWithOutput(EXPECTED_OUTPUT)
         .inspect(
diff --git a/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceLoaderTestBase.java b/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceLoaderTestBase.java
index 118a3fc..809f782 100644
--- a/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceLoaderTestBase.java
+++ b/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceLoaderTestBase.java
@@ -32,17 +32,30 @@
 import java.util.stream.Collectors;
 
 public class ServiceLoaderTestBase extends TestBase {
-  protected final TestParameters parameters;
-  protected DataResourceConsumerForTesting dataResourceConsumer;
-  protected static final DiagnosticsConsumer<CompilationFailedException> REWRITER_DIAGNOSTICS =
+  private static final DiagnosticsConsumer<CompilationFailedException> REWRITER_DIAGNOSTICS =
       diagnostics ->
           diagnostics
               .assertOnlyInfos()
               .assertAllInfosMatch(
                   DiagnosticsMatcher.diagnosticType(ServiceLoaderRewriterDiagnostic.class));
 
+  protected final TestParameters parameters;
+  protected final boolean enableRewriting;
+  protected DataResourceConsumerForTesting dataResourceConsumer;
+  protected final DiagnosticsConsumer<CompilationFailedException> expectedDiagnostics;
+
   public ServiceLoaderTestBase(TestParameters parameters) {
+    this(parameters, true);
+  }
+
+  public ServiceLoaderTestBase(TestParameters parameters, boolean enableRewriting) {
     this.parameters = parameters;
+    this.enableRewriting = enableRewriting;
+    if (enableRewriting) {
+      expectedDiagnostics = REWRITER_DIAGNOSTICS;
+    } else {
+      expectedDiagnostics = diagnostics -> diagnostics.assertNoInfos();
+    }
   }
 
   public static long getServiceLoaderLoads(CodeInspector inspector) {
@@ -124,11 +137,11 @@
                 o -> {
                   dataResourceConsumer = new DataResourceConsumerForTesting(o.dataResourceConsumer);
                   o.dataResourceConsumer = dataResourceConsumer;
+                  o.enableServiceLoaderRewriting = enableRewriting;
                 })
             // Enables ServiceLoader optimization failure diagnostics.
             .enableExperimentalWhyAreYouNotInlining()
-            .addKeepRules(
-                "-whyareyounotinlining class java.util.ServiceLoader { *** load(...); }");
+            .addKeepRules("-whyareyounotinlining class java.util.ServiceLoader { *** load(...); }");
     if (implClasses.length > 0) {
       String implLines =
           Arrays.stream(implClasses)
diff --git a/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceWithFeatureNullClassLoaderTest.java b/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceWithFeatureNullClassLoaderTest.java
index 76ea395..a815899 100644
--- a/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceWithFeatureNullClassLoaderTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/serviceloader/ServiceWithFeatureNullClassLoaderTest.java
@@ -70,7 +70,7 @@
             .enableInliningAnnotations()
             .addKeepMainRule(MainRunner.class)
             .allowDiagnosticInfoMessages()
-            .compileWithExpectedDiagnostics(REWRITER_DIAGNOSTICS);
+            .compileWithExpectedDiagnostics(expectedDiagnostics);
 
     CodeInspector inspector = result.featureInspector();
     assertEquals(getServiceLoaderLoads(inspector), 1);