{{ message }}
test
Directory actions
More options
Directory actions
More options
test
Folders and files
This directory contains useful test code for testing various bits
of Apache functionality. This stuff is for the developers only,
so we might remove it on public releases.
Python / pytest test suites
===========================
There are two complementary Python (pytest) test suites in this directory.
Both run against an already-built httpd; they are independent of each other.
pyhttpd / modules/ httpd's own test framework. Covers HTTP/2, mod_md
(ACME), HTTP/1, proxy and core behaviour. Drives the
server with external clients (curl, nghttp, h2load) and
is configured via pyhttpd/config.ini (generated by
httpd's configure). Framework code lives in pyhttpd/;
tests live in modules/{core,http1,http2,md,proxy}/.
pytest_suite/ A self-contained port of the classic Perl Apache::Test
suite (core HTTP, per-module tests, security/CVE
regressions, SSL/TLS, PHP). Drives the server with an
in-process Python HTTP client (httpx) and raw sockets.
It is fully self-contained: it ships its own conf
templates, document root, C test modules and helper
framework under pytest_suite/, and reads nothing outside
that directory. See pytest_suite/README.md for details,
including how to add new tests.
The two suites coexist: pytest_suite/ has its own conftest.py and
pyproject.toml, so pytest treats it as its own rootdir and does NOT pick up
this directory's pyhttpd conftest.py. Run pytest_suite from inside
pytest_suite/ (or via the unified runner below) -- do not point pytest at the
top-level test/ directory expecting to run both at once.
Unified runner: run-all-tests.sh
---------------------------------
run-all-tests.sh runs BOTH suites against the same built httpd and reports a
combined result. pytest_suite runs first, then the pyhttpd modules/ tests.
./run-all-tests.sh # run both suites (pytest_suite first)
./run-all-tests.sh --only=pysuite # only the pytest_suite tests
./run-all-tests.sh --only=pyhttpd # only the pyhttpd modules/ tests
./run-all-tests.sh --apxs=/path/to/apxs # point at a specific httpd build
./run-all-tests.sh -k status -v # flags pass through to BOTH suites
How it finds the httpd build:
* pytest_suite is located via apxs -- from --apxs, the $APXS environment
variable, the "prefix" in pyhttpd/config.ini, or apxs on $PATH.
* the pyhttpd tests use pyhttpd/config.ini (built by httpd's configure), via
the system "pytest".
Selecting tests:
* Flag arguments (-v, -k NAME, -x, ...) are passed to both suites.
* Positional test paths are passed only to pytest_suite (they are
pytest_suite paths). Select pyhttpd tests with the PYHTTPD_TARGETS
environment variable, e.g.
PYHTTPD_TARGETS="modules/http2" ./run-all-tests.sh --only=pyhttpd
By default the pyhttpd side runs every modules/* directory whose conftest
imports successfully in your environment; a directory whose optional
dependency is missing (e.g. modules/md needs pyOpenSSL) is skipped with a
note rather than aborting the run.
Environment overrides:
APXS path to apxs (default: pyhttpd/config.ini prefix, else PATH)
PHP_FPM path to a php-fpm binary; enables pytest_suite's PHP tests
PYHTTPD_TARGETS pyhttpd test path(s) to run (default: auto-detected modules/*)
The runner exits non-zero if either suite has failures.
Running a suite directly
------------------------
pytest_suite (from its own directory; it creates its own virtualenv):
cd pytest_suite
uv sync # one-time: create the venv
./runtests.sh --apxs=/path/to/apxs # all tests
./runtests.sh --php-fpm=/path/to/php-fpm tests/t/php # PHP tests
./runtests.sh -k rewrite -v # any pytest args pass through
pyhttpd tests (need pyhttpd/config.ini from httpd's configure, plus curl,
nghttp2/h2load, and -- for modules/md -- pyOpenSSL and an ACME test server):
pytest modules/http2 # all HTTP/2 tests
pytest modules/core -k test_001 # a subset
Other contents
--------------
unit/ C-based unit tests (libcheck / httpdunit).
clients/ helper client programs used by the tests.
*.c small standalone C test programs.
