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