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
136
137
138
139
140
141
142
143
144
145
|
"""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 = []
if hasattr(ctx.attr._test_runner, "data_runfiles"):
transitive_files.append(ctx.attr._test_runner.data_runfiles.files)
files = [test_runner] + ctx.files.testbench_binary + ctx.files._posix_server
runfiles = ctx.runfiles(
files = files,
transitive_files = depset(transitive = 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": 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",
"packetimpact",
]
def packetimpact_native_test(
name,
testbench_binary,
expect_failure = False,
**kwargs):
"""Add a native packetimpact test.
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 = ["--expect_failure"] if expect_failure else []
_packetimpact_test(
name = name + "_native_test",
testbench_binary = testbench_binary,
flags = ["--native"] + expect_failure_flag,
tags = PACKETIMPACT_TAGS,
**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,
# Note that a distinct runtime must be provided in the form
# --test_arg=--runtime=other when invoking bazel.
flags = expect_failure_flag,
tags = PACKETIMPACT_TAGS,
**kwargs
)
def packetimpact_go_test(name, size = "small", pure = True, expect_native_failure = False, expect_netstack_failure = False, **kwargs):
"""Add packetimpact tests written in go.
Args:
name: name of the test
size: size of the test
pure: make a static go binary
expect_native_failure: the test must fail natively
expect_netstack_failure: the test must fail for Netstack
**kwargs: all the other args, forwarded to go_test
"""
testbench_binary = name + "_test"
go_test(
name = testbench_binary,
size = size,
pure = pure,
nogo = False, # FIXME(gvisor.dev/issue/3374): Not working with all build systems.
tags = [
"local",
"manual",
],
**kwargs
)
packetimpact_native_test(
name = name,
expect_failure = expect_native_failure,
testbench_binary = testbench_binary,
)
packetimpact_netstack_test(
name = name,
expect_failure = expect_netstack_failure,
testbench_binary = testbench_binary,
)
|