blob: 3341acd4846ad93cdd5455f6e40dfef55eb22cfe [file] [log] [blame]
"""Unittests for propagation of linker inputs through Rust libraries"""
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
def _shared_lib_is_propagated_test_impl(ctx):
env = analysistest.begin(ctx)
tut = analysistest.target_under_test(env)
link_action = [action for action in tut.actions if action.mnemonic == "CppLink"][0]
lib_name = _get_lib_name(ctx, name = "foo_shared")
asserts.true(env, _contains_input(link_action.inputs, lib_name))
return analysistest.end(env)
def _static_lib_is_not_propagated_test_impl(ctx):
env = analysistest.begin(ctx)
tut = analysistest.target_under_test(env)
link_action = [action for action in tut.actions if action.mnemonic == "CppLink"][0]
lib_name = _get_lib_name(ctx, name = "foo")
asserts.false(env, _contains_input(link_action.inputs, lib_name))
return analysistest.end(env)
def _contains_input(inputs, name):
for input in inputs.to_list():
# We cannot check for name equality because rlib outputs contain
# a hash in their name.
if input.basename.startswith(name):
return True
return False
def _get_lib_name(ctx, name):
if ctx.target_platform_has_constraint(ctx.attr._windows_constraint[platform_common.ConstraintValueInfo]):
return name
else:
return "lib{}".format(name)
static_lib_is_not_propagated_test = analysistest.make(
_static_lib_is_not_propagated_test_impl,
attrs = {
"_windows_constraint": attr.label(default = Label("@platforms//os:windows")),
},
)
shared_lib_is_propagated_test = analysistest.make(
_shared_lib_is_propagated_test_impl,
attrs = {
"_macos_constraint": attr.label(default = Label("@platforms//os:macos")),
"_windows_constraint": attr.label(default = Label("@platforms//os:windows")),
},
)
def _linker_inputs_propagation_test():
static_lib_is_not_propagated_test(
name = "depends_on_foo_via_staticlib",
target_under_test = "//test/linker_inputs_propagation:depends_on_foo_via_staticlib",
)
shared_lib_is_propagated_test(
name = "depends_on_shared_foo_via_staticlib",
target_under_test = "//test/linker_inputs_propagation:depends_on_shared_foo_via_staticlib",
)
static_lib_is_not_propagated_test(
name = "depends_on_foo_via_sharedlib",
target_under_test = "//test/linker_inputs_propagation:depends_on_foo_via_sharedlib",
)
shared_lib_is_propagated_test(
name = "depends_on_shared_foo_via_sharedlib",
target_under_test = "//test/linker_inputs_propagation:depends_on_shared_foo_via_sharedlib",
)
def linker_inputs_propagation_test_suite(name):
"""Entry-point macro called from the BUILD file.
Args:
name: Name of the macro.
"""
_linker_inputs_propagation_test()
native.test_suite(
name = name,
tests = [
":depends_on_foo_via_staticlib",
":depends_on_shared_foo_via_staticlib",
":depends_on_foo_via_sharedlib",
":depends_on_shared_foo_via_sharedlib",
],
)