1"""Analysis tests for cargo_build_script.""" 2 3load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") 4load("//cargo:defs.bzl", "cargo_build_script") 5load("//rust:defs.bzl", "rust_library") 6 7DepActionsInfo = provider( 8 "Contains information about dependencies' actions.", 9 fields = {"actions": "List[Action]"}, 10) 11 12def _collect_dep_actions_aspect_impl(target, ctx): 13 actions = [] 14 actions.extend(target.actions) 15 for dep in ctx.rule.attr.deps: 16 actions.extend(dep[DepActionsInfo].actions) 17 return [DepActionsInfo(actions = actions)] 18 19collect_dep_actions_aspect = aspect( 20 implementation = _collect_dep_actions_aspect_impl, 21 attr_aspects = ["deps"], 22) 23 24def _outputs_contain(outputs, substring): 25 for output in outputs.to_list(): 26 if substring in output.path: 27 return True 28 return False 29 30def _build_script_deps_test_impl(ctx): 31 env = analysistest.begin(ctx) 32 target = analysistest.target_under_test(env) 33 build_script_deps_action = [ 34 action 35 for action in target[DepActionsInfo].actions 36 if _outputs_contain(action.outputs, "dep_of_a_build_script") 37 ][0] 38 39 rlib_output = [ 40 output 41 for output in build_script_deps_action.outputs.to_list() 42 if output.path.endswith(".rlib") 43 ][0] 44 45 asserts.true(env, "-exec-" in rlib_output.path) 46 return analysistest.end(env) 47 48build_script_deps_test = analysistest.make( 49 _build_script_deps_test_impl, 50 extra_target_under_test_aspects = [collect_dep_actions_aspect], 51) 52 53def build_script_test_suite(name): 54 """Build script analyisis tests. 55 56 Args: 57 name: the test suite name 58 """ 59 rust_library( 60 name = "dep_of_a_build_script", 61 srcs = ["lib.rs"], 62 edition = "2021", 63 ) 64 65 cargo_build_script( 66 name = "build_script_deps_in_exec_mode", 67 srcs = ["build.rs"], 68 deps = [":dep_of_a_build_script"], 69 edition = "2021", 70 ) 71 72 build_script_deps_test( 73 name = "build_script_deps_in_exec_mode_test", 74 target_under_test = ":build_script_deps_in_exec_mode", 75 ) 76 77 native.test_suite( 78 name = name, 79 tests = ["build_script_deps_in_exec_mode_test"], 80 ) 81