Test that --experimental_strict_java_deps is passed down to the javac action

PiperOrigin-RevId: 878599080
Change-Id: I0046d89faf8edecdacdddcbc2648aafc8179f71b
diff --git a/test/java/common/rules/java_library_tests.bzl b/test/java/common/rules/java_library_tests.bzl
index c6bb282..64e1743 100644
--- a/test/java/common/rules/java_library_tests.bzl
+++ b/test/java/common/rules/java_library_tests.bzl
@@ -1,5 +1,6 @@
 """Tests for the java_library rule"""
 
+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")
@@ -9,6 +10,7 @@
 load("//java:java_plugin.bzl", "java_plugin")
 load("//java/common:java_info.bzl", "JavaInfo")
 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/custom_java_info_rule.bzl", "custom_java_info_rule")
 load("//test/java/testutil:rules/forward_java_info.bzl", "java_info_forwarding_rule")
 load("//test/java/testutil:rules/wrap_java_info.bzl", "JavaInfoWrappingInfo", "java_info_wrapping_rule")
@@ -309,15 +311,55 @@
 
     assert_lib.dynamic_library().basename().contains("mynativedep")
 
+def _test_strict_java_deps(name, strict_java_deps):
+    util.helper_target(
+        java_library,
+        name = name + "/jl",
+        srcs = ["A.java"],
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_strict_java_deps_impl,
+        target = name + "/jl",
+        config_settings = {"//command_line_option:experimental_strict_java_deps": strict_java_deps},
+        attrs = {"expected_strict_java_deps": attr.string()},
+        attr_values = {"expected_strict_java_deps": strict_java_deps},
+    )
+
+def _test_strict_java_deps_impl(env, target):
+    # Note that if --experimental_strict_java_deps=OFF, we may not set --strict_java_deps in the
+    # javac action's argv at all; the "OFF" value (which is equivalent to an unset flag) in that
+    # case is injected by javac_action_subject for convenience and canonicalization.
+    expect_that_javac_action = javac_action_subject.of(env, target, "{package}/lib{name}.jar")
+    expect_that_javac_action.strict_java_deps().contains_exactly([env.ctx.attr.expected_strict_java_deps])
+
+def _test_strict_java_deps_off(name):
+    _test_strict_java_deps(name, "OFF")
+
+def _test_strict_java_deps_warn(name):
+    _test_strict_java_deps(name, "WARN")
+
+def _test_strict_java_deps_error(name):
+    _test_strict_java_deps(name, "ERROR")
+
 def java_library_tests(name):
+    tests = [
+        _test_exposes_plugins,
+        _test_exposes_java_info,
+        _test_java_info_propagation,
+        _test_java_library_attributes,
+        _test_propagates_direct_native_libraries,
+        _test_exposes_native_library_info,
+    ]
+    if bazel_features.rules.analysis_tests_can_transition_on_experimental_incompatible_flags:
+        tests += [
+            _test_strict_java_deps_off,
+            _test_strict_java_deps_warn,
+            _test_strict_java_deps_error,
+        ]
+
     test_suite(
         name = name,
-        tests = [
-            _test_exposes_plugins,
-            _test_exposes_java_info,
-            _test_java_info_propagation,
-            _test_java_library_attributes,
-            _test_propagates_direct_native_libraries,
-            _test_exposes_native_library_info,
-        ],
+        tests = tests,
     )
diff --git a/test/java/testutil/javac_action_subject.bzl b/test/java/testutil/javac_action_subject.bzl
index 3a105b7..beb0ecb 100644
--- a/test/java/testutil/javac_action_subject.bzl
+++ b/test/java/testutil/javac_action_subject.bzl
@@ -22,6 +22,8 @@
         direct_dependencies = lambda: _create_subject_for_flag("--direct_dependencies", self.parsed_flags, self.meta),
         javacopts = lambda: _create_subject_for_flag("--javacopts", self.parsed_flags, self.meta),
         jar = lambda: _create_subject_for_flag("-jar", self.parsed_flags, self.meta),
+        # An unset --strict_java_deps is equivalent to "OFF".
+        strict_java_deps = lambda: _create_subject_for_flag("--strict_java_deps", self.parsed_flags, self.meta, default = ["OFF"]),
         sources = lambda: _create_subject_for_flag("--sources", self.parsed_flags, self.meta),
         executable_file_name = lambda: subjects.str(action_subject.actual.argv[0], self.meta),
         inputs = action_subject.inputs,
@@ -56,9 +58,9 @@
 
     return flag_values
 
-def _create_subject_for_flag(flag_name, parsed_flags, meta):
+def _create_subject_for_flag(flag_name, parsed_flags, meta, default = None):
     """Helper to create a collection subject for a given flag."""
-    return subjects.collection(parsed_flags[flag_name], meta.derive(flag_name), format = True)
+    return subjects.collection(parsed_flags.get(flag_name, default), meta.derive(flag_name), format = True)
 
 javac_action_subject = struct(
     of = _new_javac_action_subject,