-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathMakefile
More file actions
155 lines (134 loc) · 9.66 KB
/
Copy pathMakefile
File metadata and controls
155 lines (134 loc) · 9.66 KB
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
146
147
148
149
150
151
152
153
154
155
version := $(shell cat VERSION)
GOLANGCI_LINT_VERSION := v2.9.0
.DEFAULT_GOAL := docker_build
.PHONY: build docker_build ebpf_compile go_build clean ebpf_log lint lint-deps vet imports test test-e2e test-e2e-run test-rtp test-rtp-run test-load test-load-run test-load-rtp test-load-helper test-load-targeted test-load-release test-load-candidate test-all vulncheck trivy-fs trivy-image security
load_release_tests := ^(TestReleaseFullCallNominal|TestReleaseSoak|TestReleaseINVITEFlood|TestReleaseConcurrentDialogs|TestReleaseCarrierUA|TestReleaseMultiInterface|TestReleaseFullCallPeak|TestReleaseVQMixed)$$
load_make := $(MAKE)
load_make_prefix := +@
load_make_short_flags := $(filter-out --%,$(firstword $(MAKEFLAGS)))
ifneq (,$(findstring n,$(load_make_short_flags)))
load_make_prefix :=
endif
build: ebpf_compile go_build
docker_build:
docker inspect sip-exporter:$(version) > /dev/null 2>&1 || docker build --progress=plain -t sip-exporter:${version} .
ebpf_compile:
clang -O2 -target bpf -c internal/bpf/sip.c -o bin/sip.o -g -fno-stack-protector
go_build:
go build -ldflags "-X github.com/aibudaevv/sip-exporter/internal/version.Version=$(version)" -o bin/main cmd/main.go
clean:
rm bin/sip.o && rm bin/main
ebpf_log:
sudo cat /sys/kernel/debug/tracing/trace_pipe
test:
go test -v ./...
test-all: docker_build
@echo "=== Unit tests ==="
go test -v ./internal/... ./pkg/...
@echo "=== Main E2E tests ==="
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -timeout 45m ./test/e2e/
@echo "=== RTP E2E tests ==="
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -timeout 15m ./test/e2e/rtp/
@echo "=== Load tests ==="
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -timeout 30m ./test/e2e/load/...
@echo "=== All tests passed ==="
test-e2e: docker_build
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -timeout 45m ./test/e2e/
#example: make test-e2e-run TEST=TestSERAllScenarios/100_percent
test-e2e-run: docker_build
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -failfast -timeout 10m -run "$(TEST)" ./test/e2e/
# RTP e2e tests run SEPARATELY from main e2e and load tests: both create AF_PACKET
# sockets on lo, and concurrent runs cause packet loss/duplication (see AGENTS.md).
test-rtp: docker_build
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -timeout 15m ./test/e2e/rtp/
test-rtp-run: docker_build
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -failfast -timeout 30s -run "$(TEST)" ./test/e2e/rtp/
test-load: docker_build
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -timeout 30m ./test/e2e/load/...
test-load-run: docker_build
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -timeout 30m -run "$(TEST)" ./test/e2e/load/...
test-load-helper: docker_build
@test -n "$(TEST)" || (echo "TEST is required"; exit 2)
env -u SIP_EXPORTER_LOAD_MODE -u SIP_EXPORTER_LOAD_ARTIFACT_DIR \
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false \
SIP_EXPORTER_LOAD_FINALIZE_MODE="$(SIP_EXPORTER_LOAD_FINALIZE_MODE)" \
SIP_EXPORTER_LOAD_FINALIZE_ARTIFACT_DIR="$(ARTIFACT_DIR)" \
SIP_EXPORTER_LOAD_FINALIZE_BASELINE="$(BASELINE)" \
SIP_EXPORTER_LOAD_PREFLIGHT_MODE="$(SIP_EXPORTER_LOAD_PREFLIGHT_MODE)" \
SIP_EXPORTER_LOAD_PREFLIGHT_BASELINE="$(BASELINE)" \
SIP_EXPORTER_LOAD_SUMMARY_MODE="$(SIP_EXPORTER_LOAD_SUMMARY_MODE)" \
SIP_EXPORTER_LOAD_SUMMARY_ARTIFACT_DIR="$(ARTIFACT_DIR)" \
SIP_EXPORTER_LOAD_SUMMARY_BASELINE="$(BASELINE)" \
go test -tags=e2e -v -count=1 -parallel 1 -timeout 30m -run "$(TEST)" ./test/e2e/load/...
test-load-targeted: docker_build
@test -n "$(TEST)" || (echo "TEST is required"; exit 2)
@test -n "$(ARTIFACT_DIR)" || (echo "ARTIFACT_DIR is required"; exit 2)
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false \
SIP_EXPORTER_LOAD_MODE=targeted \
SIP_EXPORTER_LOAD_ARTIFACT_DIR="$(ARTIFACT_DIR)" \
go test -tags=e2e -v -count=1 -parallel 1 -timeout 30m -run "$(TEST)" ./test/e2e/load/...
test-load-release: docker_build
@test -n "$(ARTIFACT_DIR)" || (echo "ARTIFACT_DIR is required"; exit 2)
@test -n "$(BASELINE)" || (echo "BASELINE is required"; exit 2)
@mkdir -p "$(ARTIFACT_DIR)"
$(load_make_prefix)ARTIFACT_DIR="$(ARTIFACT_DIR)" BASELINE="$(BASELINE)" bash -o pipefail -c 'SIP_EXPORTER_LOAD_PREFLIGHT_MODE=release $(load_make) test-load-helper TEST="^TestPreflightLoadMode$$" ARTIFACT_DIR="$$ARTIFACT_DIR" BASELINE="$$BASELINE" version="$(version)" 2>&1 | tee "$$ARTIFACT_DIR/preflight.log"'; status=$$?; \
printf '%s\n' $$status > "$(ARTIFACT_DIR)/preflight.exit-code"; \
if test $$status -ne 0; then SIP_EXPORTER_LOAD_SUMMARY_MODE=release $(load_make) test-load-helper TEST='^TestSummarizeLoadMode$$' ARTIFACT_DIR="$(ARTIFACT_DIR)" BASELINE="$(BASELINE)" version="$(version)"; exit $$status; fi
$(load_make_prefix)status=0; for run in 1; do \
mkdir -p "$(ARTIFACT_DIR)/run-$$run"; \
ARTIFACT_DIR="$(ARTIFACT_DIR)" RUN="$$run" TEST_PATTERN="$(load_release_tests)" bash -o pipefail -c 'SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) TESTCONTAINERS_VERBOSE=false SIP_EXPORTER_LOAD_MODE=release SIP_EXPORTER_LOAD_ARTIFACT_DIR="$$ARTIFACT_DIR/run-$$RUN" go test -tags=e2e -v -count=1 -parallel 1 -timeout 30m -run "$$TEST_PATTERN" ./test/e2e/load/... 2>&1 | tee "$$ARTIFACT_DIR/run-$$RUN/go-test.log"'; code=$$?; \
printf '%s\n' $$code > "$(ARTIFACT_DIR)/run-$$run/go-test.exit-code"; \
if test $$code -ne 0; then status=$$code; break; fi; \
done; \
if test $$status -ne 0; then SIP_EXPORTER_LOAD_SUMMARY_MODE=release $(load_make) test-load-helper TEST='^TestSummarizeLoadMode$$' ARTIFACT_DIR="$(ARTIFACT_DIR)" BASELINE="$(BASELINE)" version="$(version)"; exit $$status; fi
$(load_make_prefix)ARTIFACT_DIR="$(ARTIFACT_DIR)" BASELINE="$(BASELINE)" bash -o pipefail -c 'SIP_EXPORTER_LOAD_FINALIZE_MODE=release $(load_make) test-load-helper TEST="^TestFinalizeLoadMode$$" ARTIFACT_DIR="$$ARTIFACT_DIR" BASELINE="$$BASELINE" version="$(version)" 2>&1 | tee "$$ARTIFACT_DIR/finalize.log"'; status=$$?; \
printf '%s\n' $$status > "$(ARTIFACT_DIR)/finalize.exit-code"; \
SIP_EXPORTER_LOAD_SUMMARY_MODE=release $(load_make) test-load-helper TEST='^TestSummarizeLoadMode$$' ARTIFACT_DIR="$(ARTIFACT_DIR)" BASELINE="$(BASELINE)" version="$(version)"; summary_status=$$?; \
if test $$status -eq 0 && test $$summary_status -ne 0; then exit $$summary_status; fi; exit $$status
test-load-candidate: docker_build
@test -n "$(ARTIFACT_DIR)" || (echo "ARTIFACT_DIR is required"; exit 2)
@test -z "$(BASELINE)" || (echo "BASELINE is not accepted for candidate mode"; exit 2)
@mkdir -p "$(ARTIFACT_DIR)"
$(load_make_prefix)ARTIFACT_DIR="$(ARTIFACT_DIR)" bash -o pipefail -c 'SIP_EXPORTER_LOAD_PREFLIGHT_MODE=candidate $(load_make) test-load-helper TEST="^TestPreflightLoadMode$$" ARTIFACT_DIR="$$ARTIFACT_DIR" version="$(version)" 2>&1 | tee "$$ARTIFACT_DIR/preflight.log"'; status=$$?; \
printf '%s\n' $$status > "$(ARTIFACT_DIR)/preflight.exit-code"; \
if test $$status -ne 0; then SIP_EXPORTER_LOAD_SUMMARY_MODE=candidate $(load_make) test-load-helper TEST='^TestSummarizeLoadMode$$' ARTIFACT_DIR="$(ARTIFACT_DIR)" version="$(version)"; exit $$status; fi
$(load_make_prefix)status=0; for run in 1 2 3 4 5; do \
mkdir -p "$(ARTIFACT_DIR)/run-$$run"; \
ARTIFACT_DIR="$(ARTIFACT_DIR)" RUN="$$run" TEST_PATTERN="$(load_release_tests)" bash -o pipefail -c 'SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) TESTCONTAINERS_VERBOSE=false SIP_EXPORTER_LOAD_MODE=candidate SIP_EXPORTER_LOAD_ARTIFACT_DIR="$$ARTIFACT_DIR/run-$$RUN" go test -tags=e2e -v -count=1 -parallel 1 -timeout 30m -run "$$TEST_PATTERN" ./test/e2e/load/... 2>&1 | tee "$$ARTIFACT_DIR/run-$$RUN/go-test.log"'; code=$$?; \
printf '%s\n' $$code > "$(ARTIFACT_DIR)/run-$$run/go-test.exit-code"; \
if test $$code -ne 0; then status=$$code; break; fi; \
done; \
if test $$status -ne 0; then SIP_EXPORTER_LOAD_SUMMARY_MODE=candidate $(load_make) test-load-helper TEST='^TestSummarizeLoadMode$$' ARTIFACT_DIR="$(ARTIFACT_DIR)" version="$(version)"; exit $$status; fi
$(load_make_prefix)ARTIFACT_DIR="$(ARTIFACT_DIR)" bash -o pipefail -c 'SIP_EXPORTER_LOAD_FINALIZE_MODE=candidate $(load_make) test-load-helper TEST="^TestFinalizeLoadMode$$" ARTIFACT_DIR="$$ARTIFACT_DIR" version="$(version)" 2>&1 | tee "$$ARTIFACT_DIR/finalize.log"'; status=$$?; \
printf '%s\n' $$status > "$(ARTIFACT_DIR)/finalize.exit-code"; \
SIP_EXPORTER_LOAD_SUMMARY_MODE=candidate $(load_make) test-load-helper TEST='^TestSummarizeLoadMode$$' ARTIFACT_DIR="$(ARTIFACT_DIR)" version="$(version)"; summary_status=$$?; \
if test $$status -eq 0 && test $$summary_status -ne 0; then exit $$summary_status; fi; exit $$status
test-load-rtp: docker_build
SIP_EXPORTER_E2E_IMAGE=sip-exporter:$(version) \
TESTCONTAINERS_VERBOSE=false go test -tags=e2e -v -count=1 -parallel 1 -timeout 10m -run 'TestLoadFullCallWithRTP|TestBenchmarkMemoryPerRTPStream' ./test/e2e/load/...
lint: vet imports
golangci-lint run
lint-deps:
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION)
vet:
go vet -unsafeptr ./...
imports: vet
goimports -l -w .
vulncheck:
govulncheck ./...
trivy-fs:
trivy fs .
trivy-image: docker_build
trivy image sip-exporter:$(version)
security: vulncheck trivy-fs