summaryrefslogtreecommitdiffhomepage
path: root/test/packetimpact/runner/defs.bzl
blob: ee2e7e974a906002089ad3101c53b05b14211ef8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""Defines rules for packetimpact test targets."""

load("//tools:defs.bzl", "go_test")

def _packetimpact_test_impl(ctx):
    test_runner = ctx.executable._test_runner
    bench = ctx.actions.declare_file("%s-bench" % ctx.label.name)
    bench_content = "\n".join([
        "#!/bin/bash",
        # This test will run part in a distinct user namespace. This can cause
        # permission problems, because all runfiles may not be owned by the
        # current user, and no other users will be mapped in that namespace.
        # Make sure that everything is readable here.
        "find . -type f -or -type d -exec chmod a+rx {} \\;",
        "%s %s --testbench_binary %s $@\n" % (
            test_runner.short_path,
            " ".join(ctx.attr.flags),
            ctx.files.testbench_binary[0].short_path,
        ),
    ])
    ctx.actions.write(bench, bench_content, is_executable = True)

    transitive_files = depset()
    if hasattr(ctx.attr._test_runner, "data_runfiles"):
        transitive_files = depset(ctx.attr._test_runner.data_runfiles.files)
    runfiles = ctx.runfiles(
        files = [test_runner] + ctx.files.testbench_binary + ctx.files._posix_server_binary,
        transitive_files = transitive_files,
        collect_default = True,
        collect_data = True,
    )
    return [DefaultInfo(executable = bench, runfiles = runfiles)]

_packetimpact_test = rule(
    attrs = {
        "_test_runner": attr.label(
            executable = True,
            cfg = "target",
            default = ":packetimpact_test",
        ),
        "_posix_server_binary": attr.label(
            cfg = "target",
            default = "//test/packetimpact/dut:posix_server",
        ),
        "testbench_binary": attr.label(
            cfg = "target",
            mandatory = True,
        ),
        "flags": attr.string_list(
            mandatory = False,
            default = [],
        ),
    },
    test = True,
    implementation = _packetimpact_test_impl,
)

PACKETIMPACT_TAGS = ["local", "manual"]

def packetimpact_linux_test(
        name,
        testbench_binary,
        expect_failure = False,
        **kwargs):
    """Add a packetimpact test on linux.

    Args:
        name: name of the test
        testbench_binary: the testbench binary
        **kwargs: all the other args, forwarded to _packetimpact_test
    """
    expect_failure_flag = ["--expect_failure"] if expect_failure else []
    _packetimpact_test(
        name = name + "_linux_test",
        testbench_binary = testbench_binary,
        flags = ["--dut_platform", "linux"] + expect_failure_flag,
        tags = PACKETIMPACT_TAGS + ["packetimpact"],
        **kwargs
    )

def packetimpact_netstack_test(
        name,
        testbench_binary,
        expect_failure = False,
        **kwargs):
    """Add a packetimpact test on netstack.

    Args:
        name: name of the test
        testbench_binary: the testbench binary
        expect_failure: the test must fail
        **kwargs: all the other args, forwarded to _packetimpact_test
    """
    expect_failure_flag = []
    if expect_failure:
        expect_failure_flag = ["--expect_failure"]
    _packetimpact_test(
        name = name + "_netstack_test",
        testbench_binary = testbench_binary,
        # This is the default runtime unless
        # "--test_arg=--runtime=OTHER_RUNTIME" is used to override the value.
        flags = ["--dut_platform", "netstack", "--runtime=runsc-d"] + expect_failure_flag,
        tags = PACKETIMPACT_TAGS + ["packetimpact"],
        **kwargs
    )

def packetimpact_go_test(name, size = "small", pure = True, linux = True, netstack = True, **kwargs):
    """Add packetimpact tests written in go.

    Args:
        name: name of the test
        size: size of the test
        pure: make a static go binary
        linux: generate a linux test
        netstack: generate a netstack test
        **kwargs: all the other args, forwarded to go_test
    """
    testbench_binary = name + "_test"
    go_test(
        name = testbench_binary,
        size = size,
        pure = pure,
        tags = PACKETIMPACT_TAGS,
        **kwargs
    )
    packetimpact_linux_test(
        name = name,
        expect_failure = not linux,
        testbench_binary = testbench_binary,
    )
    packetimpact_netstack_test(
        name = name,
        expect_failure = not netstack,
        testbench_binary = testbench_binary,
    )