Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.