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 For some tests, python >= 3.5 is required; they will be skipped if it's not
available. 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 ## 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 While they are not exhaustive, they are useful to catch regressions and track
improvements on the main code paths. improvements on the main code paths.
## Fuzz tests ## Fuzz tests
Some Go packages also have instrumentation to run fuzz testing against them, 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 . $(dirname ${0})/../util/lib.sh
init init
check_hostaliases
mkdir -p .logs mkdir -p .logs

View File

@@ -26,6 +26,7 @@ set -e
. $(dirname ${0})/../util/lib.sh . $(dirname ${0})/../util/lib.sh
init init
check_hostaliases
if ! .exim4/exim4 --version > /dev/null; then if ! .exim4/exim4 --version > /dev/null; then
skip "exim4 binary at .exim4/exim4 is not functional" 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 . $(dirname ${0})/../util/lib.sh
init init
check_hostaliases
generate_certs_for testserver generate_certs_for testserver
add_user user@testserver secretpassword add_user user@testserver secretpassword

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -4,6 +4,7 @@ set -e
. $(dirname ${0})/../util/lib.sh . $(dirname ${0})/../util/lib.sh
init init
check_hostaliases
mkdir -p .logs 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 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. # Wait until there's something listening on the given port.
function wait_until_ready() { function wait_until_ready() {
PORT=$1 PORT=$1