xref: /aosp_15_r20/build/bazel/rules/abi/abi_dump_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:paths.bzl", "paths")
16*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:sets.bzl", "sets")
17*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
18*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/cc:cc_library_shared.bzl", "cc_library_shared")
19*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/cc:cc_library_static.bzl", "cc_library_static")
20*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/test_common:args.bzl", "get_arg_value", "get_arg_values")
21*7594170eSAndroid Build Coastguard Workerload(":abi_dump.bzl", "abi_dump", "find_abi_config")
22*7594170eSAndroid Build Coastguard Worker
23*7594170eSAndroid Build Coastguard WorkerABI_LINKER = "prebuilts/clang-tools/linux-x86/bin/header-abi-linker"
24*7594170eSAndroid Build Coastguard WorkerABI_DIFF = "prebuilts/clang-tools/linux-x86/bin/header-abi-diff"
25*7594170eSAndroid Build Coastguard Worker
26*7594170eSAndroid Build Coastguard Worker# cxa_demangle.cpp is added as part of the stl in cc_library_shared, so it's dump
27*7594170eSAndroid Build Coastguard Worker# file is always created.
28*7594170eSAndroid Build Coastguard WorkerCXA_DEMANGLE = "external/libcxxabi/external/libcxxabi/src/libc++demangle.cxa_demangle.cpp.sdump"
29*7594170eSAndroid Build Coastguard WorkerREF_DUMPS_HOME = "build/bazel/rules/abi/abi-dumps"
30*7594170eSAndroid Build Coastguard WorkerARCH = "x86_64"
31*7594170eSAndroid Build Coastguard WorkerBITNESS = 64
32*7594170eSAndroid Build Coastguard WorkerCONFIG_SETTING_COVERAGE = {
33*7594170eSAndroid Build Coastguard Worker    "//command_line_option:collect_code_coverage": True,
34*7594170eSAndroid Build Coastguard Worker}
35*7594170eSAndroid Build Coastguard WorkerCONFIG_SETTING_SKIP_ABI_CHECK = {
36*7594170eSAndroid Build Coastguard Worker    "@//build/bazel/flags/cc/abi:skip_abi_checks": True,
37*7594170eSAndroid Build Coastguard Worker}
38*7594170eSAndroid Build Coastguard WorkerCONFIG_SETTING_IN_APEX = {
39*7594170eSAndroid Build Coastguard Worker    "@//build/bazel/rules/apex:within_apex": True,
40*7594170eSAndroid Build Coastguard Worker}
41*7594170eSAndroid Build Coastguard Worker
42*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_test_impl(ctx):
43*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
44*7594170eSAndroid Build Coastguard Worker    bin_home = analysistest.target_bin_dir_path(env)
45*7594170eSAndroid Build Coastguard Worker    bazel_out_base = paths.join(bin_home, ctx.label.package)
46*7594170eSAndroid Build Coastguard Worker
47*7594170eSAndroid Build Coastguard Worker    actions = analysistest.target_actions(env)
48*7594170eSAndroid Build Coastguard Worker    link_actions = [a for a in actions if a.mnemonic == "AbiLink"]
49*7594170eSAndroid Build Coastguard Worker
50*7594170eSAndroid Build Coastguard Worker    asserts.true(
51*7594170eSAndroid Build Coastguard Worker        env,
52*7594170eSAndroid Build Coastguard Worker        len(link_actions) == 1,
53*7594170eSAndroid Build Coastguard Worker        "Abi link action not found: %s" % link_actions,
54*7594170eSAndroid Build Coastguard Worker    )
55*7594170eSAndroid Build Coastguard Worker
56*7594170eSAndroid Build Coastguard Worker    action = link_actions[0]
57*7594170eSAndroid Build Coastguard Worker
58*7594170eSAndroid Build Coastguard Worker    output_lib_dir = ctx.attr.lib_name + "_stripped"
59*7594170eSAndroid Build Coastguard Worker    stripped_so = paths.join(bazel_out_base, output_lib_dir, "lib" + output_lib_dir + ".so")
60*7594170eSAndroid Build Coastguard Worker    symbol_file = paths.join(ctx.label.package, ctx.attr.symbol_file)
61*7594170eSAndroid Build Coastguard Worker    asserts.set_equals(
62*7594170eSAndroid Build Coastguard Worker        env,
63*7594170eSAndroid Build Coastguard Worker        expected = sets.make(
64*7594170eSAndroid Build Coastguard Worker            [paths.join(bazel_out_base, ctx.label.package, file + ".sdump") for file in ctx.attr.dumps] + [
65*7594170eSAndroid Build Coastguard Worker                ABI_LINKER,
66*7594170eSAndroid Build Coastguard Worker                paths.join(bin_home, CXA_DEMANGLE),
67*7594170eSAndroid Build Coastguard Worker                stripped_so,
68*7594170eSAndroid Build Coastguard Worker                symbol_file,
69*7594170eSAndroid Build Coastguard Worker            ],
70*7594170eSAndroid Build Coastguard Worker        ),
71*7594170eSAndroid Build Coastguard Worker        actual = sets.make([
72*7594170eSAndroid Build Coastguard Worker            file.path
73*7594170eSAndroid Build Coastguard Worker            for file in action.inputs.to_list()
74*7594170eSAndroid Build Coastguard Worker        ]),
75*7594170eSAndroid Build Coastguard Worker    )
76*7594170eSAndroid Build Coastguard Worker
77*7594170eSAndroid Build Coastguard Worker    lsdump_file = paths.join(bazel_out_base, ctx.attr.lib_name + ".so.lsdump")
78*7594170eSAndroid Build Coastguard Worker    asserts.set_equals(
79*7594170eSAndroid Build Coastguard Worker        env,
80*7594170eSAndroid Build Coastguard Worker        expected = sets.make([lsdump_file]),
81*7594170eSAndroid Build Coastguard Worker        actual = sets.make([
82*7594170eSAndroid Build Coastguard Worker            file.path
83*7594170eSAndroid Build Coastguard Worker            for file in action.outputs.to_list()
84*7594170eSAndroid Build Coastguard Worker        ]),
85*7594170eSAndroid Build Coastguard Worker    )
86*7594170eSAndroid Build Coastguard Worker
87*7594170eSAndroid Build Coastguard Worker    argv = action.argv
88*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "--root-dir", ".")
89*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "-o", lsdump_file)
90*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "-so", stripped_so)
91*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "-arch", ARCH)
92*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "-v", symbol_file)
93*7594170eSAndroid Build Coastguard Worker    _test_arg_set_multi_values_correctly(env, argv, "--exclude-symbol-version", ctx.attr.exclude_symbol_versions)
94*7594170eSAndroid Build Coastguard Worker    _test_arg_set_multi_values_correctly(env, argv, "--exclude-symbol-tag", ctx.attr.exclude_symbol_tags)
95*7594170eSAndroid Build Coastguard Worker    _test_arg_set_multi_values_correctly(
96*7594170eSAndroid Build Coastguard Worker        env,
97*7594170eSAndroid Build Coastguard Worker        argv,
98*7594170eSAndroid Build Coastguard Worker        "-I",
99*7594170eSAndroid Build Coastguard Worker        [paths.join(bazel_out_base, file) for file in ctx.attr.export_includes] +
100*7594170eSAndroid Build Coastguard Worker        [paths.join(ctx.label.package, file) for file in ctx.attr.export_includes] +
101*7594170eSAndroid Build Coastguard Worker        ctx.attr.export_absolute_includes +
102*7594170eSAndroid Build Coastguard Worker        [paths.join(bin_home, file) for file in ctx.attr.export_absolute_includes],
103*7594170eSAndroid Build Coastguard Worker    )
104*7594170eSAndroid Build Coastguard Worker
105*7594170eSAndroid Build Coastguard Worker    sdump_files = []
106*7594170eSAndroid Build Coastguard Worker    args = " ".join(argv).split(" ")
107*7594170eSAndroid Build Coastguard Worker    args_len = len(args)
108*7594170eSAndroid Build Coastguard Worker
109*7594170eSAndroid Build Coastguard Worker    # The .sdump files are at the end of the args, the abi linker binary is always at index 0.
110*7594170eSAndroid Build Coastguard Worker    for i in reversed(range(args_len)):
111*7594170eSAndroid Build Coastguard Worker        if ".sdump" in args[i]:
112*7594170eSAndroid Build Coastguard Worker            sdump_files.append(args[i])
113*7594170eSAndroid Build Coastguard Worker        else:
114*7594170eSAndroid Build Coastguard Worker            break
115*7594170eSAndroid Build Coastguard Worker
116*7594170eSAndroid Build Coastguard Worker    asserts.set_equals(
117*7594170eSAndroid Build Coastguard Worker        env,
118*7594170eSAndroid Build Coastguard Worker        expected = sets.make(
119*7594170eSAndroid Build Coastguard Worker            [paths.join(bazel_out_base, ctx.label.package, file + ".sdump") for file in ctx.attr.dumps] + [
120*7594170eSAndroid Build Coastguard Worker                paths.join(bin_home, CXA_DEMANGLE),
121*7594170eSAndroid Build Coastguard Worker            ],
122*7594170eSAndroid Build Coastguard Worker        ),
123*7594170eSAndroid Build Coastguard Worker        actual = sets.make(sdump_files),
124*7594170eSAndroid Build Coastguard Worker    )
125*7594170eSAndroid Build Coastguard Worker
126*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
127*7594170eSAndroid Build Coastguard Worker
128*7594170eSAndroid Build Coastguard Worker__abi_linker_action_test = analysistest.make(
129*7594170eSAndroid Build Coastguard Worker    impl = _abi_linker_action_test_impl,
130*7594170eSAndroid Build Coastguard Worker    attrs = {
131*7594170eSAndroid Build Coastguard Worker        "dumps": attr.string_list(),
132*7594170eSAndroid Build Coastguard Worker        "lib_name": attr.string(),
133*7594170eSAndroid Build Coastguard Worker        "symbol_file": attr.string(),
134*7594170eSAndroid Build Coastguard Worker        "exclude_symbol_versions": attr.string_list(),
135*7594170eSAndroid Build Coastguard Worker        "exclude_symbol_tags": attr.string_list(),
136*7594170eSAndroid Build Coastguard Worker        "export_includes": attr.string_list(),
137*7594170eSAndroid Build Coastguard Worker        "export_absolute_includes": attr.string_list(),
138*7594170eSAndroid Build Coastguard Worker        "_platform_utils": attr.label(default = Label("//build/bazel/platforms:platform_utils")),
139*7594170eSAndroid Build Coastguard Worker    },
140*7594170eSAndroid Build Coastguard Worker)
141*7594170eSAndroid Build Coastguard Worker
142*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_test(**kwargs):
143*7594170eSAndroid Build Coastguard Worker    __abi_linker_action_test(
144*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [
145*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/arch:x86_64",
146*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/os:android",
147*7594170eSAndroid Build Coastguard Worker        ],
148*7594170eSAndroid Build Coastguard Worker        **kwargs
149*7594170eSAndroid Build Coastguard Worker    )
150*7594170eSAndroid Build Coastguard Worker
151*7594170eSAndroid Build Coastguard Workerdef _test_abi_linker_action():
152*7594170eSAndroid Build Coastguard Worker    name = "abi_linker_action"
153*7594170eSAndroid Build Coastguard Worker    static_dep_a = name + "_static_dep_a"
154*7594170eSAndroid Build Coastguard Worker    static_dep_b = name + "_static_dep_b"
155*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
156*7594170eSAndroid Build Coastguard Worker
157*7594170eSAndroid Build Coastguard Worker    cc_library_static(
158*7594170eSAndroid Build Coastguard Worker        name = static_dep_a,
159*7594170eSAndroid Build Coastguard Worker        srcs = ["static_a.cpp"],
160*7594170eSAndroid Build Coastguard Worker        srcs_c = ["static_a.c"],
161*7594170eSAndroid Build Coastguard Worker        export_includes = ["export_includes_static_a"],
162*7594170eSAndroid Build Coastguard Worker        export_absolute_includes = ["export_absolute_includes_static_a"],
163*7594170eSAndroid Build Coastguard Worker        export_system_includes = ["export_system_includes_static_a"],
164*7594170eSAndroid Build Coastguard Worker        local_includes = ["local_includes_static_a"],
165*7594170eSAndroid Build Coastguard Worker        absolute_includes = ["absolute_includes_static_a"],
166*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
167*7594170eSAndroid Build Coastguard Worker    )
168*7594170eSAndroid Build Coastguard Worker
169*7594170eSAndroid Build Coastguard Worker    cc_library_static(
170*7594170eSAndroid Build Coastguard Worker        name = static_dep_b,
171*7594170eSAndroid Build Coastguard Worker        srcs = ["static_b.cpp"],
172*7594170eSAndroid Build Coastguard Worker        srcs_c = ["static_b.c"],
173*7594170eSAndroid Build Coastguard Worker        deps = [":" + static_dep_a],
174*7594170eSAndroid Build Coastguard Worker        export_includes = ["export_includes_static_b"],
175*7594170eSAndroid Build Coastguard Worker        export_absolute_includes = ["export_absolute_includes_static_b"],
176*7594170eSAndroid Build Coastguard Worker        export_system_includes = ["export_system_includes_static_b"],
177*7594170eSAndroid Build Coastguard Worker        local_includes = ["local_includes_static_b"],
178*7594170eSAndroid Build Coastguard Worker        absolute_includes = ["absolute_includes_static_b"],
179*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
180*7594170eSAndroid Build Coastguard Worker    )
181*7594170eSAndroid Build Coastguard Worker
182*7594170eSAndroid Build Coastguard Worker    symbol_file = "shared_a.map.txt"
183*7594170eSAndroid Build Coastguard Worker    exclude_symbol_versions = ["30", "31"]
184*7594170eSAndroid Build Coastguard Worker    exclude_symbol_tags = ["func_1", "func_2"]
185*7594170eSAndroid Build Coastguard Worker
186*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
187*7594170eSAndroid Build Coastguard Worker        name = name,
188*7594170eSAndroid Build Coastguard Worker        srcs = ["shared.cpp"],
189*7594170eSAndroid Build Coastguard Worker        srcs_c = ["shared.c"],
190*7594170eSAndroid Build Coastguard Worker        deps = [":" + static_dep_b],
191*7594170eSAndroid Build Coastguard Worker        export_includes = ["export_includes_shared"],
192*7594170eSAndroid Build Coastguard Worker        export_absolute_includes = ["export_absolute_includes_shared"],
193*7594170eSAndroid Build Coastguard Worker        export_system_includes = ["export_system_includes_shared"],
194*7594170eSAndroid Build Coastguard Worker        local_includes = ["local_includes_shared"],
195*7594170eSAndroid Build Coastguard Worker        absolute_includes = ["absolute_includes_shared"],
196*7594170eSAndroid Build Coastguard Worker        stubs_symbol_file = name + ".map.txt",
197*7594170eSAndroid Build Coastguard Worker        abi_checker_symbol_file = symbol_file,
198*7594170eSAndroid Build Coastguard Worker        abi_checker_exclude_symbol_versions = exclude_symbol_versions,
199*7594170eSAndroid Build Coastguard Worker        abi_checker_exclude_symbol_tags = exclude_symbol_tags,
200*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
201*7594170eSAndroid Build Coastguard Worker    )
202*7594170eSAndroid Build Coastguard Worker
203*7594170eSAndroid Build Coastguard Worker    _abi_linker_action_test(
204*7594170eSAndroid Build Coastguard Worker        name = test_name,
205*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_abi_dump",
206*7594170eSAndroid Build Coastguard Worker        dumps = [
207*7594170eSAndroid Build Coastguard Worker            static_dep_a + ".static_a.cpp",
208*7594170eSAndroid Build Coastguard Worker            static_dep_b + ".static_b.cpp",
209*7594170eSAndroid Build Coastguard Worker            name + "__internal_root.shared.cpp",
210*7594170eSAndroid Build Coastguard Worker            static_dep_a + ".static_a.c",
211*7594170eSAndroid Build Coastguard Worker            static_dep_b + ".static_b.c",
212*7594170eSAndroid Build Coastguard Worker            name + "__internal_root.shared.c",
213*7594170eSAndroid Build Coastguard Worker        ],
214*7594170eSAndroid Build Coastguard Worker        lib_name = name,
215*7594170eSAndroid Build Coastguard Worker        symbol_file = symbol_file,
216*7594170eSAndroid Build Coastguard Worker        exclude_symbol_versions = exclude_symbol_versions,
217*7594170eSAndroid Build Coastguard Worker        exclude_symbol_tags = exclude_symbol_tags,
218*7594170eSAndroid Build Coastguard Worker        export_includes = [
219*7594170eSAndroid Build Coastguard Worker            "export_includes_shared",
220*7594170eSAndroid Build Coastguard Worker            "export_includes_static_a",
221*7594170eSAndroid Build Coastguard Worker            "export_includes_static_b",
222*7594170eSAndroid Build Coastguard Worker        ],
223*7594170eSAndroid Build Coastguard Worker        export_absolute_includes = [
224*7594170eSAndroid Build Coastguard Worker            "export_absolute_includes_shared",
225*7594170eSAndroid Build Coastguard Worker            "export_absolute_includes_static_a",
226*7594170eSAndroid Build Coastguard Worker            "export_absolute_includes_static_b",
227*7594170eSAndroid Build Coastguard Worker        ],
228*7594170eSAndroid Build Coastguard Worker    )
229*7594170eSAndroid Build Coastguard Worker
230*7594170eSAndroid Build Coastguard Worker    return test_name
231*7594170eSAndroid Build Coastguard Worker
232*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_run_test_impl(ctx):
233*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
234*7594170eSAndroid Build Coastguard Worker
235*7594170eSAndroid Build Coastguard Worker    actions = analysistest.target_actions(env)
236*7594170eSAndroid Build Coastguard Worker    link_actions = [a for a in actions if a.mnemonic == "AbiLink"]
237*7594170eSAndroid Build Coastguard Worker
238*7594170eSAndroid Build Coastguard Worker    asserts.true(
239*7594170eSAndroid Build Coastguard Worker        env,
240*7594170eSAndroid Build Coastguard Worker        len(link_actions) == 1,
241*7594170eSAndroid Build Coastguard Worker        "Abi link action not found: %s" % link_actions,
242*7594170eSAndroid Build Coastguard Worker    )
243*7594170eSAndroid Build Coastguard Worker
244*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
245*7594170eSAndroid Build Coastguard Worker
246*7594170eSAndroid Build Coastguard Worker__abi_linker_action_run_test = analysistest.make(
247*7594170eSAndroid Build Coastguard Worker    impl = _abi_linker_action_run_test_impl,
248*7594170eSAndroid Build Coastguard Worker)
249*7594170eSAndroid Build Coastguard Worker
250*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_run_test(**kwargs):
251*7594170eSAndroid Build Coastguard Worker    __abi_linker_action_run_test(
252*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [
253*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/arch:x86_64",
254*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/os:android",
255*7594170eSAndroid Build Coastguard Worker        ],
256*7594170eSAndroid Build Coastguard Worker        **kwargs
257*7594170eSAndroid Build Coastguard Worker    )
258*7594170eSAndroid Build Coastguard Worker
259*7594170eSAndroid Build Coastguard Workerdef _test_abi_linker_action_run_for_enabled():
260*7594170eSAndroid Build Coastguard Worker    name = "abi_linker_action_run_for_enabled"
261*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
262*7594170eSAndroid Build Coastguard Worker
263*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
264*7594170eSAndroid Build Coastguard Worker        name = name,
265*7594170eSAndroid Build Coastguard Worker        abi_checker_enabled = True,
266*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
267*7594170eSAndroid Build Coastguard Worker    )
268*7594170eSAndroid Build Coastguard Worker
269*7594170eSAndroid Build Coastguard Worker    _abi_linker_action_run_test(
270*7594170eSAndroid Build Coastguard Worker        name = test_name,
271*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_abi_dump",
272*7594170eSAndroid Build Coastguard Worker    )
273*7594170eSAndroid Build Coastguard Worker
274*7594170eSAndroid Build Coastguard Worker    return test_name
275*7594170eSAndroid Build Coastguard Worker
276*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_not_run_test_impl(ctx):
277*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
278*7594170eSAndroid Build Coastguard Worker
279*7594170eSAndroid Build Coastguard Worker    actions = analysistest.target_actions(env)
280*7594170eSAndroid Build Coastguard Worker    link_actions = [a for a in actions if a.mnemonic == "AbiLink"]
281*7594170eSAndroid Build Coastguard Worker
282*7594170eSAndroid Build Coastguard Worker    asserts.true(
283*7594170eSAndroid Build Coastguard Worker        env,
284*7594170eSAndroid Build Coastguard Worker        len(link_actions) == 0,
285*7594170eSAndroid Build Coastguard Worker        "Abi link action found: %s" % link_actions,
286*7594170eSAndroid Build Coastguard Worker    )
287*7594170eSAndroid Build Coastguard Worker
288*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
289*7594170eSAndroid Build Coastguard Worker
290*7594170eSAndroid Build Coastguard Worker__abi_linker_action_not_run_test = analysistest.make(
291*7594170eSAndroid Build Coastguard Worker    impl = _abi_linker_action_not_run_test_impl,
292*7594170eSAndroid Build Coastguard Worker)
293*7594170eSAndroid Build Coastguard Worker
294*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_not_run_test(**kwargs):
295*7594170eSAndroid Build Coastguard Worker    __abi_linker_action_not_run_test(
296*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [
297*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/arch:x86_64",
298*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/os:android",
299*7594170eSAndroid Build Coastguard Worker        ],
300*7594170eSAndroid Build Coastguard Worker        **kwargs
301*7594170eSAndroid Build Coastguard Worker    )
302*7594170eSAndroid Build Coastguard Worker
303*7594170eSAndroid Build Coastguard Worker__abi_linker_action_not_run_for_no_device_test = analysistest.make(
304*7594170eSAndroid Build Coastguard Worker    impl = _abi_linker_action_not_run_test_impl,
305*7594170eSAndroid Build Coastguard Worker)
306*7594170eSAndroid Build Coastguard Worker
307*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_not_run_for_no_device_test(**kwargs):
308*7594170eSAndroid Build Coastguard Worker    __abi_linker_action_not_run_for_no_device_test(
309*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [
310*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/arch:x86_64",
311*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/os:linux",
312*7594170eSAndroid Build Coastguard Worker        ],
313*7594170eSAndroid Build Coastguard Worker        **kwargs
314*7594170eSAndroid Build Coastguard Worker    )
315*7594170eSAndroid Build Coastguard Worker
316*7594170eSAndroid Build Coastguard Worker__abi_linker_action_not_run_for_coverage_test = analysistest.make(
317*7594170eSAndroid Build Coastguard Worker    impl = _abi_linker_action_not_run_test_impl,
318*7594170eSAndroid Build Coastguard Worker    config_settings = CONFIG_SETTING_COVERAGE,
319*7594170eSAndroid Build Coastguard Worker)
320*7594170eSAndroid Build Coastguard Worker
321*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_not_run_for_coverage_test(**kwargs):
322*7594170eSAndroid Build Coastguard Worker    __abi_linker_action_not_run_for_coverage_test(
323*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [
324*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/arch:x86_64",
325*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/os:android",
326*7594170eSAndroid Build Coastguard Worker        ],
327*7594170eSAndroid Build Coastguard Worker        **kwargs
328*7594170eSAndroid Build Coastguard Worker    )
329*7594170eSAndroid Build Coastguard Worker
330*7594170eSAndroid Build Coastguard Worker__abi_linker_action_not_run_if_skipped_test = analysistest.make(
331*7594170eSAndroid Build Coastguard Worker    impl = _abi_linker_action_not_run_test_impl,
332*7594170eSAndroid Build Coastguard Worker    config_settings = CONFIG_SETTING_SKIP_ABI_CHECK,
333*7594170eSAndroid Build Coastguard Worker)
334*7594170eSAndroid Build Coastguard Worker
335*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_not_run_if_skipped_test(**kwargs):
336*7594170eSAndroid Build Coastguard Worker    __abi_linker_action_not_run_if_skipped_test(
337*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [
338*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/arch:x86_64",
339*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/os:android",
340*7594170eSAndroid Build Coastguard Worker        ],
341*7594170eSAndroid Build Coastguard Worker        **kwargs
342*7594170eSAndroid Build Coastguard Worker    )
343*7594170eSAndroid Build Coastguard Worker
344*7594170eSAndroid Build Coastguard Worker__abi_linker_action_not_run_apex_no_stubs_test = analysistest.make(
345*7594170eSAndroid Build Coastguard Worker    impl = _abi_linker_action_not_run_test_impl,
346*7594170eSAndroid Build Coastguard Worker    config_settings = CONFIG_SETTING_IN_APEX,
347*7594170eSAndroid Build Coastguard Worker)
348*7594170eSAndroid Build Coastguard Worker
349*7594170eSAndroid Build Coastguard Workerdef _abi_linker_action_not_run_apex_no_stubs_test(**kwargs):
350*7594170eSAndroid Build Coastguard Worker    __abi_linker_action_not_run_apex_no_stubs_test(
351*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [
352*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/arch:x86_64",
353*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/os:android",
354*7594170eSAndroid Build Coastguard Worker        ],
355*7594170eSAndroid Build Coastguard Worker        **kwargs
356*7594170eSAndroid Build Coastguard Worker    )
357*7594170eSAndroid Build Coastguard Worker
358*7594170eSAndroid Build Coastguard Workerdef _test_abi_linker_action_not_run_for_default():
359*7594170eSAndroid Build Coastguard Worker    name = "abi_linker_action_not_run_for_default"
360*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
361*7594170eSAndroid Build Coastguard Worker
362*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
363*7594170eSAndroid Build Coastguard Worker        name = name,
364*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
365*7594170eSAndroid Build Coastguard Worker    )
366*7594170eSAndroid Build Coastguard Worker
367*7594170eSAndroid Build Coastguard Worker    _abi_linker_action_not_run_test(
368*7594170eSAndroid Build Coastguard Worker        name = test_name,
369*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_abi_dump",
370*7594170eSAndroid Build Coastguard Worker    )
371*7594170eSAndroid Build Coastguard Worker
372*7594170eSAndroid Build Coastguard Worker    return test_name
373*7594170eSAndroid Build Coastguard Worker
374*7594170eSAndroid Build Coastguard Workerdef _test_abi_linker_action_not_run_for_disabled():
375*7594170eSAndroid Build Coastguard Worker    name = "abi_linker_action_not_run_for_disabled"
376*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
377*7594170eSAndroid Build Coastguard Worker
378*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
379*7594170eSAndroid Build Coastguard Worker        name = name,
380*7594170eSAndroid Build Coastguard Worker        stubs_symbol_file = name + ".map.txt",
381*7594170eSAndroid Build Coastguard Worker        abi_checker_enabled = False,
382*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
383*7594170eSAndroid Build Coastguard Worker    )
384*7594170eSAndroid Build Coastguard Worker
385*7594170eSAndroid Build Coastguard Worker    _abi_linker_action_not_run_test(
386*7594170eSAndroid Build Coastguard Worker        name = test_name,
387*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_abi_dump",
388*7594170eSAndroid Build Coastguard Worker    )
389*7594170eSAndroid Build Coastguard Worker
390*7594170eSAndroid Build Coastguard Worker    return test_name
391*7594170eSAndroid Build Coastguard Worker
392*7594170eSAndroid Build Coastguard Workerdef _test_abi_linker_action_not_run_for_no_device():
393*7594170eSAndroid Build Coastguard Worker    name = "abi_linker_action_not_run_for_no_device"
394*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
395*7594170eSAndroid Build Coastguard Worker
396*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
397*7594170eSAndroid Build Coastguard Worker        name = name,
398*7594170eSAndroid Build Coastguard Worker        abi_checker_enabled = True,
399*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
400*7594170eSAndroid Build Coastguard Worker    )
401*7594170eSAndroid Build Coastguard Worker
402*7594170eSAndroid Build Coastguard Worker    _abi_linker_action_not_run_for_no_device_test(
403*7594170eSAndroid Build Coastguard Worker        name = test_name,
404*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_abi_dump",
405*7594170eSAndroid Build Coastguard Worker    )
406*7594170eSAndroid Build Coastguard Worker
407*7594170eSAndroid Build Coastguard Worker    return test_name
408*7594170eSAndroid Build Coastguard Worker
409*7594170eSAndroid Build Coastguard Workerdef _test_abi_linker_action_not_run_if_skipped():
410*7594170eSAndroid Build Coastguard Worker    name = "abi_linker_action_not_run_if_skipped"
411*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
412*7594170eSAndroid Build Coastguard Worker
413*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
414*7594170eSAndroid Build Coastguard Worker        name = name,
415*7594170eSAndroid Build Coastguard Worker        abi_checker_enabled = True,
416*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
417*7594170eSAndroid Build Coastguard Worker    )
418*7594170eSAndroid Build Coastguard Worker
419*7594170eSAndroid Build Coastguard Worker    _abi_linker_action_not_run_if_skipped_test(
420*7594170eSAndroid Build Coastguard Worker        name = test_name,
421*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_abi_dump",
422*7594170eSAndroid Build Coastguard Worker    )
423*7594170eSAndroid Build Coastguard Worker
424*7594170eSAndroid Build Coastguard Worker    return test_name
425*7594170eSAndroid Build Coastguard Worker
426*7594170eSAndroid Build Coastguard Workerdef _test_abi_linker_action_not_run_for_coverage_enabled():
427*7594170eSAndroid Build Coastguard Worker    name = "abi_linker_action_not_run_for_coverage_enabled"
428*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
429*7594170eSAndroid Build Coastguard Worker
430*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
431*7594170eSAndroid Build Coastguard Worker        name = name,
432*7594170eSAndroid Build Coastguard Worker        abi_checker_enabled = True,
433*7594170eSAndroid Build Coastguard Worker        features = ["coverage"],
434*7594170eSAndroid Build Coastguard Worker        # Coverage will add an extra lib to all the shared libs, we try to avoid
435*7594170eSAndroid Build Coastguard Worker        # that by clearing the system_dynamic_deps and stl.
436*7594170eSAndroid Build Coastguard Worker        system_dynamic_deps = [],
437*7594170eSAndroid Build Coastguard Worker        stl = "none",
438*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
439*7594170eSAndroid Build Coastguard Worker    )
440*7594170eSAndroid Build Coastguard Worker
441*7594170eSAndroid Build Coastguard Worker    _abi_linker_action_not_run_for_coverage_test(
442*7594170eSAndroid Build Coastguard Worker        name = test_name,
443*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_abi_dump",
444*7594170eSAndroid Build Coastguard Worker    )
445*7594170eSAndroid Build Coastguard Worker
446*7594170eSAndroid Build Coastguard Worker    return test_name
447*7594170eSAndroid Build Coastguard Worker
448*7594170eSAndroid Build Coastguard Workerdef _test_abi_linker_action_not_run_for_apex_no_stubs():
449*7594170eSAndroid Build Coastguard Worker    name = "abi_linker_action_not_run_for_apex_no_stubs"
450*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
451*7594170eSAndroid Build Coastguard Worker
452*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
453*7594170eSAndroid Build Coastguard Worker        name = name,
454*7594170eSAndroid Build Coastguard Worker        abi_checker_enabled = True,
455*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
456*7594170eSAndroid Build Coastguard Worker    )
457*7594170eSAndroid Build Coastguard Worker
458*7594170eSAndroid Build Coastguard Worker    _abi_linker_action_not_run_apex_no_stubs_test(
459*7594170eSAndroid Build Coastguard Worker        name = test_name,
460*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_abi_dump",
461*7594170eSAndroid Build Coastguard Worker    )
462*7594170eSAndroid Build Coastguard Worker
463*7594170eSAndroid Build Coastguard Worker    return test_name
464*7594170eSAndroid Build Coastguard Worker
465*7594170eSAndroid Build Coastguard Workerdef _abi_diff_action_test_impl(ctx):
466*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
467*7594170eSAndroid Build Coastguard Worker    actions = analysistest.target_actions(env)
468*7594170eSAndroid Build Coastguard Worker    diff_actions = [a for a in actions if a.mnemonic == "AbiDiff"]
469*7594170eSAndroid Build Coastguard Worker
470*7594170eSAndroid Build Coastguard Worker    asserts.true(
471*7594170eSAndroid Build Coastguard Worker        env,
472*7594170eSAndroid Build Coastguard Worker        len(diff_actions) == 2,
473*7594170eSAndroid Build Coastguard Worker        "There should be two abi diff actions: %s" % diff_actions,
474*7594170eSAndroid Build Coastguard Worker    )
475*7594170eSAndroid Build Coastguard Worker
476*7594170eSAndroid Build Coastguard Worker    prev_version, version = find_abi_config(ctx)
477*7594170eSAndroid Build Coastguard Worker    _verify_abi_diff_action(ctx, env, diff_actions[0], prev_version, True)
478*7594170eSAndroid Build Coastguard Worker    _verify_abi_diff_action(ctx, env, diff_actions[1], version, False)
479*7594170eSAndroid Build Coastguard Worker
480*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
481*7594170eSAndroid Build Coastguard Worker
482*7594170eSAndroid Build Coastguard Workerdef _verify_abi_diff_action(ctx, env, action, version, is_prev_version):
483*7594170eSAndroid Build Coastguard Worker    bin_home = analysistest.target_bin_dir_path(env)
484*7594170eSAndroid Build Coastguard Worker    bazel_out_base = paths.join(bin_home, ctx.label.package)
485*7594170eSAndroid Build Coastguard Worker    lsdump_file = paths.join(bazel_out_base, ctx.attr.lib_name + ".so.lsdump")
486*7594170eSAndroid Build Coastguard Worker
487*7594170eSAndroid Build Coastguard Worker    ref_dump = paths.join(
488*7594170eSAndroid Build Coastguard Worker        REF_DUMPS_HOME,
489*7594170eSAndroid Build Coastguard Worker        "platform",
490*7594170eSAndroid Build Coastguard Worker        str(version),
491*7594170eSAndroid Build Coastguard Worker        str(BITNESS),
492*7594170eSAndroid Build Coastguard Worker        ARCH,
493*7594170eSAndroid Build Coastguard Worker        "source-based",
494*7594170eSAndroid Build Coastguard Worker        ctx.attr.lib_name + ".so.lsdump",
495*7594170eSAndroid Build Coastguard Worker    )
496*7594170eSAndroid Build Coastguard Worker    asserts.set_equals(
497*7594170eSAndroid Build Coastguard Worker        env,
498*7594170eSAndroid Build Coastguard Worker        expected = sets.make([
499*7594170eSAndroid Build Coastguard Worker            lsdump_file,
500*7594170eSAndroid Build Coastguard Worker            ABI_DIFF,
501*7594170eSAndroid Build Coastguard Worker            ref_dump,
502*7594170eSAndroid Build Coastguard Worker        ]),
503*7594170eSAndroid Build Coastguard Worker        actual = sets.make([
504*7594170eSAndroid Build Coastguard Worker            file.path
505*7594170eSAndroid Build Coastguard Worker            for file in action.inputs.to_list()
506*7594170eSAndroid Build Coastguard Worker        ]),
507*7594170eSAndroid Build Coastguard Worker    )
508*7594170eSAndroid Build Coastguard Worker
509*7594170eSAndroid Build Coastguard Worker    if is_prev_version:
510*7594170eSAndroid Build Coastguard Worker        diff_file = paths.join(bazel_out_base, ".".join([ctx.attr.lib_name, "so", str(version), "abidiff"]))
511*7594170eSAndroid Build Coastguard Worker    else:
512*7594170eSAndroid Build Coastguard Worker        diff_file = paths.join(bazel_out_base, ".".join([ctx.attr.lib_name, "so", "abidiff"]))
513*7594170eSAndroid Build Coastguard Worker
514*7594170eSAndroid Build Coastguard Worker    asserts.set_equals(
515*7594170eSAndroid Build Coastguard Worker        env,
516*7594170eSAndroid Build Coastguard Worker        expected = sets.make([diff_file]),
517*7594170eSAndroid Build Coastguard Worker        actual = sets.make([
518*7594170eSAndroid Build Coastguard Worker            file.path
519*7594170eSAndroid Build Coastguard Worker            for file in action.outputs.to_list()
520*7594170eSAndroid Build Coastguard Worker        ]),
521*7594170eSAndroid Build Coastguard Worker    )
522*7594170eSAndroid Build Coastguard Worker
523*7594170eSAndroid Build Coastguard Worker    argv = action.argv
524*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "-o", diff_file)
525*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "-old", ref_dump)
526*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "-new", lsdump_file)
527*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "-lib", ctx.attr.lib_name)
528*7594170eSAndroid Build Coastguard Worker    _test_arg_set_correctly(env, argv, "-arch", ARCH)
529*7594170eSAndroid Build Coastguard Worker    _test_arg_exists(env, argv, "-allow-unreferenced-changes")
530*7594170eSAndroid Build Coastguard Worker    _test_arg_exists(env, argv, "-allow-unreferenced-elf-symbol-changes")
531*7594170eSAndroid Build Coastguard Worker    _test_arg_exists(env, argv, "-allow-extensions")
532*7594170eSAndroid Build Coastguard Worker    if is_prev_version:
533*7594170eSAndroid Build Coastguard Worker        _test_arg_set_correctly(env, argv, "-target-version", str(version + 1))
534*7594170eSAndroid Build Coastguard Worker    else:
535*7594170eSAndroid Build Coastguard Worker        _test_arg_set_correctly(env, argv, "-target-version", "current")
536*7594170eSAndroid Build Coastguard Worker
537*7594170eSAndroid Build Coastguard Worker__abi_diff_action_test = analysistest.make(
538*7594170eSAndroid Build Coastguard Worker    impl = _abi_diff_action_test_impl,
539*7594170eSAndroid Build Coastguard Worker    attrs = {
540*7594170eSAndroid Build Coastguard Worker        "lib_name": attr.string(),
541*7594170eSAndroid Build Coastguard Worker        "_platform_utils": attr.label(default = Label("//build/bazel/platforms:platform_utils")),
542*7594170eSAndroid Build Coastguard Worker    },
543*7594170eSAndroid Build Coastguard Worker)
544*7594170eSAndroid Build Coastguard Worker
545*7594170eSAndroid Build Coastguard Workerdef _abi_diff_action_test(**kwargs):
546*7594170eSAndroid Build Coastguard Worker    __abi_diff_action_test(
547*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [
548*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/arch:x86_64",
549*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/os:android",
550*7594170eSAndroid Build Coastguard Worker        ],
551*7594170eSAndroid Build Coastguard Worker        **kwargs
552*7594170eSAndroid Build Coastguard Worker    )
553*7594170eSAndroid Build Coastguard Worker
554*7594170eSAndroid Build Coastguard Workerdef _test_abi_diff_action():
555*7594170eSAndroid Build Coastguard Worker    name = "abi_diff_action"
556*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
557*7594170eSAndroid Build Coastguard Worker
558*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
559*7594170eSAndroid Build Coastguard Worker        name = name,
560*7594170eSAndroid Build Coastguard Worker        srcs = ["shared.cpp"],
561*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
562*7594170eSAndroid Build Coastguard Worker    )
563*7594170eSAndroid Build Coastguard Worker
564*7594170eSAndroid Build Coastguard Worker    lib_name = "lib" + name
565*7594170eSAndroid Build Coastguard Worker    abi_dump_name = name + "_abi_dump_new"
566*7594170eSAndroid Build Coastguard Worker    abi_dump(
567*7594170eSAndroid Build Coastguard Worker        name = abi_dump_name,
568*7594170eSAndroid Build Coastguard Worker        shared = name + "_stripped",
569*7594170eSAndroid Build Coastguard Worker        root = name + "__internal_root",
570*7594170eSAndroid Build Coastguard Worker        soname = lib_name + ".so",
571*7594170eSAndroid Build Coastguard Worker        enabled = True,
572*7594170eSAndroid Build Coastguard Worker        abi_ref_dumps_platform = "//build/bazel/rules/abi/abi-dumps/platform:bp2build_all_srcs",
573*7594170eSAndroid Build Coastguard Worker        ref_dumps_home = "build/bazel/rules/abi/abi-dumps",
574*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
575*7594170eSAndroid Build Coastguard Worker    )
576*7594170eSAndroid Build Coastguard Worker
577*7594170eSAndroid Build Coastguard Worker    _abi_diff_action_test(
578*7594170eSAndroid Build Coastguard Worker        name = test_name,
579*7594170eSAndroid Build Coastguard Worker        target_under_test = abi_dump_name,
580*7594170eSAndroid Build Coastguard Worker        lib_name = lib_name,
581*7594170eSAndroid Build Coastguard Worker    )
582*7594170eSAndroid Build Coastguard Worker
583*7594170eSAndroid Build Coastguard Worker    return test_name
584*7594170eSAndroid Build Coastguard Worker
585*7594170eSAndroid Build Coastguard Workerdef _abi_diff_action_not_run_test_impl(ctx):
586*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
587*7594170eSAndroid Build Coastguard Worker    actions = analysistest.target_actions(env)
588*7594170eSAndroid Build Coastguard Worker    diff_actions = [a for a in actions if a.mnemonic == "AbiDiff"]
589*7594170eSAndroid Build Coastguard Worker
590*7594170eSAndroid Build Coastguard Worker    asserts.true(
591*7594170eSAndroid Build Coastguard Worker        env,
592*7594170eSAndroid Build Coastguard Worker        len(diff_actions) == 0,
593*7594170eSAndroid Build Coastguard Worker        "Abi diff action found: %s" % diff_actions,
594*7594170eSAndroid Build Coastguard Worker    )
595*7594170eSAndroid Build Coastguard Worker
596*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
597*7594170eSAndroid Build Coastguard Worker
598*7594170eSAndroid Build Coastguard Worker__abi_diff_action_not_run_test = analysistest.make(
599*7594170eSAndroid Build Coastguard Worker    impl = _abi_diff_action_not_run_test_impl,
600*7594170eSAndroid Build Coastguard Worker)
601*7594170eSAndroid Build Coastguard Worker
602*7594170eSAndroid Build Coastguard Workerdef _abi_diff_action_not_run_test(**kwargs):
603*7594170eSAndroid Build Coastguard Worker    __abi_diff_action_not_run_test(
604*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [
605*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/arch:x86_64",
606*7594170eSAndroid Build Coastguard Worker            "//build/bazel_common_rules/platforms/os:android",
607*7594170eSAndroid Build Coastguard Worker        ],
608*7594170eSAndroid Build Coastguard Worker        **kwargs
609*7594170eSAndroid Build Coastguard Worker    )
610*7594170eSAndroid Build Coastguard Worker
611*7594170eSAndroid Build Coastguard Workerdef _test_abi_diff_action_not_run_if_no_ref_dump_found():
612*7594170eSAndroid Build Coastguard Worker    name = "abi_diff_action_not_run_if_no_ref_dump_found"
613*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
614*7594170eSAndroid Build Coastguard Worker
615*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
616*7594170eSAndroid Build Coastguard Worker        name = name,
617*7594170eSAndroid Build Coastguard Worker        srcs = ["shared.cpp"],
618*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
619*7594170eSAndroid Build Coastguard Worker    )
620*7594170eSAndroid Build Coastguard Worker
621*7594170eSAndroid Build Coastguard Worker    lib_name = "lib" + name
622*7594170eSAndroid Build Coastguard Worker    abi_dump_name = name + "_abi_dump_new"
623*7594170eSAndroid Build Coastguard Worker    abi_dump(
624*7594170eSAndroid Build Coastguard Worker        name = abi_dump_name,
625*7594170eSAndroid Build Coastguard Worker        shared = name + "_stripped",
626*7594170eSAndroid Build Coastguard Worker        root = name + "__internal_root",
627*7594170eSAndroid Build Coastguard Worker        soname = lib_name + ".so",
628*7594170eSAndroid Build Coastguard Worker        enabled = True,
629*7594170eSAndroid Build Coastguard Worker        ref_dumps_home = "build/bazel/rules/abi/abi-dumps",
630*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
631*7594170eSAndroid Build Coastguard Worker    )
632*7594170eSAndroid Build Coastguard Worker
633*7594170eSAndroid Build Coastguard Worker    _abi_diff_action_not_run_test(
634*7594170eSAndroid Build Coastguard Worker        name = test_name,
635*7594170eSAndroid Build Coastguard Worker        target_under_test = abi_dump_name,
636*7594170eSAndroid Build Coastguard Worker    )
637*7594170eSAndroid Build Coastguard Worker
638*7594170eSAndroid Build Coastguard Worker    return test_name
639*7594170eSAndroid Build Coastguard Worker
640*7594170eSAndroid Build Coastguard Workerdef _test_arg_set_correctly(env, argv, arg_name, expected):
641*7594170eSAndroid Build Coastguard Worker    arg = get_arg_value(argv, arg_name)
642*7594170eSAndroid Build Coastguard Worker    asserts.true(
643*7594170eSAndroid Build Coastguard Worker        env,
644*7594170eSAndroid Build Coastguard Worker        arg == expected,
645*7594170eSAndroid Build Coastguard Worker        "%s is not set correctly: expected %s, actual %s" % (arg_name, expected, arg),
646*7594170eSAndroid Build Coastguard Worker    )
647*7594170eSAndroid Build Coastguard Worker
648*7594170eSAndroid Build Coastguard Workerdef _test_arg_set_multi_values_correctly(env, argv, arg_name, expected):
649*7594170eSAndroid Build Coastguard Worker    args = get_arg_values(argv, arg_name)
650*7594170eSAndroid Build Coastguard Worker    asserts.set_equals(
651*7594170eSAndroid Build Coastguard Worker        env,
652*7594170eSAndroid Build Coastguard Worker        expected = sets.make(expected),
653*7594170eSAndroid Build Coastguard Worker        actual = sets.make(args),
654*7594170eSAndroid Build Coastguard Worker    )
655*7594170eSAndroid Build Coastguard Worker
656*7594170eSAndroid Build Coastguard Workerdef _test_arg_exists(env, argv, arg_name):
657*7594170eSAndroid Build Coastguard Worker    asserts.true(
658*7594170eSAndroid Build Coastguard Worker        env,
659*7594170eSAndroid Build Coastguard Worker        arg_name in argv,
660*7594170eSAndroid Build Coastguard Worker        "arg %s is not found" % arg_name,
661*7594170eSAndroid Build Coastguard Worker    )
662*7594170eSAndroid Build Coastguard Worker
663*7594170eSAndroid Build Coastguard Workerdef abi_dump_test_suite(name):
664*7594170eSAndroid Build Coastguard Worker    native.test_suite(
665*7594170eSAndroid Build Coastguard Worker        name = name,
666*7594170eSAndroid Build Coastguard Worker        tests = [
667*7594170eSAndroid Build Coastguard Worker            _test_abi_linker_action(),
668*7594170eSAndroid Build Coastguard Worker            _test_abi_linker_action_not_run_for_default(),
669*7594170eSAndroid Build Coastguard Worker            _test_abi_linker_action_not_run_for_disabled(),
670*7594170eSAndroid Build Coastguard Worker            _test_abi_linker_action_run_for_enabled(),
671*7594170eSAndroid Build Coastguard Worker            _test_abi_linker_action_not_run_for_no_device(),
672*7594170eSAndroid Build Coastguard Worker            _test_abi_linker_action_not_run_for_coverage_enabled(),
673*7594170eSAndroid Build Coastguard Worker            _test_abi_linker_action_not_run_if_skipped(),
674*7594170eSAndroid Build Coastguard Worker            _test_abi_linker_action_not_run_for_apex_no_stubs(),
675*7594170eSAndroid Build Coastguard Worker            _test_abi_diff_action(),
676*7594170eSAndroid Build Coastguard Worker            _test_abi_diff_action_not_run_if_no_ref_dump_found(),
677*7594170eSAndroid Build Coastguard Worker        ],
678*7594170eSAndroid Build Coastguard Worker    )
679