Migrate the `JavaImportConfiguredTargetTest.testTransitiveDependencies` test to Starlark

The test is removed from Bazel and added to rules_java

(ignore-relnotes)

PiperOrigin-RevId: 756232605
Change-Id: I68afea64884c5a9d3e37ddd7fb0be86a81ab96b7
diff --git a/test/java/common/rules/java_import_tests.bzl b/test/java/common/rules/java_import_tests.bzl
index cea1e26..c400ec8 100644
--- a/test/java/common/rules/java_import_tests.bzl
+++ b/test/java/common/rules/java_import_tests.bzl
@@ -9,6 +9,7 @@
 load("//java/common:java_info.bzl", "JavaInfo")
 load("//test/java/testutil:helper.bzl", "always_passes")
 load("//test/java/testutil:java_info_subject.bzl", "java_info_subject")
+load("//test/java/testutil:javac_action_subject.bzl", "javac_action_subject")
 load("//test/java/testutil:rules/forward_java_info.bzl", "java_info_forwarding_rule")
 
 def _test_java_import_attributes(name):
@@ -339,6 +340,48 @@
     jar = targets.lib[JavaInfo].transitive_runtime_jars.to_list()[0].short_path
     env.expect.that_target(targets.gen).action_generating(jar).mnemonic().equals("Genrule")
 
+# Regression test for b/13936397: don't flatten transitive dependencies into direct deps.
+def _test_transitive_dependencies(name):
+    target_name = name + "/javalib2"
+    util.helper_target(
+        java_import,
+        name = target_name + "/libraryjar",
+        jars = ["library.jar"],
+    )
+    util.helper_target(
+        java_library,
+        name = target_name + "/lib",
+        srcs = ["Lib.java"],
+        deps = [target_name + "/libraryjar"],
+    )
+    util.helper_target(
+        java_import,
+        name = target_name + "/library2-jar",
+        jars = ["library2.jar"],
+        exports = [target_name + "/lib"],
+    )
+    util.helper_target(
+        java_library,
+        name = target_name,
+        srcs = ["Other.java"],
+        deps = [target_name + "/library2-jar"],
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_transitive_dependencies_impl,
+        target = target_name,
+    )
+
+def _test_transitive_dependencies_impl(env, target):
+    assert_javac_action = javac_action_subject.of(env, target, "{package}/lib{name}.jar")
+
+    # Direct jars should NOT include libraryjar-ijar.jar
+    assert_javac_action.direct_dependencies().contains_exactly([
+        "{bin_path}/{package}/_ijar/{name}/library2-jar/{package}/library2-ijar.jar",
+        "{bin_path}/{package}/lib{name}/lib-hjar.jar",
+    ])
+
 def java_import_tests(name):
     test_suite(
         name = name,
@@ -352,5 +395,6 @@
             _test_module_flags,
             _test_src_jars,
             _test_from_genrule,
+            _test_transitive_dependencies,
         ],
     )
diff --git a/test/java/testutil/BUILD b/test/java/testutil/BUILD
index c2afbb3..748abb4 100644
--- a/test/java/testutil/BUILD
+++ b/test/java/testutil/BUILD
@@ -1 +1,5 @@
+load(":javac_action_subject_tests.bzl", "javac_action_subject_tests")
+
 package(default_applicable_licenses = ["@rules_java//:license"])
+
+javac_action_subject_tests(name = "javac_action_subject_tests")
diff --git a/test/java/testutil/javac_action_subject.bzl b/test/java/testutil/javac_action_subject.bzl
new file mode 100644
index 0000000..0a14c77
--- /dev/null
+++ b/test/java/testutil/javac_action_subject.bzl
@@ -0,0 +1,49 @@
+"""Bespoke rules_testing subject for the Java compilation action"""
+
+load("@rules_testing//lib:truth.bzl", "subjects", "truth")
+load("@rules_testing//lib:util.bzl", "TestingAspectInfo")
+
+def _new_javac_action_subject(env, target, output):
+    action = env.expect.that_target(target).action_generating(output).actual
+    self = struct(
+        actual = action,
+        parsed_flags = _parse_flags(action.argv),
+        meta = truth.expect(env).meta.derive(
+            "Javac",
+            format_str_kwargs = {
+                "name": target.label.name,
+                "package": target.label.package,
+                "bin_path": target[TestingAspectInfo].bin_path,
+            },
+        ),
+    )
+    public = struct(
+        direct_dependencies = lambda: subjects.collection(self.parsed_flags["--direct_dependencies"], self.meta.derive("--direct_dependencies"), format = True),
+    )
+    return public
+
+def _parse_flags(argv):
+    flag_values = {}
+    current_flag_name = None
+    for idx, arg in enumerate(argv):
+        if idx == 0:
+            continue  # java command
+        if arg.startswith("-"):
+            if "=" in arg:
+                parts = arg.split("=", 1)
+                flag_values.setdefault(parts[0], []).append(parts[1])
+                current_flag_name = None
+            else:
+                flag_values.setdefault(arg, [])
+                current_flag_name = arg
+        else:
+            if not current_flag_name:
+                fail("No preceding flag for value:", arg, "at index:", idx, "\nargv:\n", argv)
+            flag_values[current_flag_name].append(arg)
+
+    return flag_values
+
+javac_action_subject = struct(
+    of = _new_javac_action_subject,
+    parse_flags = _parse_flags,  # exposed for testing this method itself
+)
diff --git a/test/java/testutil/javac_action_subject_tests.bzl b/test/java/testutil/javac_action_subject_tests.bzl
new file mode 100644
index 0000000..eba3f76
--- /dev/null
+++ b/test/java/testutil/javac_action_subject_tests.bzl
@@ -0,0 +1,70 @@
+"""Tests for the javac_action_subject"""
+
+load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
+load(":javac_action_subject.bzl", "javac_action_subject")
+
+def _parse_flags_test_impl(ctx):
+    env = unittest.begin(ctx)
+    flags = javac_action_subject.parse_flags([
+        "/usr/bin/java",
+        "-Xmx1g",
+        "-XX:SomeProp=SomeVal",
+        "-Dcom.google.foo=bar",
+        "--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+        "--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
+        "--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED",
+        "--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
+        "-jar",
+        "JavaBuilder_deploy.jar",
+        "--output",
+        "blaze-out/k8/bin/pkg/libfoo.jar",
+        "-source",
+        "21",
+        "-target",
+        "17",
+        "-g",
+        "-parameters",
+        "-sourcepath",
+        ":",
+        "-Xmaxerrs",
+        "123",
+        "--",
+        "--strict_java_deps",
+        "ERROR",
+        "--classpath",
+        "pkg/bar-hjar.jar",
+        "other/pkg/baz.jar",
+    ])
+    asserts.equals(env, {
+        "-Xmx1g": [],
+        "-XX:SomeProp": ["SomeVal"],
+        "-Dcom.google.foo": ["bar"],
+        "--add-exports": [
+            "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+            "jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
+        ],
+        "--add-opens": [
+            "jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED",
+            "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
+        ],
+        "-jar": ["JavaBuilder_deploy.jar"],
+        "--output": ["blaze-out/k8/bin/pkg/libfoo.jar"],
+        "-source": ["21"],
+        "-target": ["17"],
+        "-g": [],
+        "-parameters": [],
+        "-sourcepath": [":"],
+        "-Xmaxerrs": ["123"],
+        "--": [],
+        "--strict_java_deps": ["ERROR"],
+        "--classpath": ["pkg/bar-hjar.jar", "other/pkg/baz.jar"],
+    }, flags)
+    return unittest.end(env)
+
+_parse_flags_test = unittest.make(_parse_flags_test_impl)
+
+def javac_action_subject_tests(name):
+    unittest.suite(
+        name,
+        _parse_flags_test,
+    )