Add a test for `java_binary` `--experimental_strict_java_deps` behavior

(ignore-relnotes)

PiperOrigin-RevId: 969850063
Change-Id: I150c001164ecbdd09e1a6411fb2a1ee47bb4715a
diff --git a/test/java/common/rules/common_launcher_java_binary_tests.bzl b/test/java/common/rules/common_launcher_java_binary_tests.bzl
index dc3d18d..877f3d4 100644
--- a/test/java/common/rules/common_launcher_java_binary_tests.bzl
+++ b/test/java/common/rules/common_launcher_java_binary_tests.bzl
@@ -1,5 +1,6 @@
 """Parameterized tests for java_binary with --java_launcher"""
 
+load("@bazel_features//:features.bzl", "bazel_features")
 load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
 load("@rules_cc//cc:cc_library.bzl", "cc_library")
 load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
@@ -10,6 +11,8 @@
 load("//java/common/rules:java_helper.bzl", "helper")
 load("//test/java/testutil:artifact_closure.bzl", "artifact_closure")
 load("//test/java/testutil:binary_executable_subject.bzl", "expect_that_executable")
+load("//test/java/testutil:helper.bzl", "always_passes")
+load("//test/java/testutil:javac_action_subject.bzl", "javac_action_subject")
 load("//test/java/testutil:mock_java_toolchain.bzl", "mock_java_toolchain")
 
 def _test_java_binary_non_executable_rule_outputs(name):
@@ -316,6 +319,79 @@
         expected = "'Outer$Inner'"  # shell-quoted
     expect_that_executable.of_target(env, target).test_suite().equals(expected)
 
+def _test_java_binary_strict_java_deps_flag(name):
+    if not bazel_features.rules.analysis_tests_can_transition_on_experimental_incompatible_flags:
+        always_passes(name)
+        return
+
+    util.helper_target(
+        java_binary,
+        name = name + "/app",
+        srcs = ["App.java"],
+        deps = [
+            name + "/alpha",
+            name + "/bravo",
+        ],
+    )
+    util.helper_target(
+        java_library,
+        name = name + "/alpha",
+        srcs = ["Alpha.java"],
+    )
+    util.helper_target(
+        java_library,
+        name = name + "/bravo",
+        srcs = ["Bravo.java"],
+        exports = [name + "/delta"],
+        deps = [name + "/charlie"],
+    )
+    util.helper_target(
+        java_library,
+        name = name + "/charlie",
+        srcs = ["Charlie.java"],
+    )
+    util.helper_target(
+        java_library,
+        name = name + "/delta",
+        srcs = ["Delta.java"],
+    )
+
+    analysis_test(
+        name = name,
+        attrs = {
+            "off": {"@config_settings": {"//command_line_option:experimental_strict_java_deps": "OFF"}},
+            "warn": {"@config_settings": {"//command_line_option:experimental_strict_java_deps": "WARN"}},
+            "error": {"@config_settings": {"//command_line_option:experimental_strict_java_deps": "ERROR"}},
+            "strict": {"@config_settings": {"//command_line_option:experimental_strict_java_deps": "STRICT"}},
+        },
+        impl = _test_java_binary_strict_java_deps_flag_impl,
+        targets = {
+            "off": name + "/app",
+            "warn": name + "/app",
+            "error": name + "/app",
+            "strict": name + "/app",
+        },
+    )
+
+def _test_java_binary_strict_java_deps_flag_impl(env, targets):
+    # off
+    assert_that_javac = javac_action_subject.of(env, targets.off, desc = "off")
+    assert_that_javac.direct_dependencies().contains_exactly([])
+    assert_that_javac.strict_java_deps().equals("OFF")
+
+    for mode, target, expected_flag_value in [
+        ("WARN", targets.warn, "WARN"),
+        ("ERROR", targets.error, "ERROR"),
+        ("STRICT", targets.strict, "ERROR"),
+    ]:
+        assert_that_javac = javac_action_subject.of(env, target, desc = "mode=" + mode)
+        assert_that_javac.strict_java_deps().equals(expected_flag_value)
+        assert_that_javac.direct_dependencies().contains_exactly([
+            "{bindir}/{package}/lib{test_name}/alpha-hjar.jar",
+            "{bindir}/{package}/lib{test_name}/bravo-hjar.jar",
+            "{bindir}/{package}/lib{test_name}/delta-hjar.jar",
+        ]).in_order()
+
 def java_binary_launcher_tests(name):
     test_suite(
         name = name,
@@ -332,5 +408,6 @@
             _test_java_binary_native_library_path_includes_transitive_deps,
             _test_java_binary_inner_class,
             _test_java_test_inner_class,
+            _test_java_binary_strict_java_deps_flag,
         ],
     )