diff options
author | Stefan Eissing <stefan@eissing.org> | 2023-04-03 11:58:21 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2023-04-04 14:37:08 +0200 |
commit | e0c3424fb11f1aa63c9029b17dd6c8b7e12e7e0b (patch) | |
tree | ff0cf990bfd614dbcaa70a1cb481019107696711 | |
parent | 164dab7864337a5ae2fe0aaa7c4a7d34ca763498 (diff) | |
download | curl-e0c3424fb11f1aa63c9029b17dd6c8b7e12e7e0b.tar.gz |
tests/http: improved httpd detection
- better error messages when not found/complete
- handling of `--without-test-httpd`
Reported-by: kwind on github
Fixes #10879
Closes #10883
-rw-r--r-- | configure.ac | 26 | ||||
-rw-r--r-- | tests/http/conftest.py | 6 | ||||
-rw-r--r-- | tests/http/testenv/env.py | 20 |
3 files changed, 37 insertions, 15 deletions
diff --git a/configure.ac b/configure.ac index b3af71176..c95b4aace 100644 --- a/configure.ac +++ b/configure.ac @@ -323,10 +323,11 @@ AC_SUBST(CADDY) dnl we'd like a httpd+apachectl as test server dnl +HTTPD_ENABLED="maybe" AC_ARG_WITH(test-httpd, [AS_HELP_STRING([--with-test-httpd=PATH], [where to find httpd/apache2 for testing])], [request_httpd=$withval], [request_httpd=check]) -if test x"$request_httpd" = "xcheck"; then +if test x"$request_httpd" = "xcheck" -o x"$request_httpd" = "xyes"; then if test -x "/usr/sbin/apache2" -a -x "/usr/sbin/apache2ctl"; then # common location on distros (debian/ubuntu) HTTPD="/usr/sbin/apache2" @@ -334,6 +335,7 @@ if test x"$request_httpd" = "xcheck"; then AC_PATH_PROG([APXS], [apxs]) if test "x$APXS" != "x"; then AC_MSG_NOTICE([apache2-dev not installed, httpd tests disabled]) + HTTPD_ENABLED="no" fi else AC_PATH_PROG([HTTPD], [httpd]) @@ -343,26 +345,36 @@ if test x"$request_httpd" = "xcheck"; then AC_PATH_PROG([APACHECTL], [apachectl]) AC_PATH_PROG([APXS], [apxs]) if test "x$HTTPD" = "x" -o "x$APACHECTL" = "x"; then - AC_MSG_NOTICE([httpd/apache2 not in PATH, httpd tests disabled]) + AC_MSG_NOTICE([httpd/apache2 not in PATH, http tests disabled]) + HTTPD_ENABLED="no" fi if test "x$APXS" = "x"; then - AC_MSG_NOTICE([apxs not in PATH, httpd tests disabled]) + AC_MSG_NOTICE([apxs not in PATH, http tests disabled]) + HTTPD_ENABLED="no" fi fi -else +elif test x"$request_httpd" != "xno"; then HTTPD="${request_httpd}/bin/httpd" APACHECTL="${request_httpd}/bin/apachectl" APXS="${request_httpd}/bin/apxs" if test ! -x "${HTTPD}"; then - AC_MSG_NOTICE([httpd not found as ${HTTPD}, httpd tests disabled]) + AC_MSG_NOTICE([httpd not found as ${HTTPD}, http tests disabled]) + HTTPD_ENABLED="no" elif test ! -x "${APACHECTL}"; then - AC_MSG_NOTICE([apachectl not found as ${APACHECTL}, httpd tests disabled]) + AC_MSG_NOTICE([apachectl not found as ${APACHECTL}, http tests disabled]) + HTTPD_ENABLED="no" elif test ! -x "${APXS}"; then - AC_MSG_NOTICE([apxs not found as ${APXS}, httpd tests disabled]) + AC_MSG_NOTICE([apxs not found as ${APXS}, http tests disabled]) + HTTPD_ENABLED="no" else AC_MSG_NOTICE([using HTTPD=$HTTPD for tests]) fi fi +if test x"$HTTPD_ENABLED" = "xno"; then + HTTPD="" + APACHECTL="" + APXS="" +fi AC_SUBST(HTTPD) AC_SUBST(APACHECTL) AC_SUBST(APXS) diff --git a/tests/http/conftest.py b/tests/http/conftest.py index eecc0c089..22386b94d 100644 --- a/tests/http/conftest.py +++ b/tests/http/conftest.py @@ -57,9 +57,11 @@ def log_global_env_facts(record_testsuite_property, env): @pytest.fixture(scope='package') def httpd(env) -> Httpd: httpd = Httpd(env=env) - assert httpd.exists(), f'httpd not found: {env.httpd}' + if not httpd.exists(): + pytest.skip(f'httpd not found: {env.httpd}') httpd.clear_logs() - assert httpd.start() + if not httpd.start(): + pytest.fail(f'failed to start httpd: {env.httpd}') yield httpd httpd.stop() diff --git a/tests/http/testenv/env.py b/tests/http/testenv/env.py index 4c42931af..f09b71749 100644 --- a/tests/http/testenv/env.py +++ b/tests/http/testenv/env.py @@ -166,11 +166,15 @@ class EnvConfig: @property def httpd_version(self): if self._httpd_version is None and self.apxs is not None: - p = subprocess.run(args=[self.apxs, '-q', 'HTTPD_VERSION'], - capture_output=True, text=True) - if p.returncode != 0: - raise Exception(f'{self.apxs} failed to query HTTPD_VERSION: {p}') - self._httpd_version = p.stdout.strip() + try: + p = subprocess.run(args=[self.apxs, '-q', 'HTTPD_VERSION'], + capture_output=True, text=True) + if p.returncode != 0: + log.error(f'{self.apxs} failed to query HTTPD_VERSION: {p}') + else: + self._httpd_version = p.stdout.strip() + except Exception as e: + log.error(f'{self.apxs} failed to run: {e}') return self._httpd_version def _versiontuple(self, v): @@ -178,6 +182,8 @@ class EnvConfig: return tuple(map(int, v.split('.'))) def httpd_is_at_least(self, minv): + if self.httpd_version is None: + return False hv = self._versiontuple(self.httpd_version) return hv >= self._versiontuple(minv) @@ -188,12 +194,14 @@ class EnvConfig: os.path.isfile(self.apxs) def get_incomplete_reason(self) -> Optional[str]: + if self.httpd is None or len(self.httpd.strip()) == 0: + return f'httpd not configured, see `--with-test-httpd=<path>`' if not os.path.isfile(self.httpd): return f'httpd ({self.httpd}) not found' if not os.path.isfile(self.apachectl): return f'apachectl ({self.apachectl}) not found' if self.apxs is None: - return f"apxs (provided by apache2-dev) not found" + return f"command apxs not found (commonly provided in apache2-dev)" if not os.path.isfile(self.apxs): return f"apxs ({self.apxs}) not found" return None |