Skip to content

Commit d19cc25

Browse files
committed
Script tests
Add E2E scripts for script worker, exercising unit and distribution modes.
1 parent bc9a937 commit d19cc25

11 files changed

Lines changed: 304 additions & 18 deletions

File tree

Dockerfile.build renamed to Containerfile

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM registry.fedoraproject.org/fedora:43
1+
FROM registry.fedoraproject.org/fedora:43 as builder
22

33
RUN dnf install -y \
44
rust \
@@ -30,6 +30,18 @@ RUN cargo clippy -- -D warnings
3030
RUN cargo build -r
3131

3232
# Test will require stub binary to be available
33-
ENV PATH="${PATH}:/berserker"
33+
ENV PATH="${PATH}:/berserker:/berserker/target/release"
3434

3535
RUN cargo test
36+
37+
FROM registry.fedoraproject.org/fedora:43
38+
39+
RUN mkdir /etc/berserker
40+
41+
COPY --from=builder /berserker/target/release/berserker /usr/local/bin/berserker
42+
COPY --from=builder /berserker/workload.toml /etc/berserker/workload.toml
43+
COPY --from=builder /berserker/stub /usr/local/bin/stub
44+
45+
ENV PATH="${PATH}:/usr/local/bin"
46+
47+
ENTRYPOINT berserker

Containerfile.test

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
FROM berserker:latest
2+
3+
RUN dnf install -y \
4+
which \
5+
bpftrace \
6+
bpftool \
7+
procps-ng
8+
9+
# Test will require stub binary to be available
10+
ENV PATH="${PATH}:/berserker:/usr/local/bin"
11+
12+
ADD ./tests /tests/
13+
14+
ENTRYPOINT ["/tests/entrypoint.sh"]

Dockerfile

Lines changed: 0 additions & 13 deletions
This file was deleted.

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ ifeq ($(BERSERKER_TAG),)
44
BERSERKER_TAG=$(shell git describe --tags --abbrev=10 --dirty)
55
endif
66

7-
87
.PHONY: all
98
all:
10-
docker build -t builder -f Dockerfile.build .
11-
docker build -t berserker .
9+
docker build -t berserker -f Containerfile .
10+
docker build -t berserker-test -f Containerfile.test .
11+
docker run --privileged berserker-test
1212

1313
.PHONY: build-network
1414
build-berserker-network:

tests/entrypoint.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/usr/bin/env bash
2+
mount -t debugfs none /sys/kernel/debug
3+
4+
./tests/workers/script/unit/smoke.sh

tests/workers/script/dist/smoke.sh

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#!/usr/bin/env bash
2+
set -eou pipefail
3+
4+
stop() { echo "$*" 1>&2 ; exit 1; }
5+
6+
which bpftrace &>/dev/null || stop "Don't have bpftrace"
7+
which bpftool &>/dev/null || stop "Don't have bpftool"
8+
which berserker &>/dev/null || stop "Don't have berserker"
9+
which stub &>/dev/null || stop "Don't have random process tool"
10+
which pkill &>/dev/null || stop "Don't have pkill"
11+
12+
if [ ! -d "tests/workers/script/unit" ]; then
13+
echo "Can't find test directory. Smoke tests have to be run from the project root directory"
14+
fi
15+
16+
echo "Cleanup..."
17+
rm -f /tmp/berserker.log
18+
rm -f /tmp/events.log
19+
20+
# in case if it's still running from a previous run
21+
pkill berserker || true
22+
23+
# make berserkers verbose
24+
export RUST_LOG=trace
25+
26+
echo "Starting bpftrace..."
27+
bpftrace tests/workers/script/unit/syscalls.bt &> /tmp/events.log &
28+
29+
# let bpftrace attach probes
30+
attempts=0
31+
32+
while ! bpftool prog | grep -q bpftrace ;
33+
do
34+
if [[ "$attempts" -gt 40 ]]; then
35+
echo "Can't find bpftool after ${attempts} attempts."
36+
cat /tmp/events.log
37+
exit 1
38+
fi;
39+
40+
attempts=$((attempts+1))
41+
echo "Wait for bpftrace";
42+
sleep 0.5;
43+
done
44+
45+
echo "Starting berserker..."
46+
berserker -f tests/workers/script/dist/workload.ber &> /tmp/berserker.log &
47+
48+
# let berserker do some work
49+
sleep 5;
50+
51+
echo "Stopping..."
52+
pkill berserker || true
53+
pkill bpftrace || true
54+
55+
echo "Verifying the results..."
56+
if ! grep -q -E 'exec .*/stub' /tmp/events.log; then
57+
echo "FAIL: no task instruction"
58+
cat /tmp/berserker.log
59+
cat /tmp/events.log
60+
exit 1;
61+
fi
62+
63+
if ! grep -q -E 'openat /tmp/tests/test' /tmp/events.log; then
64+
echo "FAIL: no open instruction"
65+
cat /tmp/berserker.log
66+
cat /tmp/events.log
67+
exit 1;
68+
fi
69+
70+
if ! grep -E 'openat /tmp/tests/.*' /tmp/events.log | grep -q -v '/tmp/tests/test'; then
71+
echo "FAIL: no open random path instruction"
72+
cat /tmp/berserker.log
73+
cat /tmp/events.log
74+
exit 1;
75+
fi
76+
77+
if ! grep -q -E 'connect .*' /tmp/events.log; then
78+
echo "FAIL: no ping instruction"
79+
cat /tmp/berserker.log
80+
cat /tmp/events.log
81+
exit 1;
82+
fi
83+
84+
if ! grep -q -E 'sendto .*' /tmp/events.log; then
85+
echo "FAIL: ping instruction did not work"
86+
cat /tmp/berserker.log
87+
cat /tmp/events.log
88+
exit 1;
89+
fi
90+
91+
echo "PASS"
92+
93+
rm -f /tmp/berserker.log
94+
rm -f /tmp/events.log
95+
96+
exit 0;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
t:syscalls:sys_enter_execve /comm == "berserker"/
2+
{
3+
printf("exec %s\n", str(args->filename));
4+
}
5+
6+
t:syscalls:sys_enter_openat /comm == "berserker"/ {
7+
printf("openat %s\n", str(args->filename));
8+
}
9+
10+
t:syscalls:sys_enter_connect /comm == "berserker"/ {
11+
$addr_in = (struct sockaddr_in *)args->uservaddr;
12+
$addr = ntop($addr_in->sin_addr.s_addr);
13+
printf("connect %s\n", $addr);
14+
}
15+
16+
t:syscalls:sys_enter_sendto /comm == "berserker"/ {
17+
$addr_in = (struct sockaddr_in *)args->addr;
18+
$addr = ntop($addr_in->sin_addr.s_addr);
19+
printf("sendto %s\n", $addr);
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
machine {
2+
server(8080);
3+
path("/tmp/tests");
4+
}
5+
6+
main (workers = 1) {
7+
debug("run task stub");
8+
task(stub);
9+
10+
debug("open file /tmp/tests/test");
11+
open("/tmp/tests/test");
12+
13+
debug("open random file under /tmp/tests/");
14+
open(random_path("/tmp/tests"));
15+
16+
debug("ping server");
17+
ping("127.0.0.1:8080");
18+
} : exp {
19+
rate = 10.0;
20+
}

tests/workers/script/unit/smoke.sh

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#!/usr/bin/env bash
2+
set -eou pipefail
3+
4+
stop() { echo "$*" 1>&2 ; exit 1; }
5+
6+
which bpftrace &>/dev/null || stop "Don't have bpftrace"
7+
which bpftool &>/dev/null || stop "Don't have bpftool"
8+
which berserker &>/dev/null || stop "Don't have berserker"
9+
which stub &>/dev/null || stop "Don't have random process tool"
10+
which pkill &>/dev/null || stop "Don't have pkill"
11+
12+
if [ ! -d "tests/workers/script/unit" ]; then
13+
echo "Can't find test directory. Smoke tests have to be run from the project root directory"
14+
fi
15+
16+
echo "Cleanup..."
17+
rm -f /tmp/berserker.log
18+
rm -f /tmp/events.log
19+
20+
# in case if it's still running from a previous run
21+
pkill berserker || true
22+
23+
# make berserkers verbose
24+
export RUST_LOG=trace
25+
26+
echo "Starting bpftrace..."
27+
bpftrace tests/workers/script/unit/syscalls.bt &> /tmp/events.log &
28+
29+
# let bpftrace attach probes
30+
attempts=0
31+
32+
while ! bpftool prog | grep -q bpftrace ;
33+
do
34+
if [[ "$attempts" -gt 40 ]]; then
35+
echo "Can't find bpftool after ${attempts} attempts."
36+
cat /tmp/events.log
37+
bpftool prog
38+
bpftool prog | grep -q bpftrace
39+
exit 1
40+
fi;
41+
42+
attempts=$((attempts+1))
43+
echo "Wait for bpftrace";
44+
sleep 0.5;
45+
done
46+
47+
echo "Starting berserker..."
48+
berserker -f tests/workers/script/unit/workload.ber &> /tmp/berserker.log
49+
50+
echo "Stopping..."
51+
pkill berserker || true
52+
pkill bpftrace || true
53+
54+
echo "Verifying the results..."
55+
if ! grep -q -E 'exec .*/stub' /tmp/events.log; then
56+
echo "FAIL: no task instruction"
57+
cat /tmp/berserker.log
58+
cat /tmp/events.log
59+
exit 1;
60+
fi
61+
62+
if ! grep -q -E 'openat /tmp/tests/test' /tmp/events.log; then
63+
echo "FAIL: no open instruction"
64+
cat /tmp/berserker.log
65+
cat /tmp/events.log
66+
exit 1;
67+
fi
68+
69+
if ! grep -E 'openat /tmp/tests/.*' /tmp/events.log | grep -q -v '/tmp/tests/test'; then
70+
echo "FAIL: no open random path instruction"
71+
cat /tmp/berserker.log
72+
cat /tmp/events.log
73+
exit 1;
74+
fi
75+
76+
if ! grep -q -E 'connect .*' /tmp/events.log; then
77+
echo "FAIL: no ping instruction"
78+
cat /tmp/berserker.log
79+
cat /tmp/events.log
80+
exit 1;
81+
fi
82+
83+
if ! grep -q -E 'sendto .*' /tmp/events.log; then
84+
echo "FAIL: ping instruction did not work"
85+
cat /tmp/berserker.log
86+
cat /tmp/events.log
87+
exit 1;
88+
fi
89+
90+
echo "PASS"
91+
92+
rm -f /tmp/berserker.log
93+
rm -f /tmp/events.log
94+
95+
exit 0;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
t:syscalls:sys_enter_execve /comm == "berserker"/
2+
{
3+
printf("exec %s\n", str(args->filename));
4+
}
5+
6+
t:syscalls:sys_enter_openat /comm == "berserker"/ {
7+
printf("openat %s\n", str(args->filename));
8+
}
9+
10+
t:syscalls:sys_enter_connect /comm == "berserker"/ {
11+
$addr_in = (struct sockaddr_in *)args->uservaddr;
12+
$addr = ntop($addr_in->sin_addr.s_addr);
13+
printf("connect %s\n", $addr);
14+
}
15+
16+
t:syscalls:sys_enter_sendto /comm == "berserker"/ {
17+
$addr_in = (struct sockaddr_in *)args->addr;
18+
$addr = ntop($addr_in->sin_addr.s_addr);
19+
printf("sendto %s\n", $addr);
20+
}

0 commit comments

Comments
 (0)