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",