1
0
mirror of https://blitiri.com.ar/repos/chasquid synced 2025-12-17 14:37:02 +00:00

test: Skip integration tests if $HOSTALIASES is not functional

Most integration tests depend on the $HOSTALIASES environment variable
being functional. That variable works on most systems, but not all. In
particular, systems with `systemd-resolved` can cause the variable to be
ignored.

This was reported by Alex Ellwein in
https://github.com/albertito/chasquid/issues/20.

This patch makes the affected tests to be skipped if $HOSTALIASES is not
working properly. It also removes unnecessary hosts files from tests
which don't need it, and documents this behaviour.

Thanks to Alex Ellwein and foxcpp@ for reporting and helping investigate
this issue!
This commit is contained in:
Alberto Bertogli
2021-07-15 00:20:21 +01:00
parent 4eaf5b38c8
commit d78056aff5
22 changed files with 89 additions and 5 deletions

View File

@@ -46,6 +46,12 @@ if the dependencies are not found:
For some tests, python >= 3.5 is required; they will be skipped if it's not
available.
Most tests depend on the
[`$HOSTALIASES`](https://man7.org/linux/man-pages/man7/hostname.7.html)
environment variable being functional, and will be skipped if it isn't. This
works by default in most Linux systems, but note that the use of
`systemd-resolved` can prevent it from working properly.
## Stress tests
@@ -55,6 +61,7 @@ load against chasquid to measure performance and resource consumption.
While they are not exhaustive, they are useful to catch regressions and track
improvements on the main code paths.
## Fuzz tests
Some Go packages also have instrumentation to run fuzz testing against them,

View File

@@ -1 +0,0 @@
testserver localhost

View File

@@ -1 +0,0 @@
testserver localhost

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
mkdir -p .logs

View File

@@ -26,6 +26,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
if ! .exim4/exim4 --version > /dev/null; then
skip "exim4 binary at .exim4/exim4 is not functional"

View File

@@ -1 +0,0 @@
testserver localhost

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
generate_certs_for testserver
add_user user@testserver secretpassword

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
generate_certs_for testserver
add_user user@testserver secretpassword

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
rm -rf .data-A .data-B .mail

View File

@@ -1 +0,0 @@
ñoños localhost

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
rm -rf .data-A .data-B .mail

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
generate_certs_for testserver
add_user user@testserver secretpassword

View File

@@ -10,6 +10,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
if ! dovecot --version > /dev/null; then
skip "dovecot not installed"

View File

@@ -1 +0,0 @@
testserver localhost

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
generate_certs_for testserver

View File

@@ -6,6 +6,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
# Build with the DNS override, so we can fake DNS records.
export GOTAGS="dnsoverride"

View File

@@ -7,6 +7,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
for binary in dkimsign dkimverify dkimkeygen; do
if ! which $binary > /dev/null; then

View File

@@ -8,6 +8,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
# Build with the DNS override, so we can fake DNS records.
export GOTAGS="dnsoverride"

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
mkdir -p .logs

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh
init
check_hostaliases
mkdir -p .logs

62
test/util/check-hostaliases Executable file
View File

@@ -0,0 +1,62 @@
#!/usr/bin/env python3
import argparse
import tempfile
import os
import socket
import subprocess
import sys
parser = argparse.ArgumentParser(
description="Check that $HOSTALIASES is working"
)
parser.add_argument(
"--child",
action="store_true",
help="run in child mode, for internal use only",
)
parser.add_argument(
"-v",
action="store_true",
help="verbose mode",
)
args = parser.parse_args()
def dprint(*a):
if args.v:
print(*a)
if args.child:
dprint("child mode, getting hosts")
lo = socket.gethostbyname("localhost")
ts = socket.gethostbyname("testserver")
dprint(ts, lo, ts == lo)
if ts != lo:
sys.exit(1)
else:
dprint("## parent mode")
# Create the hostaliases file.
fd = tempfile.NamedTemporaryFile(mode="w+")
fd.write("testserver localhost\n")
fd.flush()
# Re-execute ourselves with --child, to do the check.
env = dict(os.environ)
env["HOSTALIASES"] = fd.name
cargs = [sys.argv[0], "--child"]
if args.v:
cargs.append("-v")
cmd = subprocess.run(
cargs,
env=env,
text=True,
encoding="ascii",
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
dprint("## child output:")
dprint(cmd.stdout)
dprint("## child returned", cmd.returncode)
sys.exit(cmd.returncode)

View File

@@ -146,6 +146,12 @@ function fail() {
exit 1
}
function check_hostaliases() {
if ! "${UTILDIR}/check-hostaliases"; then
skip '$HOSTALIASES not working (probably systemd-resolved)'
fi
}
# Wait until there's something listening on the given port.
function wait_until_ready() {
PORT=$1