xref: /aosp_15_r20/external/bazelbuild-rules_rust/test/unit/toolchain/toolchain_test.bzl (revision d4726bddaa87cc4778e7472feed243fa4b6c267f)
1"""Unit tests for rust toolchains."""
2
3load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
4load("@bazel_skylib//rules:write_file.bzl", "write_file")
5load("@rules_rust_toolchain_test_target_json//:defs.bzl", "TARGET_JSON")
6load("//rust:toolchain.bzl", "rust_stdlib_filegroup", "rust_toolchain")
7load("//rust/platform:triple.bzl", "triple")
8
9def _toolchain_specifies_target_triple_test_impl(ctx):
10    env = analysistest.begin(ctx)
11    toolchain_info = analysistest.target_under_test(env)[platform_common.ToolchainInfo]
12
13    asserts.equals(env, None, toolchain_info.target_json)
14    asserts.equals(env, "toolchain-test-triple", toolchain_info.target_flag_value)
15    asserts.equals(env, triple("toolchain-test-triple"), toolchain_info.target_triple)
16    asserts.equals(env, "toolchain", toolchain_info.target_arch)
17
18    return analysistest.end(env)
19
20def _toolchain_specifies_target_json_test_impl(ctx):
21    env = analysistest.begin(ctx)
22    target = analysistest.target_under_test(env)
23    toolchain_info = target[platform_common.ToolchainInfo]
24
25    asserts.equals(env, None, toolchain_info.target_triple)
26    asserts.equals(env, "x86_64", toolchain_info.target_arch)
27
28    # The specific name here is not as vaulable as identifying that `target_json` is a json file
29    expected_basename = "{}.target.json".format(target.label.name)
30    asserts.equals(env, expected_basename, toolchain_info.target_json.basename)
31
32    # The value is expected to be to a generated file in bazel-out.
33    asserts.true(env, toolchain_info.target_flag_value.startswith("bazel-out/"))
34    asserts.true(env, toolchain_info.target_flag_value.endswith("/bin/{}/{}".format(ctx.label.package, expected_basename)))
35
36    return analysistest.end(env)
37
38def _toolchain_location_expands_linkflags_impl(ctx):
39    env = analysistest.begin(ctx)
40    toolchain_info = analysistest.target_under_test(env)[platform_common.ToolchainInfo]
41
42    asserts.equals(
43        env,
44        "test:test/unit/toolchain/config.txt",
45        toolchain_info.stdlib_linkflags.linking_context.linker_inputs.to_list()[0].user_link_flags[0],
46    )
47
48    return analysistest.end(env)
49
50def _toolchain_location_expands_extra_rustc_flags_impl(ctx):
51    env = analysistest.begin(ctx)
52    toolchain_info = analysistest.target_under_test(env)[platform_common.ToolchainInfo]
53
54    asserts.equals(
55        env,
56        "extra_rustc_flags:test/unit/toolchain/config.txt",
57        toolchain_info.extra_rustc_flags[0],
58    )
59
60    return analysistest.end(env)
61
62def _std_libs_support_srcs_outside_package_test_impl(ctx):
63    env = analysistest.begin(ctx)
64    tut = analysistest.target_under_test(env)
65    actions = analysistest.target_actions(env)
66
67    symlinks = [a for a in actions if a.mnemonic == "Symlink"]
68    asserts.equals(env, 2, len(symlinks))
69
70    rlib_symlink = symlinks[0].outputs.to_list()[0]
71    asserts.equals(env, tut.label.package + "/core.rlib", rlib_symlink.short_path)
72
73    a_symlink = symlinks[1].outputs.to_list()[0]
74    asserts.equals(env, tut.label.package + "/libcore.a", a_symlink.short_path)
75
76    return analysistest.end(env)
77
78toolchain_specifies_target_triple_test = analysistest.make(_toolchain_specifies_target_triple_test_impl)
79toolchain_specifies_target_json_test = analysistest.make(_toolchain_specifies_target_json_test_impl)
80toolchain_location_expands_linkflags_test = analysistest.make(_toolchain_location_expands_linkflags_impl)
81toolchain_location_expands_extra_rustc_flags_test = analysistest.make(_toolchain_location_expands_extra_rustc_flags_impl)
82std_libs_support_srcs_outside_package_test = analysistest.make(_std_libs_support_srcs_outside_package_test_impl)
83
84def _define_test_targets():
85    native.filegroup(
86        name = "stdlib_srcs",
87        srcs = ["config.txt"],
88    )
89    rust_stdlib_filegroup(
90        name = "std_libs",
91        srcs = [":stdlib_srcs"],
92    )
93
94    rust_stdlib_filegroup(
95        name = "std_libs_with_srcs_outside_package",
96        srcs = ["//test/unit/toolchain/subpackage:std_libs_srcs"],
97    )
98
99    native.filegroup(
100        name = "target_json",
101        srcs = ["toolchain-test-triple.json"],
102    )
103
104    write_file(
105        name = "mock_rustc",
106        out = "mock_rustc.exe",
107        content = [],
108        is_executable = True,
109    )
110
111    write_file(
112        name = "mock_rustdoc",
113        out = "mock_rustdoc.exe",
114        content = [],
115        is_executable = True,
116    )
117
118    rust_toolchain(
119        name = "rust_triple_toolchain",
120        binary_ext = "",
121        dylib_ext = ".so",
122        exec_triple = "x86_64-unknown-none",
123        rust_doc = ":mock_rustdoc",
124        rust_std = ":std_libs",
125        rustc = ":mock_rustc",
126        staticlib_ext = ".a",
127        stdlib_linkflags = [],
128        target_triple = "toolchain-test-triple",
129    )
130
131    encoded_target_json = json.encode(TARGET_JSON)
132
133    rust_toolchain(
134        name = "rust_json_toolchain",
135        binary_ext = "",
136        dylib_ext = ".so",
137        exec_triple = "x86_64-unknown-none",
138        rust_doc = ":mock_rustdoc",
139        rust_std = ":std_libs",
140        rustc = ":mock_rustc",
141        staticlib_ext = ".a",
142        stdlib_linkflags = [],
143        target_json = encoded_target_json,
144    )
145
146    rust_toolchain(
147        name = "rust_inline_json_toolchain",
148        binary_ext = "",
149        dylib_ext = ".so",
150        exec_triple = "x86_64-unknown-none",
151        rust_doc = ":mock_rustdoc",
152        rust_std = ":std_libs",
153        rustc = ":mock_rustc",
154        staticlib_ext = ".a",
155        stdlib_linkflags = [],
156        target_json = json.encode(
157            {
158                "arch": "x86_64",
159                "env": "gnu",
160                "llvm-target": "x86_64-unknown-linux-gnu",
161                "target-family": ["unix"],
162                "target-pointer-width": "64",
163            },
164        ),
165    )
166
167    rust_toolchain(
168        name = "rust_location_expand_toolchain",
169        binary_ext = "",
170        dylib_ext = ".so",
171        exec_triple = "x86_64-unknown-none",
172        rust_doc = ":mock_rustdoc",
173        rust_std = ":std_libs",
174        rustc = ":mock_rustc",
175        staticlib_ext = ".a",
176        stdlib_linkflags = ["test:$(location :stdlib_srcs)"],
177        extra_rustc_flags = ["extra_rustc_flags:$(location :stdlib_srcs)"],
178        target_json = encoded_target_json,
179    )
180
181def toolchain_test_suite(name):
182    """Entry-point macro called from the BUILD file.
183
184    Args:
185        name (str): The name of the test suite.
186    """
187    _define_test_targets()
188
189    toolchain_specifies_target_triple_test(
190        name = "toolchain_specifies_target_triple_test",
191        target_under_test = ":rust_triple_toolchain",
192    )
193    toolchain_specifies_target_json_test(
194        name = "toolchain_specifies_target_json_test",
195        target_under_test = ":rust_json_toolchain",
196    )
197    toolchain_specifies_target_json_test(
198        name = "toolchain_specifies_inline_target_json_test",
199        target_under_test = ":rust_inline_json_toolchain",
200    )
201    toolchain_location_expands_linkflags_test(
202        name = "toolchain_location_expands_linkflags_test",
203        target_under_test = ":rust_location_expand_toolchain",
204    )
205    toolchain_location_expands_extra_rustc_flags_test(
206        name = "toolchain_location_expands_extra_rustc_flags_test",
207        target_under_test = ":rust_location_expand_toolchain",
208    )
209    std_libs_support_srcs_outside_package_test(
210        name = "std_libs_support_srcs_outside_package_test",
211        target_under_test = ":std_libs_with_srcs_outside_package",
212    )
213
214    native.test_suite(
215        name = name,
216        tests = [
217            ":toolchain_specifies_target_triple_test",
218            ":toolchain_specifies_target_json_test",
219            ":toolchain_specifies_inline_target_json_test",
220            ":toolchain_location_expands_linkflags_test",
221            ":toolchain_location_expands_extra_rustc_flags_test",
222            ":std_libs_support_srcs_outside_package_test",
223        ],
224    )
225