firegex/tests/requirements.txt
2026-09-18 09:34:44 +02:00

49 lines
2.6 KiB
Plaintext

# What the tests need. The benchmarks need more — iperf3, matplotlib, numpy — and those
# are in bench/requirements.txt, so a CI run that only tests does not build a binding
# against a C library it will never call.
pytest
requests
cryptography
psutil
pydantic
python-socketio[client]
# The only way to speak QUIC from Python, and the integration tests for that layer have
# to speak it: what they check is the half the engine's own tests cannot reach — the
# rules that steer a QUIC address, the relay bound per address, and a filter attached
# through the API. Everything that needs it skips with a reason when it is absent, so a
# machine without it still runs the rest.
aioquic
# And the only way to speak gRPC from Python, which is what says HTTP/2 is filtered: a
# gRPC service is a real HTTP/2 service, its method name is an HPACK-compressed `:path`,
# and its status is a trailer section — the three things a firegex that only forwarded
# HTTP/2 could not show a filter. Everything that needs it skips with a reason when it is
# absent, so a machine without it still runs the rest.
grpcio
# `unit/test_nftables_addresses.py` imports the **backend** — the address-to-nftables
# translation is the backend's, and testing a copy of it would be testing a copy. That
# drags in `backend/utils`, which raises FastAPI's `HTTPException`, so FastAPI has to be
# here even though nothing in this suite serves a request. Without it the file cannot be
# collected, and a collection error is not one test failing: pytest stops the entire run
# before anything has executed. It went unnoticed for as long as it did because a machine
# that has ever run the backend outside the container already has it.
fastapi
# `unit/` imports the filter library straight out of `../fgex-lib`, so its runtime
# dependencies have to be here too. Listed one by one rather than with
# `-r ../fgex-lib/requirements.txt`, because that file lists `fgex` — the alias package,
# which depends on a *published* `firegex` and would quietly shadow the source tree the
# suite is meant to be testing.
#
# The HTTP parser is deliberately NOT here. It is a C extension that ships inside
# firegex itself, so it has to be *built*: `run_tests.sh` does that with an editable
# install of `../fgex-lib`. Running `pytest` by hand without it gives
# `ImportError: cannot import name '_llhttp' from 'firegex'`.
brotli
websockets
# Unconditional here, unlike in the library, which only needs it below 3.14: the
# suite uses it to build the corpus *and* to exercise the fallback backend, so
# without it the cross-backend agreement test silently skips on the one Python
# that matters most.
zstandard