xref: /aosp_15_r20/build/bazel/rules/cc/cc_binary_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:unittest.bzl", "analysistest", "asserts")
16*7594170eSAndroid Build Coastguard Workerload(":cc_binary.bzl", "cc_binary")
17*7594170eSAndroid Build Coastguard Workerload(":cc_library_common_test.bzl", "target_provides_androidmk_info_test")
18*7594170eSAndroid Build Coastguard Workerload(":cc_library_shared.bzl", "cc_library_shared")
19*7594170eSAndroid Build Coastguard Workerload(":cc_library_static.bzl", "cc_library_static")
20*7594170eSAndroid Build Coastguard Worker
21*7594170eSAndroid Build Coastguard Workerdef strip_test_assert_flags(env, strip_action, strip_flags):
22*7594170eSAndroid Build Coastguard Worker    # Extract these flags from strip_action (for example):
23*7594170eSAndroid Build Coastguard Worker    # build/soong/scripts/strip.sh --keep-symbols --add-gnu-debuglink -i <in> -o <out> -d <out>.d
24*7594170eSAndroid Build Coastguard Worker    #                              ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
25*7594170eSAndroid Build Coastguard Worker    flag_start_idx = 1  # starts after the strip.sh executable
26*7594170eSAndroid Build Coastguard Worker    flag_end_idx = strip_action.argv.index("-i")  # end of the flags
27*7594170eSAndroid Build Coastguard Worker    asserts.equals(
28*7594170eSAndroid Build Coastguard Worker        env,
29*7594170eSAndroid Build Coastguard Worker        strip_action.argv[flag_start_idx:flag_end_idx],
30*7594170eSAndroid Build Coastguard Worker        strip_flags,
31*7594170eSAndroid Build Coastguard Worker    )
32*7594170eSAndroid Build Coastguard Worker
33*7594170eSAndroid Build Coastguard Workerdef _cc_binary_strip_test(ctx):
34*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
35*7594170eSAndroid Build Coastguard Worker    actions = analysistest.target_actions(env)
36*7594170eSAndroid Build Coastguard Worker    filtered_actions = [a for a in actions if a.mnemonic == "CcStrip"]
37*7594170eSAndroid Build Coastguard Worker    on_target = ctx.target_platform_has_constraint(
38*7594170eSAndroid Build Coastguard Worker        ctx.attr._android_constraint[platform_common.ConstraintValueInfo],
39*7594170eSAndroid Build Coastguard Worker    )
40*7594170eSAndroid Build Coastguard Worker    if ctx.attr.strip_flags or on_target:
41*7594170eSAndroid Build Coastguard Worker        # expected to find strip flags, so look for a CcStrip action.
42*7594170eSAndroid Build Coastguard Worker        asserts.true(
43*7594170eSAndroid Build Coastguard Worker            env,
44*7594170eSAndroid Build Coastguard Worker            len(filtered_actions) == 1,
45*7594170eSAndroid Build Coastguard Worker            "expected to find an action with CcStrip mnemonic in %s" % actions,
46*7594170eSAndroid Build Coastguard Worker        )
47*7594170eSAndroid Build Coastguard Worker        if ctx.attr.strip_flags or not on_target:
48*7594170eSAndroid Build Coastguard Worker            strip_test_assert_flags(env, filtered_actions[0], ctx.attr.strip_flags)
49*7594170eSAndroid Build Coastguard Worker        return analysistest.end(env)
50*7594170eSAndroid Build Coastguard Worker    else:
51*7594170eSAndroid Build Coastguard Worker        asserts.true(
52*7594170eSAndroid Build Coastguard Worker            env,
53*7594170eSAndroid Build Coastguard Worker            len(filtered_actions) == 0,
54*7594170eSAndroid Build Coastguard Worker            "expected to not find an action with CcStrip mnemonic in %s" % actions,
55*7594170eSAndroid Build Coastguard Worker        )
56*7594170eSAndroid Build Coastguard Worker        return analysistest.end(env)
57*7594170eSAndroid Build Coastguard Worker
58*7594170eSAndroid Build Coastguard Workercc_binary_strip_test = analysistest.make(
59*7594170eSAndroid Build Coastguard Worker    _cc_binary_strip_test,
60*7594170eSAndroid Build Coastguard Worker    attrs = {
61*7594170eSAndroid Build Coastguard Worker        "strip_flags": attr.string_list(),
62*7594170eSAndroid Build Coastguard Worker        "_android_constraint": attr.label(default = Label("//build/bazel_common_rules/platforms/os:android")),
63*7594170eSAndroid Build Coastguard Worker    },
64*7594170eSAndroid Build Coastguard Worker)
65*7594170eSAndroid Build Coastguard Worker
66*7594170eSAndroid Build Coastguard Workerdef _cc_binary_strip_default():
67*7594170eSAndroid Build Coastguard Worker    name = "cc_binary_strip_default"
68*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
69*7594170eSAndroid Build Coastguard Worker
70*7594170eSAndroid Build Coastguard Worker    cc_binary(
71*7594170eSAndroid Build Coastguard Worker        name = name,
72*7594170eSAndroid Build Coastguard Worker        srcs = ["main.cc"],
73*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
74*7594170eSAndroid Build Coastguard Worker    )
75*7594170eSAndroid Build Coastguard Worker
76*7594170eSAndroid Build Coastguard Worker    cc_binary_strip_test(
77*7594170eSAndroid Build Coastguard Worker        name = test_name,
78*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
79*7594170eSAndroid Build Coastguard Worker        strip_flags = [],
80*7594170eSAndroid Build Coastguard Worker    )
81*7594170eSAndroid Build Coastguard Worker
82*7594170eSAndroid Build Coastguard Worker    return test_name
83*7594170eSAndroid Build Coastguard Worker
84*7594170eSAndroid Build Coastguard Workerdef _cc_binary_strip_keep_symbols():
85*7594170eSAndroid Build Coastguard Worker    name = "cc_binary_strip_keep_symbols"
86*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
87*7594170eSAndroid Build Coastguard Worker
88*7594170eSAndroid Build Coastguard Worker    cc_binary(
89*7594170eSAndroid Build Coastguard Worker        name = name,
90*7594170eSAndroid Build Coastguard Worker        srcs = ["main.cc"],
91*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
92*7594170eSAndroid Build Coastguard Worker        strip = {"keep_symbols": True},
93*7594170eSAndroid Build Coastguard Worker    )
94*7594170eSAndroid Build Coastguard Worker
95*7594170eSAndroid Build Coastguard Worker    cc_binary_strip_test(
96*7594170eSAndroid Build Coastguard Worker        name = test_name,
97*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
98*7594170eSAndroid Build Coastguard Worker        strip_flags = [
99*7594170eSAndroid Build Coastguard Worker            "--keep-symbols",
100*7594170eSAndroid Build Coastguard Worker            "--add-gnu-debuglink",
101*7594170eSAndroid Build Coastguard Worker        ],
102*7594170eSAndroid Build Coastguard Worker    )
103*7594170eSAndroid Build Coastguard Worker
104*7594170eSAndroid Build Coastguard Worker    return test_name
105*7594170eSAndroid Build Coastguard Worker
106*7594170eSAndroid Build Coastguard Workerdef _cc_binary_strip_keep_symbols_and_debug_frame():
107*7594170eSAndroid Build Coastguard Worker    name = "cc_binary_strip_keep_symbols_and_debug_frame"
108*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
109*7594170eSAndroid Build Coastguard Worker
110*7594170eSAndroid Build Coastguard Worker    cc_binary(
111*7594170eSAndroid Build Coastguard Worker        name = name,
112*7594170eSAndroid Build Coastguard Worker        srcs = ["main.cc"],
113*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
114*7594170eSAndroid Build Coastguard Worker        strip = {"keep_symbols_and_debug_frame": True},
115*7594170eSAndroid Build Coastguard Worker    )
116*7594170eSAndroid Build Coastguard Worker
117*7594170eSAndroid Build Coastguard Worker    cc_binary_strip_test(
118*7594170eSAndroid Build Coastguard Worker        name = test_name,
119*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
120*7594170eSAndroid Build Coastguard Worker        strip_flags = [
121*7594170eSAndroid Build Coastguard Worker            "--keep-symbols-and-debug-frame",
122*7594170eSAndroid Build Coastguard Worker            "--add-gnu-debuglink",
123*7594170eSAndroid Build Coastguard Worker        ],
124*7594170eSAndroid Build Coastguard Worker    )
125*7594170eSAndroid Build Coastguard Worker
126*7594170eSAndroid Build Coastguard Worker    return test_name
127*7594170eSAndroid Build Coastguard Worker
128*7594170eSAndroid Build Coastguard Workerdef _cc_binary_strip_keep_symbols_list():
129*7594170eSAndroid Build Coastguard Worker    name = "cc_binary_strip_keep_symbols_list"
130*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
131*7594170eSAndroid Build Coastguard Worker
132*7594170eSAndroid Build Coastguard Worker    cc_binary(
133*7594170eSAndroid Build Coastguard Worker        name = name,
134*7594170eSAndroid Build Coastguard Worker        srcs = ["main.cc"],
135*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
136*7594170eSAndroid Build Coastguard Worker        strip = {"keep_symbols_list": ["foo", "bar"]},
137*7594170eSAndroid Build Coastguard Worker    )
138*7594170eSAndroid Build Coastguard Worker
139*7594170eSAndroid Build Coastguard Worker    cc_binary_strip_test(
140*7594170eSAndroid Build Coastguard Worker        name = test_name,
141*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
142*7594170eSAndroid Build Coastguard Worker        strip_flags = [
143*7594170eSAndroid Build Coastguard Worker            "-kfoo,bar",
144*7594170eSAndroid Build Coastguard Worker            "--add-gnu-debuglink",
145*7594170eSAndroid Build Coastguard Worker        ],
146*7594170eSAndroid Build Coastguard Worker    )
147*7594170eSAndroid Build Coastguard Worker
148*7594170eSAndroid Build Coastguard Worker    return test_name
149*7594170eSAndroid Build Coastguard Worker
150*7594170eSAndroid Build Coastguard Workerdef _cc_binary_strip_all():
151*7594170eSAndroid Build Coastguard Worker    name = "cc_binary_strip_all"
152*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
153*7594170eSAndroid Build Coastguard Worker
154*7594170eSAndroid Build Coastguard Worker    cc_binary(
155*7594170eSAndroid Build Coastguard Worker        name = name,
156*7594170eSAndroid Build Coastguard Worker        srcs = ["main.cc"],
157*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
158*7594170eSAndroid Build Coastguard Worker        strip = {"all": True},
159*7594170eSAndroid Build Coastguard Worker    )
160*7594170eSAndroid Build Coastguard Worker
161*7594170eSAndroid Build Coastguard Worker    cc_binary_strip_test(
162*7594170eSAndroid Build Coastguard Worker        name = test_name,
163*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
164*7594170eSAndroid Build Coastguard Worker        strip_flags = [
165*7594170eSAndroid Build Coastguard Worker            "--add-gnu-debuglink",
166*7594170eSAndroid Build Coastguard Worker        ],
167*7594170eSAndroid Build Coastguard Worker    )
168*7594170eSAndroid Build Coastguard Worker
169*7594170eSAndroid Build Coastguard Worker    return test_name
170*7594170eSAndroid Build Coastguard Worker
171*7594170eSAndroid Build Coastguard Workerdef _cc_binary_suffix_test_impl(ctx):
172*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
173*7594170eSAndroid Build Coastguard Worker    target = analysistest.target_under_test(env)
174*7594170eSAndroid Build Coastguard Worker    info = target[DefaultInfo]
175*7594170eSAndroid Build Coastguard Worker    suffix = ctx.attr.suffix
176*7594170eSAndroid Build Coastguard Worker
177*7594170eSAndroid Build Coastguard Worker    outputs = info.files.to_list()
178*7594170eSAndroid Build Coastguard Worker    asserts.true(
179*7594170eSAndroid Build Coastguard Worker        env,
180*7594170eSAndroid Build Coastguard Worker        len(outputs) == 1,
181*7594170eSAndroid Build Coastguard Worker        "Expected 1 output file; got %s" % outputs,
182*7594170eSAndroid Build Coastguard Worker    )
183*7594170eSAndroid Build Coastguard Worker    out = outputs[0]
184*7594170eSAndroid Build Coastguard Worker    asserts.true(
185*7594170eSAndroid Build Coastguard Worker        env,
186*7594170eSAndroid Build Coastguard Worker        out.path.endswith(suffix),
187*7594170eSAndroid Build Coastguard Worker        "Expected output filename to end in `%s`; it was instead %s" % (suffix, out),
188*7594170eSAndroid Build Coastguard Worker    )
189*7594170eSAndroid Build Coastguard Worker
190*7594170eSAndroid Build Coastguard Worker    if ctx.attr.stem:
191*7594170eSAndroid Build Coastguard Worker        asserts.equals(
192*7594170eSAndroid Build Coastguard Worker            env,
193*7594170eSAndroid Build Coastguard Worker            out.basename,
194*7594170eSAndroid Build Coastguard Worker            ctx.attr.stem,
195*7594170eSAndroid Build Coastguard Worker            "Expected output filename %s to be equal to `stem` attribute %s" % (out, ctx.attr.stem),
196*7594170eSAndroid Build Coastguard Worker        )
197*7594170eSAndroid Build Coastguard Worker
198*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
199*7594170eSAndroid Build Coastguard Worker
200*7594170eSAndroid Build Coastguard Workercc_binary_suffix_test = analysistest.make(
201*7594170eSAndroid Build Coastguard Worker    _cc_binary_suffix_test_impl,
202*7594170eSAndroid Build Coastguard Worker    attrs = {
203*7594170eSAndroid Build Coastguard Worker        "stem": attr.string(),
204*7594170eSAndroid Build Coastguard Worker        "suffix": attr.string(),
205*7594170eSAndroid Build Coastguard Worker    },
206*7594170eSAndroid Build Coastguard Worker)
207*7594170eSAndroid Build Coastguard Worker
208*7594170eSAndroid Build Coastguard Workerdef _cc_binary_suffix():
209*7594170eSAndroid Build Coastguard Worker    name = "cc_binary_suffix"
210*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
211*7594170eSAndroid Build Coastguard Worker    suffix = "-suf"
212*7594170eSAndroid Build Coastguard Worker
213*7594170eSAndroid Build Coastguard Worker    cc_binary(
214*7594170eSAndroid Build Coastguard Worker        name,
215*7594170eSAndroid Build Coastguard Worker        srcs = ["src.cc"],
216*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
217*7594170eSAndroid Build Coastguard Worker        suffix = suffix,
218*7594170eSAndroid Build Coastguard Worker    )
219*7594170eSAndroid Build Coastguard Worker    cc_binary_suffix_test(
220*7594170eSAndroid Build Coastguard Worker        name = test_name,
221*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
222*7594170eSAndroid Build Coastguard Worker        suffix = suffix,
223*7594170eSAndroid Build Coastguard Worker    )
224*7594170eSAndroid Build Coastguard Worker    return test_name
225*7594170eSAndroid Build Coastguard Worker
226*7594170eSAndroid Build Coastguard Workerdef _cc_binary_empty_suffix():
227*7594170eSAndroid Build Coastguard Worker    name = "cc_binary_empty_suffix"
228*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
229*7594170eSAndroid Build Coastguard Worker
230*7594170eSAndroid Build Coastguard Worker    cc_binary(
231*7594170eSAndroid Build Coastguard Worker        name,
232*7594170eSAndroid Build Coastguard Worker        srcs = ["src.cc"],
233*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
234*7594170eSAndroid Build Coastguard Worker    )
235*7594170eSAndroid Build Coastguard Worker    cc_binary_suffix_test(
236*7594170eSAndroid Build Coastguard Worker        name = test_name,
237*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
238*7594170eSAndroid Build Coastguard Worker    )
239*7594170eSAndroid Build Coastguard Worker    return test_name
240*7594170eSAndroid Build Coastguard Worker
241*7594170eSAndroid Build Coastguard Workerdef _cc_binary_with_stem():
242*7594170eSAndroid Build Coastguard Worker    name = "cc_binary_with_stem"
243*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
244*7594170eSAndroid Build Coastguard Worker
245*7594170eSAndroid Build Coastguard Worker    cc_binary(
246*7594170eSAndroid Build Coastguard Worker        name,
247*7594170eSAndroid Build Coastguard Worker        srcs = ["src.cc"],
248*7594170eSAndroid Build Coastguard Worker        stem = "bar",
249*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
250*7594170eSAndroid Build Coastguard Worker    )
251*7594170eSAndroid Build Coastguard Worker    cc_binary_suffix_test(
252*7594170eSAndroid Build Coastguard Worker        name = test_name,
253*7594170eSAndroid Build Coastguard Worker        stem = "bar",
254*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
255*7594170eSAndroid Build Coastguard Worker    )
256*7594170eSAndroid Build Coastguard Worker    return test_name
257*7594170eSAndroid Build Coastguard Worker
258*7594170eSAndroid Build Coastguard Workerdef _cc_binary_provides_androidmk_info():
259*7594170eSAndroid Build Coastguard Worker    name = "cc_binary_provides_androidmk_info"
260*7594170eSAndroid Build Coastguard Worker    dep_name = name + "_static_dep"
261*7594170eSAndroid Build Coastguard Worker    whole_archive_dep_name = name + "_whole_archive_dep"
262*7594170eSAndroid Build Coastguard Worker    dynamic_dep_name = name + "_dynamic_dep"
263*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
264*7594170eSAndroid Build Coastguard Worker
265*7594170eSAndroid Build Coastguard Worker    cc_library_static(
266*7594170eSAndroid Build Coastguard Worker        name = dep_name,
267*7594170eSAndroid Build Coastguard Worker        srcs = ["foo.c"],
268*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
269*7594170eSAndroid Build Coastguard Worker    )
270*7594170eSAndroid Build Coastguard Worker    cc_library_static(
271*7594170eSAndroid Build Coastguard Worker        name = whole_archive_dep_name,
272*7594170eSAndroid Build Coastguard Worker        srcs = ["foo.c"],
273*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
274*7594170eSAndroid Build Coastguard Worker    )
275*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
276*7594170eSAndroid Build Coastguard Worker        name = dynamic_dep_name,
277*7594170eSAndroid Build Coastguard Worker        srcs = ["foo.c"],
278*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
279*7594170eSAndroid Build Coastguard Worker    )
280*7594170eSAndroid Build Coastguard Worker    cc_binary(
281*7594170eSAndroid Build Coastguard Worker        name = name,
282*7594170eSAndroid Build Coastguard Worker        srcs = ["foo.cc"],
283*7594170eSAndroid Build Coastguard Worker        deps = [dep_name],
284*7594170eSAndroid Build Coastguard Worker        whole_archive_deps = [whole_archive_dep_name],
285*7594170eSAndroid Build Coastguard Worker        dynamic_deps = [dynamic_dep_name],
286*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
287*7594170eSAndroid Build Coastguard Worker    )
288*7594170eSAndroid Build Coastguard Worker    android_test_name = test_name + "_android"
289*7594170eSAndroid Build Coastguard Worker    linux_test_name = test_name + "_linux"
290*7594170eSAndroid Build Coastguard Worker    target_provides_androidmk_info_test(
291*7594170eSAndroid Build Coastguard Worker        name = android_test_name,
292*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
293*7594170eSAndroid Build Coastguard Worker        expected_static_libs = [dep_name, "libc++demangle", "libunwind"],
294*7594170eSAndroid Build Coastguard Worker        expected_whole_static_libs = [whole_archive_dep_name],
295*7594170eSAndroid Build Coastguard Worker        expected_shared_libs = [dynamic_dep_name, "libc++", "libc_stub_libs-current", "libdl_stub_libs-current", "libm_stub_libs-current"],
296*7594170eSAndroid Build Coastguard Worker        target_compatible_with = ["//build/bazel_common_rules/platforms/os:android"],
297*7594170eSAndroid Build Coastguard Worker    )
298*7594170eSAndroid Build Coastguard Worker    target_provides_androidmk_info_test(
299*7594170eSAndroid Build Coastguard Worker        name = linux_test_name,
300*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
301*7594170eSAndroid Build Coastguard Worker        expected_static_libs = [dep_name],
302*7594170eSAndroid Build Coastguard Worker        expected_whole_static_libs = [whole_archive_dep_name],
303*7594170eSAndroid Build Coastguard Worker        expected_shared_libs = [dynamic_dep_name, "libc++"],
304*7594170eSAndroid Build Coastguard Worker        target_compatible_with = ["//build/bazel_common_rules/platforms/os:linux"],
305*7594170eSAndroid Build Coastguard Worker    )
306*7594170eSAndroid Build Coastguard Worker    return [
307*7594170eSAndroid Build Coastguard Worker        android_test_name,
308*7594170eSAndroid Build Coastguard Worker        linux_test_name,
309*7594170eSAndroid Build Coastguard Worker    ]
310*7594170eSAndroid Build Coastguard Worker
311*7594170eSAndroid Build Coastguard Workerdef _cc_bad_linkopts_test_impl(ctx):
312*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
313*7594170eSAndroid Build Coastguard Worker    if ctx.target_platform_has_constraint(ctx.attr._android_constraint[platform_common.ConstraintValueInfo]):
314*7594170eSAndroid Build Coastguard Worker        asserts.expect_failure(env, "Library requested via -l is not supported for device builds. Use implementation_deps instead.")
315*7594170eSAndroid Build Coastguard Worker    else:
316*7594170eSAndroid Build Coastguard Worker        asserts.expect_failure(env, "Host library(s) requested via -l is not available in the toolchain.")
317*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
318*7594170eSAndroid Build Coastguard Worker
319*7594170eSAndroid Build Coastguard Workercc_bad_linkopts_test = analysistest.make(
320*7594170eSAndroid Build Coastguard Worker    _cc_bad_linkopts_test_impl,
321*7594170eSAndroid Build Coastguard Worker    expect_failure = True,
322*7594170eSAndroid Build Coastguard Worker    attrs = {
323*7594170eSAndroid Build Coastguard Worker        "_android_constraint": attr.label(
324*7594170eSAndroid Build Coastguard Worker            default = Label("//build/bazel_common_rules/platforms/os:android"),
325*7594170eSAndroid Build Coastguard Worker        ),
326*7594170eSAndroid Build Coastguard Worker    },
327*7594170eSAndroid Build Coastguard Worker)
328*7594170eSAndroid Build Coastguard Worker
329*7594170eSAndroid Build Coastguard Worker# Test that an error is raised if a user requests a library that is not available in the toolchain.
330*7594170eSAndroid Build Coastguard Workerdef _cc_binary_bad_linkopts():
331*7594170eSAndroid Build Coastguard Worker    subject_name = "cc_binary_bad_linkopts"
332*7594170eSAndroid Build Coastguard Worker    test_name = subject_name + "_test"
333*7594170eSAndroid Build Coastguard Worker
334*7594170eSAndroid Build Coastguard Worker    cc_binary(
335*7594170eSAndroid Build Coastguard Worker        name = subject_name,
336*7594170eSAndroid Build Coastguard Worker        linkopts = ["-lunknown"],
337*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
338*7594170eSAndroid Build Coastguard Worker    )
339*7594170eSAndroid Build Coastguard Worker    cc_bad_linkopts_test(
340*7594170eSAndroid Build Coastguard Worker        name = test_name,
341*7594170eSAndroid Build Coastguard Worker        target_under_test = subject_name,
342*7594170eSAndroid Build Coastguard Worker    )
343*7594170eSAndroid Build Coastguard Worker    return test_name
344*7594170eSAndroid Build Coastguard Worker
345*7594170eSAndroid Build Coastguard Workerdef cc_binary_test_suite(name):
346*7594170eSAndroid Build Coastguard Worker    native.test_suite(
347*7594170eSAndroid Build Coastguard Worker        name = name,
348*7594170eSAndroid Build Coastguard Worker        tests = [
349*7594170eSAndroid Build Coastguard Worker            _cc_binary_strip_default(),
350*7594170eSAndroid Build Coastguard Worker            _cc_binary_strip_keep_symbols(),
351*7594170eSAndroid Build Coastguard Worker            _cc_binary_strip_keep_symbols_and_debug_frame(),
352*7594170eSAndroid Build Coastguard Worker            _cc_binary_strip_keep_symbols_list(),
353*7594170eSAndroid Build Coastguard Worker            _cc_binary_strip_all(),
354*7594170eSAndroid Build Coastguard Worker            _cc_binary_suffix(),
355*7594170eSAndroid Build Coastguard Worker            _cc_binary_empty_suffix(),
356*7594170eSAndroid Build Coastguard Worker            _cc_binary_with_stem(),
357*7594170eSAndroid Build Coastguard Worker            _cc_binary_bad_linkopts(),
358*7594170eSAndroid Build Coastguard Worker        ] + _cc_binary_provides_androidmk_info(),
359*7594170eSAndroid Build Coastguard Worker    )
360