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