Improve the artifact closure API for tests

(ignore-relnotes)

PiperOrigin-RevId: 930378334
Change-Id: Ifb3689c9a388151707b164a46cc9d64bc1817380
diff --git a/MODULE.bazel b/MODULE.bazel
index 38405ca..a088efe 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -124,9 +124,9 @@
 bazel_dep(name = "rules_testing", dev_dependency = True)
 archive_override(
     module_name = "rules_testing",
-    integrity = "sha256-WYc72jM8jNK3m45vjWlmN6NB+95f6HAHnTkRaSaNisE=",
-    strip_prefix = "rules_testing-04a1219ee516ccdf3ffadfe3b28e5c634c9b90e1",
-    urls = ["https://github.com/bazelbuild/rules_testing/archive/04a1219ee516ccdf3ffadfe3b28e5c634c9b90e1.tar.gz"],
+    integrity = "sha256-ZmrwZSmn3NkEj0MOnix9oSMzPXJWbuJbCCbOM1C03QQ=",
+    strip_prefix = "rules_testing-ff65fc8b7f1b7c37de71d781601ff40288de80f2",
+    urls = ["https://github.com/bazelbuild/rules_testing/archive/ff65fc8b7f1b7c37de71d781601ff40288de80f2.tar.gz"],
 )
 
 test_repositories = use_extension("//test:repositories.bzl", "test_repositories_ext", dev_dependency = True)
diff --git a/test/java/common/java_common_tests.bzl b/test/java/common/java_common_tests.bzl
index 756e3a4..0a3b257 100644
--- a/test/java/common/java_common_tests.bzl
+++ b/test/java/common/java_common_tests.bzl
@@ -725,15 +725,10 @@
     )
 
 def _test_compile_neverlink_impl(env, target):
-    java_source_basenames = [
-        f.basename
-        for f in artifact_closure.of_target(target)
-        if f.extension == "java"
-    ]
-    env.expect.that_collection(java_source_basenames).contains_exactly([
-        "Plugin.java",
-        "Dependency.java",
-        "EclipseDependency.java",
+    artifact_closure.of_target(env, target, extensions = ["java"]).contains_exactly([
+        "{package}/Plugin.java",
+        "{package}/Dependency.java",
+        "{package}/EclipseDependency.java",
     ])
     jars_in_runfiles = [
         f.basename
diff --git a/test/java/testutil/artifact_closure.bzl b/test/java/testutil/artifact_closure.bzl
index 129b588..b7141f0 100644
--- a/test/java/testutil/artifact_closure.bzl
+++ b/test/java/testutil/artifact_closure.bzl
@@ -1,8 +1,10 @@
 """Helper for computing the artifact closure of a target"""
 
+load("@rules_testing//lib:truth.bzl", "subjects")
+
 # TODO: consider upstreaming this to @rules_testing
 
-def _of_target(target):
+def _compute(target):
     to_process = target[DefaultInfo].files.to_list()
     if _ArtifactActionMapInfo not in target:
         fail("Did you forget to add the aspect to analysis_test(extra_target_under_test_aspects = )?")
@@ -49,6 +51,29 @@
 
 _aspect = aspect(_aspect_impl, attr_aspects = ["*"])
 
+def _of_target(env, target, as_paths = True, extensions = None):
+    meta = env.expect.meta.derive(format_str_kwargs = {
+        "name": target.label.name,
+        "package": target.label.package,
+    })
+    result = subjects.collection(
+        _compute(target),
+        meta = meta,
+        container_name = "artifact clousre of {}".format(target.label),
+        format = True,
+    )
+    if extensions:
+        result = result.transform(
+            filter = lambda f: f.extension in extensions,
+            desc = "with extensions: {exts}".format(exts = extensions),
+        )
+    if as_paths:
+        result = result.transform(
+            desc = "short_path",
+            map_each = lambda f: f.short_path,
+        )
+    return result
+
 artifact_closure = struct(
     aspect = _aspect,
     of_target = _of_target,