blob: 79feba9165e4477bba5242cc6f7fab4745f7b4f9 [file] [log] [blame]
BenoƮt Ganne9fb6d402019-04-15 15:28:21 +02001ASAN_OPTIONS?=verify_asan_link_order=0:detect_leaks=0:abort_on_error=1:unmap_shadow_on_exit=1:disable_coredump=0
2export ASAN_OPTIONS
3
Dave Wallacef0797d12019-11-15 17:29:15 -05004.PHONY: verify-env
5verify-env:
6ifndef WS_ROOT
7 $(error WS_ROOT is not set)
8endif
9ifndef BR
10 $(error BR is not set)
11endif
Klement Sekerab8c72a42018-11-08 11:21:39 +010012ifndef TEST_DIR
13 $(error TEST_DIR is not set)
Klement Sekera277b89c2016-10-28 13:20:27 +020014endif
15
Dave Wallaceeddd8e32021-05-12 21:43:59 -040016export TEST_BR = $(TEST_DIR)
Dave Wallacef0797d12019-11-15 17:29:15 -050017FAILED_DIR=/tmp/vpp-failed-unittests/
Dave Wallaceeddd8e32021-05-12 21:43:59 -040018VPP_TEST_DIRS=$(shell ls -d $(TEST_DIR) $(EXTERN_TESTS))
Dave Wallacef0797d12019-11-15 17:29:15 -050019
Klement Sekerae2636852021-03-16 12:52:12 +010020FORCE_NO_WIPE=0
Klement Sekeradb4e84c2017-08-11 10:06:15 +020021ifeq ($(DEBUG),gdb)
22FORCE_FOREGROUND=1
23else ifeq ($(DEBUG),gdbserver)
24FORCE_FOREGROUND=1
Dave Wallace24564332019-10-21 02:53:14 +000025else ifeq ($(DEBUG),gdb-all)
26FORCE_FOREGROUND=1
27else ifeq ($(DEBUG),gdbserver-all)
28FORCE_FOREGROUND=1
Klement Sekerab90be672017-10-10 06:44:05 +020029else ifeq ($(DEBUG),core)
30FORCE_FOREGROUND=1
Klement Sekerae2636852021-03-16 12:52:12 +010031else ifeq ($(DEBUG),attach)
32FORCE_FOREGROUND=1
33FORCE_NO_WIPE=1
juraj.linkes184870a2018-07-16 14:22:01 +020034else ifeq ($(STEP),yes)
35FORCE_FOREGROUND=1
36else ifeq ($(STEP),y)
37FORCE_FOREGROUND=1
38else ifeq ($(STEP),1)
39FORCE_FOREGROUND=1
Klement Sekeradb4e84c2017-08-11 10:06:15 +020040else
41FORCE_FOREGROUND=0
42endif
43
Klement Sekerabbfa5fd2018-06-27 13:54:32 +020044ifdef PROFILE_OUTPUT
45PROFILE_OUTPUT_OPTS=-o $(PROFILE_OUTPUT)
46endif
47
48ifndef PROFILE_SORT_BY
49PROFILE_SORT_BY=cumtime
50endif
51
52ifeq ($(PROFILE),1)
Klement Sekerab23ffd72021-05-31 16:08:53 +020053PYTHON_OPTS="-m cProfile $(PROFILE_OUTPUT_OPTS) -s $(PROFILE_SORT_BY)"
Klement Sekerabbfa5fd2018-06-27 13:54:32 +020054FORCE_FOREGROUND=1
55endif
56
Saima Yunusc7f93b32022-08-10 03:25:31 -040057VENV_BR_DIR=$(BR)/test
58VENV_PATH=$(VENV_BR_DIR)/venv
Klement Sekerab8c72a42018-11-08 11:21:39 +010059
Klement Sekeraebbaf552018-02-17 13:41:33 +010060ifeq ($(TEST_DEBUG),1)
Dave Wallacef0797d12019-11-15 17:29:15 -050061VENV_RUN_DIR:=$(VENV_PATH)/run-debug
Klement Sekeraebbaf552018-02-17 13:41:33 +010062else
Dave Wallacef0797d12019-11-15 17:29:15 -050063VENV_RUN_DIR:=$(VENV_PATH)/run
Klement Sekeraebbaf552018-02-17 13:41:33 +010064endif
65
vagrant937bf302017-04-07 01:48:47 +000066ifeq ($(PYTHON),)
Ole Troan6e6ad642020-02-04 13:28:13 +010067PYTHON_INTERP=python3
vagrant937bf302017-04-07 01:48:47 +000068else
69PYTHON_INTERP=$(PYTHON)
70endif
71
Klement Sekerab23ffd72021-05-31 16:08:53 +020072ifeq ($(V),)
73V=0
74endif
75
Aloys Augustin28fa8cb2019-06-21 17:04:29 +020076PYTHON_VERSION=$(shell $(PYTHON_INTERP) -c 'import sys; print(sys.version_info.major)')
Dave Wallacecf9356d2024-07-23 01:28:19 -040077PIP_VERSION=24.2
Aloys Augustinef29fa42020-05-25 18:07:24 +020078# Keep in sync with requirements.txt
Dave Wallace940a70f2024-04-03 12:31:42 -040079PIP_TOOLS_VERSION=7.4.1
Dave Wallacecf9356d2024-07-23 01:28:19 -040080PIP_SETUPTOOLS_VERSION=71.1.0
Aloys Augustin28fa8cb2019-06-21 17:04:29 +020081PYTHON_DEPENDS=requirements-$(PYTHON_VERSION).txt
Ole Troan6e6ad642020-02-04 13:28:13 +010082SCAPY_SOURCE=$(shell find $(VENV_PATH)/lib/python* -name site-packages)
Dave Wallacecf9356d2024-07-23 01:28:19 -040083SCAPY_VERSION=$(shell grep scapy $(TEST_DIR)/requirements.txt | cut -d'=' -f3 | cut -d';' -f1)
Dave Wallace1c95e122023-06-21 23:14:38 -040084BUILD_COV_DIR=$(BR)/test-coverage
Aloys Augustin28fa8cb2019-06-21 17:04:29 +020085
Aloys Augustinef29fa42020-05-25 18:07:24 +020086PIP_TOOLS_INSTALL_DONE=$(VENV_RUN_DIR)/pip-tools-install-$(PYTHON_VERSION)-$(PIP_TOOLS_VERSION).done
87PIP_INSTALL_DONE=$(VENV_RUN_DIR)/pip-install-$(PYTHON_VERSION)-$(PIP_VERSION).done
Dave Wallacef0797d12019-11-15 17:29:15 -050088PIP_PATCH_DONE=$(VENV_RUN_DIR)/pip-patch-$(PYTHON_VERSION).done
89PAPI_INSTALL_DONE=$(VENV_RUN_DIR)/papi-install-$(PYTHON_VERSION).done
90PAPI_PYTHON_SRC_DIR=$(WS_ROOT)/src/vpp-api/python
91PAPI_WIPE_DIST=$(WS_ROOT)/src/vpp-api/vapi/__pycache__ \
92 $(PAPI_PYTHON_SRC_DIR)/build \
93 $(PAPI_PYTHON_SRC_DIR)/vpp_papi.egg-info \
94 $(PAPI_PYTHON_SRC_DIR)/vpp_papi/__pycache__
Aloys Augustin28fa8cb2019-06-21 17:04:29 +020095
Aloys Augustin28fa8cb2019-06-21 17:04:29 +020096$(PIP_TOOLS_INSTALL_DONE):
97 @rm -rf $(VENV_PATH)
Dave Wallacef0797d12019-11-15 17:29:15 -050098 @mkdir -p $(VENV_RUN_DIR)
Klement Sekera7554aef2021-03-30 19:46:06 +020099 @$(PYTHON_INTERP) -m venv $(VENV_PATH)
Aloys Augustin8adb92b2019-07-23 15:19:28 +0200100 # pip version pinning
101 @bash -c "source $(VENV_PATH)/bin/activate && \
Klement Sekeraa8a9a8a2021-04-10 12:37:04 +0200102 python3 -m pip install pip===$(PIP_VERSION)"
Aloys Augustin28fa8cb2019-06-21 17:04:29 +0200103 @bash -c "source $(VENV_PATH)/bin/activate && \
Klement Sekeraa8a9a8a2021-04-10 12:37:04 +0200104 python3 -m pip install pip-tools===$(PIP_TOOLS_VERSION)"
Dave Wallacefa5aabb2022-02-05 09:27:05 -0500105 @bash -c "source $(VENV_PATH)/bin/activate && \
106 python3 -m pip install setuptools===$(PIP_SETUPTOOLS_VERSION)"
Aloys Augustin28fa8cb2019-06-21 17:04:29 +0200107 @touch $@
108
Aloys Augustin8eca60d2020-06-24 11:33:20 +0200109$(PYTHON_DEPENDS): requirements.txt
Aloys Augustin28fa8cb2019-06-21 17:04:29 +0200110 @bash -c "source $(VENV_PATH)/bin/activate && \
Tom Jones0aa0d6f2024-01-18 10:48:17 +0000111 CUSTOM_COMPILE_COMMAND='$(MAKE) test-refresh-deps (or update requirements.txt)' \
Klement Sekeraa8a9a8a2021-04-10 12:37:04 +0200112 python3 -m piptools compile -q --generate-hashes requirements.txt --output-file $@"
Aloys Augustin28fa8cb2019-06-21 17:04:29 +0200113
Aloys Augustin8eca60d2020-06-24 11:33:20 +0200114$(PIP_INSTALL_DONE): $(PIP_TOOLS_INSTALL_DONE) $(PYTHON_DEPENDS)
Aloys Augustin28fa8cb2019-06-21 17:04:29 +0200115 @bash -c "source $(VENV_PATH)/bin/activate && \
Klement Sekeraa8a9a8a2021-04-10 12:37:04 +0200116 python3 -m piptools sync $(PYTHON_DEPENDS)"
Neale Ranns177bbdc2016-11-15 09:46:51 +0000117 @touch $@
118
Klement Sekera9f9d07b2016-12-12 09:20:50 +0100119$(PIP_PATCH_DONE): $(PIP_INSTALL_DONE)
Neale Ranns177bbdc2016-11-15 09:46:51 +0000120 @echo --- patching ---
Dave Wallace6f692d62017-01-26 21:07:10 -0500121 @sleep 1 # Ensure python recompiles patched *.py files -> *.pyc
Dave Wallacecf9356d2024-07-23 01:28:19 -0400122 for f in $(CURDIR)/patches/scapy-$(SCAPY_VERSION)/*.patch ; do \
Neale Ranns177bbdc2016-11-15 09:46:51 +0000123 echo Applying patch: $$(basename $$f) ; \
Aloys Augustin28fa8cb2019-06-21 17:04:29 +0200124 patch --forward -p1 -d $(SCAPY_SOURCE) < $$f ; \
125 retCode=$$?; \
Aloys Augustin8eca60d2020-06-24 11:33:20 +0200126 [ $$retCode -gt 1 ] && exit $$retCode; \
Aloys Augustin28fa8cb2019-06-21 17:04:29 +0200127 done; \
128 touch $@
Neale Ranns177bbdc2016-11-15 09:46:51 +0000129
Klement Sekera9f9d07b2016-12-12 09:20:50 +0100130$(PAPI_INSTALL_DONE): $(PIP_PATCH_DONE)
Klement Sekeraa8a9a8a2021-04-10 12:37:04 +0200131 @bash -c "source $(VENV_PATH)/bin/activate && python3 -m pip install -e $(PAPI_PYTHON_SRC_DIR)"
Neale Ranns177bbdc2016-11-15 09:46:51 +0000132 @touch $@
133
Dave Wallacef0797d12019-11-15 17:29:15 -0500134.PHONY: refresh-deps
Dave Wallace7b8b4652023-08-15 19:05:26 -0400135refresh-deps: clean-deps $(PIP_INSTALL_DONE) $(PYTHON_DEPENDS)
Aloys Augustin28fa8cb2019-06-21 17:04:29 +0200136
Dave Wallacef0797d12019-11-15 17:29:15 -0500137.PHONY: clean-deps
Aloys Augustin28fa8cb2019-06-21 17:04:29 +0200138clean-deps:
139 @rm -f $(PYTHON_DEPENDS)
140
Dave Wallacef0797d12019-11-15 17:29:15 -0500141INTERN_PLUGIN_SRC_DIR=$(WS_ROOT)/src/plugins
Dave Wallacea43c93f2019-08-22 00:32:29 +0000142ifneq ($(EXTERN_PLUGIN_SRC_DIR),)
143PLUGIN_SRC_DIR=$(EXTERN_PLUGIN_SRC_DIR)
144else
Dave Wallacef0797d12019-11-15 17:29:15 -0500145PLUGIN_SRC_DIR=$(INTERN_PLUGIN_SRC_DIR)
Dave Wallacea43c93f2019-08-22 00:32:29 +0000146endif
Dave Wallacea43c93f2019-08-22 00:32:29 +0000147
Klement Sekerac160ae02017-03-09 08:20:13 +0100148.PHONY: sanity
149
juraj.linkes184870a2018-07-16 14:22:01 +0200150ifndef TEST_JOBS
151PARALLEL_ILLEGAL=0
Klement Sekerab23ffd72021-05-31 16:08:53 +0200152TEST_JOBS=1
juraj.linkes184870a2018-07-16 14:22:01 +0200153else ifeq ($(FORCE_FOREGROUND),0)
154PARALLEL_ILLEGAL=0
Klement Sekerab23ffd72021-05-31 16:08:53 +0200155else ifneq ($(findstring $(TEST_JOBS),1 auto),)
juraj.linkes184870a2018-07-16 14:22:01 +0200156PARALLEL_ILLEGAL=0
157else
158PARALLEL_ILLEGAL=1
159endif
160
Klement Sekerab23ffd72021-05-31 16:08:53 +0200161ifneq ($(DEBUG),)
162SANITY=no
163endif
164
165ifneq ($(findstring $(SANITY),0 n no),)
166SANITY_IMPORT_VPP_PAPI_CMD=true
167ARG0=
168else
169SANITY_IMPORT_VPP_PAPI_CMD=source $(VENV_PATH)/bin/activate && $(PYTHON_INTERP) sanity_import_vpp_papi.py
170ARG0=--sanity
171endif
172
173ARG1=
174ifneq ($(findstring $(FAILFAST),1 y yes),)
175ARG1=--failfast
176endif
177
178ARG2=
179ifneq ($(findstring $(EXTENDED_TESTS),1 y yes),)
180ARG2=--extended
181endif
182
183ARG3=
184ifneq ($(EXTERN_TESTS),)
185ARG3=--test-src-dir $(EXTERN_TESTS)
186endif
187
188ARG4=
189ifneq ($(findstring $(FORCE_FOREGROUND),1 y yes),)
190ARG4=--force-foreground
191endif
192
193ARG5=
194ifneq ($(findstring $(COREDUMP_COMPRESS),1 y yes),)
195ARG5=--compress-core
196endif
197
198ARG6=
199ifneq ($(findstring $(STEP),1 y yes),)
200ARG6=--step
201endif
202
203ARG7=
Dave Wallace878a9f52023-08-08 15:25:21 -0400204ifneq ($(findstring $(TEST_GCOV),1 y yes),)
Klement Sekerab23ffd72021-05-31 16:08:53 +0200205ARG7=--gcov
206endif
207
208ARG8=
209ifneq ($(EXTERN_PLUGINS),)
210ARG8=--extern-plugin-dir=$(EXTERN_PLUGINS)
211endif
212
213ARG9=
214ifneq ($(DEBUG),)
215ARG9=--debug=$(DEBUG)
216endif
217
218ARG10=
219ifneq ($(COREDUMP_SIZE),)
220ARG10=--coredump-size=$(COREDUMP_SIZE)
221endif
222
223ARG11=
224ifneq ($(VARIANT),)
225ARG11=--variant=$(VARIANT)
226endif
227
228ARG12=--cache-vpp-output
229ifneq ($(findstring $(CACHE_OUTPUT),0 n no),)
230ARG12=
231endif
232
233ARG13=
234ifneq ($(MAX_VPP_CPUS),)
235ARG13=--max-vpp-cpus=$(MAX_VPP_CPUS)
236endif
237
238ARG14=
239ifneq ($(TIMEOUT),)
240ARG14=--timeout=$(TIMEOUT)
241endif
242
243ARG15=
244ifneq ($(findstring $(TEST_DEBUG),1 y yes),)
245ARG15=--debug-framework
246endif
247
248ARG16=
249ifneq ($(findstring $(API_FUZZ),1 y yes),)
250ARG16=--api-fuzz=on
251endif
252
Ole Troan37157da2022-12-01 11:22:06 +0100253ARG17=
254ifneq ($(EXTERN_APIDIR),)
255ARG17=--extern-apidir=$(EXTERN_APIDIR)
256endif
257
Dave Wallace8800f732023-08-31 00:47:44 -0400258ARG18=
Klement Sekeraca2f2e12024-05-23 11:19:51 +0200259ifneq ($(DECODE_PCAPS),)
260ARG18=--decode-pcaps=$(DECODE_PCAPS)
Dave Wallace8800f732023-08-31 00:47:44 -0400261endif
262
Maxime Peim77caeb12023-11-14 15:26:41 +0100263ifneq ($(findstring $(API_PRELOAD),1 y yes),)
264ARG19=--api-preload
265else
266ARG19=
267endif
268
Andrew Yourtchenkobc378782023-09-26 16:01:21 +0200269EXC_PLUGINS_ARG=
270ifneq ($(VPP_EXCLUDED_PLUGINS),)
271# convert the comma-separated list into N invocations of the argument to exclude a plugin
272EXC_PLUGINS_ARG=$(shell echo "${VPP_EXCLUDED_PLUGINS}" | sed 's/\([^,]*\)/--excluded-plugin=\1/g; s/,/ /g')
273endif
274
275
276
Maxime Peim77caeb12023-11-14 15:26:41 +0100277EXTRA_ARGS=$(ARG0) $(ARG1) $(ARG2) $(ARG3) $(ARG4) $(ARG5) $(ARG6) $(ARG7) $(ARG8) $(ARG9) $(ARG10) $(ARG11) $(ARG12) $(ARG13) $(ARG14) $(ARG15) $(ARG16) $(ARG17) $(ARG18) $(ARG19)
Klement Sekerab23ffd72021-05-31 16:08:53 +0200278
Andrew Yourtchenkobc378782023-09-26 16:01:21 +0200279RUN_TESTS_ARGS=--failed-dir=$(FAILED_DIR) --verbose=$(V) --jobs=$(TEST_JOBS) --filter=$(TEST) --retries=$(RETRIES) --venv-dir=$(VENV_PATH) --vpp-ws-dir=$(WS_ROOT) --vpp-tag=$(TAG) --rnd-seed=$(RND_SEED) --vpp-worker-count="$(VPP_WORKER_COUNT)" --keep-pcaps $(PLUGIN_PATH_ARGS) $(EXC_PLUGINS_ARG) $(TEST_PLUGIN_PATH_ARGS) $(EXTRA_ARGS)
Klement Sekerab3fc6582022-03-10 11:47:45 +0100280RUN_SCRIPT_ARGS=--python-opts=$(PYTHON_OPTS)
Klement Sekerab23ffd72021-05-31 16:08:53 +0200281
282define retest-func
Klement Sekerab3fc6582022-03-10 11:47:45 +0100283@scripts/run.sh $(RUN_SCRIPT_ARGS) $(RUN_TESTS_ARGS) || env FAILED_DIR=$(FAILED_DIR) COMPRESS_FAILED_TEST_LOGS=$(COMPRESS_FAILED_TEST_LOGS) scripts/compress_failed.sh
Klement Sekerab23ffd72021-05-31 16:08:53 +0200284endef
285
Klement Sekerae2636852021-03-16 12:52:12 +0100286sanity: test-dep
juraj.linkes184870a2018-07-16 14:22:01 +0200287 @bash -c "test $(PARALLEL_ILLEGAL) -eq 0 ||\
288 (echo \"*******************************************************************\" &&\
289 echo \"* Sanity check failed, TEST_JOBS is not 1 or 'auto' and DEBUG, STEP or PROFILE is set\" &&\
290 echo \"*******************************************************************\" &&\
291 false)"
Klement Sekera41a9e512017-10-17 07:59:31 +0200292 @bash -c "$(SANITY_IMPORT_VPP_PAPI_CMD) ||\
Klement Sekerac160ae02017-03-09 08:20:13 +0100293 (echo \"*******************************************************************\" &&\
294 echo \"* Sanity check failed, cannot import vpp_papi\" &&\
295 echo \"* to debug: \" &&\
296 echo \"* 1. enter test shell: make test-shell\" &&\
297 echo \"* 2. execute debugger: gdb python -ex 'run sanity_import_vpp_papi.py'\" &&\
298 echo \"*******************************************************************\" &&\
299 false)"
300
Dave Wallacef0797d12019-11-15 17:29:15 -0500301$(FAILED_DIR): reset
302 @mkdir -p $@
303
304.PHONY: test-dep
Dave Wallaceeddd8e32021-05-12 21:43:59 -0400305test-dep: $(PAPI_INSTALL_DONE) $(FAILED_DIR)
Dave Wallacef0797d12019-11-15 17:29:15 -0500306
307.PHONY: test
Damjan Mariona2d6d352021-05-25 18:29:24 +0200308test: test-dep sanity
Juraj Sloboda0279b292016-11-16 19:50:24 +0100309 $(call retest-func)
Klement Sekeraf62ae122016-10-11 11:47:09 +0200310
Dave Wallacef0797d12019-11-15 17:29:15 -0500311.PHONY: retest
312retest: verify-env sanity $(FAILED_DIR)
Juraj Sloboda0279b292016-11-16 19:50:24 +0100313 $(call retest-func)
Klement Sekeraf62ae122016-10-11 11:47:09 +0200314
Dave Wallacef0797d12019-11-15 17:29:15 -0500315.PHONY: shell
316shell: test-dep
Klement Sekerab8c72a42018-11-08 11:21:39 +0100317 @echo "source $(VENV_PATH)/bin/activate;\
Paul Vinciguerrac701e572019-12-19 16:09:43 -0500318 export RND_SEED=$(RND_SEED);\
Klement Sekeraa86e2892017-03-09 08:01:52 +0100319 echo '***';\
Dave Wallacefd243742021-03-16 22:12:07 -0400320 echo PYTHONPATH=$(PYTHONPATH);\
Paul Vinciguerrac701e572019-12-19 16:09:43 -0500321 echo RND_SEED=$(RND_SEED);\
Klement Sekera593635d2019-02-07 19:56:50 +0100322 echo VPP_BUILD_DIR=$(VPP_BUILD_DIR);\
Klement Sekera593635d2019-02-07 19:56:50 +0100323 echo VPP_PLUGIN_PATH=$(VPP_PLUGIN_PATH);\
Dave Barach7d31ab22019-05-08 19:18:18 -0400324 echo VPP_TEST_PLUGIN_PATH=$(VPP_TEST_PLUGIN_PATH);\
Klement Sekera593635d2019-02-07 19:56:50 +0100325 echo VPP_INSTALL_PATH=$(VPP_INSTALL_PATH);\
Klement Sekera47e275b2017-03-21 08:21:25 +0100326 echo EXTERN_TESTS=$(EXTERN_TESTS);\
327 echo EXTERN_PLUGINS=$(EXTERN_PLUGINS);\
Klement Sekerab23ffd72021-05-31 16:08:53 +0200328 echo EXTERN_COV_DIR=$(EXTERN_COV_DIR);\
Klement Sekeraa86e2892017-03-09 08:01:52 +0100329 echo LD_LIBRARY_PATH=$(LD_LIBRARY_PATH);\
330 echo '***';\
331 exec </dev/tty" | bash -i
332
Dave Wallacef0797d12019-11-15 17:29:15 -0500333.PHONY: reset
Neale Ranns177bbdc2016-11-15 09:46:51 +0000334reset:
Klement Sekeraaa7a2a12021-03-18 15:22:57 +0100335 @rm -f /dev/shm/vpp-unittest-*
Klement Sekerae2636852021-03-16 12:52:12 +0100336 @if [ $(FORCE_NO_WIPE) -eq "0" ] ; then rm -rf /tmp/vpp-unittest-*; fi
Dave Wallacef0797d12019-11-15 17:29:15 -0500337 @rm -f /tmp/api_post_mortem.*
Klement Sekerab8c72a42018-11-08 11:21:39 +0100338 @rm -rf $(FAILED_DIR)
Naveen Joy7ea7ab52021-05-11 10:31:18 -0700339 @rm -rf /tmp/vpp-vm-tests
Klement Sekeraf62ae122016-10-11 11:47:09 +0200340
Dave Wallacef0797d12019-11-15 17:29:15 -0500341.PHONY: wipe
Neale Ranns177bbdc2016-11-15 09:46:51 +0000342wipe: reset
Saima Yunusc7f93b32022-08-10 03:25:31 -0400343 @rm -rf $(VENV_BR_DIR)
Neale Ranns02da9262021-01-08 08:43:14 +0000344 @rm -rf $(patsubst %,%/__pycache__, $(VPP_TEST_DIRS))
Neale Ranns177bbdc2016-11-15 09:46:51 +0000345
Dave Wallacef0797d12019-11-15 17:29:15 -0500346$(BUILD_COV_DIR):
347 @mkdir -p $@
348
Dave Wallace1c95e122023-06-21 23:14:38 -0400349.PHONY: cov-prep
350cov-prep: test-dep
Klement Sekera593635d2019-02-07 19:56:50 +0100351 @lcov --zerocounters --directory $(VPP_BUILD_DIR)
Klement Sekeracd6cb982017-05-11 06:55:32 +0200352 @test -z "$(EXTERN_COV_DIR)" || lcov --zerocounters --directory $(EXTERN_COV_DIR)
Dave Wallace1c95e122023-06-21 23:14:38 -0400353
Dave Wallace8a284cc2024-01-16 13:12:27 -0500354COV_REM_NOT_CODE="/usr/include/*" "*/build-root/*" "/opt/*" "/usr/lib/*" \
355 "*_test.*" "*test_*" "*vat*" "*/vnet/unix/gdb_funcs.c" \
356 "*pg.c"
357
358COV_REM_DRIVERS="*rdma*" "*/plugins/af_packet/*" "*/plugins/af_xdp/*" \
359 "*/plugins/avf/*" "*/plugins/dma_intel/*" "*/vlib/pci/*" \
360 "*/vnet/devices/*" "*/vlib/dma/*" "*/plugins/vmxnet3/*" \
361 "*/vnet/devices/virtio/*" "*/plugins/perfmon/arm*" \
362 "*/plugins/perfmon/intel/*" "*/vlib/vmbus/*" \
363 "*/vnet/dev/*" "*/plugins/dev_ena/*" "*/plugins/dev_iavf/*"
364
365COV_REM_UNUSED_FEAT="*/plugins/ioam/analyse/*" "*/plugins/ioam/lib-*/*" \
366 "*/plugins/ioam/export-common/*" "*/vnet/srp/*" \
367 "*/lawful-intercept/*" "*/lisp/*" "*/vnet/osi/*" \
368 "*/plugins/nsh/*"
369
370COV_REM_TODO_NO_TEST="*/vpp-api/client/*" "*/plugins/prom/*" \
371 "*/plugins/tlspicotls/*" "*/plugins/tlsmbedtls/*" \
372 "*/vppinfra/perfmon/*" "*/plugins/ila/*" \
373 "*/vlib/linux/*" "*/vnet/util/radix.c" "*/vapi/vapi.hpp" \
374 "*/vpp/api/types.c" "*/vpp/api/json_format.c" \
375 "*/plugins/ioam/*/*.h" "*/linux/netns.c" "*/vnet/flow/*" \
376 "*/vppinfra/random.c" "*/vppinfra/ring.h" \
377 "*/vppinfra/bihash_vec8_8.h" "*/vppinfra/maplog.c" \
378 "*/vppinfra/format_table.c" "*/vppinfra/timing_wheel.c" \
379 "*/vppinfra/macros.c" "*/vppinfra/valloc.c" \
380 "*/vppinfra/jsonformat.c" "*/vppinfra/vector/array_mask.h" \
381 "*/vppinfra/vector/toeplitz.c" "*/plugins/vrrp/vrrp_packet.h" \
382 "*/vnet/srv6/sr.h" "*/vlibapi/api_format.c" \
383 "*/vlibapi/node_serialize.c" "*/plugins/quic/error.c" \
384 "*/vnet/ipfix-export/flow_report_classify.h" \
385 "*/vnet/ip/ip6_ll_types.c" "*/vnet/ip/ip_psh_cksum.h" \
386 "*/vnet/ip/ip6_hop_by_hop.h" "*/vnet/ip/ip_format_fns.h" \
387 "*/vnet/dpo/classify_dpo.h" "*/vnet/dpo/l3_proxy_dpo.h" \
388 "*/vnet/ipsec/esp_format.c" "*/vnet/ethernet/sfp.c" \
389 "*/vnet/ethernet/ethernet_format_fns.h" \
390 "*/plugins/ikev2/ikev2_format.c" "*/vnet/bier/bier_types.c"
391
Matus Fabian519983b2024-08-01 16:00:37 +0200392COV_REM_ALT_TEST="*/plugins/hs_apps/*" "*/plugins/http/*.h"
393
Dave Wallace1c95e122023-06-21 23:14:38 -0400394.PHONY: cov-post
395cov-post: wipe-cov $(BUILD_COV_DIR)
Dave Wallace66fcfb82024-08-26 20:55:49 -0400396 @lcov --ignore-errors --capture \
Dave Wallace1c95e122023-06-21 23:14:38 -0400397 --directory $(VPP_BUILD_DIR) \
adrianvillin85121452024-01-11 11:59:47 +0100398 --output-file $(BUILD_COV_DIR)/coverage$(HS_TEST).info
Dave Wallace1c95e122023-06-21 23:14:38 -0400399 @test -z "$(EXTERN_COV_DIR)" || \
Dave Wallace66fcfb82024-08-26 20:55:49 -0400400 lcov --ignore-errors --capture \
Dave Wallace1c95e122023-06-21 23:14:38 -0400401 --directory $(EXTERN_COV_DIR) \
adrianvillin85121452024-01-11 11:59:47 +0100402 --output-file $(BUILD_COV_DIR)/extern-coverage$(HS_TEST).info
Dave Wallace66fcfb82024-08-26 20:55:49 -0400403 @lcov --ignore-errors --remove $(BUILD_COV_DIR)/coverage$(HS_TEST).info \
Dave Wallace8a284cc2024-01-16 13:12:27 -0500404 $(COV_REM_NOT_CODE) \
405 $(COV_REM_DRIVERS) \
406 $(COV_REM_TODO_NO_TEST) \
407 $(COV_REM_UNUSED_FEAT) \
408 $(COV_REM_ALT_TEST) \
adrianvillin85121452024-01-11 11:59:47 +0100409 -o $(BUILD_COV_DIR)/coverage-filtered$(HS_TEST).info
410 @genhtml $(BUILD_COV_DIR)/coverage-filtered$(HS_TEST).info \
Dave Wallace1c95e122023-06-21 23:14:38 -0400411 --output-directory $(BUILD_COV_DIR)/html
412 @test -z "$(EXTERN_COV_DIR)" || \
adrianvillin85121452024-01-11 11:59:47 +0100413 genhtml $(BUILD_COV_DIR)/extern-coverage$(HS_TEST).info \
Dave Wallace1c95e122023-06-21 23:14:38 -0400414 --output-directory $(BUILD_COV_DIR)/extern-html
Juraj Sloboda0279b292016-11-16 19:50:24 +0100415 @echo
416 @echo "Build finished. Code coverage report is in $(BUILD_COV_DIR)/html/index.html"
Klement Sekeracd6cb982017-05-11 06:55:32 +0200417 @test -z "$(EXTERN_COV_DIR)" || echo "Code coverage report for out-of-tree objects is in $(BUILD_COV_DIR)/extern-html/index.html"
adrianvillin85121452024-01-11 11:59:47 +0100418 @mkdir -p $(BR)/test-coverage-merged
419 @cp -f $(BUILD_COV_DIR)/coverage-filtered$(HS_TEST).info $(BR)/test-coverage-merged
Juraj Sloboda0279b292016-11-16 19:50:24 +0100420
Dave Wallace1c95e122023-06-21 23:14:38 -0400421.PHONY: cov
422cov:
Tom Jones0aa0d6f2024-01-18 10:48:17 +0000423 $(MAKE) -C . cov-prep test cov-post
Dave Wallace1c95e122023-06-21 23:14:38 -0400424
Klement Sekera9f9d07b2016-12-12 09:20:50 +0100425.PHONY: wipe-cov
Juraj Sloboda0279b292016-11-16 19:50:24 +0100426wipe-cov: wipe
427 @rm -rf $(BUILD_COV_DIR)
428
Dave Wallacef0797d12019-11-15 17:29:15 -0500429.PHONY: wipe-papi
430wipe-papi:
431 @rm -rf $(PAPI_INSTALL_DONE) $(PAPI_WIPE_DIST)
Paul Vinciguerra2648e442019-07-09 16:49:46 -0400432
Dave Wallacef0797d12019-11-15 17:29:15 -0500433.PHONY: wipe-all
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +0200434wipe-all: wipe wipe-papi wipe-cov
Dave Wallacef0797d12019-11-15 17:29:15 -0500435 @rm -rf $(TEST_BR)
Paul Vinciguerra2648e442019-07-09 16:49:46 -0400436
Klement Sekerae2636852021-03-16 12:52:12 +0100437.PHONY: start-gdb
438start-gdb: sanity
Klement Sekerab23ffd72021-05-31 16:08:53 +0200439 @bash -c "source $(VENV_PATH)/bin/activate && python3 -c 'from debug import start_vpp_in_gdb; start_vpp_in_gdb()' $(RUN_TESTS_ARGS)"
Klement Sekerae2636852021-03-16 12:52:12 +0100440
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200441.PHONY: checkstyle-python-all
442checkstyle-python-all: $(PIP_INSTALL_DONE)
Ole Troan4aacc012019-10-23 11:47:33 +0200443 @bash -c "source $(VENV_PATH)/bin/activate &&\
Klement Sekerae2159bd2022-05-11 16:54:09 +0200444 black -t py39 --check --diff $(WS_ROOT) ||\
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200445 (echo \"*************************************************************************\" &&\
446 echo \"* Test framework PEP8 compliance check FAILED (maybe: make fixstyle-python)\" &&\
447 echo \"*************************************************************************\" &&\
448 false)"
Klement Sekera72715ee2017-01-17 10:37:05 +0100449 @echo "*******************************************************************"
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200450 @echo "* Test framework PEP8 compliance check passed"
451 @echo "*******************************************************************"
452
453.PHONY: checkstyle
454checkstyle: checkstyle-python-all
455
456.PHONY: fixstyle-python-all
457fixstyle-python-all: $(PIP_INSTALL_DONE)
458 @bash -c "source $(VENV_PATH)/bin/activate &&\
459 black -t py39 $(WS_ROOT) ||\
460 (echo \"*************************************************************************\" &&\
461 echo \"* Test framework PEP8 compliance check FAILED (maybe: make fixstyle-python)\" &&\
462 echo \"*************************************************************************\" &&\
463 false)"
464 @echo "*******************************************************************"
465 @echo "* Test framework PEP8 compliance check passed"
Klement Sekera72715ee2017-01-17 10:37:05 +0100466 @echo "*******************************************************************"
467
Dave Wallacef0797d12019-11-15 17:29:15 -0500468.PHONY: help
Klement Sekera277b89c2016-10-28 13:20:27 +0200469help:
470 @echo "Running tests:"
471 @echo ""
Dave Wallacef0797d12019-11-15 17:29:15 -0500472 @echo " test - build and run (basic) functional tests"
473 @echo " test-debug - build and run (basic) functional tests (debug build)"
Dave Wallace1c95e122023-06-21 23:14:38 -0400474 @echo " test-cov - generate code coverage report for functional tests"
475 @echo " test-cov-prep - coverage phase #1 : prepare lcov"
476 @echo " test-cov-build - coverage phase #2 : build gcov image & run tests against it (use TEST=)"
477 @echo " test-cov-post - coverage phase #3 : generate lcov html report"
adrianvillin85121452024-01-11 11:59:47 +0100478 @echo " test-cov-both - generate and merge code coverage report for Python and Golang tests"
Dave Wallacef0797d12019-11-15 17:29:15 -0500479 @echo " test-all - build and run functional and extended tests"
480 @echo " test-all-debug - build and run functional and extended tests (debug build)"
Dave Wallace1c95e122023-06-21 23:14:38 -0400481 @echo " test-all-cov - generate code coverage report for functional and extended tests"
Dave Wallacef0797d12019-11-15 17:29:15 -0500482 @echo " retest - run functional tests"
483 @echo " retest-debug - run functional tests (debug build)"
484 @echo " retest-all - run functional and extended tests"
485 @echo " retest-all-debug - run functional and extended tests (debug build)"
Dave Wallacef0797d12019-11-15 17:29:15 -0500486 @echo " test-wipe - wipe (temporary) files generated by unit tests"
487 @echo " test-wipe-cov - wipe code coverage report for test framework"
Dave Wallacef0797d12019-11-15 17:29:15 -0500488 @echo " test-wipe-papi - rebuild vpp_papi sources"
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +0200489 @echo " test-wipe-all - wipe (temporary) files generated by unit tests, and coverage"
Dave Wallacef0797d12019-11-15 17:29:15 -0500490 @echo " test-shell - enter shell with test environment"
491 @echo " test-shell-debug - enter shell with test environment (debug build)"
Klement Sekerae2636852021-03-16 12:52:12 +0100492 @echo " test-refresh-deps - refresh the Python dependencies for the tests"
Klement Sekera277b89c2016-10-28 13:20:27 +0200493 @echo ""
Klement Sekera08c50e32023-04-14 17:44:04 +0200494 @echo "Environment variables controlling test runs:"
Klement Sekerab23ffd72021-05-31 16:08:53 +0200495 @echo ""
Klement Sekera08c50e32023-04-14 17:44:04 +0200496 @echo " V=[0|1|2]"
497 @echo " set test verbosity level: 0=ERROR, 1=INFO, 2=DEBUG"
498 @echo ""
499 @echo " TEST_JOBS=[<n>|auto]"
500 @echo " use at most <n> parallel python processes for test"
501 @echo " execution, if auto, set to number of available cpus"
502 @echo " (default: 1)"
503 @echo ""
504 @echo " MAX_VPP_CPUS=[<n>|auto]"
505 @echo " use at most <n> cpus for running vpp"
506 @echo " 'auto' sets to number of available cpus"
507 @echo " (default: auto)"
508 @echo ""
509 @echo " CACHE_OUTPUT=[0|n|no]"
510 @echo " disable caching VPP stdout/stderr and logging it"
511 @echo " as one block after test finishes"
512 @echo " (default: yes)"
513 @echo ""
514 @echo " FAILFAST=[1|y|yes]"
515 @echo " if enabled, stop running tests on first failure"
516 @echo " otherwise finish running whole suite"
517 @echo " (default: no)"
518 @echo ""
519 @echo " TIMEOUT=<timeout>"
520 @echo " fail test suite if any single test takes longer"
521 @echo " than <timeout> (in seconds) to finish"
522 @echo " (default: 600)"
523 @echo ""
524 @echo " RETRIES=<n>"
525 @echo " retry failed tests <n> times"
526 @echo " (default: 0)"
527 @echo ""
528 @echo " DEBUG=<type>"
529 @echo " configure VPP debugging:"
530 @echo " DEBUG=core"
531 @echo " detect coredump and load it in gdb on crash"
532 @echo ""
533 @echo " DEBUG=gdb"
534 @echo " print VPP PID and wait for user input before"
535 @echo " running and tearing down a testcase, allowing"
536 @echo " easy gdb attach"
537 @echo ""
538 @echo " DEBUG=gdbserver"
539 @echo " same as above, but run gdb inside a gdb server"
540 @echo ""
541 @echo " DEBUG=attach"
542 @echo " attach to existing vpp in running in gdb"
543 @echo " (see test-start-vpp-in-gdb)"
544 @echo " (default: none)"
545 @echo ""
546 @echo " STEP=[1|y|yes]"
547 @echo " enable stepping through a testcase"
548 @echo " (default: no)"
549 @echo ""
550 @echo " SANITY=[0|n|no]"
551 @echo " disable sanity import of vpp-api/vpp sanity"
552 @echo " run before running tests"
553 @echo " (default: yes)"
554 @echo ""
555 @echo " EXTENDED_TESTS=[1|y|yes]"
556 @echo " run extended tests"
557 @echo " (default: no)"
558 @echo ""
559 @echo " TEST=<filter>,[<filter>],..."
560 @echo " only run tests matching one or more comma-delimited"
561 @echo " filter expressions"
562 @echo ""
563 @echo " simple filter:"
564 @echo " file name or file suffix select all tests from a file"
565 @echo " examples:"
566 @echo " TEST=test_bfd"
567 @echo " TEST=bfd"
568 @echo " equivalent expressions selecting all"
569 @echo " tests defined in test_bfd.py"
570 @echo ""
571 @echo " wildcard filter:"
572 @echo " advanced filtering based on test file, test class"
573 @echo " and test function"
574 @echo " each filter expression is in the form of"
575 @echo " <file>.<class>.<test function>"
576 @echo " each of the tokens can be left empty or replaced"
577 @echo " with '*' to select all objects available"
578 @echo " examples:"
579 @echo " TEST=test_bfd.*.*"
580 @echo " TEST=test_bfd.."
581 @echo " TEST=bfd.*.*"
582 @echo " TEST=bfd.."
583 @echo " select all tests defined in test_bfd.py"
584 @echo " TEST=bfd.BFDAPITestCase.*"
585 @echo " TEST=bfd.BFDAPITestCase."
586 @echo " select all tests from test_bfd.py"
587 @echo " which are part of BFDAPITestCase class"
588 @echo " TEST=bfd.BFDAPITestCase.test_add_bfd"
589 @echo " select a single test named test_add_bfd"
590 @echo " from test_bfd.py/BFDAPITestCase"
591 @echo " TEST=..test_add_bfd"
592 @echo " TEST=*.*.test_add_bfd"
593 @echo " select all test functions named test_add_bfd"
594 @echo " from all files/classes"
595 @echo " TEST=bfd,ip4,..test_icmp_error"
596 @echo " select all test functions in test_bfd.py,"
597 @echo " test_ip4.py and all test functions named"
598 @echo " 'test_icmp_error' in all files"
599 @echo " (default: '')"
600 @echo ""
601 @echo " VARIANT=<variant>"
602 @echo " specify which march node variant to unit test"
603 @echo " e.g. VARIANT=skx test the skx march variants"
604 @echo " e.g. VARIANT=icl test the icl march variants"
605 @echo " (default: '')"
606 @echo ""
607 @echo " COREDUMP_SIZE=<size>"
608 @echo " pass <size> as unix { coredump-size <size> } argument"
609 @echo " to vpp, e.g. COREDUMP_SIZE=4g or COREDUMP_SIZE=unlimited"
610 @echo " (default: '')"
611 @echo ""
612 @echo " COREDUMP_COMPRESS=[1|y|yes]"
613 @echo " if no debug option is set, compress any core files"
614 @echo " (default: no)"
615 @echo ""
616 @echo " EXTERN_TESTS=<path>"
617 @echo " include out-of-tree test_*.py files under <path>"
618 @echo " (default: '')"
619 @echo ""
620 @echo " EXTERN_PLUGINS=<path>"
621 @echo " load out-of-tree vpp plugins in <path>"
622 @echo " (default: '')"
623 @echo ""
624 @echo " EXTERN_COV_DIR=<path>"
625 @echo " path to out-of-tree prefix, where source, object"
626 @echo " and .gcda files can be found for coverage report"
627 @echo " (default: '')"
628 @echo ""
629 @echo " PROFILE=[1|y|yes]"
630 @echo " enable profiling of test framework via cProfile module"
631 @echo " (default: no)"
632 @echo ""
633 @echo " PROFILE_SORT_BY=opt"
634 @echo " sort profiling report by opt - see cProfile documentation"
635 @echo " for possible values"
636 @echo " (default: cumtime)"
637 @echo ""
638 @echo " PROFILE_OUTPUT=file"
639 @echo " output profiling info to file - use absolute path"
640 @echo " (default: stdout)"
641 @echo ""
642 @echo " TEST_DEBUG=[1|y|yes]"
643 @echo " enable debugging of the test framework itself (expert)"
644 @echo " (default: no)"
645 @echo ""
Dave Wallace1c95e122023-06-21 23:14:38 -0400646 @echo " TEST_GCOV=[1|y|yes]"
647 @echo " enable tests specifically designed soley for code coverage"
648 @echo " (default: no)"
649 @echo ""
Klement Sekera08c50e32023-04-14 17:44:04 +0200650 @echo " API_FUZZ=[1|y|yes]"
651 @echo " enable VPP api fuzz testing"
652 @echo " (default: no)"
653 @echo ""
654 @echo " RND_SEED=<seed>"
655 @echo " random seed used by test framework"
656 @echo " (default: time.time())"
Klement Sekera45a95dd2019-11-05 11:18:25 +0000657 @echo ""
Klement Sekeraca2f2e12024-05-23 11:19:51 +0200658 @echo " DECODE_PCAPS=[all|failed|none]"
659 @echo " decode pcap files using tshark - all, only failed or none"
660 @echo " (default: failed)"
661 @echo ""
Klement Sekerae2636852021-03-16 12:52:12 +0100662 @echo "Starting VPP in GDB for use with DEBUG=attach:"
663 @echo ""
664 @echo " test-start-vpp-in-gdb - start VPP in gdb (release)"
665 @echo " test-start-vpp-debug-in-gdb - start VPP in gdb (debug)"
666 @echo ""