Add a test for a `java_binary` resources

(ignore-relnotes)

PiperOrigin-RevId: 936596044
Change-Id: I7425c61c244cb309178c8219ed8835e66c1e0e0d
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 572f27a..36b6c47 100644
--- a/test/java/common/rules/common_launcher_java_binary_tests.bzl
+++ b/test/java/common/rules/common_launcher_java_binary_tests.bzl
@@ -3,6 +3,9 @@
 load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
 load("@rules_testing//lib:util.bzl", "util")
 load("//java:java_binary.bzl", "java_binary")
+load("//java:java_library.bzl", "java_library")
+load("//test/java/testutil:artifact_closure.bzl", "artifact_closure")
+load("//test/java/testutil:mock_java_toolchain.bzl", "mock_java_toolchain")
 
 def _test_java_binary_non_executable_rule_outputs(name):
     util.helper_target(
@@ -23,10 +26,61 @@
         "{package}/{name}.jar",
     ])
 
+def _test_java_binary_resources_only(name):
+    util.helper_target(
+        java_binary,
+        name = name + "/bin",
+        main_class = "doesnotmatter",
+        resources = [
+            "someFile.xml",
+            "someOtherFile.xml",
+        ],
+        runtime_deps = [name + "/lib"],
+    )
+    util.helper_target(
+        java_library,
+        name = name + "/lib",
+        srcs = ["Xml.java"],
+    )
+    util.helper_target(
+        mock_java_toolchain,
+        name = name + "/toolchain",
+    )
+
+    analysis_test(
+        name = name,
+        attr_values = {"tags": ["min_bazel_8"]},  # the deploy jar was created by a separate rule in Bazel 7
+        config_settings = {
+            "//command_line_option:extra_toolchains": [Label(name + "/toolchain")],
+        },
+        extra_target_under_test_aspects = [artifact_closure.aspect],
+        impl = _test_java_binary_resources_only_impl,
+        target = name + "/bin",
+    )
+
+def _test_java_binary_resources_only_impl(env, target):
+    deploy_jar = env.expect.that_target(target).action_named("JavaDeployJar").actual.outputs.to_list()[0]
+    env.expect.that_file(deploy_jar).basename().equals("bin_deploy.jar")
+
+    # check that we do have a jar file build for bin, although
+    # it does not contain any source files
+    artifact_closure.of_target(env, target, extensions = ["jar"], initial = deploy_jar).contains_exactly([
+        "{package}/JavaBuilder_deploy.jar",
+        "{package}/lib{test_name}/lib.jar",
+        "{package}/{test_name}/bin-class.jar",
+        "{package}/{test_name}/bin.jar",
+        "{package}/{test_name}/bin_deploy.jar",
+    ])
+    artifact_closure.of_target(env, target, extensions = ["xml"], initial = deploy_jar).contains_exactly([
+        "{package}/someFile.xml",
+        "{package}/someOtherFile.xml",
+    ])
+
 def java_binary_launcher_tests(name):
     test_suite(
         name = name,
         tests = [
             _test_java_binary_non_executable_rule_outputs,
+            _test_java_binary_resources_only,
         ],
     )
diff --git a/test/java/testutil/artifact_closure.bzl b/test/java/testutil/artifact_closure.bzl
index b7141f0..4835358 100644
--- a/test/java/testutil/artifact_closure.bzl
+++ b/test/java/testutil/artifact_closure.bzl
@@ -4,8 +4,11 @@
 
 # TODO: consider upstreaming this to @rules_testing
 
-def _compute(target):
-    to_process = target[DefaultInfo].files.to_list()
+def _compute(target, initial = None):
+    if not initial:
+        to_process = target[DefaultInfo].files.to_list()
+    else:
+        to_process = [initial]
     if _ArtifactActionMapInfo not in target:
         fail("Did you forget to add the aspect to analysis_test(extra_target_under_test_aspects = )?")
     map = target[_ArtifactActionMapInfo].map
@@ -51,13 +54,19 @@
 
 _aspect = aspect(_aspect_impl, attr_aspects = ["*"])
 
-def _of_target(env, target, as_paths = True, extensions = None):
+def _of_target(
+        env,
+        target,
+        initial = None,
+        as_paths = True,
+        extensions = None,
+        package_local_only = True):
     meta = env.expect.meta.derive(format_str_kwargs = {
         "name": target.label.name,
         "package": target.label.package,
     })
     result = subjects.collection(
-        _compute(target),
+        _compute(target, initial = initial),
         meta = meta,
         container_name = "artifact clousre of {}".format(target.label),
         format = True,
@@ -67,6 +76,11 @@
             filter = lambda f: f.extension in extensions,
             desc = "with extensions: {exts}".format(exts = extensions),
         )
+    if package_local_only:
+        result = result.transform(
+            filter = lambda f: f.short_path.startswith(target.label.package),
+            desc = "in package: {package}".format(package = target.label.package),
+        )
     if as_paths:
         result = result.transform(
             desc = "short_path",