Migrate the `JavaStarlarkApiTest.testJavaRuntimeProviderJavaHermetic` test to Starlark The test is removed from Bazel and added in `@rules_java` PiperOrigin-RevId: 738375246 Change-Id: Ic87608b17b98e5b4d6d6cecd833584cd3e7d2452
diff --git a/java/test/testutil/java_runtime_info_subject.bzl b/java/test/testutil/java_runtime_info_subject.bzl index fedb5e7..79ab2fc 100644 --- a/java/test/testutil/java_runtime_info_subject.bzl +++ b/java/test/testutil/java_runtime_info_subject.bzl
@@ -9,13 +9,28 @@ meta = meta.derive("JavaRuntimeInfo"), ) public = struct( - java_home = lambda: subjects.str(self.actual.java_home, self.meta.derive("java_home")), - java_home_runfiles_path = lambda: subjects.str(self.actual.java_home_runfiles_path, self.meta.derive("java_home_runfiles_path")), - java_executable_exec_path = lambda: subjects.str(self.actual.java_executable_exec_path, self.meta.derive("java_executable_exec_path")), - java_executable_runfiles_path = lambda: subjects.str(self.actual.java_executable_runfiles_path, self.meta.derive("java_executable_runfiles_path")), + java_home = lambda: _new_path_string_subject(self.actual.java_home, self.meta.derive("java_home")), + java_home_runfiles_path = lambda: _new_path_string_subject(self.actual.java_home_runfiles_path, self.meta.derive("java_home_runfiles_path")), + java_executable_exec_path = lambda: _new_path_string_subject(self.actual.java_executable_exec_path, self.meta.derive("java_executable_exec_path")), + java_executable_runfiles_path = lambda: _new_path_string_subject(self.actual.java_executable_runfiles_path, self.meta.derive("java_executable_runfiles_path")), ) return public +def _new_path_string_subject(str, meta): + public = struct( + equals = lambda other: subjects.str(str, meta).equals(meta.format_str(other)), + is_in = lambda expected: subjects.str(str, meta).is_in([meta.format_str(e) for e in expected]), + starts_with = lambda prefix: _check_str_prefix(str, prefix, meta), + ) + return public + +def _check_str_prefix(actual, prefix, meta): + if not actual.startswith(meta.format_str(prefix)): + meta.add_failure( + "did not start with required prefix: {}".format(prefix), + "actual: {}".format(actual), + ) + def _from_target(env, target): return _new_java_runtime_info_subject( target[java_common.JavaRuntimeInfo],
diff --git a/java/test/toolchains/java_runtime_tests.bzl b/java/test/toolchains/java_runtime_tests.bzl index 31cbab3..2dfcbbd 100644 --- a/java/test/toolchains/java_runtime_tests.bzl +++ b/java/test/toolchains/java_runtime_tests.bzl
@@ -47,19 +47,56 @@ assert_info.java_home().equals("/foo/bar") assert_info.java_home_runfiles_path().equals("/foo/bar") - assert_info.java_executable_exec_path().is_in([ - "/foo/bar/bin/java", - "/foo/bar/bin/java.exe", - ]) - assert_info.java_executable_runfiles_path().is_in([ - "/foo/bar/bin/java", - "/foo/bar/bin/java.exe", - ]) + assert_info.java_executable_exec_path().starts_with("/foo/bar/bin/java") + assert_info.java_executable_runfiles_path().starts_with("/foo/bar/bin/java") + +def _test_with_hermetic_java_home(name): + util.helper_target( + java_runtime, + name = name + "/jvm", + srcs = [], + java_home = "foo/bar", + ) + util.helper_target( + java_runtime_alias, + name = name + "/alias", + ) + util.helper_target( + java_runtime_info_forwarding_rule, + name = name + "/r", + java_runtime = name + "/alias", + ) + util.helper_target( + native.toolchain, + name = name + "/java_runtime_toolchain", + toolchain = name + "/jvm", + toolchain_type = semantics.JAVA_RUNTIME_TOOLCHAIN_TYPE, + ) + + analysis_test( + name = name, + impl = _test_with_hermetic_java_home_impl, + target = name + "/r", + config_settings = { + "//command_line_option:extra_toolchains": [Label(name + "/java_runtime_toolchain")], + }, + # Bazel 6 doesn't accept Label's for the transition above + attr_values = {"tags": ["min_bazel_7"]}, + ) + +def _test_with_hermetic_java_home_impl(env, target): + assert_info = java_runtime_info_subject.from_target(env, target) + + assert_info.java_home().equals("{package}/foo/bar") + assert_info.java_home_runfiles_path().equals("{package}/foo/bar") + assert_info.java_executable_exec_path().starts_with("{package}/foo/bar/bin/java") + assert_info.java_executable_runfiles_path().starts_with("{package}/foo/bar/bin/java") def java_runtime_tests(name): test_suite( name = name, tests = [ _test_with_absolute_java_home, + _test_with_hermetic_java_home, ], )