Starlarkify JavaToolchainTest.javac_getsOptionsFromToolchain()

PiperOrigin-RevId: 874081635
Change-Id: Ie56e4c40878e781e130a229b60bf2e7bdf0386c3
diff --git a/test/java/testutil/javac_action_subject.bzl b/test/java/testutil/javac_action_subject.bzl
index 0a14c77..ef23812 100644
--- a/test/java/testutil/javac_action_subject.bzl
+++ b/test/java/testutil/javac_action_subject.bzl
@@ -4,10 +4,10 @@
 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
+    action_subject = env.expect.that_target(target).action_generating(output)
     self = struct(
-        actual = action,
-        parsed_flags = _parse_flags(action.argv),
+        actual = action_subject.actual,
+        parsed_flags = _parse_flags(action_subject.actual.argv),
         meta = truth.expect(env).meta.derive(
             "Javac",
             format_str_kwargs = {
@@ -17,8 +17,15 @@
             },
         ),
     )
+
     public = struct(
-        direct_dependencies = lambda: subjects.collection(self.parsed_flags["--direct_dependencies"], self.meta.derive("--direct_dependencies"), format = True),
+        direct_dependencies = lambda: _create_subject_for_flag("--direct_dependencies", self.parsed_flags, self.meta),
+        source = lambda: _create_subject_for_flag("-source", self.parsed_flags, self.meta),
+        target = lambda: _create_subject_for_flag("-target", self.parsed_flags, self.meta),
+        xmaxerrs = lambda: _create_subject_for_flag("-Xmaxerrs", self.parsed_flags, self.meta),
+        jar = lambda: _create_subject_for_flag("-jar", self.parsed_flags, self.meta),
+        inputs = action_subject.inputs,
+        argv = action_subject.argv,
     )
     return public
 
@@ -43,6 +50,10 @@
 
     return flag_values
 
+def _create_subject_for_flag(flag_name, parsed_flags, meta):
+    """Helper to create a collection subject for a given flag."""
+    return subjects.collection(parsed_flags[flag_name], meta.derive(flag_name), format = True)
+
 javac_action_subject = struct(
     of = _new_javac_action_subject,
     parse_flags = _parse_flags,  # exposed for testing this method itself
diff --git a/test/java/toolchains/java_toolchain_tests.bzl b/test/java/toolchains/java_toolchain_tests.bzl
index 928ce00..976bb08 100644
--- a/test/java/toolchains/java_toolchain_tests.bzl
+++ b/test/java/toolchains/java_toolchain_tests.bzl
@@ -2,28 +2,100 @@
 
 load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
 load("@rules_testing//lib:util.bzl", "util")
+load("//java:java_library.bzl", "java_library")
+load("//java/common:java_semantics.bzl", "semantics")
 load("//java/toolchains:java_runtime.bzl", "java_runtime")
 load("//java/toolchains:java_toolchain.bzl", "java_toolchain")
 load("//test/java/testutil:java_toolchain_info_subject.bzl", "java_toolchain_info_subject")
+load("//test/java/testutil:javac_action_subject.bzl", "javac_action_subject")
 
 def _declare_java_toolchain(*, name, **kwargs):
-    if "java_runtime" not in kwargs:
-        kwargs["java_runtime"] = name + "/runtime"
-        java_runtime(name = name + "/runtime")
+    java_runtime_name = name + "/runtime"
+    java_runtime(name = java_runtime_name)
+    toolchain_attrs = {
+        "source_version": "6",
+        "target_version": "6",
+        "bootclasspath": ["rt.jar"],
+        "xlint": ["toto"],
+        "javacopts": ["-Xmaxerrs 500"],
+        "compatible_javacopts": {
+            "android": ["-XDandroidCompatible"],
+            "testonly": ["-XDtestOnly"],
+            "public_visibility": ["-XDpublicVisibility"],
+        },
+        "tools": [":javac_canary.jar"],
+        "javabuilder": ":JavaBuilder_deploy.jar",
+        "header_compiler": ":turbine_canary_deploy.jar",
+        "header_compiler_direct": ":turbine_direct",
+        "singlejar": "singlejar",
+        "ijar": "ijar",
+        "genclass": "GenClass_deploy.jar",
+        "timezone_data": "tzdata.jar",
+        "header_compiler_builtin_processors": ["BuiltinProc1", "BuiltinProc2"],
+        "reduced_classpath_incompatible_processors": [
+            "IncompatibleProc1",
+            "IncompatibleProc2",
+        ],
+        "java_runtime": java_runtime_name,
+    }
+    toolchain_attrs.update(kwargs)
     util.helper_target(
         java_toolchain,
-        name = name,
-        genclass = kwargs.get("genclass", "default_genclass.jar"),
-        jacocorunner = kwargs.get("jacocorunner", None),
-        javabuilder = kwargs.get("javabuilder", "default_javabuilder.jar"),
-        java_runtime = kwargs["java_runtime"],
-        ijar = kwargs.get("ijar", "default_ijar.jar"),
-        singlejar = kwargs.get("singlejar", "default_singlejar.jar"),
+        name = name + "/java_toolchain",
+        **toolchain_attrs
     )
+    util.helper_target(
+        native.toolchain,
+        name = name + "/toolchain",
+        toolchain = name + "/java_toolchain",
+        toolchain_type = semantics.JAVA_TOOLCHAIN_TYPE,
+    )
+
+def _test_javac_gets_options(name):
+    _declare_java_toolchain(name = name)
+    util.helper_target(
+        java_library,
+        name = name + "/b",
+        srcs = ["b.java"],
+    )
+    util.helper_target(
+        java_library,
+        name = name + "/a",
+        srcs = ["a.java"],
+        deps = [Label(name + "/b")],
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_javac_gets_options_impl,
+        targets = {
+            "a": name + "/a",
+            "b": name + "/b",
+        },
+        config_settings = {
+            "//command_line_option:java_header_compilation": "true",
+            "//command_line_option:extra_toolchains": [Label(name + "/toolchain")],
+        },
+    )
+
+def _test_javac_gets_options_impl(env, targets):
+    assert_javac_action = javac_action_subject.of(env, targets.a, "{package}/lib{name}.jar")
+    assert_javac_action.source().contains_exactly(["6"])
+    assert_javac_action.target().contains_exactly(["6"])
+    assert_javac_action.xmaxerrs().contains_exactly(["500"])
+    assert_javac_action.jar().contains_exactly(["{package}/JavaBuilder_deploy.jar"])
+    assert_javac_action.inputs().contains("{package}/rt.jar")
+
+    assert_argv = assert_javac_action.argv()
+    assert_argv.contains("-Xlint:toto")
+    assert_argv.not_contains("-g")
+
+    assert_header_action = javac_action_subject.of(env, targets.b, "{package}/lib{name}-hjar.jar")
+    assert_header_action.argv().contains("{package}/turbine_direct")
 
 def _test_jacocorunner(name):
     _declare_java_toolchain(
-        name = name + "/java_toolchain",
+        name = name,
         jacocorunner = "myjacocorunner.jar",
     )
 
@@ -43,5 +115,6 @@
         name = name,
         tests = [
             _test_jacocorunner,
+            _test_javac_gets_options,
         ],
     )