[KeepAnno] Add extraction tests to access visibility test
Bug: b/321674067
Change-Id: I383be8fa73255b3a33b353b1f8ffce2a1b2633dc
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
index afa1871..a9dec7d 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
@@ -7,9 +7,6 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.keepanno.annotations.FieldAccessFlags;
import com.android.tools.r8.keepanno.annotations.KeepConstraint;
import com.android.tools.r8.keepanno.annotations.KeepItemKind;
@@ -32,57 +29,66 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
@RunWith(Parameterized.class)
-public class KeepAccessVisibilityFlagsTest extends TestBase {
+public class KeepAccessVisibilityFlagsTest extends KeepAnnoTestBase {
static final String EXPECTED =
StringUtils.lines(
- // Field targets.
+ "=== non-private fields:",
"packagePrivateField",
"protectedField",
"publicField",
- // Method targets.
+ "=== non-package-private methods:",
"privateMethod",
"protectedMethod",
"publicMethod",
- // Member field targets.
+ "=== private and package-private fields:",
"packagePrivateField",
"privateField",
- // Member method targets.
+ "=== private and package-private methods:",
"packagePrivateMethod",
"privateMethod");
- private final TestParameters parameters;
+ static final String UNEXPECTED_PG =
+ StringUtils.lines(
+ "=== non-private fields:",
+ "packagePrivateField",
+ "protectedField",
+ "publicField",
+ "=== non-package-private methods:",
+ "privateMethod",
+ "protectedMethod",
+ "publicMethod",
+ "=== private and package-private fields:",
+ // PG will rename and privatize the unused public and protected field!?
+ "a",
+ "b",
+ "packagePrivateField",
+ "privateField",
+ "=== private and package-private methods:",
+ "packagePrivateMethod",
+ "privateMethod");
+
+ @Parameter public KeepAnnoParameters parameters;
@Parameterized.Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build();
- }
-
- public KeepAccessVisibilityFlagsTest(TestParameters parameters) {
- this.parameters = parameters;
+ public static List<KeepAnnoParameters> data() {
+ return createParameters(
+ getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
}
@Test
- public void testReference() throws Exception {
- testForRuntime(parameters)
- .addProgramClasses(getInputClasses())
- .run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutput(EXPECTED);
- }
-
- @Test
- public void testWithRuleExtraction() throws Exception {
- testForR8(parameters.getBackend())
- .enableExperimentalKeepAnnotations()
+ public void test() throws Exception {
+ testForKeepAnno(parameters)
.addProgramClasses(getInputClasses())
.addKeepMainRule(TestClass.class)
.allowAccessModification()
- .setMinApi(parameters)
- .run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutput(EXPECTED)
- .inspect(this::checkOutput);
+ .setExcludedOuterClass(getClass())
+ .run(TestClass.class)
+ .assertSuccessWithOutput(parameters.isPG() ? UNEXPECTED_PG : EXPECTED)
+ .applyIf(parameters.isR8(), r -> r.inspect(this::checkOutput));
}
public List<Class<?>> getInputClasses() {
@@ -203,6 +209,7 @@
void foo() {
// Print all non-private fields.
{
+ System.out.println("=== non-private fields:");
List<String> nonPrivateFields = new ArrayList<>();
for (Field field : FieldRuleTarget.class.getDeclaredFields()) {
int mod = field.getModifiers();
@@ -214,6 +221,7 @@
}
// Print all non-package-private methods.
{
+ System.out.println("=== non-package-private methods:");
List<String> nonPackagePrivateMethods = new ArrayList<>();
for (Method method : MethodRuleTarget.class.getDeclaredMethods()) {
int mod = method.getModifiers();
@@ -225,6 +233,7 @@
}
// Print all private and package-private members.
{
+ System.out.println("=== private and package-private fields:");
List<String> privateOrPackagePrivateFields = new ArrayList<>();
for (Field field : MemberRuleTarget.class.getDeclaredFields()) {
int mod = field.getModifiers();
@@ -235,6 +244,7 @@
printSorted(privateOrPackagePrivateFields);
}
{
+ System.out.println("=== private and package-private methods:");
List<String> privateOrPackagePrivateMethods = new ArrayList<>();
for (Method method : MemberRuleTarget.class.getDeclaredMethods()) {
int mod = method.getModifiers();
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index 737c95e..947e89e 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.ProguardTestBuilder;
import com.android.tools.r8.R8FullTestBuilder;
import com.android.tools.r8.R8TestBuilder;
+import com.android.tools.r8.R8TestCompileResult;
import com.android.tools.r8.SingleTestRunResult;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestBuilder;
@@ -38,11 +39,16 @@
}
private final KeepAnnoParameters keepAnnoParams;
+ private boolean printRules = false;
private KeepAnnoTestBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
this.keepAnnoParams = params;
}
+ boolean shouldPrintRules() {
+ return printRules;
+ }
+
public final TestParameters parameters() {
return keepAnnoParams.parameters();
}
@@ -54,6 +60,13 @@
public abstract SingleTestRunResult<?> run(Class<?> mainClass) throws Exception;
+ public KeepAnnoTestBuilder applyIfShrinker(
+ ThrowableConsumer<TestShrinkerBuilder<?, ?, ?, ?, ?>> builderConsumer) {
+ applyIfR8(builderConsumer);
+ applyIfPG(builderConsumer::accept);
+ return this;
+ }
+
public KeepAnnoTestBuilder applyIfR8(
ThrowableConsumer<TestShrinkerBuilder<?, ?, ?, ?, ?>> builderConsumer) {
return this;
@@ -75,6 +88,16 @@
return applyIfR8Native(R8TestBuilder::allowUnusedProguardConfigurationRules);
}
+ public final KeepAnnoTestBuilder allowAccessModification() {
+ applyIfShrinker(TestShrinkerBuilder::allowAccessModification);
+ return this;
+ }
+
+ public KeepAnnoTestBuilder printRules() {
+ printRules = true;
+ return this;
+ }
+
private static class ReferenceBuilder extends KeepAnnoTestBuilder {
private final TestBuilder<? extends SingleTestRunResult<?>, ?> builder;
@@ -147,7 +170,11 @@
@Override
public SingleTestRunResult<?> run(Class<?> mainClass) throws Exception {
- return builder.run(parameters().getRuntime(), mainClass);
+ R8TestCompileResult compileResult = builder.compile();
+ if (shouldPrintRules()) {
+ System.out.println(compileResult.getProguardConfiguration());
+ }
+ return compileResult.run(parameters().getRuntime(), mainClass);
}
}
@@ -178,6 +205,9 @@
List<String> rules = KeepAnnoTestUtils.extractRules(programClasses, extractorOptions);
builder.addProgramClasses(programClasses);
builder.addKeepRules(rules);
+ if (shouldPrintRules()) {
+ rules.forEach(System.out::println);
+ }
return this;
}
@@ -218,6 +248,9 @@
List<String> rules = KeepAnnoTestUtils.extractRules(programClasses, extractorOptions);
builder.addProgramClasses(programClasses);
builder.addKeepRules(rules);
+ if (shouldPrintRules()) {
+ rules.forEach(System.out::println);
+ }
return this;
}