You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ic...@apache.org on 2025/02/05 12:41:53 UTC

svn commit: r1923593 [2/3] - in /httpd/httpd/branches/2.4.x: changes-entries/ modules/md/ test/modules/md/ test/modules/md/pebble/

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_502_acmev2_drive.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_502_acmev2_drive.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_502_acmev2_drive.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_502_acmev2_drive.py Wed Feb  5 12:41:51 2025
@@ -25,7 +25,7 @@ class TestDrivev2:
         env.check_acme()
         env.APACHE_CONF_SRC = "data/test_drive"
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -76,7 +76,7 @@ class TestDrivev2:
         domain = self.test_domain
         name = "www." + domain
         self._prepare_md(env, [name])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # drive
         prev_md = env.a2md(["list", name]).json['output'][0]
         r = env.a2md(["-vv", "drive", "-c", "http-01", name])
@@ -117,7 +117,7 @@ class TestDrivev2:
         domain = self.test_domain
         name = "www." + domain
         self._prepare_md(env, [name, "test." + domain])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # drive
         r = env.a2md(["-vv", "drive", "-c", "http-01", name])
         assert r.exit_code == 0, "a2md drive failed: {0}".format(r.stderr)
@@ -132,7 +132,7 @@ class TestDrivev2:
         name = "www." + domain
         assert env.a2md(["add", name]).exit_code == 0
         assert env.a2md(["update", name, "contacts", "admin@" + domain]).exit_code == 0
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # setup: create account on server
         r = env.a2md(["-t", "accepted", "acme", "newreg", "admin@" + domain], raw=True)
         assert r.exit_code == 0
@@ -152,7 +152,7 @@ class TestDrivev2:
         domain = self.test_domain
         name = "www." + domain
         self._prepare_md(env, [name])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # setup: create account on server
         r = env.a2md(["-t", "accepted", "acme", "newreg", "test@" + domain], raw=True)
         assert r.exit_code == 0
@@ -172,7 +172,7 @@ class TestDrivev2:
         domain = self.test_domain
         name = "www." + domain
         self._prepare_md(env, [name])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # drive
         r = env.a2md(["-vv", "drive", name])
         assert r.exit_code == 0, "a2md drive failed: {0}".format(r.stderr)
@@ -204,7 +204,7 @@ class TestDrivev2:
         conf = MDConf(env, proxy=True)
         conf.add('LogLevel proxy:trace8')
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
         # drive it, with wrong proxy url -> FAIL
         r = env.a2md(["-p", "http://localhost:1", "drive", name])
@@ -231,11 +231,11 @@ class TestDrivev2:
         # setup: create resource files
         self._write_res_file(os.path.join(env.server_docs_dir, "test"), "name.txt", name)
         self._write_res_file(os.path.join(env.server_docs_dir), "name.txt", "not-forbidden.org")
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
         # drive it
         assert env.a2md(["drive", name]).exit_code == 0
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # test HTTP access - no redirect
         jdata = env.get_json_content(f"test1.{env.http_tld}", "/alive.json", use_https=False)
         assert jdata['host']== "test1"
@@ -249,7 +249,7 @@ class TestDrivev2:
         # test HTTP access again -> redirect to default HTTPS port
         conf.add("MDRequireHttps temporary")
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         r = env.get_meta(name, "/name.txt", use_https=False)
         assert r.response['status'] == 302
         exp_location = "https://%s/name.txt" % name
@@ -266,7 +266,7 @@ class TestDrivev2:
         # test HTTP access again -> redirect permanent
         conf.add("MDRequireHttps permanent")
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         r = env.get_meta(name, "/name.txt", use_https=False)
         assert r.response['status'] == 301
         exp_location = "https://%s/name.txt" % name
@@ -288,15 +288,15 @@ class TestDrivev2:
         conf.add_vhost(name, port=env.http_port)
         conf.add_vhost(name)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # drive it
         assert env.a2md(["drive", name]).exit_code == 0
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
         # test override HSTS header
         conf.add('Header set Strict-Transport-Security "max-age=10886400; includeSubDomains; preload"')
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         r = env.get_meta(name, "/name.txt", use_https=True)
         assert 'strict-transport-security' in r.response['header'], r.response['header']
         assert r.response['header']['strict-transport-security'] == \
@@ -306,7 +306,7 @@ class TestDrivev2:
         conf.add('  Redirect /a /name.txt')
         conf.add('  Redirect seeother /b /name.txt')
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # check: default redirect by mod_md still works
         exp_location = "https://%s/name.txt" % name
         r = env.get_meta(name, "/name.txt", use_https=False)
@@ -330,17 +330,17 @@ class TestDrivev2:
         conf.add_vhost(name, port=env.http_port)
         conf.add_vhost(name)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # drive it
         r = env.a2md(["-v", "drive", name])
         assert r.exit_code == 0, "a2md drive failed: {0}".format(r.stderr)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
         # setup: place redirect rules
         conf.add('  Redirect /a /name.txt')
         conf.add('  Redirect seeother /b /name.txt')
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # check: redirects on HTTP
         exp_location = "http://%s:%s/name.txt" % (name, env.http_port)
         r = env.get_meta(name, "/a", use_https=False)
@@ -367,12 +367,12 @@ class TestDrivev2:
         conf.add_md([name])
         conf.add_vhost(name)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.run(["openssl", "s_client",
                  f"-connect", "localhost:{env.https_port}",
                  "-servername", "example.com", "-crlf"
                  ], intext="GET https:// HTTP/1.1\nHost: example.com\n\n")
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     # --------- critical state change -> drive again ---------
 
@@ -382,7 +382,7 @@ class TestDrivev2:
         domain = self.test_domain
         name = "www." + domain
         self._prepare_md(env, [name])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # setup: drive it
         r = env.a2md(["drive", name])
         assert r.exit_code == 0, "a2md drive failed: {0}".format(r.stderr)
@@ -419,7 +419,7 @@ class TestDrivev2:
         conf.add_renew_window(renew_window)
         conf.add_md([name])
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.a2md(["list", name]).json['output'][0]['state'] == env.MD_S_INCOMPLETE
         # setup: drive it
         r = env.a2md(["drive", name])
@@ -457,7 +457,7 @@ class TestDrivev2:
         conf.add_private_key(key_type, key_params)
         conf.add_md([name])
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.a2md(["list", name]).json['output'][0]['state'] == env.MD_S_INCOMPLETE
         # setup: drive it
         r = env.a2md(["-vv", "drive", name])
@@ -477,7 +477,7 @@ class TestDrivev2:
         domain = self.test_domain
         name = "www." + domain
         self._prepare_md(env, [name, "test." + domain, "xxx." + domain])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # setup: drive it
         r = env.a2md(["drive", name])
         assert r.exit_code == 0, "a2md drive failed: {0}".format(r.stderr)
@@ -496,7 +496,7 @@ class TestDrivev2:
         domain = self.test_domain
         name = "www." + domain
         self._prepare_md(env, [name])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # setup: drive it
         r = env.a2md(["drive", name])
         assert r.exit_code == 0, "a2md drive failed: {0}".format(r.stderr)

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_602_roundtrip.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_602_roundtrip.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_602_roundtrip.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_602_roundtrip.py Wed Feb  5 12:41:51 2025
@@ -39,16 +39,16 @@ class TestRoundtripv2:
         conf.add_md(domains)
         conf.install()
         # - restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # - drive
         assert env.a2md(["-v", "drive", domain]).exit_code == 0
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md_complete(domain)
         # - append vhost to config
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # check: SSL is running OK
         cert = env.get_cert(domain)
         assert domain in cert.get_san_list()
@@ -71,14 +71,14 @@ class TestRoundtripv2:
         conf.install()
 
         # - restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains_a)
         env.check_md(domains_b)
 
         # - drive
         assert env.a2md(["drive", domain_a]).exit_code == 0
         assert env.a2md(["drive", domain_b]).exit_code == 0
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md_complete(domain_a)
         env.check_md_complete(domain_b)
 
@@ -88,7 +88,7 @@ class TestRoundtripv2:
         conf.install()
 
         # check: SSL is running OK
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         cert_a = env.get_cert(domain_a)
         assert domains_a == cert_a.get_san_list()
         cert_b = env.get_cert(domain_b)
@@ -108,12 +108,12 @@ class TestRoundtripv2:
         conf.install()
         
         # - restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
 
         # - drive
         assert env.a2md(["drive", domain]).exit_code == 0
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md_complete(domain)
 
         # - append vhost to config
@@ -126,7 +126,7 @@ class TestRoundtripv2:
         self._write_res_file(os.path.join(env.server_docs_dir, "b"), "name.txt", name_b)
 
         # check: SSL is running OK
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         cert_a = env.get_cert(name_a)
         assert name_a in cert_a.get_san_list()
         cert_b = env.get_cert(name_b)

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_702_auto.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_702_auto.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_702_auto.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_702_auto.py Wed Feb  5 12:41:51 2025
@@ -1,4 +1,5 @@
 import os
+import time
 from datetime import timedelta
 
 import pytest
@@ -21,7 +22,7 @@ class TestAutov2:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -44,7 +45,7 @@ class TestAutov2:
         conf.install()
         #
         # restart, check that MD is synched to store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         stat = env.get_md_status(domain)
         assert stat["watched"] == 0
@@ -52,7 +53,7 @@ class TestAutov2:
         # add vhost for MD, restart should drive it
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
         env.check_md_complete(domain)
         stat = env.get_md_status(domain)
@@ -89,7 +90,7 @@ class TestAutov2:
         conf.install()
         #
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains_a)
         env.check_md(domains_b)
         #
@@ -106,7 +107,7 @@ class TestAutov2:
         assert status['state-descr'] == "certificate(rsa) is missing"
 
         # restart and activate
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # check: SSL is running OK
         cert_a = env.get_cert(domain_a)
         assert domains_a == cert_a.get_san_list()
@@ -136,7 +137,7 @@ class TestAutov2:
         self._write_res_file(os.path.join(env.server_docs_dir, "b"), "name.txt", name_b)
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         assert env.await_completion([domain])
         md = env.check_md_complete(domain)
@@ -170,7 +171,7 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         assert env.await_completion([domain])
         env.check_md_complete(domain)
@@ -196,7 +197,7 @@ class TestAutov2:
         self._write_res_file(os.path.join(env.server_docs_dir, "a"), "name.txt", name_a)
         #
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         #        
         # check: that request to domains give 503 Service Unavailable
@@ -227,7 +228,7 @@ class TestAutov2:
         self._write_res_file(os.path.join(env.server_docs_dir, "a"), "name.txt", name_a)
         #
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         md = env.await_error(domain)
@@ -262,7 +263,7 @@ class TestAutov2:
         conf.install()
         #
         # - restart (-> drive)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # await drive completion
         md = env.await_error(domain)
         assert md
@@ -291,9 +292,9 @@ class TestAutov2:
         conf.install()
         #
         # - restart (-> drive), check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md_complete(domain)
 
     # Force cert renewal due to critical remaining valid duration
@@ -311,30 +312,23 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that md+cert is in store, TLS is up
-        assert env.apache_restart() == 0
-        assert env.await_completion([domain])
-        env.check_md_complete(domain)
-        cert1 = MDCertUtil(env.store_domain_file(domain, 'pubcert.pem'))
-        # compare with what md reports as status
-        stat = env.get_certificate_status(domain)
-        assert cert1.same_serial_as(stat['rsa']['serial'])
-        #
-        # create self-signed cert, with critical remaining valid duration -> drive again
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
+        assert env.await_completion([domain], restart=False)
+        # Overwrite stages cert with one which has little remaining lifetime
         creds = env.create_self_signed_cert(CertificateSpec(domains=[domain]),
                                             valid_from=timedelta(days=-120),
                                             valid_to=timedelta(days=2),
                                             serial=7029)
-        creds.save_cert_pem(env.store_domain_file(domain, 'pubcert.pem'))
-        creds.save_pkey_pem(env.store_domain_file(domain, 'privkey.pem'))
         assert creds.certificate.serial_number == 7029
-        assert env.apache_restart() == 0
+        creds.save_cert_pem(env.store_staged_file(domain, 'pubcert.pem'))
+        creds.save_pkey_pem(env.store_staged_file(domain, 'privkey.pem'))
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.get_certificate_status(domain)
         assert creds.certificate.serial_number == int(stat['rsa']['serial'], 16)
-        #
         # cert should renew and be different afterwards
         assert env.await_completion([domain], must_renew=True)
         stat = env.get_certificate_status(domain)
-        creds.certificate.serial_number != int(stat['rsa']['serial'], 16)
+        assert creds.certificate.serial_number != int(stat['rsa']['serial'], 16)
 
     # test case: drive with an unsupported challenge due to port availability 
     def test_md_702_010(self, env):
@@ -348,7 +342,7 @@ class TestAutov2:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md["renewal"]["errors"] > 0
         #
@@ -360,7 +354,7 @@ class TestAutov2:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         assert env.await_completion([domain])
         #
@@ -386,7 +380,7 @@ class TestAutov2:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md["renewal"]["errors"] > 0
         #
@@ -399,7 +393,7 @@ class TestAutov2:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         assert env.await_completion([domain])
         #
@@ -431,7 +425,7 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         assert env.await_completion([name_x])
         env.check_md_complete(name_x)
@@ -451,7 +445,7 @@ class TestAutov2:
         conf.add_vhost(name_b)
         conf.install()
         # restart, check that host still works and kept the cert
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(new_list)
         status = env.get_certificate_status(name_a)
         assert cert_a.same_serial_as(status['rsa']['serial'])
@@ -475,7 +469,7 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         assert env.await_completion([name_x])
         env.check_md_complete(name_x)
@@ -495,7 +489,7 @@ class TestAutov2:
         conf.add_vhost(name_b)
         conf.install()
         # restart, check that host still works and have new cert
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(new_list)
         assert env.await_completion([name_a])
         #
@@ -520,7 +514,7 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md([name1])
         env.check_md([name2])
         assert env.await_completion([name1, name2])
@@ -538,7 +532,7 @@ class TestAutov2:
         conf.add_md([name1])
         conf.add_vhost([name1, name2])
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md([name1, name2])
         assert env.await_completion([name1])
         #
@@ -563,7 +557,7 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains1)
         assert env.await_completion([name_x])
         env.check_md_complete(name_x)
@@ -576,7 +570,7 @@ class TestAutov2:
         conf.add_vhost(domains=domains2)
         conf.install()
         # restart, check that host still works and kept the cert
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         status = env.get_certificate_status(name_a)
         assert cert_x.same_serial_as(status['rsa']['serial'])
 
@@ -597,7 +591,7 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # check that acme-tls/1 is available for all domains
         stat = env.get_md_status(domain)
@@ -625,11 +619,18 @@ class TestAutov2:
         #
         # restart (-> drive), check that MD job shows errors 
         # and that missing proto is detected
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # check that acme-tls/1 is available for none of the domains
         stat = env.get_md_status(domain)
         assert stat["proto"]["acme-tls/1"] == []
+        MDConf(env).install()
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
+        env.httpd_error_log.ignore_recent(matches=[
+            r'.*None of offered challenge types for domain.*',
+        ], lognos=[
+            "AH10056"  # challenges not available
+        ])
 
     # test case: 2.4.40 mod_ssl stumbles over a SSLCertificateChainFile when installing
     # a fallback certificate
@@ -645,7 +646,7 @@ class TestAutov2:
         conf.add_md(dns_list)
         conf.add_vhost(dns_list)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
 
     # test case: test "tls-alpn-01" without enabling 'acme-tls/1' challenge protocol
@@ -666,7 +667,7 @@ class TestAutov2:
         #
         # restart (-> drive), check that MD job shows errors
         # and that missing proto is detected
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # check that acme-tls/1 is available for none of the domains
         stat = env.get_md_status(domain)
@@ -694,7 +695,7 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(md_domains)
         assert env.await_completion([domain])
         env.check_md_complete(domain)
@@ -714,7 +715,7 @@ class TestAutov2:
             """)
         conf.add_md([domain])
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
 
     # Make a setup using the base server without http:, will fail.
@@ -728,7 +729,7 @@ class TestAutov2:
             """)
         conf.add_md([domain])
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_error(domain)
         #
         env.httpd_error_log.ignore_recent(
@@ -759,7 +760,7 @@ class TestAutov2:
         ])
         conf.add_md([domain])
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.get_md_status(domain, via_domain=env.http_addr, use_https=False)
         assert stat["proto"]["acme-tls/1"] == [domain]
         assert env.await_completion([domain], via_domain=env.http_addr, use_https=False)
@@ -786,7 +787,7 @@ class TestAutov2:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         assert env.await_error(long_domain)
         # add a short domain to the SAN list, the CA should now use that one
@@ -800,7 +801,7 @@ class TestAutov2:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([long_domain])
         env.check_md_complete(long_domain)
         #
@@ -823,7 +824,7 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         env.check_md_complete(domains[0])
 
@@ -842,7 +843,7 @@ class TestAutov2:
         conf.install()
         #
         # restart (-> drive), check that MD was synched and completes
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         env.check_md_complete(domains[0])
 

Added: httpd/httpd/branches/2.4.x/test/modules/md/test_710_profiles.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_710_profiles.py?rev=1923593&view=auto
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_710_profiles.py (added)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_710_profiles.py Wed Feb  5 12:41:51 2025
@@ -0,0 +1,132 @@
+import datetime
+import email.utils
+import os
+from datetime import timedelta
+
+import pytest
+from pyhttpd.certs import CertificateSpec
+
+from pyhttpd.env import HttpdTestEnv
+from .md_cert_util import MDCertUtil
+from .md_env import MDTestEnv
+from .md_conf import MDConf
+
+
+@pytest.mark.skipif(condition=not MDTestEnv.has_acme_server(),
+                    reason="no ACME test server configured")
+class TestProfiles:
+
+    @pytest.fixture(autouse=True, scope='class')
+    def _class_scope(self, env, acme):
+        env.APACHE_CONF_SRC = "data/test_auto"
+        acme.start(config='default')
+        env.check_acme()
+        env.clear_store()
+        MDConf(env).install()
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
+
+    @pytest.fixture(autouse=True, scope='function')
+    def _method_scope(self, env, request):
+        env.clear_store()
+        self.test_domain = env.get_request_domain(request)
+
+    def _write_res_file(self, doc_root, name, content):
+        if not os.path.exists(doc_root):
+            os.makedirs(doc_root)
+        open(os.path.join(doc_root, name), "w").write(content)
+
+    # create a MD with 'default' profile, get cert
+    def test_md_710_001(self, env):
+        domain = self.test_domain
+        # generate config with one MD
+        domains = [domain, "www." + domain]
+        conf = MDConf(env, admin="admin@" + domain)
+        conf.add_drive_mode("auto")
+        conf.start_md(domains)
+        conf.add(f'  MDProfile default')
+        conf.end_md()
+        conf.add_vhost(domains)
+        conf.install()
+        #
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
+        assert env.await_completion(domains)
+        stat = env.get_md_status(domain)
+        assert stat["watched"] == 1
+        assert stat["profile"] == "default", f'{stat}'
+        assert stat['cert']['rsa']['valid']['until'], f'{stat}'
+        ts = email.utils.parsedate_to_datetime(stat['cert']['rsa']['valid']['until'])
+        valid = ts - datetime.datetime.now(datetime.UTC)
+        assert valid.days in [89, 90]
+
+    # create a MD with 'shortlived' profile, get cert
+    def test_md_710_002(self, env):
+        domain = self.test_domain
+        # generate config with one MD
+        domains = [domain, "www." + domain]
+        conf = MDConf(env, admin="admin@" + domain)
+        conf.add_drive_mode("auto")
+        conf.start_md(domains)
+        conf.add(f'  MDProfile shortlived')
+        conf.add(f'  MDProfileMandatory on')
+        conf.end_md()
+        conf.add_vhost(domains)
+        conf.install()
+        #
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
+        assert env.await_completion(domains)
+        stat = env.get_md_status(domain)
+        assert stat["watched"] == 1
+        assert stat["profile"] == "shortlived", f'{stat}'
+        assert stat['cert']['rsa']['valid']['until'], f'{stat}'
+        ts = email.utils.parsedate_to_datetime(stat['cert']['rsa']['valid']['until'])
+        valid = ts - datetime.datetime.now(datetime.UTC)
+        assert valid.days in [5, 6]
+
+    # create a MD with unknown 'XXX' profile, get cert
+    def test_md_710_003(self, env):
+        domain = self.test_domain
+        # generate config with one MD
+        domains = [domain, "www." + domain]
+        conf = MDConf(env, admin="admin@" + domain)
+        conf.add_drive_mode("auto")
+        conf.start_md(domains)
+        conf.add(f'  MDProfile XXX')
+        conf.end_md()
+        conf.add_vhost(domains)
+        conf.install()
+        #
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
+        assert env.await_completion(domains)
+        stat = env.get_md_status(domain)
+        assert stat["watched"] == 1
+        assert stat["profile"] == "XXX", f'{stat}'
+
+    # create a MD with unknown 'XXX' profile, mandatory, fail
+    def test_md_710_004(self, env):
+        domain = self.test_domain
+        # generate config with one MD
+        domains = [domain, "www." + domain]
+        conf = MDConf(env, admin="admin@" + domain)
+        conf.add_drive_mode("auto")
+        conf.start_md(domains)
+        conf.add(f'  MDProfile XXX')
+        conf.add(f'  MDProfileMandatory on')
+        conf.end_md()
+        conf.add_vhost(domains)
+        conf.install()
+        #
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
+        assert env.await_error(domain)
+        stat = env.get_md_status(domain)
+        assert stat["watched"] == 1
+        assert stat["profile"] == "XXX", f'{stat}'
+        assert len(stat['cert']) == 0, f'{stat}'
+        assert stat['renewal']['errors'] > 0, f'{stat}'
+        assert stat['renewal']['last']['activity'] == 'Creating new order', f'{stat}'
+        MDConf(env).install()
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
+        env.httpd_error_log.ignore_recent(matches=[
+            r'.*mandatory ACME profile \'XXX\' is not offered by CA.*',
+        ], lognos=[
+            "AH10056"  # processing failed
+        ])

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_720_wildcard.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_720_wildcard.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_720_wildcard.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_720_wildcard.py Wed Feb  5 12:41:51 2025
@@ -18,7 +18,7 @@ class TestWildcard:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -37,7 +37,7 @@ class TestWildcard:
         conf.install()
 
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         md = env.await_error(domain)
@@ -69,7 +69,7 @@ class TestWildcard:
         conf.install()
 
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         md = env.await_error(domain)
@@ -100,7 +100,7 @@ class TestWildcard:
         conf.install()
 
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         assert env.await_completion([domain])
@@ -125,7 +125,7 @@ class TestWildcard:
         conf.install()
 
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         md = env.await_error(domain)
@@ -156,7 +156,7 @@ class TestWildcard:
         conf.install()
 
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         assert env.await_completion([domain])
@@ -183,7 +183,7 @@ class TestWildcard:
         conf.install()
 
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         assert env.await_completion([domain])
@@ -211,7 +211,7 @@ class TestWildcard:
         conf.install()
 
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         assert env.await_completion([domain])
@@ -238,7 +238,7 @@ class TestWildcard:
         conf.install()
 
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         assert env.await_completion([wwwdomain])
@@ -270,7 +270,7 @@ class TestWildcard:
             fd.write(content)
 
         # restart, check that md is in store
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         # await drive completion
         assert env.await_completion([domain], restart=False)
@@ -278,5 +278,5 @@ class TestWildcard:
         r = env.curl_get(f"http://{domain}:{env.http_port}/.well-known/acme-challenge/123456")
         assert r.response['status'] == 200
         assert r.response['body'] == content
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md_complete(domain)

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_730_static.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_730_static.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_730_static.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_730_static.py Wed Feb  5 12:41:51 2025
@@ -19,7 +19,7 @@ class TestStatic:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -48,7 +48,7 @@ class TestStatic:
         conf.end_md()
         conf.add_vhost(domain)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         
         # check if the domain uses it, it appears in our stats and renewal is off
         cert = env.get_cert(domain)
@@ -83,7 +83,7 @@ class TestStatic:
         conf.end_md()
         conf.add_vhost(domain)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # this should enforce a renewal
         stat = env.get_md_status(domain)
         assert stat['renew'] is True, stat

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_740_acme_errors.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_740_acme_errors.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_740_acme_errors.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_740_acme_errors.py Wed Feb  5 12:41:51 2025
@@ -16,7 +16,7 @@ class TestAcmeErrors:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -33,7 +33,7 @@ class TestAcmeErrors:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md
         assert md['renewal']['errors'] > 0
@@ -65,7 +65,7 @@ class TestAcmeErrors:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md
         assert md['renewal']['errors'] > 0

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_741_setup_errors.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_741_setup_errors.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_741_setup_errors.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_741_setup_errors.py Wed Feb  5 12:41:51 2025
@@ -18,7 +18,7 @@ class TestSetupErrors:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -42,7 +42,7 @@ class TestSetupErrors:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain, errors=2, timeout=10)
         assert md
         assert md['renewal']['errors'] > 0
@@ -65,13 +65,13 @@ class TestSetupErrors:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md(domains)
         assert env.await_completion([domain], restart=False)
         staged_md_path = env.store_staged_file(domain, 'md.json')
         with open(staged_md_path, 'w') as fd:
             fd.write('garbage\n')
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
         env.check_md_complete(domain)
         env.httpd_error_log.ignore_recent(

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_750_eab.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_750_eab.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_750_eab.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_750_eab.py Wed Feb  5 12:41:51 2025
@@ -18,7 +18,7 @@ class TestEab:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -33,7 +33,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md['renewal']['errors'] > 0
         assert md['renewal']['last']['problem'] == 'urn:ietf:params:acme:error:externalAccountRequired'
@@ -56,7 +56,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md['renewal']['errors'] > 0
         assert md['renewal']['last']['problem'] == 'apache:eab-hmac-invalid'
@@ -79,7 +79,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md['renewal']['errors'] > 0
         assert md['renewal']['last']['problem'] in [
@@ -105,7 +105,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md['renewal']['errors'] > 0
         assert md['renewal']['last']['problem'] in [
@@ -131,7 +131,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md['renewal']['errors'] > 0
         assert md['renewal']['last']['problem'] in [
@@ -158,7 +158,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
 
     def test_md_750_011(self, env):
@@ -174,7 +174,7 @@ class TestEab:
         conf.add_md([domain_b])
         conf.add_vhost(domains=[domain_b])
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain_a], restart=False)
         md = env.await_error(domain_b)
         assert md['renewal']['errors'] > 0
@@ -202,7 +202,7 @@ class TestEab:
         conf.end_md()
         conf.add_vhost(domains=[domain_b])
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain_b], restart=False)
         md = env.await_error(domain_a)
         assert md['renewal']['errors'] > 0
@@ -231,7 +231,7 @@ class TestEab:
         conf.end_md()
         conf.add_vhost(domains=[domain_b])
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain_a, domain_b])
         md_a = env.get_md_status(domain_a)
         md_b = env.get_md_status(domain_b)
@@ -247,7 +247,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         md_1 = env.get_md_status(domain)
         conf = MDConf(env)
@@ -258,7 +258,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         md_2 = env.get_md_status(domain)
         assert md_1['ca'] != md_2['ca']
@@ -273,7 +273,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         conf = MDConf(env)
         # this is another one of the values in conf/pebble-eab.json
@@ -282,7 +282,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_error(domain)
         md = env.await_error(domain)
         assert md['renewal']['errors'] > 0
@@ -307,7 +307,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         conf = MDConf(env)
         # this is another one of the values in conf/pebble-eab.json
@@ -317,7 +317,7 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_error(domain)
         md = env.await_error(domain)
         assert md['renewal']['errors'] > 0
@@ -343,7 +343,7 @@ class TestEab:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md['renewal']['errors'] > 0
         assert md['renewal']['last']['problem'] == 'urn:ietf:params:acme:error:externalAccountRequired'
@@ -432,5 +432,5 @@ class TestEab:
         conf.add_md(domains)
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_751_sectigo.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_751_sectigo.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_751_sectigo.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_751_sectigo.py Wed Feb  5 12:41:51 2025
@@ -46,7 +46,7 @@ class TestSectigo:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -65,7 +65,7 @@ class TestSectigo:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         r = env.curl_get(f"https://{domain}:{env.https_port}", options=[
             "--cacert", f"{env.test_dir}/data/sectigo-demo-root.pem"
@@ -83,7 +83,7 @@ class TestSectigo:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_error(domain)
         md = env.get_md_status(domain)
         assert md['renewal']['errors'] > 0
@@ -101,7 +101,7 @@ class TestSectigo:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_error(domain)
         md = env.get_md_status(domain)
         assert md['renewal']['errors'] > 0
@@ -120,7 +120,7 @@ class TestSectigo:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         r = env.curl_get(f"https://{domain}:{env.https_port}", options=[
             "--cacert", f"{env.test_dir}/data/sectigo-demo-root.pem"
@@ -142,7 +142,7 @@ class TestSectigo:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         r = env.curl_get(f"https://{domain2}:{env.https_port}", options=[
             "--cacert", f"{env.test_dir}/data/sectigo-demo-root.pem"
@@ -167,7 +167,7 @@ class TestSectigo:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         r = env.curl_get(f"https://{domain}:{env.https_port}", options=[
             "--cacert", f"{env.test_dir}/data/sectigo-demo-root.pem"

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_752_zerossl.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_752_zerossl.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_752_zerossl.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_752_zerossl.py Wed Feb  5 12:41:51 2025
@@ -43,7 +43,7 @@ class TestZeroSSL:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -66,7 +66,7 @@ class TestZeroSSL:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         r = env.curl_get(f"https://{domain}:{env.https_port}", options=[
             "--cacert", f"{env.test_dir}/data/sectigo-demo-root.pem"
@@ -88,7 +88,7 @@ class TestZeroSSL:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_error(domain)
         md = env.get_md_status(domain)
         assert md['renewal']['errors'] > 0
@@ -110,7 +110,7 @@ class TestZeroSSL:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_error(domain)
         md = env.get_md_status(domain)
         assert md['renewal']['errors'] > 0
@@ -134,7 +134,7 @@ class TestZeroSSL:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         r = env.curl_get(f"https://{domain}:{env.https_port}", options=[
             "--cacert", f"{env.test_dir}/data/sectigo-demo-root.pem"
@@ -160,7 +160,7 @@ class TestZeroSSL:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         r = env.curl_get(f"https://{domain2}:{env.https_port}", options=[
             "--cacert", f"{env.test_dir}/data/sectigo-demo-root.pem"
@@ -188,7 +188,7 @@ class TestZeroSSL:
         conf.end_md()
         conf.add_vhost(domains=domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         r = env.curl_get(f"https://{domain}:{env.https_port}", options=[
             "--cacert", f"{env.test_dir}/data/sectigo-demo-root.pem"

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_780_tailscale.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_780_tailscale.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_780_tailscale.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_780_tailscale.py Wed Feb  5 12:41:51 2025
@@ -103,7 +103,7 @@ class TestTailscale:
         acme.start(config='default')
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         yield
         faker.stop()
 
@@ -133,7 +133,7 @@ class TestTailscale:
         conf.add_vhost(domains)
         conf.install()
         # restart and watch it fail due to wrong tailscale unix socket path
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md
         assert md['renewal']['errors'] > 0
@@ -163,9 +163,9 @@ class TestTailscale:
         conf.add_vhost(domains)
         conf.install()
         # restart and watch it fail due to wrong tailscale unix socket path
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md_complete(domain)
 
     # create a MD using `tailscale` as protocol, but domain name not assigned by tailscale
@@ -184,7 +184,7 @@ class TestTailscale:
         conf.add_vhost(domains)
         conf.install()
         # restart and watch it fail due to wrong tailscale unix socket path
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md
         assert md['renewal']['errors'] > 0

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_790_failover.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_790_failover.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_790_failover.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_790_failover.py Wed Feb  5 12:41:51 2025
@@ -16,7 +16,7 @@ class TestFailover:
         conf = MDConf(env)
         conf.install()
 
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -39,7 +39,7 @@ class TestFailover:
         conf.end_md()
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
         env.check_md_complete(domain)
 
@@ -60,7 +60,7 @@ class TestFailover:
         conf.end_md()
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
         env.check_md_complete(domain)
         #
@@ -91,7 +91,7 @@ class TestFailover:
         conf.end_md()
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
         env.check_md_complete(domain)
         #

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_800_must_staple.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_800_must_staple.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_800_must_staple.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_800_must_staple.py Wed Feb  5 12:41:51 2025
@@ -17,7 +17,7 @@ class TestMustStaple:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -33,7 +33,7 @@ class TestMustStaple:
     # MD with default, e.g. not staple
     def test_md_800_001(self, env):
         self.configure_httpd(env, self.domain)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([self.domain])
         env.check_md_complete(self.domain)
         cert1 = MDCertUtil(env.store_domain_file(self.domain, 'pubcert.pem'))
@@ -42,7 +42,7 @@ class TestMustStaple:
     # MD that should explicitly not staple
     def test_md_800_002(self, env):
         self.configure_httpd(env, self.domain, "MDMustStaple off")
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         env.check_md_complete(self.domain)
         cert1 = MDCertUtil(env.store_domain_file(self.domain, 'pubcert.pem'))
         assert not cert1.get_must_staple()
@@ -53,13 +53,13 @@ class TestMustStaple:
     @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_800_003(self, env):
         self.configure_httpd(env, self.domain, "MDMustStaple on")
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([self.domain])
         env.check_md_complete(self.domain)
         cert1 = MDCertUtil(env.store_domain_file(self.domain, 'pubcert.pem'))
         assert cert1.get_must_staple()
         self.configure_httpd(env, self.domain, "MDMustStaple off")
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([self.domain])
         env.check_md_complete(self.domain)
         cert1 = MDCertUtil(env.store_domain_file(self.domain, 'pubcert.pem'))
@@ -78,7 +78,7 @@ class TestMustStaple:
             SSLUseStapling On
             SSLStaplingCache shmcb:stapling_cache(128000)
             """)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.get_ocsp_status(self.domain)
         assert stat['ocsp'] == "successful (0x0)" 
         assert stat['verify'] == "0 (ok)"

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_801_stapling.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_801_stapling.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_801_stapling.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_801_stapling.py Wed Feb  5 12:41:51 2025
@@ -12,7 +12,6 @@ from .md_env import MDTestEnv
 
 @pytest.mark.skipif(condition=not MDTestEnv.has_acme_server(),
                     reason="no ACME test server configured")
-@pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
 class TestStapling:
 
     @pytest.fixture(autouse=True, scope='class')
@@ -25,7 +24,7 @@ class TestStapling:
         mdB = "b-" + domain
         self.configure_httpd(env, [mdA, mdB]).install()
         env.apache_stop()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([mdA, mdB])
         env.check_md_complete(mdA)
         env.check_md_complete(mdB)
@@ -68,9 +67,12 @@ class TestStapling:
     def test_md_801_001(self, env):
         md = self.mdA
         self.configure_httpd(env, md).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.get_ocsp_status(md)
-        assert stat['ocsp'] == "no response sent" 
+        if MDTestEnv.lacks_ocsp():
+            assert 'ocsp' not in stat or stat['ocsp'] == "no response sent", f'{stat}'
+        else:
+            assert stat['ocsp'] == "no response sent"
         stat = env.get_md_status(md)
         assert not stat["stapling"]
         #
@@ -79,30 +81,43 @@ class TestStapling:
             MDStapling on
             LogLevel md:trace5
             """).install()
-        assert env.apache_restart() == 0
-        stat = env.await_ocsp_status(md)
-        assert stat['ocsp'] == "successful (0x0)" 
-        assert stat['verify'] == "0 (ok)"
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
+        if MDTestEnv.lacks_ocsp():
+            stat = env.get_md_status(md)
+            assert 'ocsp' not in stat or stat['ocsp'] == "no response sent", f'{stat}'
+        else:
+            stat = env.await_ocsp_status(md)
+            assert stat['ocsp'] == "successful (0x0)"
+            assert stat['verify'] == "0 (ok)"
         stat = env.get_md_status(md)
-        assert stat["stapling"]
-        pkey = 'rsa'
-        assert stat["cert"][pkey]["ocsp"]["status"] == "good"
-        assert stat["cert"][pkey]["ocsp"]["valid"]
+        if MDTestEnv.lacks_ocsp():
+            assert stat["stapling"]
+            pkey = 'rsa'
+            assert 'ocsp' not in stat["cert"][pkey], f'{stat}'
+        else:
+            assert stat["stapling"]
+            pkey = 'rsa'
+            assert stat["cert"][pkey]["ocsp"]["status"] == "good"
+            assert stat["cert"][pkey]["ocsp"]["valid"]
         #
         # turn stapling off (explicitly) again, should disappear
         self.configure_httpd(env, md, "MDStapling off").install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.get_ocsp_status(md)
-        assert stat['ocsp'] == "no response sent" 
+        if MDTestEnv.lacks_ocsp():
+            assert 'ocsp' not in stat or stat['ocsp'] == "no response sent", f'{stat}'
+        else:
+            assert stat['ocsp'] == "no response sent"
         stat = env.get_md_status(md)
         assert not stat["stapling"]
         
     # MD with stapling on/off and mod_ssl stapling on
     # expect to see stapling response in all cases
+    @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_801_002(self, env):
         md = self.mdA
         self.configure_httpd(env, md, ssl_stapling=True).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.get_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)" if \
             env.ssl_module == "mod_ssl" else "no response sent"
@@ -111,7 +126,7 @@ class TestStapling:
         #
         # turn stapling on, wait for it to appear in connections
         self.configure_httpd(env, md, "MDStapling on", ssl_stapling=True).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)" 
         assert stat['verify'] == "0 (ok)"
@@ -123,7 +138,7 @@ class TestStapling:
         #
         # turn stapling off (explicitly) again, should disappear
         self.configure_httpd(env, md, "MDStapling off", ssl_stapling=True).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.get_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)" if \
             env.ssl_module == "mod_ssl" else "no response sent"
@@ -145,23 +160,30 @@ class TestStapling:
         conf.add_vhost(md_a)
         conf.add_vhost(md_b)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # mdA has stapling
-        stat = env.await_ocsp_status(md_a)
-        assert stat['ocsp'] == "successful (0x0)" 
+        if MDTestEnv.lacks_ocsp():
+            stat = env.get_ocsp_status(md_a)
+            assert 'ocsp' not in stat or stat['ocsp'] == "no response sent", f'{stat}'
+        else:
+            stat = env.await_ocsp_status(md_a)
+            assert stat['ocsp'] == "successful (0x0)"
         assert stat['verify'] == "0 (ok)"
         stat = env.get_md_status(md_a)
         assert stat["stapling"]
-        pkey = 'rsa'
-        assert stat["cert"][pkey]["ocsp"]["status"] == "good"
-        assert stat["cert"][pkey]["ocsp"]["valid"]
+        if not MDTestEnv.lacks_ocsp():
+            pkey = 'rsa'
+            assert stat["cert"][pkey]["ocsp"]["status"] == "good"
+            assert stat["cert"][pkey]["ocsp"]["valid"]
         # mdB has no stapling
-        stat = env.get_ocsp_status(md_b)
-        assert stat['ocsp'] == "no response sent" 
+        if not MDTestEnv.lacks_ocsp():
+            stat = env.get_ocsp_status(md_b)
+            assert stat['ocsp'] == "no response sent"
         stat = env.get_md_status(md_b)
         assert not stat["stapling"]
 
     # 2 MDs, md stapling on+off, ssl stapling on
+    @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_801_004(self, env):
         md_a = self.mdA
         md_b = self.mdB
@@ -176,7 +198,7 @@ class TestStapling:
         conf.add_vhost(md_a)
         conf.add_vhost(md_b)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # mdA has stapling
         stat = env.await_ocsp_status(md_a)
         assert stat['ocsp'] == "successful (0x0)"
@@ -195,12 +217,13 @@ class TestStapling:
 
     # MD, check that restart leaves response unchanged, reconfigure keep interval, 
     # should remove the file on restart and get a new one
+    @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_801_005(self, env):
         # TODO: mod_watchdog seems to have problems sometimes with fast restarts
         # turn stapling on, wait for it to appear in connections
         md = self.mdA
         self.configure_httpd(env, md, "MDStapling on").install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)" 
         assert stat['verify'] == "0 (ok)"
@@ -215,7 +238,7 @@ class TestStapling:
         mtime1 = os.path.getmtime(ocsp_file)
         # wait a sec, restart and check that file does not change
         time.sleep(1)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)" 
         mtime2 = os.path.getmtime(ocsp_file)
@@ -227,12 +250,12 @@ class TestStapling:
             MDStapling on
             MDStaplingKeepResponse 1s
             """).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)"
         assert not os.path.exists(ocsp_file)
         # if we restart again, a new file needs to appear
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)"
         mtime3 = os.path.getmtime(ocsp_file)
@@ -240,11 +263,12 @@ class TestStapling:
 
     # MD, check that stapling renew window works. Set a large window
     # that causes response to be retrieved all the time.
+    @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_801_006(self, env):
         # turn stapling on, wait for it to appear in connections
         md = self.mdA
         self.configure_httpd(env, md, "MDStapling on").install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)" 
         assert stat['verify'] == "0 (ok)"
@@ -257,7 +281,7 @@ class TestStapling:
                 ocsp_file = os.path.join(dirpath, name)
         assert ocsp_file
         mtime1 = os.path.getmtime(ocsp_file)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)" 
         # wait a sec, restart and check that file does not change
@@ -269,7 +293,7 @@ class TestStapling:
             MDStapling on
             MDStaplingRenewWindow 10d
             """).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)"
         # wait a sec, restart and check that file does change
@@ -278,6 +302,7 @@ class TestStapling:
         assert mtime1 != mtime3
 
     # MD, make a MDomain with static files, check that stapling works
+    @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_801_007(self, env):
         # turn stapling on, wait for it to appear in connections
         md = self.mdA
@@ -292,7 +317,7 @@ class TestStapling:
                    env.store_domain_file(md, 'pubcert.pem')))
         conf.add_vhost(md)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)" 
         assert stat['verify'] == "0 (ok)"
@@ -306,6 +331,7 @@ class TestStapling:
         assert ocsp_file
 
     # Use certificate files in direct config, check that stapling works
+    @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_801_008(self, env):
         # turn stapling on, wait for it to appear in connections
         md = self.mdA
@@ -316,7 +342,7 @@ class TestStapling:
                              env.store_domain_file(md, 'privkey.pem'))
         conf.end_vhost()
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.await_ocsp_status(md)
         assert stat['ocsp'] == "successful (0x0)" 
         assert stat['verify'] == "0 (ok)"
@@ -331,6 +357,7 @@ class TestStapling:
 
     # Turn on stapling for a certificate without OCSP responder and issuer
     # (certificates without issuer prevent mod_ssl asking around for stapling)
+    @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_801_009(self, env):
         md = self.mdA
         domains = [md]
@@ -353,13 +380,14 @@ class TestStapling:
         conf.end_md()
         conf.add_vhost(md)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         time.sleep(1)
         stat = env.get_ocsp_status(md)
         assert stat['ocsp'] == "no response sent" 
 
     # Turn on stapling for an MDomain not used in any virtualhost
     # There was a crash in server-status in this case
+    @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_801_010(self, env):
         env.clear_ocsp_store()
         md = self.mdA
@@ -369,7 +397,7 @@ class TestStapling:
         conf.add("MDStapling on")
         conf.end_md()
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         stat = env.get_server_status()
         assert stat
 
@@ -379,15 +407,16 @@ class TestStapling:
     # scheduling.
     # This checks the mistaken assert() reported in
     # <https://bz.apache.org/bugzilla/show_bug.cgi?id=65567>
+    @pytest.mark.skipif(MDTestEnv.lacks_ocsp(), reason="no OCSP responder")
     def test_md_801_011(self, env):
         domains = [ f'test-801-011-{i}-{env.DOMAIN_SUFFIX}' for i in range(7)]
         self.configure_httpd(env, domains, """
             MDStapling on
             LogLevel md:trace2 ssl:warn
             """).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains, restart=False, timeout=120)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # now the certs are installed and ocsp will be retrieved
         time.sleep(1)
         for domain in domains:

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_810_ec.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_810_ec.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_810_ec.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_810_ec.py Wed Feb  5 12:41:51 2025
@@ -18,7 +18,7 @@ class TestAutov2:
         env.check_acme()
         env.clear_store()
         MDConf(env).install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
 
     @pytest.fixture(autouse=True, scope='function')
     def _method_scope(self, env, request):
@@ -33,7 +33,7 @@ class TestAutov2:
             conf.add_md(domains)
             conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
 
     def check_pkeys(self, env, domain, pkeys):
@@ -100,7 +100,7 @@ class TestAutov2:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         md = env.await_error(domain)
         assert md
         assert md['renewal']['errors'] > 0
@@ -135,14 +135,14 @@ class TestAutov2:
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion(domains)
         conf = MDConf(env)
         conf.add("MDPrivateKeys rsa3072 secp384r1")
         conf.add_md(domains)
         conf.add_vhost(domains)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         mds = env.get_md_status(domain, via_domain=domain, use_https=True)
         assert 'renew' in mds and mds['renew'] is True, f"{mds}"
         assert env.await_completion(domains)

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_820_locks.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_820_locks.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_820_locks.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_820_locks.py Wed Feb  5 12:41:51 2025
@@ -37,7 +37,7 @@ class TestLocks:
         self.configure_httpd(env, [domain], add_lines=[
             "MDStoreLocks 1s"
         ])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
 
     # renewal, with global lock held during restert
@@ -47,26 +47,26 @@ class TestLocks:
         self.configure_httpd(env, [domain], add_lines=[
             "MDStoreLocks 1s"
         ])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([domain])
         # we have a cert now, add a dns name to force renewal
         certa = MDCertUtil(env.store_domain_file(domain, 'pubcert.pem'))
         self.configure_httpd(env, [domain, f"x.{domain}"], add_lines=[
             "MDStoreLocks 1s"
         ])
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # await new cert, but do not restart, keeps the cert in staging
         assert env.await_completion([domain], restart=False)
         # obtain global lock and restart
         lockfile = os.path.join(env.store_dir, "store.lock")
         with FileLock(lockfile):
-            assert env.apache_restart() == 0
+            assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         # lock should have prevented staging from being activated,
         # meaning we will have the same cert
         certb = MDCertUtil(env.store_domain_file(domain, 'pubcert.pem'))
         assert certa.same_serial_as(certb)
         # now restart without lock
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         certc = MDCertUtil(env.store_domain_file(domain, 'pubcert.pem'))
         assert not certa.same_serial_as(certc)
 

Modified: httpd/httpd/branches/2.4.x/test/modules/md/test_900_notify.py
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/test/modules/md/test_900_notify.py?rev=1923593&r1=1923592&r2=1923593&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/test/modules/md/test_900_notify.py (original)
+++ httpd/httpd/branches/2.4.x/test/modules/md/test_900_notify.py Wed Feb  5 12:41:51 2025
@@ -45,7 +45,7 @@ class TestNotify:
         self.configure_httpd(env, self.domain, f"""
             MDNotifyCmd {command} {args}
             """)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_error(self.domain)
         stat = env.get_md_status(self.domain)
         assert stat["renewal"]["last"]["problem"] == "urn:org:apache:httpd:log:AH10108:"
@@ -63,7 +63,7 @@ class TestNotify:
         self.configure_httpd(env, self.domain, f"""
             MDNotifyCmd {command} {args}
             """)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_error(self.domain)
         stat = env.get_md_status(self.domain)
         assert stat["renewal"]["last"]["problem"] == "urn:org:apache:httpd:log:AH10108:"
@@ -83,7 +83,7 @@ class TestNotify:
         self.configure_httpd(env, self.domain, f"""
             MDNotifyCmd {command} {args}
             """)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([self.domain], restart=False)
         time.sleep(1)
         stat = env.get_md_status(self.domain)
@@ -102,7 +102,7 @@ class TestNotify:
         self.configure_httpd(env, self.domain, f"""
             MDNotifyCmd {command} {args} {extra_arg}
             """)
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([self.domain], restart=False)
         time.sleep(1)
         stat = env.get_md_status(self.domain)
@@ -125,7 +125,7 @@ class TestNotify:
         conf.add_vhost(domains1)
         conf.add_vhost(domains2)
         conf.install()
-        assert env.apache_restart() == 0
+        assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
         assert env.await_completion([md1, md2], restart=False)
         time.sleep(1)
         stat = env.get_md_status(md1)