xref: /aosp_15_r20/build/bazel/rules/bpf/bpf_test.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 The Android Open Source Project
2*7594170eSAndroid Build Coastguard Worker#
3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*7594170eSAndroid Build Coastguard Worker#
7*7594170eSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*7594170eSAndroid Build Coastguard Worker#
9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*7594170eSAndroid Build Coastguard Worker# limitations under the License.
14*7594170eSAndroid Build Coastguard Worker
15*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
16*7594170eSAndroid Build Coastguard Workerload(":bpf.bzl", "bpf")
17*7594170eSAndroid Build Coastguard Worker
18*7594170eSAndroid Build Coastguard Workerdef _basic_bpf_test_impl(ctx):
19*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
20*7594170eSAndroid Build Coastguard Worker    actions = analysistest.target_actions(env)
21*7594170eSAndroid Build Coastguard Worker    bpf_target = analysistest.target_under_test(env)
22*7594170eSAndroid Build Coastguard Worker
23*7594170eSAndroid Build Coastguard Worker    if len(ctx.attr.expected_flags) > 0:
24*7594170eSAndroid Build Coastguard Worker        for flag in ctx.attr.expected_flags:
25*7594170eSAndroid Build Coastguard Worker            asserts.true(
26*7594170eSAndroid Build Coastguard Worker                env,
27*7594170eSAndroid Build Coastguard Worker                flag in actions[0].argv,
28*7594170eSAndroid Build Coastguard Worker                "Expected flag (%s) is not in actual flags" % (flag),
29*7594170eSAndroid Build Coastguard Worker            )
30*7594170eSAndroid Build Coastguard Worker
31*7594170eSAndroid Build Coastguard Worker    if len(ctx.attr.unexpected_flags) > 0:
32*7594170eSAndroid Build Coastguard Worker        for flag in ctx.attr.unexpected_flags:
33*7594170eSAndroid Build Coastguard Worker            asserts.true(
34*7594170eSAndroid Build Coastguard Worker                env,
35*7594170eSAndroid Build Coastguard Worker                flag not in actions[0].argv,
36*7594170eSAndroid Build Coastguard Worker                "Unexpected flag (%s) is in actual flags" % (flag),
37*7594170eSAndroid Build Coastguard Worker            )
38*7594170eSAndroid Build Coastguard Worker
39*7594170eSAndroid Build Coastguard Worker    if len(ctx.attr.includes) > 0:
40*7594170eSAndroid Build Coastguard Worker        for dir in ctx.attr.includes:
41*7594170eSAndroid Build Coastguard Worker            index = actions[0].argv.index(dir)
42*7594170eSAndroid Build Coastguard Worker            asserts.true(
43*7594170eSAndroid Build Coastguard Worker                env,
44*7594170eSAndroid Build Coastguard Worker                actions[0].argv[index - 1] == "-I",
45*7594170eSAndroid Build Coastguard Worker                "Directory %s is not after '-I' tag in clang command" % (dir),
46*7594170eSAndroid Build Coastguard Worker            )
47*7594170eSAndroid Build Coastguard Worker
48*7594170eSAndroid Build Coastguard Worker    asserts.equals(
49*7594170eSAndroid Build Coastguard Worker        env,
50*7594170eSAndroid Build Coastguard Worker        expected = 2 if ctx.attr.expect_strip else 1,
51*7594170eSAndroid Build Coastguard Worker        actual = len(actions),
52*7594170eSAndroid Build Coastguard Worker    )
53*7594170eSAndroid Build Coastguard Worker
54*7594170eSAndroid Build Coastguard Worker    if ctx.attr.expect_strip:
55*7594170eSAndroid Build Coastguard Worker        asserts.true(
56*7594170eSAndroid Build Coastguard Worker            env,
57*7594170eSAndroid Build Coastguard Worker            actions[-1].argv[0].endswith("llvm-strip"),
58*7594170eSAndroid Build Coastguard Worker            "No strip action is executed when btf is True",
59*7594170eSAndroid Build Coastguard Worker        )
60*7594170eSAndroid Build Coastguard Worker
61*7594170eSAndroid Build Coastguard Worker    asserts.true(
62*7594170eSAndroid Build Coastguard Worker        env,
63*7594170eSAndroid Build Coastguard Worker        "unstripped" not in bpf_target[DefaultInfo].files.to_list()[0].path,
64*7594170eSAndroid Build Coastguard Worker        "'unstripped' is in the output file path",
65*7594170eSAndroid Build Coastguard Worker    )
66*7594170eSAndroid Build Coastguard Worker
67*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
68*7594170eSAndroid Build Coastguard Worker
69*7594170eSAndroid Build Coastguard Workerbasic_bpf_test = analysistest.make(
70*7594170eSAndroid Build Coastguard Worker    _basic_bpf_test_impl,
71*7594170eSAndroid Build Coastguard Worker    attrs = {
72*7594170eSAndroid Build Coastguard Worker        "expected_flags": attr.string_list(),
73*7594170eSAndroid Build Coastguard Worker        "unexpected_flags": attr.string_list(),
74*7594170eSAndroid Build Coastguard Worker        "includes": attr.string_list(),
75*7594170eSAndroid Build Coastguard Worker        "expect_strip": attr.bool(),
76*7594170eSAndroid Build Coastguard Worker    },
77*7594170eSAndroid Build Coastguard Worker)
78*7594170eSAndroid Build Coastguard Worker
79*7594170eSAndroid Build Coastguard Workerdef bpf_fail_test_impl(ctx):
80*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
81*7594170eSAndroid Build Coastguard Worker
82*7594170eSAndroid Build Coastguard Worker    asserts.expect_failure(
83*7594170eSAndroid Build Coastguard Worker        env,
84*7594170eSAndroid Build Coastguard Worker        "Invalid character '_' in source name",
85*7594170eSAndroid Build Coastguard Worker    )
86*7594170eSAndroid Build Coastguard Worker
87*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
88*7594170eSAndroid Build Coastguard Worker
89*7594170eSAndroid Build Coastguard Workerbpf_fail_test = analysistest.make(
90*7594170eSAndroid Build Coastguard Worker    bpf_fail_test_impl,
91*7594170eSAndroid Build Coastguard Worker    expect_failure = True,
92*7594170eSAndroid Build Coastguard Worker)
93*7594170eSAndroid Build Coastguard Worker
94*7594170eSAndroid Build Coastguard Workerdef test_all_attrs_btf_true():
95*7594170eSAndroid Build Coastguard Worker    name = "all_attrs_btf_true_test"
96*7594170eSAndroid Build Coastguard Worker    copts = ["cflag1", "cflag2"]
97*7594170eSAndroid Build Coastguard Worker    absolute_includes = ["foo/bar1", "foo/bar2"]
98*7594170eSAndroid Build Coastguard Worker    bpf(
99*7594170eSAndroid Build Coastguard Worker        name = name + "_target",
100*7594170eSAndroid Build Coastguard Worker        srcs = ["testAllAttrsBtfTrueSrc.c"],
101*7594170eSAndroid Build Coastguard Worker        copts = copts,
102*7594170eSAndroid Build Coastguard Worker        absolute_includes = absolute_includes,
103*7594170eSAndroid Build Coastguard Worker        btf = True,
104*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
105*7594170eSAndroid Build Coastguard Worker    )
106*7594170eSAndroid Build Coastguard Worker    basic_bpf_test(
107*7594170eSAndroid Build Coastguard Worker        name = name,
108*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_target",
109*7594170eSAndroid Build Coastguard Worker        expected_flags = ["-g"] + copts,
110*7594170eSAndroid Build Coastguard Worker        includes = absolute_includes,
111*7594170eSAndroid Build Coastguard Worker        expect_strip = True,
112*7594170eSAndroid Build Coastguard Worker    )
113*7594170eSAndroid Build Coastguard Worker    return name
114*7594170eSAndroid Build Coastguard Worker
115*7594170eSAndroid Build Coastguard Workerdef test_btf_false():
116*7594170eSAndroid Build Coastguard Worker    name = "btf_false_test"
117*7594170eSAndroid Build Coastguard Worker    bpf(
118*7594170eSAndroid Build Coastguard Worker        name = name + "_target",
119*7594170eSAndroid Build Coastguard Worker        srcs = ["testBtfFalse.c"],
120*7594170eSAndroid Build Coastguard Worker        copts = ["copts1", "copts2"],
121*7594170eSAndroid Build Coastguard Worker        absolute_includes = ["foo/bar1", "foo/bar2"],
122*7594170eSAndroid Build Coastguard Worker        btf = False,
123*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
124*7594170eSAndroid Build Coastguard Worker    )
125*7594170eSAndroid Build Coastguard Worker    basic_bpf_test(
126*7594170eSAndroid Build Coastguard Worker        name = name,
127*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_target",
128*7594170eSAndroid Build Coastguard Worker        unexpected_flags = ["-g"],
129*7594170eSAndroid Build Coastguard Worker        expect_strip = False,
130*7594170eSAndroid Build Coastguard Worker    )
131*7594170eSAndroid Build Coastguard Worker    return name
132*7594170eSAndroid Build Coastguard Worker
133*7594170eSAndroid Build Coastguard Workerdef test_invalid_src_name():
134*7594170eSAndroid Build Coastguard Worker    name = "invalid_src_name_test"
135*7594170eSAndroid Build Coastguard Worker    bpf(
136*7594170eSAndroid Build Coastguard Worker        name = name + "_target",
137*7594170eSAndroid Build Coastguard Worker        srcs = [name + "_src.c"],
138*7594170eSAndroid Build Coastguard Worker        copts = ["copts1", "copts2"],
139*7594170eSAndroid Build Coastguard Worker        absolute_includes = ["foo/bar1", "foo/bar2"],
140*7594170eSAndroid Build Coastguard Worker        btf = True,
141*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
142*7594170eSAndroid Build Coastguard Worker    )
143*7594170eSAndroid Build Coastguard Worker    bpf_fail_test(
144*7594170eSAndroid Build Coastguard Worker        name = name,
145*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_target",
146*7594170eSAndroid Build Coastguard Worker    )
147*7594170eSAndroid Build Coastguard Worker    return name
148*7594170eSAndroid Build Coastguard Worker
149*7594170eSAndroid Build Coastguard Workerdef bpf_test_suite(name):
150*7594170eSAndroid Build Coastguard Worker    native.test_suite(
151*7594170eSAndroid Build Coastguard Worker        name = name,
152*7594170eSAndroid Build Coastguard Worker        tests = [
153*7594170eSAndroid Build Coastguard Worker            test_all_attrs_btf_true(),
154*7594170eSAndroid Build Coastguard Worker            test_btf_false(),
155*7594170eSAndroid Build Coastguard Worker            test_invalid_src_name(),
156*7594170eSAndroid Build Coastguard Worker        ],
157*7594170eSAndroid Build Coastguard Worker    )
158