| # Scapy tox configuration file |
| # Copyright (C) 2020 Guillaume Valadon <[email protected]> |
| |
| |
| # Tox environments: |
| # py{version}-{os}-{non_root,root} |
| # In our testing, version can be 37 to 312 or py39 for pypy39 |
| |
| [tox] |
| # minversion = 4.0 |
| skip_missing_interpreters = true |
| # envlist = default when doing 'tox' |
| envlist = py{37,38,39,310,311,312}-{linux,bsd,windows}-{non_root,root} |
| |
| # Main tests |
| |
| [testenv] |
| description = "Scapy unit tests" |
| allowlist_externals = sudo |
| parallel_show_output = true |
| package = wheel |
| passenv = |
| PATH |
| PWD |
| PROGRAMFILES |
| WINDIR |
| SYSTEMROOT |
| OPENSSL_CONF |
| # Used by scapy |
| SCAPY_USE_LIBPCAP |
| deps = |
| ipython |
| cryptography |
| coverage[toml] |
| python-can |
| # disabled on windows because they require c++ dependencies |
| # brotli 1.1.0 broken https://github.com/google/brotli/issues/1072 |
| brotli < 1.1.0 ; sys_platform != 'win32' |
| zstandard ; sys_platform != 'win32' |
| platform = |
| linux: linux |
| bsd: (darwin|freebsd|openbsd|netbsd).* |
| windows: win32 |
| commands = |
| linux-non_root: {envpython} {env:DISABLE_COVERAGE:-m coverage run} -m scapy.tools.UTscapy -c ./test/configs/linux.utsc -N {posargs} |
| linux-root: sudo -E {envpython} {env:DISABLE_COVERAGE:-m coverage run} -m scapy.tools.UTscapy -c ./test/configs/linux.utsc {posargs} |
| bsd-non_root: {envpython} {env:DISABLE_COVERAGE:-m coverage run} -m scapy.tools.UTscapy -c test/configs/bsd.utsc -K tshark -N {posargs} |
| bsd-root: sudo -E {envpython} {env:DISABLE_COVERAGE:-m coverage run} -m scapy.tools.UTscapy -c test/configs/bsd.utsc -K tshark {posargs} |
| windows: {envpython} {env:DISABLE_COVERAGE:-m coverage run} -m scapy.tools.UTscapy -c test/configs/windows.utsc {posargs} |
| {env:DISABLE_COVERAGE:coverage combine} |
| {env:DISABLE_COVERAGE:coverage xml -i} |
| |
| # Variants of the main tests |
| |
| [testenv:py38-isotp_kernel_module] |
| description = "Scapy unit tests - ISOTP Linux kernel module" |
| allowlist_externals = sudo |
| git |
| bash |
| lsmod |
| modprobe |
| passenv = |
| PATH |
| PWD |
| PROGRAMFILES |
| WINDIR |
| SYSTEMROOT |
| deps = {[testenv]deps} |
| commands = |
| sudo apt-get -qy install build-essential linux-headers-$(uname -r) linux-modules-extra-$(uname -r) |
| sudo -E modprobe can |
| git clone --depth=1 https://github.com/linux-can/can-utils.git /tmp/can-utils |
| bash -c "cd /tmp/can-utils; ./autogen.sh; ./configure; make; sudo make install" |
| git clone --depth=1 https://github.com/hartkopp/can-isotp.git /tmp/can-isotp |
| bash -c "cd /tmp/can-isotp; make; sudo make modules_install; sudo modprobe can_isotp || sudo insmod ./net/can/can-isotp.ko" |
| bash -c "rm -rf /tmp/can-utils /tmp/can-isotp" |
| lsmod |
| sudo -E {envpython} -m coverage run -m scapy.tools.UTscapy -c ./test/configs/linux.utsc {posargs} |
| coverage combine |
| coverage xml -i |
| |
| # Test used by upstream pyca/cryptography |
| [testenv:cryptography] |
| description = "Scapy unit tests - pyca/cryptography variant" |
| sitepackages = true |
| deps = |
| commands = |
| python -c "import cryptography; print('DEBUG: cryptography %s' % cryptography.__version__)" |
| python -m scapy.tools.UTscapy -c ./test/configs/cryptography.utsc |
| |
| # The files listed past the first argument of the sphinx-apidoc command are ignored |
| [testenv:apitree] |
| description = "Regenerates the API reference doc tree" |
| skip_install = true |
| changedir = {toxinidir}/doc/scapy |
| deps = sphinx |
| commands = |
| sphinx-apidoc -f --no-toc -d 1 --separate --module-first --templatedir=_templates --output-dir api ../../scapy ../../scapy/modules/ ../../scapy/libs/ ../../scapy/tools/ ../../scapy/arch/ ../../scapy/contrib/scada/* ../../scapy/layers/msrpce/raw/ ../../scapy/layers/msrpce/all.py ../../scapy/all.py ../../scapy/layers/all.py ../../scapy/compat.py |
| |
| |
| [testenv:mypy] |
| description = "Check Scapy compliance against static typing" |
| skip_install = true |
| deps = mypy==1.7.0 |
| typing |
| commands = python .config/mypy/mypy_check.py linux |
| python .config/mypy/mypy_check.py win32 |
| |
| |
| [testenv:docs] |
| description = "Build the docs" |
| deps = |
| extras = doc |
| changedir = {toxinidir}/doc/scapy |
| commands = |
| sphinx-build -W --keep-going -b html . _build/html |
| |
| |
| # Debug mode |
| [testenv:docs2] |
| description = "Build the docs without rebuilding the API tree" |
| skip_install = true |
| changedir = {toxinidir}/doc/scapy |
| deps = {[testenv:docs]deps} |
| allowlist_externals = sphinx-build |
| setenv = |
| SCAPY_APITREE = 0 |
| commands = |
| sphinx-build -W --keep-going -b html . _build/html |
| |
| |
| [testenv:spell] |
| description = "Check code for Grammar mistakes" |
| skip_install = true |
| deps = codespell |
| # inet6, dhcp6 and the ipynb files contains french: ignore them |
| commands = codespell --ignore-words=.config/codespell_ignore.txt --skip="*.pyc,*.png,*.jpg,*.ods,*.raw,*.pdf,*.pcap,*.js,*.html,*.der,*_build*,*inet6.py,*dhcp6.py,*manuf.py,*tcpros.py,*.ipynb,*.svg,*.gif,*.obs,*.gz" scapy/ doc/ test/ .github/ |
| |
| |
| [testenv:twine] |
| description = "Check Scapy code distribution" |
| skip_install = true |
| deps = twine |
| cmarkgfm |
| build |
| setenv = SCAPY_VERSION=3.0.0 |
| commands = python -m build |
| twine check --strict dist/* |
| |
| |
| [testenv:gitarchive] |
| description = "Check Scapy git archive" |
| skip_install = true |
| allowlist_externals = git |
| commands = git version |
| git archive HEAD -o {envtmpdir}/scapy.tar |
| python -m pip install {envtmpdir}/scapy.tar |
| # Below: remove current folder from path to force use of installed Scapy |
| python -c "import sys; sys.path.remove(''); import scapy; print(scapy._version_from_git_archive())" |
| |
| |
| [testenv:flake8] |
| description = "Check Scapy code style & quality" |
| skip_install = true |
| deps = flake8<6.0.0 |
| commands = flake8 scapy/ |
| |
| |
| # flake8 configuration |
| [flake8] |
| ignore = E203, E731, W504, W503 |
| max-line-length = 88 |
| per-file-ignores = |
| scapy/all.py:F403,F401 |
| scapy/asn1/mib.py:E501 |
| scapy/contrib/automotive/obd/obd.py:F405,F403 |
| scapy/contrib/automotive/obd/pid/pids.py:F405,F403 |
| scapy/contrib/automotive/obd/scanner.py:F405,F403,E501 |
| scapy/contrib/automotive/volkswagen/definitions.py:E501 |
| scapy/contrib/eigrp.py:E501 |
| scapy/contrib/geneve.py:E501 |
| scapy/contrib/http2.py:F821 |
| scapy/contrib/igmp.py:E501 |
| scapy/contrib/scada/iec104/__init__.py:F405 |
| scapy/layers/tls/all.py:F403 |
| scapy/layers/tls/crypto/all.py:F403 |
| scapy/layers/tls/crypto/md4.py:E741 |
| scapy/libs/winpcapy.py:F405,F403,E501 |
| scapy/libs/manuf.py:E501 |
| scapy/tools/UTscapy.py:E501 |
| exclude = scapy/libs/ethertypes.py, |
| scapy/layers/msrpce/raw/* |