blob: 12bb65db0e5e9a05a5a60158105f31e7bb9c8119 [file] [log] [blame]
load("@bazel_features//:features.bzl", "bazel_features")
load("@rules_license//rules:providers.bzl", "PackageInfo")
load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
load("@rules_testing//lib:truth.bzl", "subjects")
def _test_package_info(name):
analysis_test(
name = name,
impl = _test_package_info_impl,
target = "@com_github_fmeum_dep_on_gazelle//:go_default_library",
extra_target_under_test_aspects = [
_package_info_aspect,
],
provider_subject_factories = [_PackageInfoSubjectFactory],
)
def _test_package_info_impl(env, target):
# The package_info functionality requires REPO.bazel support, which is only
# available in Bazel 7 and higher. Use this unrelated feature launched in
# Bazel 7 as a hacky signal to skip the test if the feature is not
# available.
if not bazel_features.proto.starlark_proto_info:
return
env.expect.that_target(target).has_provider(PackageInfo)
subject = env.expect.that_target(target).provider(PackageInfo)
subject.package_name().equals("github.com/fmeum/dep_on_gazelle")
subject.package_version().equals("1.0.0")
subject.package_url().equals("https://github.com/fmeum/dep_on_gazelle")
subject.purl().equals("pkg:golang/github.com/fmeum/dep_on_gazelle@v1.0.0")
def _package_info_aspect_impl(_, ctx):
if hasattr(ctx.rule.attr, "applicable_licenses"):
attr = ctx.rule.attr.applicable_licenses
elif hasattr(ctx.rule.attr, "package_metadata"):
attr = ctx.rule.attr.package_metadata
if attr and PackageInfo in attr[0]:
return [attr[0][PackageInfo]]
return []
_package_info_aspect = aspect(
implementation = _package_info_aspect_impl,
doc = "Forwards metadata annotations on the target via the PackageInfo provider.",
)
_PackageInfoSubjectFactory = struct(
type = PackageInfo,
name = "PackageInfo",
factory = lambda actual, *, meta: subjects.struct(
actual,
meta = meta,
attrs = {
"package_name": subjects.str,
"package_version": subjects.str,
"package_url": subjects.str,
"purl": subjects.str,
},
),
)
def starlark_tests(name):
test_suite(
name = name,
tests = [
_test_package_info,
],
)