158 lines
4.3 KiB
Python
158 lines
4.3 KiB
Python
|
|
# Copyright (C) 2022 The Android Open Source Project
|
||
|
|
#
|
||
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
|
# you may not use this file except in compliance with the License.
|
||
|
|
# You may obtain a copy of the License at
|
||
|
|
#
|
||
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
#
|
||
|
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
|
# See the License for the specific language governing permissions and
|
||
|
|
# limitations under the License.
|
||
|
|
|
||
|
|
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
|
||
|
|
load(":bpf.bzl", "bpf")
|
||
|
|
|
||
|
|
def _basic_bpf_test_impl(ctx):
|
||
|
|
env = analysistest.begin(ctx)
|
||
|
|
actions = analysistest.target_actions(env)
|
||
|
|
bpf_target = analysistest.target_under_test(env)
|
||
|
|
|
||
|
|
if len(ctx.attr.expected_flags) > 0:
|
||
|
|
for flag in ctx.attr.expected_flags:
|
||
|
|
asserts.true(
|
||
|
|
env,
|
||
|
|
flag in actions[0].argv,
|
||
|
|
"Expected flag (%s) is not in actual flags" % (flag),
|
||
|
|
)
|
||
|
|
|
||
|
|
if len(ctx.attr.unexpected_flags) > 0:
|
||
|
|
for flag in ctx.attr.unexpected_flags:
|
||
|
|
asserts.true(
|
||
|
|
env,
|
||
|
|
flag not in actions[0].argv,
|
||
|
|
"Unexpected flag (%s) is in actual flags" % (flag),
|
||
|
|
)
|
||
|
|
|
||
|
|
if len(ctx.attr.includes) > 0:
|
||
|
|
for dir in ctx.attr.includes:
|
||
|
|
index = actions[0].argv.index(dir)
|
||
|
|
asserts.true(
|
||
|
|
env,
|
||
|
|
actions[0].argv[index - 1] == "-I",
|
||
|
|
"Directory %s is not after '-I' tag in clang command" % (dir),
|
||
|
|
)
|
||
|
|
|
||
|
|
asserts.equals(
|
||
|
|
env,
|
||
|
|
expected = 2 if ctx.attr.expect_strip else 1,
|
||
|
|
actual = len(actions),
|
||
|
|
)
|
||
|
|
|
||
|
|
if ctx.attr.expect_strip:
|
||
|
|
asserts.true(
|
||
|
|
env,
|
||
|
|
actions[-1].argv[0].endswith("llvm-strip"),
|
||
|
|
"No strip action is executed when btf is True",
|
||
|
|
)
|
||
|
|
|
||
|
|
asserts.true(
|
||
|
|
env,
|
||
|
|
"unstripped" not in bpf_target[DefaultInfo].files.to_list()[0].path,
|
||
|
|
"'unstripped' is in the output file path",
|
||
|
|
)
|
||
|
|
|
||
|
|
return analysistest.end(env)
|
||
|
|
|
||
|
|
basic_bpf_test = analysistest.make(
|
||
|
|
_basic_bpf_test_impl,
|
||
|
|
attrs = {
|
||
|
|
"expected_flags": attr.string_list(),
|
||
|
|
"unexpected_flags": attr.string_list(),
|
||
|
|
"includes": attr.string_list(),
|
||
|
|
"expect_strip": attr.bool(),
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
def bpf_fail_test_impl(ctx):
|
||
|
|
env = analysistest.begin(ctx)
|
||
|
|
|
||
|
|
asserts.expect_failure(
|
||
|
|
env,
|
||
|
|
"Invalid character '_' in source name",
|
||
|
|
)
|
||
|
|
|
||
|
|
return analysistest.end(env)
|
||
|
|
|
||
|
|
bpf_fail_test = analysistest.make(
|
||
|
|
bpf_fail_test_impl,
|
||
|
|
expect_failure = True,
|
||
|
|
)
|
||
|
|
|
||
|
|
def test_all_attrs_btf_true():
|
||
|
|
name = "all_attrs_btf_true_test"
|
||
|
|
copts = ["cflag1", "cflag2"]
|
||
|
|
absolute_includes = ["foo/bar1", "foo/bar2"]
|
||
|
|
bpf(
|
||
|
|
name = name + "_target",
|
||
|
|
srcs = ["testAllAttrsBtfTrueSrc.c"],
|
||
|
|
copts = copts,
|
||
|
|
absolute_includes = absolute_includes,
|
||
|
|
btf = True,
|
||
|
|
tags = ["manual"],
|
||
|
|
)
|
||
|
|
basic_bpf_test(
|
||
|
|
name = name,
|
||
|
|
target_under_test = name + "_target",
|
||
|
|
expected_flags = ["-g"] + copts,
|
||
|
|
includes = absolute_includes,
|
||
|
|
expect_strip = True,
|
||
|
|
)
|
||
|
|
return name
|
||
|
|
|
||
|
|
def test_btf_false():
|
||
|
|
name = "btf_false_test"
|
||
|
|
bpf(
|
||
|
|
name = name + "_target",
|
||
|
|
srcs = ["testBtfFalse.c"],
|
||
|
|
copts = ["copts1", "copts2"],
|
||
|
|
absolute_includes = ["foo/bar1", "foo/bar2"],
|
||
|
|
btf = False,
|
||
|
|
tags = ["manual"],
|
||
|
|
)
|
||
|
|
basic_bpf_test(
|
||
|
|
name = name,
|
||
|
|
target_under_test = name + "_target",
|
||
|
|
unexpected_flags = ["-g"],
|
||
|
|
expect_strip = False,
|
||
|
|
)
|
||
|
|
return name
|
||
|
|
|
||
|
|
def test_invalid_src_name():
|
||
|
|
name = "invalid_src_name_test"
|
||
|
|
bpf(
|
||
|
|
name = name + "_target",
|
||
|
|
srcs = [name + "_src.c"],
|
||
|
|
copts = ["copts1", "copts2"],
|
||
|
|
absolute_includes = ["foo/bar1", "foo/bar2"],
|
||
|
|
btf = True,
|
||
|
|
tags = ["manual"],
|
||
|
|
)
|
||
|
|
bpf_fail_test(
|
||
|
|
name = name,
|
||
|
|
target_under_test = name + "_target",
|
||
|
|
)
|
||
|
|
return name
|
||
|
|
|
||
|
|
def bpf_test_suite(name):
|
||
|
|
native.test_suite(
|
||
|
|
name = name,
|
||
|
|
tests = [
|
||
|
|
test_all_attrs_btf_true(),
|
||
|
|
test_btf_false(),
|
||
|
|
test_invalid_src_name(),
|
||
|
|
],
|
||
|
|
)
|