Implement applicable --java_launcher tests in Starlark and open-source them.

PiperOrigin-RevId: 883202557
Change-Id: Ib83a9fa044eded610be4789e7868d351f7205720
diff --git a/test/java/common/rules/BUILD b/test/java/common/rules/BUILD
index 8e74a2a..28d3834 100644
--- a/test/java/common/rules/BUILD
+++ b/test/java/common/rules/BUILD
@@ -2,6 +2,7 @@
 load(":deploy_archive_builder_tests.bzl", "deploy_archive_builder_test_suite")
 load(":java_binary_tests.bzl", "java_binary_tests")
 load(":java_import_tests.bzl", "java_import_tests")
+load(":java_launcher_tests.bzl", "java_launcher_tests")
 load(":java_library_tests.bzl", "java_library_tests")
 load(":java_plugin_tests.bzl", "java_plugin_tests")
 load(":java_single_jar_tests.bzl", "java_single_jar_tests")
@@ -20,6 +21,8 @@
 
 java_library_tests(name = "java_library_tests")
 
+java_launcher_tests(name = "java_launcher_tests")
+
 java_import_tests(name = "java_import_tests")
 
 java_single_jar_tests(name = "java_single_jar_tests")
diff --git a/test/java/common/rules/java_launcher_tests.bzl b/test/java/common/rules/java_launcher_tests.bzl
new file mode 100644
index 0000000..6faaa93
--- /dev/null
+++ b/test/java/common/rules/java_launcher_tests.bzl
@@ -0,0 +1,71 @@
+"""Tests for the "launcher" attribute and "--java_launcher" flag."""
+
+load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
+load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
+load("@rules_testing//lib:truth.bzl", "matching")
+load("@rules_testing//lib:util.bzl", "util")
+load("//java:java_binary.bzl", "java_binary")
+
+def _test_overridden_incompatible_launcher(name):
+    # Check analysis succeeds even though --java_launcher refers to an incompatible target
+    # when the "use_launcher" attribute is set to False.
+    util.helper_target(
+        rule = cc_binary,
+        name = name + "/launcher",
+        srcs = select({
+            "@platforms//cpu:ppc": [name + "/launcher.cc"],
+        }),
+    )
+
+    util.helper_target(
+        rule = java_binary,
+        name = name + "/bin",
+        srcs = [name + "/Bin.java"],
+        use_launcher = False,
+    )
+
+    analysis_test(
+        name = name,
+        impl = lambda env, target: True,
+        target = name + "/bin",
+        config_settings = {
+            "//command_line_option:java_launcher": Label(name + "/launcher"),
+            "//command_line_option:cpu": "k8",
+        },
+    )
+
+def _test_launcher_with_create_executable_false_fails(name):
+    util.helper_target(
+        rule = cc_binary,
+        name = name + "/launcher",
+        srcs = [name + "/launcher.cc"],
+    )
+
+    util.helper_target(
+        rule = java_binary,
+        name = name + "/bin",
+        srcs = [name + "/Bin.java"],
+        launcher = name + "/launcher",
+        create_executable = False,
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_launcher_with_create_executable_false_fails_impl,
+        target = name + "/bin",
+        expect_failure = True,
+    )
+
+def _test_launcher_with_create_executable_false_fails_impl(env, target):
+    env.expect.that_target(target).failures().contains_predicate(
+        matching.str_matches("launcher specified but create_executable is false"),
+    )
+
+def java_launcher_tests(name):
+    test_suite(
+        name = name,
+        tests = [
+            _test_overridden_incompatible_launcher,
+            _test_launcher_with_create_executable_false_fails,
+        ],
+    )