101 lines
3.2 KiB
Python
101 lines
3.2 KiB
Python
import importlib.util
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
SCRIPT = Path(__file__).resolve().parents[1] / "scripts" / "check_alt_set_impl.py"
|
|
|
|
|
|
def load_script():
|
|
spec = importlib.util.spec_from_file_location("check_alt_set_impl", SCRIPT)
|
|
module = importlib.util.module_from_spec(spec)
|
|
assert spec.loader is not None
|
|
sys.modules[spec.name] = module
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
def test_select_elf_members_separates_providers_and_requirers():
|
|
check = load_script()
|
|
members = [
|
|
"./usr/lib64/libfoo.so.1",
|
|
"./usr/lib64/libfoo.so.1.2.3",
|
|
"./usr/lib64/libfoo.a",
|
|
"./usr/bin/tool",
|
|
"./usr/share/doc/readme",
|
|
]
|
|
|
|
assert check.select_provider_members(members) == [
|
|
"./usr/lib64/libfoo.so.1",
|
|
"./usr/lib64/libfoo.so.1.2.3",
|
|
]
|
|
assert check.select_requirer_members(members) == [
|
|
"./usr/lib64/libfoo.so.1",
|
|
"./usr/lib64/libfoo.so.1.2.3",
|
|
"./usr/bin/tool",
|
|
]
|
|
|
|
|
|
def test_generate_label_set_and_compare_uses_only_local_set_py():
|
|
check = load_script()
|
|
provided = check.generate_label_set("provider", "libfoo.so.1", ["foo", "bar", "baz"], bpp=16)
|
|
required = check.generate_label_set("requirer", "tool", ["foo", "bar"], bpp=16)
|
|
missing = check.generate_label_set("requirer", "badtool", ["foo", "quux"], bpp=16)
|
|
|
|
ok = check.compare_label_sets(provided, required)
|
|
bad = check.compare_label_sets(provided, missing)
|
|
|
|
assert ok.status == "compatible"
|
|
assert ok.cmp_result == 1
|
|
assert bad.status == "incompatible"
|
|
assert bad.cmp_result == -2
|
|
|
|
|
|
def test_normalize_required_symbol_version_can_match_provided_symbol_version():
|
|
check = load_script()
|
|
|
|
assert check.normalize_required_symbol("foo@LIB_1") == "foo@@LIB_1"
|
|
assert check.normalize_required_symbol("foo@@LIB_1") == "foo@@LIB_1"
|
|
assert check.normalize_required_symbol("foo") == "foo"
|
|
|
|
|
|
def test_parse_required_nm_output_filters_weak_undefined_symbols():
|
|
check = load_script()
|
|
nm_output = """
|
|
w __gmon_start__
|
|
w _ITM_deregisterTMCloneTable
|
|
U close@GLIBC_2.2.5
|
|
U memcpy@GLIBC_2.14
|
|
W optional_hook
|
|
"""
|
|
|
|
assert check.parse_required_nm_output(nm_output) == [
|
|
"close@GLIBC_2.2.5",
|
|
"memcpy@GLIBC_2.14",
|
|
]
|
|
|
|
|
|
def test_default_bpp_is_large_enough_for_real_alt_symbol_sets():
|
|
check = load_script()
|
|
|
|
assert check.parse_args([]).bpp == 32
|
|
|
|
|
|
def test_build_dependency_results_splits_required_labels_by_provider_library():
|
|
check = load_script()
|
|
libc = check.generate_label_set(
|
|
"provided", "libc.so.6", ["close@@GLIBC_2.2.5", "read@@GLIBC_2.2.5"], bpp=16, package="glibc-core"
|
|
)
|
|
libz = check.generate_label_set(
|
|
"provided", "libz.so.1", ["inflate", "deflate"], bpp=16, package="zlib"
|
|
)
|
|
tool = check.generate_label_set(
|
|
"required", "tool", ["close@@GLIBC_2.2.5", "inflate"], bpp=16, package="consumer"
|
|
)
|
|
|
|
results = check.build_dependency_results([libc, libz], [tool], bpp=16)
|
|
|
|
assert [(result.provider_member, result.required_labels, result.status) for result in results] == [
|
|
("libc.so.6", 1, "compatible"),
|
|
("libz.so.1", 1, "compatible"),
|
|
]
|