xref: /aosp_15_r20/build/bazel/rules/aidl/aidl_library_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 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:unittest.bzl", "analysistest", "asserts")
18*7594170eSAndroid Build Coastguard Workerload(":aidl_library.bzl", "AidlGenInfo", "aidl_library")
19*7594170eSAndroid Build Coastguard Worker
20*7594170eSAndroid Build Coastguard WorkerPACKAGE_ROOT = "build/bazel/rules/aidl"
21*7594170eSAndroid Build Coastguard Worker
22*7594170eSAndroid Build Coastguard Workerdef _test_include_dirs_are_transitive_impl(ctx):
23*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
24*7594170eSAndroid Build Coastguard Worker    target_under_test = analysistest.target_under_test(env)
25*7594170eSAndroid Build Coastguard Worker
26*7594170eSAndroid Build Coastguard Worker    asserts.equals(
27*7594170eSAndroid Build Coastguard Worker        env,
28*7594170eSAndroid Build Coastguard Worker        expected = [
29*7594170eSAndroid Build Coastguard Worker            # direct include dir is the first in the list returned from
30*7594170eSAndroid Build Coastguard Worker            # transitive_include_dirs.to_list() because transitive_include_dir
31*7594170eSAndroid Build Coastguard Worker            # is created with preorder
32*7594170eSAndroid Build Coastguard Worker            # TODO(b/243825300): Move direct include_dir out of transitive_include_dir
33*7594170eSAndroid Build Coastguard Worker            # so that we don't have to rely on preorder traversal
34*7594170eSAndroid Build Coastguard Worker            paths.join(ctx.genfiles_dir.path, PACKAGE_ROOT, "_virtual_imports", "include_dirs_transitivity"),
35*7594170eSAndroid Build Coastguard Worker            paths.join(ctx.genfiles_dir.path, PACKAGE_ROOT, "_virtual_imports", "include_dirs_transitivity_dependency"),
36*7594170eSAndroid Build Coastguard Worker        ],
37*7594170eSAndroid Build Coastguard Worker        actual = target_under_test[AidlGenInfo].transitive_include_dirs.to_list(),
38*7594170eSAndroid Build Coastguard Worker    )
39*7594170eSAndroid Build Coastguard Worker
40*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
41*7594170eSAndroid Build Coastguard Worker
42*7594170eSAndroid Build Coastguard Workerinclude_dirs_are_transitive_test = analysistest.make(_test_include_dirs_are_transitive_impl)
43*7594170eSAndroid Build Coastguard Worker
44*7594170eSAndroid Build Coastguard Workerdef _test_include_dirs_transitivity():
45*7594170eSAndroid Build Coastguard Worker    test_base_name = "include_dirs_transitivity"
46*7594170eSAndroid Build Coastguard Worker    test_name = test_base_name + "_test"
47*7594170eSAndroid Build Coastguard Worker    aidl_dep = test_base_name + "_dependency"
48*7594170eSAndroid Build Coastguard Worker    aidl_library(
49*7594170eSAndroid Build Coastguard Worker        name = test_base_name,
50*7594170eSAndroid Build Coastguard Worker        strip_import_prefix = "testing",
51*7594170eSAndroid Build Coastguard Worker        deps = [":" + aidl_dep],
52*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
53*7594170eSAndroid Build Coastguard Worker    )
54*7594170eSAndroid Build Coastguard Worker    aidl_library(
55*7594170eSAndroid Build Coastguard Worker        name = aidl_dep,
56*7594170eSAndroid Build Coastguard Worker        strip_import_prefix = "testing2",
57*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
58*7594170eSAndroid Build Coastguard Worker    )
59*7594170eSAndroid Build Coastguard Worker    include_dirs_are_transitive_test(
60*7594170eSAndroid Build Coastguard Worker        name = test_name,
61*7594170eSAndroid Build Coastguard Worker        target_under_test = test_base_name,
62*7594170eSAndroid Build Coastguard Worker    )
63*7594170eSAndroid Build Coastguard Worker    return [
64*7594170eSAndroid Build Coastguard Worker        test_name,
65*7594170eSAndroid Build Coastguard Worker    ]
66*7594170eSAndroid Build Coastguard Worker
67*7594170eSAndroid Build Coastguard Workerdef _test_empty_srcs_aggregates_deps_impl(ctx):
68*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
69*7594170eSAndroid Build Coastguard Worker    target_under_test = analysistest.target_under_test(env)
70*7594170eSAndroid Build Coastguard Worker
71*7594170eSAndroid Build Coastguard Worker    asserts.equals(
72*7594170eSAndroid Build Coastguard Worker        env,
73*7594170eSAndroid Build Coastguard Worker        expected = [],
74*7594170eSAndroid Build Coastguard Worker        actual = target_under_test[AidlGenInfo].srcs.to_list(),
75*7594170eSAndroid Build Coastguard Worker    )
76*7594170eSAndroid Build Coastguard Worker
77*7594170eSAndroid Build Coastguard Worker    import_path = paths.join(
78*7594170eSAndroid Build Coastguard Worker        PACKAGE_ROOT,
79*7594170eSAndroid Build Coastguard Worker        "_virtual_imports",
80*7594170eSAndroid Build Coastguard Worker    )
81*7594170eSAndroid Build Coastguard Worker
82*7594170eSAndroid Build Coastguard Worker    asserts.equals(
83*7594170eSAndroid Build Coastguard Worker        env,
84*7594170eSAndroid Build Coastguard Worker        expected = [
85*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency2", "b.aidl"),
86*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency2", "header_b.aidl"),
87*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency3", "c.aidl"),
88*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency3", "header_c.aidl"),
89*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency1", "a.aidl"),
90*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency1", "header_a.aidl"),
91*7594170eSAndroid Build Coastguard Worker        ],
92*7594170eSAndroid Build Coastguard Worker        actual = [
93*7594170eSAndroid Build Coastguard Worker            file.short_path
94*7594170eSAndroid Build Coastguard Worker            for file in target_under_test[AidlGenInfo].transitive_srcs.to_list()
95*7594170eSAndroid Build Coastguard Worker        ],
96*7594170eSAndroid Build Coastguard Worker    )
97*7594170eSAndroid Build Coastguard Worker
98*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
99*7594170eSAndroid Build Coastguard Worker
100*7594170eSAndroid Build Coastguard Workerempty_srcs_aggregates_deps_test = analysistest.make(_test_empty_srcs_aggregates_deps_impl)
101*7594170eSAndroid Build Coastguard Worker
102*7594170eSAndroid Build Coastguard Workerdef _test_hdrs_are_only_in_transitive_srcs_impl(ctx):
103*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
104*7594170eSAndroid Build Coastguard Worker    target_under_test = analysistest.target_under_test(env)
105*7594170eSAndroid Build Coastguard Worker
106*7594170eSAndroid Build Coastguard Worker    import_path = paths.join(
107*7594170eSAndroid Build Coastguard Worker        PACKAGE_ROOT,
108*7594170eSAndroid Build Coastguard Worker        "_virtual_imports",
109*7594170eSAndroid Build Coastguard Worker        target_under_test.label.name,
110*7594170eSAndroid Build Coastguard Worker    )
111*7594170eSAndroid Build Coastguard Worker
112*7594170eSAndroid Build Coastguard Worker    asserts.equals(
113*7594170eSAndroid Build Coastguard Worker        env,
114*7594170eSAndroid Build Coastguard Worker        expected = [
115*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, "direct.aidl"),
116*7594170eSAndroid Build Coastguard Worker        ],
117*7594170eSAndroid Build Coastguard Worker        actual = [
118*7594170eSAndroid Build Coastguard Worker            file.short_path
119*7594170eSAndroid Build Coastguard Worker            for file in target_under_test[AidlGenInfo].srcs.to_list()
120*7594170eSAndroid Build Coastguard Worker        ],
121*7594170eSAndroid Build Coastguard Worker    )
122*7594170eSAndroid Build Coastguard Worker
123*7594170eSAndroid Build Coastguard Worker    asserts.equals(
124*7594170eSAndroid Build Coastguard Worker        env,
125*7594170eSAndroid Build Coastguard Worker        expected = [
126*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, "header_direct.aidl"),
127*7594170eSAndroid Build Coastguard Worker        ],
128*7594170eSAndroid Build Coastguard Worker        actual = [
129*7594170eSAndroid Build Coastguard Worker            file.short_path
130*7594170eSAndroid Build Coastguard Worker            for file in target_under_test[AidlGenInfo].hdrs.to_list()
131*7594170eSAndroid Build Coastguard Worker        ],
132*7594170eSAndroid Build Coastguard Worker    )
133*7594170eSAndroid Build Coastguard Worker
134*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
135*7594170eSAndroid Build Coastguard Worker
136*7594170eSAndroid Build Coastguard Workerhdrs_are_only_in_transitive_srcs_test = analysistest.make(_test_hdrs_are_only_in_transitive_srcs_impl)
137*7594170eSAndroid Build Coastguard Worker
138*7594170eSAndroid Build Coastguard Workerdef _test_transitive_srcs_contains_direct_and_transitive_srcs_impl(ctx):
139*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
140*7594170eSAndroid Build Coastguard Worker    target_under_test = analysistest.target_under_test(env)
141*7594170eSAndroid Build Coastguard Worker
142*7594170eSAndroid Build Coastguard Worker    import_path = paths.join(
143*7594170eSAndroid Build Coastguard Worker        PACKAGE_ROOT,
144*7594170eSAndroid Build Coastguard Worker        "_virtual_imports",
145*7594170eSAndroid Build Coastguard Worker    )
146*7594170eSAndroid Build Coastguard Worker
147*7594170eSAndroid Build Coastguard Worker    asserts.equals(
148*7594170eSAndroid Build Coastguard Worker        env,
149*7594170eSAndroid Build Coastguard Worker        expected = [
150*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name, "direct.aidl"),
151*7594170eSAndroid Build Coastguard Worker        ],
152*7594170eSAndroid Build Coastguard Worker        actual = [
153*7594170eSAndroid Build Coastguard Worker            file.short_path
154*7594170eSAndroid Build Coastguard Worker            for file in target_under_test[AidlGenInfo].srcs.to_list()
155*7594170eSAndroid Build Coastguard Worker        ],
156*7594170eSAndroid Build Coastguard Worker    )
157*7594170eSAndroid Build Coastguard Worker
158*7594170eSAndroid Build Coastguard Worker    asserts.equals(
159*7594170eSAndroid Build Coastguard Worker        env,
160*7594170eSAndroid Build Coastguard Worker        expected = [
161*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency2", "b.aidl"),
162*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency2", "header_b.aidl"),
163*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency3", "c.aidl"),
164*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency3", "header_c.aidl"),
165*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency1", "a.aidl"),
166*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name + "_dependency1", "header_a.aidl"),
167*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name, "direct.aidl"),
168*7594170eSAndroid Build Coastguard Worker            paths.join(import_path, target_under_test.label.name, "header_direct.aidl"),
169*7594170eSAndroid Build Coastguard Worker        ],
170*7594170eSAndroid Build Coastguard Worker        actual = [
171*7594170eSAndroid Build Coastguard Worker            file.short_path
172*7594170eSAndroid Build Coastguard Worker            for file in target_under_test[AidlGenInfo].transitive_srcs.to_list()
173*7594170eSAndroid Build Coastguard Worker        ],
174*7594170eSAndroid Build Coastguard Worker    )
175*7594170eSAndroid Build Coastguard Worker
176*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
177*7594170eSAndroid Build Coastguard Worker
178*7594170eSAndroid Build Coastguard Workertransitive_srcs_contains_direct_and_transitive_srcs_test = analysistest.make(
179*7594170eSAndroid Build Coastguard Worker    _test_transitive_srcs_contains_direct_and_transitive_srcs_impl,
180*7594170eSAndroid Build Coastguard Worker)
181*7594170eSAndroid Build Coastguard Worker
182*7594170eSAndroid Build Coastguard Workerdef _generate_test_targets(name):
183*7594170eSAndroid Build Coastguard Worker    aidl_dep1 = name + "_dependency1"
184*7594170eSAndroid Build Coastguard Worker    aidl_dep2 = name + "_dependency2"
185*7594170eSAndroid Build Coastguard Worker    aidl_dep3 = name + "_dependency3"
186*7594170eSAndroid Build Coastguard Worker    aidl_library(
187*7594170eSAndroid Build Coastguard Worker        name = aidl_dep1,
188*7594170eSAndroid Build Coastguard Worker        srcs = ["a.aidl"],
189*7594170eSAndroid Build Coastguard Worker        hdrs = ["header_a.aidl"],
190*7594170eSAndroid Build Coastguard Worker        deps = [
191*7594170eSAndroid Build Coastguard Worker            ":" + aidl_dep2,
192*7594170eSAndroid Build Coastguard Worker            ":" + aidl_dep3,
193*7594170eSAndroid Build Coastguard Worker        ],
194*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
195*7594170eSAndroid Build Coastguard Worker    )
196*7594170eSAndroid Build Coastguard Worker    aidl_library(
197*7594170eSAndroid Build Coastguard Worker        name = aidl_dep2,
198*7594170eSAndroid Build Coastguard Worker        srcs = ["b.aidl"],
199*7594170eSAndroid Build Coastguard Worker        hdrs = ["header_b.aidl"],
200*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
201*7594170eSAndroid Build Coastguard Worker    )
202*7594170eSAndroid Build Coastguard Worker    aidl_library(
203*7594170eSAndroid Build Coastguard Worker        name = aidl_dep3,
204*7594170eSAndroid Build Coastguard Worker        srcs = ["c.aidl"],
205*7594170eSAndroid Build Coastguard Worker        hdrs = ["header_c.aidl"],
206*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
207*7594170eSAndroid Build Coastguard Worker    )
208*7594170eSAndroid Build Coastguard Worker    return aidl_dep1
209*7594170eSAndroid Build Coastguard Worker
210*7594170eSAndroid Build Coastguard Workerdef _test_empty_srcs_aggregates_deps():
211*7594170eSAndroid Build Coastguard Worker    test_base_name = "empty_srcs_aggregates_deps"
212*7594170eSAndroid Build Coastguard Worker    test_name = test_base_name + "_test"
213*7594170eSAndroid Build Coastguard Worker
214*7594170eSAndroid Build Coastguard Worker    aidl_dep1 = _generate_test_targets(test_base_name)
215*7594170eSAndroid Build Coastguard Worker    aidl_library(
216*7594170eSAndroid Build Coastguard Worker        name = test_base_name,
217*7594170eSAndroid Build Coastguard Worker        deps = [":" + aidl_dep1],
218*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
219*7594170eSAndroid Build Coastguard Worker    )
220*7594170eSAndroid Build Coastguard Worker    empty_srcs_aggregates_deps_test(
221*7594170eSAndroid Build Coastguard Worker        name = test_name,
222*7594170eSAndroid Build Coastguard Worker        target_under_test = test_base_name,
223*7594170eSAndroid Build Coastguard Worker    )
224*7594170eSAndroid Build Coastguard Worker    return [
225*7594170eSAndroid Build Coastguard Worker        test_name,
226*7594170eSAndroid Build Coastguard Worker    ]
227*7594170eSAndroid Build Coastguard Worker
228*7594170eSAndroid Build Coastguard Workerdef _test_transitive_srcs_contains_direct_and_transitive_srcs():
229*7594170eSAndroid Build Coastguard Worker    test_base_name = "transitive_srcs_contains_direct_and_transitive_srcs"
230*7594170eSAndroid Build Coastguard Worker    srcs_test_name = test_base_name + "_srcs"
231*7594170eSAndroid Build Coastguard Worker    hdrs_test_name = test_base_name + "_hdrs"
232*7594170eSAndroid Build Coastguard Worker
233*7594170eSAndroid Build Coastguard Worker    aidl_dep1 = _generate_test_targets(test_base_name)
234*7594170eSAndroid Build Coastguard Worker    aidl_library(
235*7594170eSAndroid Build Coastguard Worker        name = test_base_name,
236*7594170eSAndroid Build Coastguard Worker        srcs = ["direct.aidl"],
237*7594170eSAndroid Build Coastguard Worker        hdrs = ["header_direct.aidl"],
238*7594170eSAndroid Build Coastguard Worker        deps = [":" + aidl_dep1],
239*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
240*7594170eSAndroid Build Coastguard Worker    )
241*7594170eSAndroid Build Coastguard Worker    transitive_srcs_contains_direct_and_transitive_srcs_test(
242*7594170eSAndroid Build Coastguard Worker        name = srcs_test_name,
243*7594170eSAndroid Build Coastguard Worker        target_under_test = test_base_name,
244*7594170eSAndroid Build Coastguard Worker    )
245*7594170eSAndroid Build Coastguard Worker    hdrs_are_only_in_transitive_srcs_test(
246*7594170eSAndroid Build Coastguard Worker        name = hdrs_test_name,
247*7594170eSAndroid Build Coastguard Worker        target_under_test = test_base_name,
248*7594170eSAndroid Build Coastguard Worker    )
249*7594170eSAndroid Build Coastguard Worker    return [
250*7594170eSAndroid Build Coastguard Worker        srcs_test_name,
251*7594170eSAndroid Build Coastguard Worker        hdrs_test_name,
252*7594170eSAndroid Build Coastguard Worker    ]
253*7594170eSAndroid Build Coastguard Worker
254*7594170eSAndroid Build Coastguard Workerdef aidl_library_test_suite(name):
255*7594170eSAndroid Build Coastguard Worker    native.test_suite(
256*7594170eSAndroid Build Coastguard Worker        name = name,
257*7594170eSAndroid Build Coastguard Worker        tests = _test_include_dirs_transitivity() +
258*7594170eSAndroid Build Coastguard Worker                _test_transitive_srcs_contains_direct_and_transitive_srcs() +
259*7594170eSAndroid Build Coastguard Worker                _test_empty_srcs_aggregates_deps(),
260*7594170eSAndroid Build Coastguard Worker    )
261