Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved httpd detection for pytest #10883

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 19 additions & 7 deletions configure.ac
Expand Up @@ -323,17 +323,19 @@ 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"
APACHECTL="/usr/sbin/apache2ctl"
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])
Expand All @@ -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)
Expand Down
6 changes: 4 additions & 2 deletions tests/http/conftest.py
Expand Up @@ -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()

Expand Down
20 changes: 14 additions & 6 deletions tests/http/testenv/env.py
Expand Up @@ -166,18 +166,24 @@ def __init__(self):
@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'],
icing marked this conversation as resolved.
Show resolved Hide resolved
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):
v = re.sub(r'(\d+\.\d+(\.\d+)?)(-\S+)?', r'\1', v)
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)

Expand All @@ -188,12 +194,14 @@ def is_complete(self) -> bool:
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
Expand Down