blob: 5ec2a061cd965478f05cbb57d168d210b80846e4 [file] [log] [blame]
"""Tests for the java_runtime rule"""
load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
load("@rules_testing//lib:truth.bzl", "matching", "subjects")
load("@rules_testing//lib:util.bzl", "util")
load("//java/common:java_semantics.bzl", "semantics")
load("//java/toolchains:java_runtime.bzl", "java_runtime")
load("//test/java/testutil:java_runtime_info_subject.bzl", "java_runtime_info_subject")
load("//test/java/testutil:rules/forward_java_runtime_info.bzl", "java_runtime_info_forwarding_rule")
load("//toolchains:java_toolchain_alias.bzl", "java_runtime_alias")
def _test_with_absolute_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_absolute_java_home_impl,
target = name + "/r",
config_settings = {
"//command_line_option:extra_toolchains": [Label(name + "/java_runtime_toolchain")],
},
)
def _test_with_absolute_java_home_impl(env, target):
assert_info = java_runtime_info_subject.from_target(env, target)
assert_info.java_home().equals("/foo/bar")
assert_info.java_home_runfiles_path().equals("/foo/bar")
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")],
},
)
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 _test_with_generated_java_executable(name):
util.helper_target(
native.genrule,
name = name + "/gen",
cmd = "",
outs = ["foo/bar/bin/java"],
output_to_bindir = True,
)
util.helper_target(
java_runtime,
name = name + "/jvm",
srcs = [],
java = "foo/bar/bin/java",
)
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_generated_java_executable_impl,
target = name + "/r",
config_settings = {
"//command_line_option:extra_toolchains": [Label(name + "/java_runtime_toolchain")],
},
)
def _test_with_generated_java_executable_impl(env, target):
assert_info = java_runtime_info_subject.from_target(env, target)
assert_info.java_home().equals("{bindir}/{package}/foo/bar")
assert_info.java_home_runfiles_path().equals("{package}/foo/bar")
assert_info.java_executable_exec_path().starts_with("{bindir}/{package}/foo/bar/bin/java")
assert_info.java_executable_runfiles_path().starts_with("{package}/foo/bar/bin/java")
def _test_runtime_alias(name):
util.helper_target(
java_runtime_alias,
name = name + "/alias",
)
analysis_test(
name = name,
impl = _test_runtime_alias_impl,
target = name + "/alias",
)
def _test_runtime_alias_impl(env, target):
env.expect.that_target(target).has_provider(platform_common.ToolchainInfo)
env.expect.that_target(target).has_provider(platform_common.TemplateVariableInfo)
def _test_java_runtime_simple(name):
util.helper_target(
java_runtime,
name = name + "/jvm-foo",
srcs = [
"foo/a",
"foo/b",
],
java_home = "foo",
)
analysis_test(
name = name,
impl = _test_java_runtime_simple_impl,
target = name + "/jvm-foo",
)
def _test_java_runtime_simple_impl(env, target):
java_runtime_info_subject.from_target(env, target).files().contains_exactly([
"{package}/foo/a",
"{package}/foo/b",
])
env.expect.that_target(target).data_runfiles().contains_exactly([
"{workspace}/{package}/foo/a",
"{workspace}/{package}/foo/b",
])
def _test_absolute_java_home_with_srcs(name):
util.helper_target(
java_runtime,
name = name + "/jvm",
srcs = ["dummy.txt"],
java_home = "/absolute/path",
)
analysis_test(
name = name,
impl = _test_absolute_java_home_with_srcs_impl,
target = name + "/jvm",
expect_failure = True,
)
def _test_absolute_java_home_with_srcs_impl(env, target):
env.expect.that_target(target).failures().contains_predicate(
matching.str_matches("'java_home' with an absolute path requires 'srcs' to be empty."),
)
def _test_absolute_java_home_with_java(name):
util.helper_target(
java_runtime,
name = name + "/jvm",
java = "bin/java",
java_home = "/absolute/path",
)
analysis_test(
name = name,
impl = _test_absolute_java_home_with_java_impl,
target = name + "/jvm",
expect_failure = True,
)
def _test_absolute_java_home_with_java_impl(env, target):
env.expect.that_target(target).failures().contains_predicate(
matching.str_matches("'java_home' with an absolute path requires 'java' to be empty."),
)
def _test_bin_java_path_name(name):
util.helper_target(
java_runtime,
name = name + "/jvm",
java = "java",
)
analysis_test(
name = name,
impl = _test_bin_java_path_name_impl,
target = name + "/jvm",
expect_failure = True,
)
def _test_bin_java_path_name_impl(env, target):
env.expect.that_target(target).failures().contains_predicate(
matching.str_matches("the path to 'java' must end in 'bin/java'."),
)
def _test_absolute_java_home(name):
util.helper_target(
java_runtime,
name = name + "/jvm",
java_home = "/absolute/path",
)
analysis_test(
name = name,
impl = _test_absolute_java_home_impl,
target = name + "/jvm",
)
def _test_absolute_java_home_impl(env, target):
java_runtime_info_subject.from_target(env, target).java_home().equals("/absolute/path")
def _test_relative_java_home(name):
util.helper_target(
java_runtime,
name = name + "/jvm",
java_home = "b/c",
)
analysis_test(
name = name,
impl = _test_relative_java_home_impl,
target = name + "/jvm",
)
def _test_relative_java_home_impl(env, target):
java_runtime_info_subject.from_target(env, target).java_home().equals("{package}/b/c")
def _test_java_home_with_invalid_make_variables(name):
util.helper_target(
java_runtime,
name = name + "/jvm",
java_home = "/opt/$(WTF)",
)
analysis_test(
name = name,
impl = _test_java_home_with_invalid_make_variables_impl,
target = name + "/jvm",
expect_failure = True,
)
def _test_java_home_with_invalid_make_variables_impl(env, target):
env.expect.that_target(target).failures().contains_predicate(
matching.str_matches("$(WTF) not defined"),
)
def _test_make_variables(name):
util.helper_target(
java_runtime,
name = name + "/jvm",
java_home = "/foo/bar",
)
analysis_test(
name = name,
impl = _test_make_variables_impl,
target = name + "/jvm",
)
def _test_make_variables_impl(env, target):
env.expect.that_target(target).provider(
platform_common.TemplateVariableInfo,
).variables().contains_at_least({"JAVABASE": "/foo/bar"})
env.expect.that_target(target).provider(
platform_common.TemplateVariableInfo,
).variables().get("JAVA", factory = subjects.str).starts_with("/foo/bar/bin/java")
def _test_no_srcs(name):
util.helper_target(
java_runtime,
name = name + "/jvm",
java_home = "/opt/jvm",
)
analysis_test(
name = name,
impl = _test_no_srcs_impl,
target = name + "/jvm",
)
def _test_no_srcs_impl(env, target):
assert_info = java_runtime_info_subject.from_target(env, target)
assert_info.java_home().equals("/opt/jvm")
assert_info.files().contains_exactly([])
def _test_java_home_generated(name):
util.helper_target(
native.genrule,
name = name + "/gen",
outs = ["generated_java_home/bin/java"],
cmd = "touch $@",
)
util.helper_target(
java_runtime,
name = name + "/jvm",
java = "generated_java_home/bin/java",
java_home = "generated_java_home",
)
analysis_test(
name = name,
impl = _test_java_home_generated_impl,
target = name + "/jvm",
)
def _test_java_home_generated_impl(env, target):
java_runtime_info_subject.from_target(env, target).java_home().equals(
"{gendir}/{package}/generated_java_home",
)
def java_runtime_tests(name):
test_suite(
name = name,
tests = [
_test_with_absolute_java_home,
_test_with_hermetic_java_home,
_test_with_generated_java_executable,
_test_runtime_alias,
_test_java_runtime_simple,
_test_absolute_java_home_with_srcs,
_test_absolute_java_home_with_java,
_test_bin_java_path_name,
_test_absolute_java_home,
_test_relative_java_home,
_test_java_home_with_invalid_make_variables,
_test_make_variables,
_test_no_srcs,
_test_java_home_generated,
],
)