xref: /aosp_15_r20/external/bazelbuild-rules_rust/test/unit/native_deps/native_action_inputs_test.bzl (revision d4726bddaa87cc4778e7472feed243fa4b6c267f)
1"""Unittests for rust rules."""
2
3load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
4load(
5    "//rust:defs.bzl",
6    "rust_binary",
7    "rust_common",
8    "rust_library",
9    "rust_proc_macro",
10    "rust_shared_library",
11    "rust_static_library",
12)
13load("//test/unit:common.bzl", "assert_action_mnemonic")
14
15def _get_crate_info(target):
16    return target[rust_common.crate_info] if rust_common.crate_info in target else target[rust_common.test_crate_info].crate
17
18def _native_action_inputs_present_test_impl(ctx):
19    env = analysistest.begin(ctx)
20    tut = analysistest.target_under_test(env)
21    action = tut.actions[0]
22    assert_action_mnemonic(env, action, "Rustc")
23    inputs = action.inputs.to_list()
24    for_shared_library = _get_crate_info(tut).type in ("dylib", "cdylib", "proc-macro")
25    lib_name = _native_dep_lib_name(ctx, for_shared_library)
26
27    asserts.true(
28        env,
29        _has_action_input(lib_name, inputs),
30        "Expected to contain {lib_name} as action input, got {inputs}".format(
31            lib_name = lib_name,
32            inputs = inputs,
33        ),
34    )
35
36    return analysistest.end(env)
37
38def _native_action_inputs_not_present_test_impl(ctx):
39    env = analysistest.begin(ctx)
40    tut = analysistest.target_under_test(env)
41    action = tut.actions[0]
42    for_shared_library = _get_crate_info(tut).type in ("dylib", "cdylib", "proc-macro")
43    assert_action_mnemonic(env, action, "Rustc")
44    inputs = action.inputs.to_list()
45    lib_name = _native_dep_lib_name(ctx, for_shared_library)
46
47    asserts.false(
48        env,
49        _has_action_input(lib_name, inputs),
50        "Expected not to contain {lib_name}".format(lib_name = lib_name),
51    )
52
53    return analysistest.end(env)
54
55def _native_dep_lib_name(ctx, for_shared_library):
56    compilation_mode = ctx.var["COMPILATION_MODE"]
57    if ctx.target_platform_has_constraint(
58        ctx.attr._windows_constraint[platform_common.ConstraintValueInfo],
59    ):
60        return "bar.lib"
61    if ctx.target_platform_has_constraint(
62        ctx.attr._macos_constraint[platform_common.ConstraintValueInfo],
63    ):
64        pic_suffix = ""
65    else:
66        pic_suffix = ".pic" if compilation_mode == "opt" and for_shared_library else ""
67    return "libbar{}.a".format(pic_suffix)
68
69def _has_action_input(name, inputs):
70    for file in inputs:
71        if file.basename == name:
72            return True
73    return False
74
75native_action_inputs_present_test = analysistest.make(
76    _native_action_inputs_present_test_impl,
77    attrs = {
78        "_macos_constraint": attr.label(default = Label("@platforms//os:macos")),
79        "_windows_constraint": attr.label(default = Label("@platforms//os:windows")),
80    },
81)
82native_action_inputs_not_present_test = analysistest.make(
83    _native_action_inputs_not_present_test_impl,
84    attrs = {
85        "_macos_constraint": attr.label(default = Label("@platforms//os:macos")),
86        "_windows_constraint": attr.label(default = Label("@platforms//os:windows")),
87    },
88)
89
90def _native_action_inputs_test():
91    rust_library(
92        name = "foo_lib",
93        srcs = ["foo.rs"],
94        edition = "2018",
95        deps = [":bar"],
96    )
97
98    rust_binary(
99        name = "foo_bin",
100        srcs = ["foo_main.rs"],
101        edition = "2018",
102        deps = [":bar"],
103    )
104
105    rust_shared_library(
106        name = "foo_dylib",
107        srcs = ["foo.rs"],
108        edition = "2018",
109        deps = [":bar"],
110    )
111
112    rust_static_library(
113        name = "foo_static",
114        srcs = ["foo.rs"],
115        edition = "2018",
116        deps = [":bar"],
117    )
118
119    rust_proc_macro(
120        name = "foo_proc_macro",
121        srcs = ["foo.rs"],
122        edition = "2018",
123        deps = [":bar"],
124    )
125
126    # buildifier: disable=native-cc
127    native.cc_library(
128        name = "bar",
129        srcs = ["bar.cc"],
130    )
131
132    native_action_inputs_not_present_test(
133        name = "native_action_inputs_lib_test",
134        target_under_test = ":foo_lib",
135    )
136
137    native_action_inputs_present_test(
138        name = "native_action_inputs_bin_test",
139        target_under_test = ":foo_bin",
140    )
141
142    native_action_inputs_present_test(
143        name = "native_action_inputs_dylib_test",
144        target_under_test = ":foo_dylib",
145    )
146
147    native_action_inputs_present_test(
148        name = "native_action_inputs_static_test",
149        target_under_test = ":foo_static",
150    )
151
152    native_action_inputs_present_test(
153        name = "native_action_inputs_proc_macro_test",
154        target_under_test = ":foo_proc_macro",
155    )
156
157def native_action_inputs_test_suite(name):
158    """Entry-point macro called from the BUILD file.
159
160    Args:
161        name: Name of the macro.
162    """
163    _native_action_inputs_test()
164
165    native.test_suite(
166        name = name,
167        tests = [
168            ":native_action_inputs_lib_test",
169            ":native_action_inputs_bin_test",
170            ":native_action_inputs_dylib_test",
171            ":native_action_inputs_static_test",
172            ":native_action_inputs_proc_macro_test",
173        ],
174    )
175