Add tests for redundant -keeppackagenames rules
Bug: b/356827163
Change-Id: Ia63080604e5461b49ae71f6d6fd3907a171ad3aa
diff --git a/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForNonReboundFieldTest.java b/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForNonReboundFieldTest.java
new file mode 100644
index 0000000..7e4971e
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForNonReboundFieldTest.java
@@ -0,0 +1,99 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.tracereferences.packages;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessagesImpl;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.references.PackageReference;
+import com.android.tools.r8.tracereferences.TraceReferences;
+import com.android.tools.r8.tracereferences.TraceReferencesCommand;
+import com.android.tools.r8.tracereferences.TraceReferencesConsumer;
+import com.android.tools.r8.tracereferences.packages.testclasses.TraceReferenceRedundantKeepPackageForNonReboundFieldTestClasses;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
+import com.android.tools.r8.utils.codeinspector.AssertUtils;
+import java.nio.file.Path;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TraceReferenceRedundantKeepPackageForNonReboundFieldTest extends TestBase {
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withNoneRuntime().build();
+ }
+
+ static class TraceReferencesInspector implements TraceReferencesConsumer {
+
+ @Override
+ public void acceptPackage(PackageReference pkg, DiagnosticsHandler handler) {
+ fail("Unexpected package");
+ }
+
+ @Override
+ public void acceptField(TracedField tracedField, DiagnosticsHandler handler) {}
+
+ @Override
+ public void acceptMethod(TracedMethod tracedMethod, DiagnosticsHandler handler) {}
+
+ @Override
+ public void acceptType(TracedClass tracedClass, DiagnosticsHandler handler) {}
+ }
+
+ @Test
+ public void test() throws Throwable {
+ AssertUtils.assertFailsCompilation(
+ () ->
+ runTest(
+ testForD8(Backend.DEX)
+ .addProgramClasses(Main.class)
+ .release()
+ .setMinApi(AndroidApiLevel.B)
+ .compile()
+ .writeToZip()),
+ exception -> assertEquals("Unexpected package", exception.getCause().getMessage()));
+ }
+
+ private TraceReferencesInspector runTest(Path sourceFile) throws Exception {
+ Path dir = temp.newFolder().toPath();
+ Path targetJar =
+ ZipBuilder.builder(dir.resolve("target.jar"))
+ .addFilesRelative(
+ ToolHelper.getClassPathForTests(),
+ ToolHelper.getClassFilesForInnerClasses(
+ TraceReferenceRedundantKeepPackageForNonReboundFieldTestClasses.class))
+ .build();
+ TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
+ TraceReferencesInspector consumer = new TraceReferencesInspector();
+ TraceReferences.run(
+ TraceReferencesCommand.builder(diagnostics)
+ .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+ .addSourceFiles(sourceFile)
+ .addTargetFiles(targetJar)
+ .setConsumer(consumer)
+ .build());
+ return consumer;
+ }
+
+ public static class Main {
+
+ public static void main(String[] args) {
+ int f = TraceReferenceRedundantKeepPackageForNonReboundFieldTestClasses.B.f;
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForNonReboundMethodTest.java b/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForNonReboundMethodTest.java
new file mode 100644
index 0000000..53bde72
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForNonReboundMethodTest.java
@@ -0,0 +1,99 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.tracereferences.packages;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessagesImpl;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.references.PackageReference;
+import com.android.tools.r8.tracereferences.TraceReferences;
+import com.android.tools.r8.tracereferences.TraceReferencesCommand;
+import com.android.tools.r8.tracereferences.TraceReferencesConsumer;
+import com.android.tools.r8.tracereferences.packages.testclasses.TraceReferenceRedundantKeepPackageForNonReboundMethodTestClasses;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
+import com.android.tools.r8.utils.codeinspector.AssertUtils;
+import java.nio.file.Path;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TraceReferenceRedundantKeepPackageForNonReboundMethodTest extends TestBase {
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withNoneRuntime().build();
+ }
+
+ static class TraceReferencesInspector implements TraceReferencesConsumer {
+
+ @Override
+ public void acceptPackage(PackageReference pkg, DiagnosticsHandler handler) {
+ fail("Unexpected package");
+ }
+
+ @Override
+ public void acceptField(TracedField tracedField, DiagnosticsHandler handler) {}
+
+ @Override
+ public void acceptMethod(TracedMethod tracedMethod, DiagnosticsHandler handler) {}
+
+ @Override
+ public void acceptType(TracedClass tracedClass, DiagnosticsHandler handler) {}
+ }
+
+ @Test
+ public void test() throws Throwable {
+ AssertUtils.assertFailsCompilation(
+ () ->
+ runTest(
+ testForD8(Backend.DEX)
+ .addProgramClasses(Main.class)
+ .release()
+ .setMinApi(AndroidApiLevel.B)
+ .compile()
+ .writeToZip()),
+ exception -> assertEquals("Unexpected package", exception.getCause().getMessage()));
+ }
+
+ private TraceReferencesInspector runTest(Path sourceFile) throws Exception {
+ Path dir = temp.newFolder().toPath();
+ Path targetJar =
+ ZipBuilder.builder(dir.resolve("target.jar"))
+ .addFilesRelative(
+ ToolHelper.getClassPathForTests(),
+ ToolHelper.getClassFilesForInnerClasses(
+ TraceReferenceRedundantKeepPackageForNonReboundMethodTestClasses.class))
+ .build();
+ TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
+ TraceReferencesInspector consumer = new TraceReferencesInspector();
+ TraceReferences.run(
+ TraceReferencesCommand.builder(diagnostics)
+ .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+ .addSourceFiles(sourceFile)
+ .addTargetFiles(targetJar)
+ .setConsumer(consumer)
+ .build());
+ return consumer;
+ }
+
+ public static class Main {
+
+ public static void main(String[] args) {
+ TraceReferenceRedundantKeepPackageForNonReboundMethodTestClasses.B.m();
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForProtectedFieldTest.java b/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForProtectedFieldTest.java
new file mode 100644
index 0000000..f2ada53
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForProtectedFieldTest.java
@@ -0,0 +1,100 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.tracereferences.packages;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessagesImpl;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.references.PackageReference;
+import com.android.tools.r8.tracereferences.TraceReferences;
+import com.android.tools.r8.tracereferences.TraceReferencesCommand;
+import com.android.tools.r8.tracereferences.TraceReferencesConsumer;
+import com.android.tools.r8.tracereferences.packages.testclasses.TraceReferenceRedundantKeepPackageForProtectedFieldTestClasses;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
+import com.android.tools.r8.utils.codeinspector.AssertUtils;
+import java.nio.file.Path;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TraceReferenceRedundantKeepPackageForProtectedFieldTest extends TestBase {
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withNoneRuntime().build();
+ }
+
+ static class TraceReferencesInspector implements TraceReferencesConsumer {
+
+ @Override
+ public void acceptPackage(PackageReference pkg, DiagnosticsHandler handler) {
+ fail("Unexpected package");
+ }
+
+ @Override
+ public void acceptField(TracedField tracedField, DiagnosticsHandler handler) {}
+
+ @Override
+ public void acceptMethod(TracedMethod tracedMethod, DiagnosticsHandler handler) {}
+
+ @Override
+ public void acceptType(TracedClass tracedClass, DiagnosticsHandler handler) {}
+ }
+
+ @Test
+ public void test() throws Throwable {
+ AssertUtils.assertFailsCompilation(
+ () ->
+ runTest(
+ testForD8(Backend.DEX)
+ .addProgramClasses(Main.class)
+ .release()
+ .setMinApi(AndroidApiLevel.B)
+ .compile()
+ .writeToZip()),
+ exception -> assertEquals("Unexpected package", exception.getCause().getMessage()));
+ }
+
+ private TraceReferencesInspector runTest(Path sourceFile) throws Exception {
+ Path dir = temp.newFolder().toPath();
+ Path targetJar =
+ ZipBuilder.builder(dir.resolve("target.jar"))
+ .addFilesRelative(
+ ToolHelper.getClassPathForTests(),
+ ToolHelper.getClassFilesForInnerClasses(
+ TraceReferenceRedundantKeepPackageForProtectedFieldTestClasses.class))
+ .build();
+ TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
+ TraceReferencesInspector consumer = new TraceReferencesInspector();
+ TraceReferences.run(
+ TraceReferencesCommand.builder(diagnostics)
+ .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+ .addSourceFiles(sourceFile)
+ .addTargetFiles(targetJar)
+ .setConsumer(consumer)
+ .build());
+ return consumer;
+ }
+
+ public static class Main
+ extends TraceReferenceRedundantKeepPackageForProtectedFieldTestClasses.A {
+
+ public static void main(String[] args) {
+ int f = TraceReferenceRedundantKeepPackageForProtectedFieldTestClasses.A.f;
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForProtectedMethodTest.java b/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForProtectedMethodTest.java
new file mode 100644
index 0000000..f8a0c91
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/tracereferences/packages/TraceReferenceRedundantKeepPackageForProtectedMethodTest.java
@@ -0,0 +1,100 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.tracereferences.packages;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessagesImpl;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.references.PackageReference;
+import com.android.tools.r8.tracereferences.TraceReferences;
+import com.android.tools.r8.tracereferences.TraceReferencesCommand;
+import com.android.tools.r8.tracereferences.TraceReferencesConsumer;
+import com.android.tools.r8.tracereferences.packages.testclasses.TraceReferenceRedundantKeepPackageForProtectedMethodTestClasses;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
+import com.android.tools.r8.utils.codeinspector.AssertUtils;
+import java.nio.file.Path;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TraceReferenceRedundantKeepPackageForProtectedMethodTest extends TestBase {
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withNoneRuntime().build();
+ }
+
+ static class TraceReferencesInspector implements TraceReferencesConsumer {
+
+ @Override
+ public void acceptPackage(PackageReference pkg, DiagnosticsHandler handler) {
+ fail("Unexpected package");
+ }
+
+ @Override
+ public void acceptField(TracedField tracedField, DiagnosticsHandler handler) {}
+
+ @Override
+ public void acceptMethod(TracedMethod tracedMethod, DiagnosticsHandler handler) {}
+
+ @Override
+ public void acceptType(TracedClass tracedClass, DiagnosticsHandler handler) {}
+ }
+
+ @Test
+ public void test() throws Throwable {
+ AssertUtils.assertFailsCompilation(
+ () ->
+ runTest(
+ testForD8(Backend.DEX)
+ .addProgramClasses(Main.class)
+ .release()
+ .setMinApi(AndroidApiLevel.B)
+ .compile()
+ .writeToZip()),
+ exception -> assertEquals("Unexpected package", exception.getCause().getMessage()));
+ }
+
+ private TraceReferencesInspector runTest(Path sourceFile) throws Exception {
+ Path dir = temp.newFolder().toPath();
+ Path targetJar =
+ ZipBuilder.builder(dir.resolve("target.jar"))
+ .addFilesRelative(
+ ToolHelper.getClassPathForTests(),
+ ToolHelper.getClassFilesForInnerClasses(
+ TraceReferenceRedundantKeepPackageForProtectedMethodTestClasses.class))
+ .build();
+ TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
+ TraceReferencesInspector consumer = new TraceReferencesInspector();
+ TraceReferences.run(
+ TraceReferencesCommand.builder(diagnostics)
+ .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+ .addSourceFiles(sourceFile)
+ .addTargetFiles(targetJar)
+ .setConsumer(consumer)
+ .build());
+ return consumer;
+ }
+
+ public static class Main
+ extends TraceReferenceRedundantKeepPackageForProtectedMethodTestClasses.A {
+
+ public static void main(String[] args) {
+ TraceReferenceRedundantKeepPackageForProtectedMethodTestClasses.A.m();
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForNonReboundFieldTestClasses.java b/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForNonReboundFieldTestClasses.java
new file mode 100644
index 0000000..ecc0f82
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForNonReboundFieldTestClasses.java
@@ -0,0 +1,14 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.tracereferences.packages.testclasses;
+
+public class TraceReferenceRedundantKeepPackageForNonReboundFieldTestClasses {
+
+ static class A {
+
+ public static int f;
+ }
+
+ public static class B extends A {}
+}
diff --git a/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForNonReboundMethodTestClasses.java b/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForNonReboundMethodTestClasses.java
new file mode 100644
index 0000000..93233c8
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForNonReboundMethodTestClasses.java
@@ -0,0 +1,14 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.tracereferences.packages.testclasses;
+
+public class TraceReferenceRedundantKeepPackageForNonReboundMethodTestClasses {
+
+ static class A {
+
+ public static void m() {}
+ }
+
+ public static class B extends A {}
+}
diff --git a/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForProtectedFieldTestClasses.java b/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForProtectedFieldTestClasses.java
new file mode 100644
index 0000000..67b8ca3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForProtectedFieldTestClasses.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.tracereferences.packages.testclasses;
+
+public class TraceReferenceRedundantKeepPackageForProtectedFieldTestClasses {
+
+ public static class A {
+
+ protected static int f;
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForProtectedMethodTestClasses.java b/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForProtectedMethodTestClasses.java
new file mode 100644
index 0000000..824206e
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/tracereferences/packages/testclasses/TraceReferenceRedundantKeepPackageForProtectedMethodTestClasses.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.tracereferences.packages.testclasses;
+
+public class TraceReferenceRedundantKeepPackageForProtectedMethodTestClasses {
+
+ public static class A {
+
+ protected static void m() {}
+ }
+}