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