summaryrefslogtreecommitdiffhomepage
path: root/test/packetimpact/tests/defs.bzl
blob: 8c0d058b29f4ec22659f94c4ff629ec93266517d (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
"""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 -exec chmod a+rx {} \\;",
        "find . -type d -exec chmod a+rx {} \\;",
        "%s %s --posix_server_binary %s --testbench_binary %s $@\n" % (
            test_runner.short_path,
            " ".join(ctx.attr.flags),
            ctx.files._posix_server_binary[0].short_path,
            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 = ":test_runner",
        ),
        "_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, **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
    """
    _packetimpact_test(
        name = name + "_linux_test",
        testbench_binary = testbench_binary,
        flags = ["--dut_platform", "linux"],
        tags = PACKETIMPACT_TAGS + ["packetimpact"],
        **kwargs
    )

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

    Args:
        name: name of the test
        testbench_binary: the testbench binary
        **kwargs: all the other args, forwarded to _packetimpact_test
    """
    _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"],
        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
    )
    if linux:
        packetimpact_linux_test(name = name, testbench_binary = testbench_binary)
    if netstack:
        packetimpact_netstack_test(name = name, testbench_binary = testbench_binary)