Skip to content

Commit ee57062

Browse files
pzembrodcopybara-github
authored andcommitted
Creates _test_headers_not_passed_to_linking_action for cc_binary() in rules_cc/test/cc/common/cc_binary_configured_target_test.bzl
PiperOrigin-RevId: 879495530 Change-Id: I5c51be96e25da2c72cc7f9b999d7e9e5b282b5d4
1 parent bea7a42 commit ee57062

File tree

7 files changed

+134
-27
lines changed

7 files changed

+134
-27
lines changed

MODULE.bazel

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,16 @@ single_version_override(
2626
version = "1.17.0",
2727
)
2828

29-
bazel_dep(name = "rules_testing", version = "0.6.0", dev_dependency = True)
29+
# Required commit 288cdbd "Add meta field to ActionSubject."
30+
# TODO: pzembrod - Change to a released version again when the commit is in a release.
31+
bazel_dep(name = "rules_testing", dev_dependency = True)
32+
archive_override(
33+
module_name = "rules_testing",
34+
integrity = "sha256-7Uj90x7fnhUKBxRytq/R4E9gOBisIoDW1KoUxHCDVd4=",
35+
strip_prefix = "rules_testing-288cdbd3ef4839a89d9d5911319fd9edde44b106",
36+
urls = ["https://github.com/bazelbuild/rules_testing/archive/288cdbd3ef4839a89d9d5911319fd9edde44b106.tar.gz"],
37+
)
38+
3039
bazel_dep(name = "stardoc", version = "0.8.0", dev_dependency = True)
3140

3241
# Compatibility layer

WORKSPACE

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@ rules_shell_dependencies()
3737

3838
rules_shell_toolchains()
3939

40+
# Required commit 288cdbd "Add meta field to ActionSubject."
41+
# TODO: pzembrod - Change to a released version again when the commit is in a release.
4042
http_archive(
4143
name = "rules_testing",
42-
sha256 = "02c62574631876a4e3b02a1820cb51167bb9cdcdea2381b2fa9d9b8b11c407c4",
43-
strip_prefix = "rules_testing-0.6.0",
44-
url = "https://github.com/bazelbuild/rules_testing/releases/download/v0.6.0/rules_testing-v0.6.0.tar.gz",
44+
integrity = "sha256-7Uj90x7fnhUKBxRytq/R4E9gOBisIoDW1KoUxHCDVd4=",
45+
strip_prefix = "rules_testing-288cdbd3ef4839a89d9d5911319fd9edde44b106",
46+
url = "https://github.com/bazelbuild/rules_testing/archive/288cdbd3ef4839a89d9d5911319fd9edde44b106.tar.gz",
4547
)
4648

4749
http_archive(
Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,59 @@
11
"""Tests for cc_binary."""
22

3-
load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
3+
load("@rules_testing//lib:truth.bzl", "matching")
44
load("@rules_testing//lib:util.bzl", "util")
55
load("//cc:cc_binary.bzl", "cc_binary")
6+
load("//tests/cc/testutil:cc_analysis_test.bzl", "cc_analysis_test", "cc_test_suite")
7+
load("//tests/cc/testutil:cc_binary_target_subject.bzl", "cc_binary_target_subject")
8+
load("//tests/cc/testutil:link_action_subject.bzl", "link_action_subject")
69

7-
def _test_files_to_build(name, binary_extension):
10+
def _test_files_to_build(name, **kwargs):
811
util.helper_target(
912
cc_binary,
1013
name = name + "/hello",
1114
srcs = ["hello.cc"],
1215
)
13-
analysis_test(
16+
cc_analysis_test(
1417
name = name,
1518
impl = _test_files_to_build_impl,
16-
attrs = {
17-
"binary_extension": attr.string(),
18-
},
19-
attr_values = {
20-
"binary_extension": binary_extension,
21-
},
2219
target = name + "/hello",
20+
**kwargs
2321
)
2422

2523
def _test_files_to_build_impl(env, target):
26-
expected_extension = env.ctx.attr.binary_extension
27-
expected_name = "{package}/{name}".format(
28-
package = target.label.package,
29-
name = target.label.name,
30-
) + expected_extension
31-
env.expect.that_target(target).default_outputs().contains_exactly([expected_name])
32-
env.expect.that_target(target).executable().short_path_equals(expected_name)
24+
cc_binary_subject = cc_binary_target_subject.from_target(env, target)
25+
cc_binary_subject.default_outputs().contains_exactly(["{package}/{name}{binary_extension}"])
26+
cc_binary_subject.executable().short_path_equals("{package}/{name}{binary_extension}")
27+
28+
def _test_headers_not_passed_to_linking_action(name, **kwargs):
29+
util.helper_target(
30+
cc_binary,
31+
name = name + "/bye",
32+
srcs = ["bye.cc", "bye.h"],
33+
)
34+
cc_analysis_test(
35+
name = name,
36+
impl = _test_headers_not_passed_to_linking_action_impl,
37+
target = name + "/bye",
38+
config_settings = {
39+
"//command_line_option:features": ["parse_headers"],
40+
"//command_line_option:process_headers_in_dependencies": True,
41+
},
42+
**kwargs
43+
)
44+
45+
def _test_headers_not_passed_to_linking_action_impl(env, target):
46+
link_action_subject.from_target(env, target).inputs().contains_none_of([
47+
matching.str_endswith(".h"),
48+
matching.str_endswith(".hpp"),
49+
matching.str_endswith(".hxx"),
50+
])
3351

3452
def cc_binary_configured_target_tests(name):
35-
test_suite(
53+
cc_test_suite(
3654
name = name,
3755
tests = [
3856
_test_files_to_build,
57+
_test_headers_not_passed_to_linking_action,
3958
],
40-
test_kwargs = {
41-
"binary_extension": select({
42-
"@platforms//os:windows": ".exe",
43-
"//conditions:default": "",
44-
}),
45-
},
4659
)

tests/cc/testutil/BUILD

Whitespace-only changes.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""Specialized analysis_test and test_suite for rules_cc."""
2+
3+
load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
4+
5+
def cc_analysis_test(name, *, is_windows, **kwargs):
6+
analysis_test(
7+
name = name,
8+
attrs = {
9+
"is_windows": attr.bool(),
10+
},
11+
attr_values = {
12+
"is_windows": is_windows,
13+
},
14+
**kwargs
15+
)
16+
17+
def cc_test_suite(name, *, tests = [], basic_tests = [], test_kwargs = {}):
18+
test_kwargs = dict(test_kwargs, **{
19+
"is_windows": select({
20+
"@platforms//os:windows": True,
21+
"//conditions:default": False,
22+
}),
23+
})
24+
test_suite(
25+
name = name,
26+
tests = tests,
27+
basic_tests = basic_tests,
28+
test_kwargs = test_kwargs,
29+
)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""Tweaked TargetSubject for asserting on a cc_binary target.
2+
3+
Adds a `binary_extension` to the meta info that can be used in format strings that then
4+
match both Windows and non-Windows targets.
5+
6+
Offers the same interface as TargetSubject, in fact it is just a TargetSubject, with additional
7+
meta info.
8+
9+
Example use:
10+
11+
cc_binary_target_subject.from_target(env, target).executable().short_path_equals(
12+
"{package}/{name}{binary_extension}"
13+
)
14+
"""
15+
16+
load("@rules_testing//lib:truth.bzl", "subjects")
17+
18+
def _cc_binary_target_subject_from_target(env, target):
19+
helper_target_subject = env.expect.that_target(target)
20+
binary_extension = ".exe" if env.ctx.attr.is_windows else ""
21+
meta = helper_target_subject.meta.derive(
22+
expr = "cc_binary_target({})".format(target.label),
23+
details = ["cc_binary_target: {}".format(target.label)],
24+
format_str_kwargs = {"binary_extension": binary_extension},
25+
)
26+
return subjects.target(target, meta)
27+
28+
cc_binary_target_subject = struct(
29+
from_target = _cc_binary_target_subject_from_target,
30+
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""Subject for asserting on Link Actions."""
2+
3+
load("@rules_testing//lib:truth.bzl", "subjects")
4+
load("//tests/cc/testutil:cc_binary_target_subject.bzl", "cc_binary_target_subject")
5+
6+
def _link_action_subject_new(actual, meta):
7+
return struct(
8+
actual = actual,
9+
meta = meta,
10+
inputs = lambda: subjects.collection([f.short_path for f in actual.inputs.to_list()], meta = meta.derive("inputs")),
11+
outputs = lambda: subjects.collection([f.short_path for f in actual.outputs.to_list()], meta = meta.derive("outputs")),
12+
argv = lambda: subjects.collection(actual.argv, meta = meta.derive("argv")),
13+
)
14+
15+
def _link_action_subject_from_target(env, target):
16+
action_subject = cc_binary_target_subject.from_target(env, target).action_generating(
17+
"{package}/{name}{binary_extension}",
18+
)
19+
return _link_action_subject_new(action_subject.actual, action_subject.meta)
20+
21+
link_action_subject = struct(
22+
new = _link_action_subject_new,
23+
from_target = _link_action_subject_from_target,
24+
)

0 commit comments

Comments
 (0)