From: Stefan Eissing Date: Thu, 14 Apr 2022 11:09:50 +0000 (+0000) Subject: *) test/core: start of a stress test case, skipped unless X-Git-Tag: 2.5.0-alpha2-ci-test-only~396 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b13978eddd1b975ec6fd581a88fc1f7519dabeb6;p=thirdparty%2Fapache%2Fhttpd.git *) test/core: start of a stress test case, skipped unless environment variable STRESS_TEST is present. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1899845 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/test/modules/core/conftest.py b/test/modules/core/conftest.py index 439cd22e171..cf670bbea18 100644 --- a/test/modules/core/conftest.py +++ b/test/modules/core/conftest.py @@ -4,25 +4,26 @@ import os import pytest import sys +from .env import CoreTestEnv from pyhttpd.env import HttpdTestEnv sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) def pytest_report_header(config, startdir): - env = HttpdTestEnv() + env = CoreTestEnv() return f"core [apache: {env.get_httpd_version()}, mpm: {env.mpm_module}, {env.prefix}]" @pytest.fixture(scope="package") -def env(pytestconfig) -> HttpdTestEnv: +def env(pytestconfig) -> CoreTestEnv: level = logging.INFO console = logging.StreamHandler() console.setLevel(level) console.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) logging.getLogger('').addHandler(console) logging.getLogger('').setLevel(level=level) - env = HttpdTestEnv(pytestconfig=pytestconfig) + env = CoreTestEnv(pytestconfig=pytestconfig) env.setup_httpd() env.apache_access_log_clear() env.httpd_error_log.clear_log() diff --git a/test/modules/core/env.py b/test/modules/core/env.py new file mode 100644 index 00000000000..9c63380503c --- /dev/null +++ b/test/modules/core/env.py @@ -0,0 +1,25 @@ +import inspect +import logging +import os + +from pyhttpd.env import HttpdTestEnv, HttpdTestSetup + +log = logging.getLogger(__name__) + + +class CoreTestSetup(HttpdTestSetup): + + def __init__(self, env: 'HttpdTestEnv'): + super().__init__(env=env) + self.add_source_dir(os.path.dirname(inspect.getfile(CoreTestSetup))) + self.add_modules(["cgid"]) + + +class CoreTestEnv(HttpdTestEnv): + + def __init__(self, pytestconfig=None): + super().__init__(pytestconfig=pytestconfig) + self.add_httpd_log_modules(["http", "core"]) + + def setup_httpd(self, setup: HttpdTestSetup = None): + super().setup_httpd(setup=CoreTestSetup(env=self)) diff --git a/test/modules/core/htdocs/cgi/delay.py b/test/modules/core/htdocs/cgi/delay.py new file mode 100644 index 00000000000..f4cd319c9e0 --- /dev/null +++ b/test/modules/core/htdocs/cgi/delay.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +import sys, time + +content="A delayed response.\n" + +print("Status: 200") +print(f"Request-Length: {len(content)}") +print("Content-Type: text/plain\n") +time.sleep(1) +sys.stdout.write(content) + diff --git a/test/modules/core/test_002_restarts.py b/test/modules/core/test_002_restarts.py new file mode 100644 index 00000000000..1f0ad43f3fb --- /dev/null +++ b/test/modules/core/test_002_restarts.py @@ -0,0 +1,51 @@ +import os + +import pytest + +from .env import CoreTestEnv +from pyhttpd.conf import HttpdConf + + +@pytest.mark.skipif(condition='STRESS_TEST' not in os.environ, + reason="STRESS_TEST not set in env") +@pytest.mark.skipif(condition=not CoreTestEnv().h2load_is_at_least('1.41.0'), + reason="h2load unavailable or misses --connect-to option") +class TestRestarts: + + @pytest.fixture(autouse=True, scope='class') + def _class_scope(self, env): + conf = HttpdConf(env, extras={ + 'base': f""" +StartServers 1 +ServerLimit 4 +ThreadLimit 2 +ThreadsPerChild 2 +MinSpareThreads 2 +MaxSpareThreads 4 +MaxRequestWorkers 8 +MaxConnectionsPerChild 0 + """, + }) + conf.add_vhost_cgi() + conf.install() + assert env.apache_restart() == 0 + + def test_core_002_01(self, env): + connections = 8 + n = connections * 10 + url = env.mkurl("https", "cgi", "/delay.py") + args = [env.h2load, f"--connect-to=localhost:{env.https_port}", "--h1", + "-n", str(n), "-c", str(connections), + url, + ] + r = env.run(args) + assert 0 == r.exit_code + r = env.h2load_status(r) + assert r.results["h2load"]["requests"] == { + "total": n, "started": n, "done": n, "succeeded": n + }, f"{r.stdout}" + assert n == r.results["h2load"]["status"]["2xx"] + assert 0 == r.results["h2load"]["status"]["3xx"] + assert 0 == r.results["h2load"]["status"]["4xx"] + assert 0 == r.results["h2load"]["status"]["5xx"] +