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() {}
+  }
+}