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);