blob: 6a466346600048544d394253db0e845809d046a4 [file] [log] [blame]
"""Unittest to verify contents and ordering of rust stdlib in rust_library() CcInfo"""
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
load("//rust:defs.bzl", "rust_library")
def _categorize_library(name):
"""Given an rlib name, guess if it's std, core, or alloc."""
if "std" in name:
return "std"
if "core" in name:
return "core"
if "alloc" in name:
return "alloc"
if "compiler_builtins" in name:
return "compiler_builtins"
return "other"
def _dedup_preserving_order(list):
"""Given a list, deduplicate its elements preserving order."""
r = []
seen = {}
for e in list:
if e in seen:
continue
seen[e] = 1
r.append(e)
return r
def _stdlibs(tut):
"""Given a target, return the list of its standard rust libraries."""
libs = [
lib.static_library
for li in tut[CcInfo].linking_context.linker_inputs.to_list()
for lib in li.libraries
]
stdlibs = [lib for lib in libs if (tut.label.name not in lib.basename)]
return stdlibs
def _libstd_ordering_test_impl(ctx):
env = analysistest.begin(ctx)
tut = analysistest.target_under_test(env)
stdlib_categories = [_categorize_library(lib.basename) for lib in _stdlibs(tut)]
set_to_check = _dedup_preserving_order([lib for lib in stdlib_categories if lib != "other"])
asserts.equals(env, ["std", "core", "compiler_builtins", "alloc"], set_to_check)
return analysistest.end(env)
libstd_ordering_test = analysistest.make(_libstd_ordering_test_impl)
def _libstd_panic_test_impl(ctx):
# The libraries panic_unwind and panic_abort are alternatives.
# Check that they don't occur together.
env = analysistest.begin(ctx)
tut = analysistest.target_under_test(env)
stdlibs = _stdlibs(tut)
has_panic_unwind = [lib for lib in stdlibs if "panic_unwind" in lib.basename]
if has_panic_unwind:
has_panic_abort = [lib for lib in stdlibs if "panic_abort" in lib.basename]
asserts.false(env, has_panic_abort)
return analysistest.end(env)
libstd_panic_test = analysistest.make(_libstd_panic_test_impl)
def _native_dep_test():
rust_library(
name = "some_rlib",
srcs = ["some_rlib.rs"],
edition = "2018",
)
libstd_ordering_test(
name = "libstd_ordering_test",
target_under_test = ":some_rlib",
)
libstd_panic_test(
name = "libstd_panic_test",
target_under_test = ":some_rlib",
)
def stdlib_suite(name):
"""Entry-point macro called from the BUILD file.
Args:
name: Name of the macro.
"""
_native_dep_test()
native.test_suite(
name = name,
tests = [
":libstd_ordering_test",
],
)