xref: /aosp_15_r20/build/bazel/rules/cc/ndk_headers_test.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker"""Copyright (C) 2023 The Android Open Source Project
2*7594170eSAndroid Build Coastguard Worker
3*7594170eSAndroid Build Coastguard WorkerLicensed under the Apache License, Version 2.0 (the "License");
4*7594170eSAndroid Build Coastguard Workeryou may not use this file except in compliance with the License.
5*7594170eSAndroid Build Coastguard WorkerYou 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 WorkerUnless required by applicable law or agreed to in writing, software
10*7594170eSAndroid Build Coastguard Workerdistributed under the License is distributed on an "AS IS" BASIS,
11*7594170eSAndroid Build Coastguard WorkerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7594170eSAndroid Build Coastguard WorkerSee the License for the specific language governing permissions and
13*7594170eSAndroid Build Coastguard Workerlimitations under the License.
14*7594170eSAndroid Build Coastguard Worker"""
15*7594170eSAndroid Build Coastguard Worker
16*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:paths.bzl", "paths")
17*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:sets.bzl", "sets")
18*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
19*7594170eSAndroid Build Coastguard Workerload(":ndk_headers.bzl", "ndk_headers")
20*7594170eSAndroid Build Coastguard Worker
21*7594170eSAndroid Build Coastguard Workerdef _ndk_headers_test_impl(ctx):
22*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
23*7594170eSAndroid Build Coastguard Worker    target_under_test = analysistest.target_under_test(env)
24*7594170eSAndroid Build Coastguard Worker    target_bin_dir_path = analysistest.target_bin_dir_path(env)
25*7594170eSAndroid Build Coastguard Worker
26*7594170eSAndroid Build Coastguard Worker    # check that versioner was run for versioned NDK headers
27*7594170eSAndroid Build Coastguard Worker    if ctx.attr.expected_run_versioner:
28*7594170eSAndroid Build Coastguard Worker        version_action = [a for a in analysistest.target_actions(env) if a.mnemonic == "VersionBionicHeaders"]
29*7594170eSAndroid Build Coastguard Worker        asserts.equals(
30*7594170eSAndroid Build Coastguard Worker            env,
31*7594170eSAndroid Build Coastguard Worker            len(version_action),
32*7594170eSAndroid Build Coastguard Worker            1,
33*7594170eSAndroid Build Coastguard Worker            "Expected versioner to run once",
34*7594170eSAndroid Build Coastguard Worker        )
35*7594170eSAndroid Build Coastguard Worker
36*7594170eSAndroid Build Coastguard Worker    asserts.set_equals(
37*7594170eSAndroid Build Coastguard Worker        env,
38*7594170eSAndroid Build Coastguard Worker        expected = sets.make([
39*7594170eSAndroid Build Coastguard Worker            paths.join(ctx.attr.expected_isystem, file)
40*7594170eSAndroid Build Coastguard Worker            for file in ctx.attr.expected_hdrs
41*7594170eSAndroid Build Coastguard Worker        ]),
42*7594170eSAndroid Build Coastguard Worker        actual = sets.make([
43*7594170eSAndroid Build Coastguard Worker            file.short_path
44*7594170eSAndroid Build Coastguard Worker            for file in target_under_test[DefaultInfo].files.to_list()
45*7594170eSAndroid Build Coastguard Worker        ]),
46*7594170eSAndroid Build Coastguard Worker    )
47*7594170eSAndroid Build Coastguard Worker
48*7594170eSAndroid Build Coastguard Worker    compilation_context = target_under_test[CcInfo].compilation_context
49*7594170eSAndroid Build Coastguard Worker
50*7594170eSAndroid Build Coastguard Worker    # check -I
51*7594170eSAndroid Build Coastguard Worker    asserts.equals(
52*7594170eSAndroid Build Coastguard Worker        env,
53*7594170eSAndroid Build Coastguard Worker        [],
54*7594170eSAndroid Build Coastguard Worker        compilation_context.includes.to_list(),
55*7594170eSAndroid Build Coastguard Worker        "ndk headers should be added as -isystem and not -I",
56*7594170eSAndroid Build Coastguard Worker    )
57*7594170eSAndroid Build Coastguard Worker
58*7594170eSAndroid Build Coastguard Worker    # check -isystem
59*7594170eSAndroid Build Coastguard Worker    asserts.equals(
60*7594170eSAndroid Build Coastguard Worker        env,
61*7594170eSAndroid Build Coastguard Worker        [
62*7594170eSAndroid Build Coastguard Worker            paths.join(
63*7594170eSAndroid Build Coastguard Worker                target_bin_dir_path,
64*7594170eSAndroid Build Coastguard Worker                ctx.attr.expected_isystem,
65*7594170eSAndroid Build Coastguard Worker            ),
66*7594170eSAndroid Build Coastguard Worker            # check for the NDK triple
67*7594170eSAndroid Build Coastguard Worker            paths.join(
68*7594170eSAndroid Build Coastguard Worker                target_bin_dir_path,
69*7594170eSAndroid Build Coastguard Worker                ctx.attr.expected_isystem,
70*7594170eSAndroid Build Coastguard Worker                "arm-linux-androideabi",
71*7594170eSAndroid Build Coastguard Worker            ),
72*7594170eSAndroid Build Coastguard Worker        ],
73*7594170eSAndroid Build Coastguard Worker        compilation_context.system_includes.to_list(),
74*7594170eSAndroid Build Coastguard Worker        "CcInfo returned by ndk headers does not have the correct -isystem",
75*7594170eSAndroid Build Coastguard Worker    )
76*7594170eSAndroid Build Coastguard Worker
77*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
78*7594170eSAndroid Build Coastguard Worker
79*7594170eSAndroid Build Coastguard Workerndk_headers_test = analysistest.make(
80*7594170eSAndroid Build Coastguard Worker    _ndk_headers_test_impl,
81*7594170eSAndroid Build Coastguard Worker    attrs = {
82*7594170eSAndroid Build Coastguard Worker        "expected_hdrs": attr.string_list(),
83*7594170eSAndroid Build Coastguard Worker        "expected_isystem": attr.string(doc = "expected dir relative to bin dir that will be provided as -isystem to rdeps"),
84*7594170eSAndroid Build Coastguard Worker        "expected_run_versioner": attr.bool(default = False),
85*7594170eSAndroid Build Coastguard Worker    },
86*7594170eSAndroid Build Coastguard Worker    # Pin the test to a consistent arch
87*7594170eSAndroid Build Coastguard Worker    config_settings = {
88*7594170eSAndroid Build Coastguard Worker        "//command_line_option:platforms": "@//build/bazel/tests/products:aosp_arm_for_testing",
89*7594170eSAndroid Build Coastguard Worker    },
90*7594170eSAndroid Build Coastguard Worker)
91*7594170eSAndroid Build Coastguard Worker
92*7594170eSAndroid Build Coastguard Workerdef _test_ndk_headers_simple():
93*7594170eSAndroid Build Coastguard Worker    test_name = "ndk_headers_simple"
94*7594170eSAndroid Build Coastguard Worker    target_under_test_name = test_name + "_target"
95*7594170eSAndroid Build Coastguard Worker
96*7594170eSAndroid Build Coastguard Worker    ndk_headers(
97*7594170eSAndroid Build Coastguard Worker        name = target_under_test_name,
98*7594170eSAndroid Build Coastguard Worker        hdrs = ["a/aa.h", "a/ab.h"],
99*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
100*7594170eSAndroid Build Coastguard Worker    )
101*7594170eSAndroid Build Coastguard Worker
102*7594170eSAndroid Build Coastguard Worker    ndk_headers_test(
103*7594170eSAndroid Build Coastguard Worker        name = test_name,
104*7594170eSAndroid Build Coastguard Worker        target_under_test = target_under_test_name,
105*7594170eSAndroid Build Coastguard Worker        expected_hdrs = ["a/aa.h", "a/ab.h"],
106*7594170eSAndroid Build Coastguard Worker        expected_isystem = "build/bazel/rules/cc/" + target_under_test_name,
107*7594170eSAndroid Build Coastguard Worker    )
108*7594170eSAndroid Build Coastguard Worker
109*7594170eSAndroid Build Coastguard Worker    return test_name
110*7594170eSAndroid Build Coastguard Worker
111*7594170eSAndroid Build Coastguard Workerdef _test_ndk_headers_non_empty_strip_import():
112*7594170eSAndroid Build Coastguard Worker    test_name = "ndk_headers_non_empty_strip_import"
113*7594170eSAndroid Build Coastguard Worker    target_under_test_name = test_name + "_target"
114*7594170eSAndroid Build Coastguard Worker
115*7594170eSAndroid Build Coastguard Worker    ndk_headers(
116*7594170eSAndroid Build Coastguard Worker        name = target_under_test_name,
117*7594170eSAndroid Build Coastguard Worker        strip_import_prefix = "a",
118*7594170eSAndroid Build Coastguard Worker        hdrs = ["a/aa.h", "a/ab.h"],
119*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
120*7594170eSAndroid Build Coastguard Worker    )
121*7594170eSAndroid Build Coastguard Worker
122*7594170eSAndroid Build Coastguard Worker    ndk_headers_test(
123*7594170eSAndroid Build Coastguard Worker        name = test_name,
124*7594170eSAndroid Build Coastguard Worker        target_under_test = target_under_test_name,
125*7594170eSAndroid Build Coastguard Worker        expected_hdrs = ["aa.h", "ab.h"],
126*7594170eSAndroid Build Coastguard Worker        expected_isystem = "build/bazel/rules/cc/" + target_under_test_name,
127*7594170eSAndroid Build Coastguard Worker    )
128*7594170eSAndroid Build Coastguard Worker
129*7594170eSAndroid Build Coastguard Worker    return test_name
130*7594170eSAndroid Build Coastguard Worker
131*7594170eSAndroid Build Coastguard Workerdef _test_ndk_headers_non_empty_import():
132*7594170eSAndroid Build Coastguard Worker    test_name = "ndk_headers_non_empty_import"
133*7594170eSAndroid Build Coastguard Worker    target_under_test_name = test_name + "_target"
134*7594170eSAndroid Build Coastguard Worker
135*7594170eSAndroid Build Coastguard Worker    ndk_headers(
136*7594170eSAndroid Build Coastguard Worker        name = target_under_test_name,
137*7594170eSAndroid Build Coastguard Worker        import_prefix = "b",
138*7594170eSAndroid Build Coastguard Worker        hdrs = ["a/aa.h", "a/ab.h"],
139*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
140*7594170eSAndroid Build Coastguard Worker    )
141*7594170eSAndroid Build Coastguard Worker
142*7594170eSAndroid Build Coastguard Worker    ndk_headers_test(
143*7594170eSAndroid Build Coastguard Worker        name = test_name,
144*7594170eSAndroid Build Coastguard Worker        target_under_test = target_under_test_name,
145*7594170eSAndroid Build Coastguard Worker        expected_hdrs = ["b/a/aa.h", "b/a/ab.h"],
146*7594170eSAndroid Build Coastguard Worker        expected_isystem = "build/bazel/rules/cc/" + target_under_test_name,
147*7594170eSAndroid Build Coastguard Worker    )
148*7594170eSAndroid Build Coastguard Worker
149*7594170eSAndroid Build Coastguard Worker    return test_name
150*7594170eSAndroid Build Coastguard Worker
151*7594170eSAndroid Build Coastguard Workerdef _test_ndk_headers_non_empty_strip_import_and_import():
152*7594170eSAndroid Build Coastguard Worker    test_name = "ndk_headers_non_empty_strip_import_and_import"
153*7594170eSAndroid Build Coastguard Worker    target_under_test_name = test_name + "_target"
154*7594170eSAndroid Build Coastguard Worker
155*7594170eSAndroid Build Coastguard Worker    ndk_headers(
156*7594170eSAndroid Build Coastguard Worker        name = target_under_test_name,
157*7594170eSAndroid Build Coastguard Worker        strip_import_prefix = "a",
158*7594170eSAndroid Build Coastguard Worker        import_prefix = "b",
159*7594170eSAndroid Build Coastguard Worker        hdrs = ["a/aa.h", "a/ab.h"],
160*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
161*7594170eSAndroid Build Coastguard Worker    )
162*7594170eSAndroid Build Coastguard Worker
163*7594170eSAndroid Build Coastguard Worker    ndk_headers_test(
164*7594170eSAndroid Build Coastguard Worker        name = test_name,
165*7594170eSAndroid Build Coastguard Worker        target_under_test = target_under_test_name,
166*7594170eSAndroid Build Coastguard Worker        expected_hdrs = ["b/aa.h", "b/ab.h"],
167*7594170eSAndroid Build Coastguard Worker        expected_isystem = "build/bazel/rules/cc/" + target_under_test_name,
168*7594170eSAndroid Build Coastguard Worker    )
169*7594170eSAndroid Build Coastguard Worker
170*7594170eSAndroid Build Coastguard Worker    return test_name
171*7594170eSAndroid Build Coastguard Worker
172*7594170eSAndroid Build Coastguard Workerdef _test_versioned_ndk_headers_non_empty_strip_import_and_import():
173*7594170eSAndroid Build Coastguard Worker    test_name = "versioned_ndk_headers_non_empty_strip_import_and_import"
174*7594170eSAndroid Build Coastguard Worker    target_under_test_name = test_name + "_target"
175*7594170eSAndroid Build Coastguard Worker
176*7594170eSAndroid Build Coastguard Worker    ndk_headers(
177*7594170eSAndroid Build Coastguard Worker        name = target_under_test_name,
178*7594170eSAndroid Build Coastguard Worker        strip_import_prefix = "a",
179*7594170eSAndroid Build Coastguard Worker        import_prefix = "b",
180*7594170eSAndroid Build Coastguard Worker        hdrs = ["a/aa.h", "a/ab.h"],
181*7594170eSAndroid Build Coastguard Worker        run_versioner = True,
182*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
183*7594170eSAndroid Build Coastguard Worker    )
184*7594170eSAndroid Build Coastguard Worker
185*7594170eSAndroid Build Coastguard Worker    ndk_headers_test(
186*7594170eSAndroid Build Coastguard Worker        name = test_name,
187*7594170eSAndroid Build Coastguard Worker        target_under_test = target_under_test_name,
188*7594170eSAndroid Build Coastguard Worker        expected_hdrs = ["b/aa.h", "b/ab.h"],
189*7594170eSAndroid Build Coastguard Worker        expected_isystem = "build/bazel/rules/cc/" + target_under_test_name + ".versioned",
190*7594170eSAndroid Build Coastguard Worker        expected_run_versioner = True,
191*7594170eSAndroid Build Coastguard Worker    )
192*7594170eSAndroid Build Coastguard Worker
193*7594170eSAndroid Build Coastguard Worker    return test_name
194*7594170eSAndroid Build Coastguard Worker
195*7594170eSAndroid Build Coastguard Workerdef ndk_headers_test_suite(name):
196*7594170eSAndroid Build Coastguard Worker    native.test_suite(
197*7594170eSAndroid Build Coastguard Worker        name = name,
198*7594170eSAndroid Build Coastguard Worker        tests = [
199*7594170eSAndroid Build Coastguard Worker            _test_ndk_headers_simple(),
200*7594170eSAndroid Build Coastguard Worker            _test_ndk_headers_non_empty_strip_import(),
201*7594170eSAndroid Build Coastguard Worker            _test_ndk_headers_non_empty_import(),
202*7594170eSAndroid Build Coastguard Worker            _test_ndk_headers_non_empty_strip_import_and_import(),
203*7594170eSAndroid Build Coastguard Worker            _test_versioned_ndk_headers_non_empty_strip_import_and_import(),
204*7594170eSAndroid Build Coastguard Worker        ],
205*7594170eSAndroid Build Coastguard Worker    )
206