• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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