blob: baf1f87ba91fa5b27b5e29338802de2e47e7124a [file]
"""A custom @rules_testing subject for the CcInfo provider"""
load("@rules_testing//lib:truth.bzl", "subjects")
load("//cc/common:cc_info.bzl", "CcInfo")
load(":testutil.bzl", "testutil")
def _new_cc_info_subject(cc_info, meta):
self = struct(
actual = cc_info,
meta = meta,
)
public = struct(
compilation_context = lambda: _new_cc_compilation_context_subject(
self.actual.compilation_context,
self.meta.derive("compilation_context"),
),
linking_context = lambda: _new_cc_info_linking_context_subject(self.actual, self.meta),
native_libraries = lambda: subjects.collection(
testutil.cc_info_transitive_native_libraries(self.actual),
self.meta.derive("transitive_native_libraries()"),
),
)
return public
def _new_cc_info_subject_from_target(env, target):
assert_target = env.expect.that_target(target)
assert_target.has_provider(CcInfo)
return _new_cc_info_subject(target[CcInfo], assert_target.meta)
def _new_cc_compilation_context_subject(cc_compilation_context, meta):
self = struct(
actual = cc_compilation_context,
meta = meta,
)
public = struct(
include_dirs = lambda: subjects.collection(
self.actual.includes.to_list(),
self.meta.derive("include_dirs"),
),
system_include_dirs = lambda: subjects.collection(
self.actual.system_includes.to_list(),
self.meta.derive("system_include_dirs"),
),
quote_include_dirs = lambda: subjects.collection(
self.actual.quote_includes.to_list(),
self.meta.derive("quote_include_dirs"),
),
external_include_dirs = lambda: subjects.collection(
self.actual.external_includes.to_list(),
self.meta.derive("external_include_dirs"),
),
direct_public_headers = lambda: subjects.collection(
self.actual.direct_public_headers,
self.meta.derive("direct_public_headers"),
),
headers = lambda: subjects.depset_file(
self.actual.headers,
meta = self.meta.derive("headers"),
),
defines = lambda: subjects.collection(
self.actual.defines.to_list(),
self.meta.derive("defines"),
),
)
return public
def _new_cc_info_linking_context_subject(cc_info, meta):
self = struct(
actual = cc_info.linking_context,
meta = meta.derive("linking_context"),
)
public = struct(
equals = lambda other: _cc_info_linking_context_equals(self.actual, other, self.meta),
library_files = lambda: _new_library_files_subject(self.actual, self.meta),
static_library_files = lambda: _new_static_library_files_subject(self.actual, self.meta),
dynamic_library_files = lambda: _new_dynamic_library_files_subject(self.actual, self.meta),
interface_library_files = lambda: _new_interface_library_files_subject(self.actual, self.meta),
resolved_symlink_dynamic_library_files = lambda: _new_resolved_symlink_dynamic_library_files_subject(self.actual, self.meta),
resolved_symlink_interface_library_files = lambda: _new_resolved_symlink_interface_library_files_subject(self.actual, self.meta),
libraries_to_link = lambda: _new_libraries_to_link_subject_from_linking_context(self.actual, self.meta),
)
return public
def _new_library_files_subject(linking_context, meta):
libs = []
for input in linking_context.linker_inputs.to_list():
for lib in input.libraries:
if lib.pic_static_library:
libs.append(lib.pic_static_library)
elif lib.static_library:
libs.append(lib.static_library)
elif lib.interface_library:
libs.append(lib.interface_library)
else:
libs.append(lib.dynamic_library)
return subjects.depset_file(
depset(libs),
meta = meta.derive("library_files"),
)
def _new_static_library_files_subject(linking_context, meta):
static_libraries = []
for input in linking_context.linker_inputs.to_list():
for lib in input.libraries:
if lib.static_library:
static_libraries.append(lib.static_library)
return subjects.depset_file(
depset(static_libraries),
meta = meta.derive("static_library_files"),
)
def _new_dynamic_library_files_subject(linking_context, meta):
dynamic_libraries = []
for linker_input in linking_context.linker_inputs.to_list():
for lib in linker_input.libraries:
if lib.dynamic_library:
dynamic_libraries.append(lib.dynamic_library)
return subjects.depset_file(
depset(dynamic_libraries),
meta = meta.derive("dynamic_library_files"),
)
def _new_interface_library_files_subject(linking_context, meta):
interface_libraries = []
for linker_input in linking_context.linker_inputs.to_list():
for lib in linker_input.libraries:
if lib.interface_library:
interface_libraries.append(lib.interface_library)
return subjects.depset_file(
depset(interface_libraries),
meta = meta.derive("interface_library_files"),
)
def _new_resolved_symlink_dynamic_library_files_subject(linking_context, meta):
libs = []
for linker_input in linking_context.linker_inputs.to_list():
for lib in linker_input.libraries:
if lib.resolved_symlink_dynamic_library:
libs.append(lib.resolved_symlink_dynamic_library)
return subjects.depset_file(
depset(libs),
meta = meta.derive("resolved_symlink_dynamic_library_files"),
)
def _new_resolved_symlink_interface_library_files_subject(linking_context, meta):
libs = []
for linker_input in linking_context.linker_inputs.to_list():
for lib in linker_input.libraries:
if lib.resolved_symlink_interface_library:
libs.append(lib.resolved_symlink_interface_library)
return subjects.depset_file(
depset(libs),
meta = meta.derive("resolved_symlink_interface_library_files"),
)
def _new_libraries_to_link_subject_from_linking_context(linking_context, meta):
libs = []
for linker_input in linking_context.linker_inputs.to_list():
libs.extend(linker_input.libraries)
return _new_cc_info_libraries_to_link_subject(libs, meta)
def _cc_info_linking_context_equals(actual, expected, meta):
if actual == expected:
return
meta.add_failure(
"expected: {}".format(expected),
"actual: {}".format(actual),
)
def _new_cc_info_libraries_to_link_subject(libraries_to_link, meta):
if hasattr(libraries_to_link, "to_list"):
libraries_to_link = libraries_to_link.to_list()
self = struct(
actual = libraries_to_link,
meta = meta,
)
public = struct(
static_libraries = lambda: _new_library_to_link_static_libraries_subject(self.actual, self.meta),
singleton = lambda: _new_library_to_link_subject(_get_singleton(self.actual), self.meta.derive("[0]")),
)
return public
def _new_library_to_link_subject(library_to_link, meta):
public = struct(
dynamic_library = lambda: subjects.file(library_to_link.dynamic_library, meta.derive("dynamic_library")),
alwayslink = lambda: subjects.bool(library_to_link.alwayslink, meta.derive("alwayslink")),
)
return public
def _new_library_to_link_static_libraries_subject(libraries_to_link, meta):
self = subjects.collection(
[testutil.cc_library_to_link_static_library(lib) for lib in libraries_to_link],
meta = meta.derive("static_library()"),
).transform(desc = "basename", map_each = lambda file: file.basename)
public = struct(
contains_exactly = lambda expected: self.contains_exactly([meta.format_str(e) for e in expected]),
contains_exactly_predicates = lambda expected: self.contains_exactly_predicates(expected),
)
return public
def _get_singleton(seq):
if len(seq) != 1:
fail("expected singleton, got:", seq)
return seq[0]
cc_info_subject = struct(
from_target = _new_cc_info_subject_from_target,
libraries_to_link = _new_cc_info_libraries_to_link_subject,
new_from_cc_info = lambda cc_info, meta: _new_cc_info_subject(cc_info, meta),
new_from_java_info = lambda java_info, meta: _new_cc_info_subject(java_info.cc_link_params_info, meta.derive("cc_link_params_info")),
)