blob: e53061d59628540d7abff22b99a7028740b529c6 [file]
"""Defines a test suite for bzl analysis tests."""
load("@rules_testing//lib:analysis_test.bzl", "analysis_test")
load("@rules_testing//lib:util.bzl", "testing_aspect")
def bzl_test_suite(
name,
tests,
attrs = {},
testing_aspect = testing_aspect,
provider_subject_factories = [],
config_settings = {},
**kwargs):
"""Defines a test suite for bzl analysis tests.
Args:
name: The name of the test suite.
tests: A dictionary where the key is the build target and the value is a list of
analysis test implementation functions using that target.
attrs: A dictionary of attributes to apply to the testing aspect.
testing_aspect: The testing aspect to use in the test suite.
provider_subject_factories: An array of subject factories to use in the test suite.
config_settings: A dictionary of config settings to apply to the test suite.
**kwargs: Additional keyword arguments passed through to the underlying analysis tests.
"""
actual_config_settings = dict(config_settings)
test_names = []
for target, impl_list in tests.items():
for impl in impl_list:
impl_name = get_function_name(impl)
test_name = create_test_name(impl_name, name)
analysis_test(
name = test_name,
target = target,
impl = impl,
provider_subject_factories = provider_subject_factories,
config_settings = actual_config_settings,
testing_aspect = testing_aspect,
attrs = attrs,
**kwargs
)
test_names.append(test_name)
native.test_suite(
name = name,
tests = test_names,
)
def default_config_settings():
return {}
def get_function_name(fn):
# Starlark currently stringifies a function as "<function NAME>", so we use
# that knowledge to parse the "NAME" portion out.
fn_name = str(fn).partition("<function ")[2].partition(" ")[0].partition(">")[0]
return fn_name
def create_test_name(fn_name, name):
if fn_name.startswith("_"):
fn_name = fn_name.removeprefix("_")
return fn_name + "_" + name
def package_label_string(label_str, name = None):
"""Returns the string repr of a label resolved relative to the current package being constructed."""
# name is unused.
return str(native.package_relative_label(label_str))