mirror of
https://github.com/docker-mailserver/docker-mailserver.git
synced 2024-01-19 02:48:50 +00:00
Removed assert.sh and tests
This commit is contained in:
parent
10d04efece
commit
91554372e5
186
assert.sh
186
assert.sh
|
@ -1,186 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# assert.sh 1.1 - bash unit testing framework
|
|
||||||
# Copyright (C) 2009-2015 Robert Lehmann
|
|
||||||
#
|
|
||||||
# http://github.com/lehmannro/assert.sh
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU Lesser General Public License as published
|
|
||||||
# by the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU Lesser General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU Lesser General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
export DISCOVERONLY=${DISCOVERONLY:-}
|
|
||||||
export DEBUG=${DEBUG:-}
|
|
||||||
export STOP=${STOP:-}
|
|
||||||
export INVARIANT=${INVARIANT:-}
|
|
||||||
export CONTINUE=${CONTINUE:-}
|
|
||||||
|
|
||||||
args="$(getopt -n "$0" -l \
|
|
||||||
verbose,help,stop,discover,invariant,continue vhxdic $*)" \
|
|
||||||
|| exit -1
|
|
||||||
for arg in $args; do
|
|
||||||
case "$arg" in
|
|
||||||
-h)
|
|
||||||
echo "$0 [-vxidc]" \
|
|
||||||
"[--verbose] [--stop] [--invariant] [--discover] [--continue]"
|
|
||||||
echo "`sed 's/./ /g' <<< "$0"` [-h] [--help]"
|
|
||||||
exit 0;;
|
|
||||||
--help)
|
|
||||||
cat <<EOF
|
|
||||||
Usage: $0 [options]
|
|
||||||
Language-agnostic unit tests for subprocesses.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-v, --verbose generate output for every individual test case
|
|
||||||
-x, --stop stop running tests after the first failure
|
|
||||||
-i, --invariant do not measure timings to remain invariant between runs
|
|
||||||
-d, --discover collect test suites only, do not run any tests
|
|
||||||
-c, --continue do not modify exit code to test suite status
|
|
||||||
-h show brief usage information and exit
|
|
||||||
--help show this help message and exit
|
|
||||||
EOF
|
|
||||||
exit 0;;
|
|
||||||
-v|--verbose)
|
|
||||||
DEBUG=1;;
|
|
||||||
-x|--stop)
|
|
||||||
STOP=1;;
|
|
||||||
-i|--invariant)
|
|
||||||
INVARIANT=1;;
|
|
||||||
-d|--discover)
|
|
||||||
DISCOVERONLY=1;;
|
|
||||||
-c|--continue)
|
|
||||||
CONTINUE=1;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
_indent=$'\n\t' # local format helper
|
|
||||||
|
|
||||||
_assert_reset() {
|
|
||||||
tests_ran=0
|
|
||||||
tests_failed=0
|
|
||||||
tests_errors=()
|
|
||||||
tests_starttime="$(date +%s%N)" # nanoseconds_since_epoch
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_end() {
|
|
||||||
# assert_end [suite ..]
|
|
||||||
tests_endtime="$(date +%s%N)"
|
|
||||||
# required visible decimal place for seconds (leading zeros if needed)
|
|
||||||
local tests_time="$( \
|
|
||||||
printf "%010d" "$(( ${tests_endtime/%N/000000000}
|
|
||||||
- ${tests_starttime/%N/000000000} ))")" # in ns
|
|
||||||
tests="$tests_ran ${*:+$* }tests"
|
|
||||||
[[ -n "$DISCOVERONLY" ]] && echo "collected $tests." && _assert_reset && return
|
|
||||||
[[ -n "$DEBUG" ]] && echo
|
|
||||||
# to get report_time split tests_time on 2 substrings:
|
|
||||||
# ${tests_time:0:${#tests_time}-9} - seconds
|
|
||||||
# ${tests_time:${#tests_time}-9:3} - milliseconds
|
|
||||||
[[ -z "$INVARIANT" ]] \
|
|
||||||
&& report_time=" in ${tests_time:0:${#tests_time}-9}.${tests_time:${#tests_time}-9:3}s" \
|
|
||||||
|| report_time=
|
|
||||||
|
|
||||||
if [[ "$tests_failed" -eq 0 ]]; then
|
|
||||||
echo "all $tests passed$report_time."
|
|
||||||
else
|
|
||||||
for error in "${tests_errors[@]}"; do echo "$error"; done
|
|
||||||
echo "$tests_failed of $tests failed$report_time."
|
|
||||||
fi
|
|
||||||
tests_failed_previous=$tests_failed
|
|
||||||
[[ $tests_failed -gt 0 ]] && tests_suite_status=1
|
|
||||||
_assert_reset
|
|
||||||
}
|
|
||||||
|
|
||||||
assert() {
|
|
||||||
# assert <command> <expected stdout> [stdin]
|
|
||||||
(( tests_ran++ )) || :
|
|
||||||
[[ -z "$DISCOVERONLY" ]] || return
|
|
||||||
expected=$(echo -ne "${2:-}")
|
|
||||||
result="$(eval 2>/dev/null $1 <<< ${3:-})" || true
|
|
||||||
if [[ "$result" == "$expected" ]]; then
|
|
||||||
[[ -z "$DEBUG" ]] || echo -n .
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
result="$(sed -e :a -e '$!N;s/\n/\\n/;ta' <<< "$result")"
|
|
||||||
[[ -z "$result" ]] && result="nothing" || result="\"$result\""
|
|
||||||
[[ -z "$2" ]] && expected="nothing" || expected="\"$2\""
|
|
||||||
_assert_fail "expected $expected${_indent}got $result" "$1" "$3"
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_raises() {
|
|
||||||
# assert_raises <command> <expected code> [stdin]
|
|
||||||
(( tests_ran++ )) || :
|
|
||||||
[[ -z "$DISCOVERONLY" ]] || return
|
|
||||||
status=0
|
|
||||||
(eval $1 <<< ${3:-}) > /dev/null 2>&1 || status=$?
|
|
||||||
expected=${2:-0}
|
|
||||||
if [[ "$status" -eq "$expected" ]]; then
|
|
||||||
[[ -z "$DEBUG" ]] || echo -n .
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
_assert_fail "program terminated with code $status instead of $expected" "$1" "$3"
|
|
||||||
}
|
|
||||||
|
|
||||||
_assert_fail() {
|
|
||||||
# _assert_fail <failure> <command> <stdin>
|
|
||||||
[[ -n "$DEBUG" ]] && echo -n X
|
|
||||||
report="test #$tests_ran \"$2${3:+ <<< $3}\" failed:${_indent}$1"
|
|
||||||
if [[ -n "$STOP" ]]; then
|
|
||||||
[[ -n "$DEBUG" ]] && echo
|
|
||||||
echo "$report"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
tests_errors[$tests_failed]="$report"
|
|
||||||
(( tests_failed++ )) || :
|
|
||||||
}
|
|
||||||
|
|
||||||
skip_if() {
|
|
||||||
# skip_if <command ..>
|
|
||||||
(eval $@) > /dev/null 2>&1 && status=0 || status=$?
|
|
||||||
[[ "$status" -eq 0 ]] || return
|
|
||||||
skip
|
|
||||||
}
|
|
||||||
|
|
||||||
skip() {
|
|
||||||
# skip (no arguments)
|
|
||||||
shopt -q extdebug && tests_extdebug=0 || tests_extdebug=1
|
|
||||||
shopt -q -o errexit && tests_errexit=0 || tests_errexit=1
|
|
||||||
# enable extdebug so returning 1 in a DEBUG trap handler skips next command
|
|
||||||
shopt -s extdebug
|
|
||||||
# disable errexit (set -e) so we can safely return 1 without causing exit
|
|
||||||
set +o errexit
|
|
||||||
tests_trapped=0
|
|
||||||
trap _skip DEBUG
|
|
||||||
}
|
|
||||||
_skip() {
|
|
||||||
if [[ $tests_trapped -eq 0 ]]; then
|
|
||||||
# DEBUG trap for command we want to skip. Do not remove the handler
|
|
||||||
# yet because *after* the command we need to reset extdebug/errexit (in
|
|
||||||
# another DEBUG trap.)
|
|
||||||
tests_trapped=1
|
|
||||||
[[ -z "$DEBUG" ]] || echo -n s
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
trap - DEBUG
|
|
||||||
[[ $tests_extdebug -eq 0 ]] || shopt -u extdebug
|
|
||||||
[[ $tests_errexit -eq 1 ]] || set -o errexit
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
_assert_reset
|
|
||||||
: ${tests_suite_status:=0} # remember if any of the tests failed so far
|
|
||||||
_assert_cleanup() {
|
|
||||||
local status=$?
|
|
||||||
# modify exit code if it's not already non-zero
|
|
||||||
[[ $status -eq 0 && -z $CONTINUE ]] && exit $tests_suite_status
|
|
||||||
}
|
|
||||||
trap _assert_cleanup EXIT
|
|
116
test/test.sh
116
test/test.sh
|
@ -1,116 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Set up test framework
|
|
||||||
source assert.sh
|
|
||||||
|
|
||||||
# Testing that services are running and pop3 is disabled
|
|
||||||
assert_raises "docker exec mail ps aux --forest | grep -v grep | grep '/usr/lib/postfix/master'" 0
|
|
||||||
assert_raises "docker exec mail ps aux --forest | grep -v grep | grep '/usr/sbin/saslauthd'" 0
|
|
||||||
assert_raises "docker exec mail ps aux --forest | grep -v grep | grep '/usr/sbin/clamd'" 0
|
|
||||||
assert_raises "docker exec mail ps aux --forest | grep -v grep | grep '/usr/sbin/amavisd-new'" 0
|
|
||||||
assert_raises "docker exec mail ps aux --forest | grep -v grep | grep '/usr/sbin/opendkim'" 0
|
|
||||||
assert_raises "docker exec mail ps aux --forest | grep -v grep | grep '/usr/sbin/opendmarc'" 0
|
|
||||||
assert_raises "docker exec mail ps aux --forest | grep -v grep | grep '/usr/lib/courier/courier/courierpop3d'" 1
|
|
||||||
assert_raises "docker exec mail ps aux --forest | grep -v grep | grep '/usr/bin/python /usr/bin/fail2ban-server'" 0
|
|
||||||
|
|
||||||
# Testing services of pop3 container
|
|
||||||
assert_raises "docker exec mail_pop3 ps aux --forest | grep -v grep | grep '/usr/lib/courier/courier/courierpop3d'" 0
|
|
||||||
|
|
||||||
# Testing IMAP server
|
|
||||||
assert_raises "docker exec mail nc -w 1 0.0.0.0 143 | grep '* OK' | grep 'STARTTLS' | grep 'Courier-IMAP ready'" 0
|
|
||||||
assert_raises "docker exec mail /bin/sh -c 'nc -w 1 0.0.0.0 143 < /tmp/test/auth/imap-auth.txt'" 0
|
|
||||||
|
|
||||||
# Testing POP3 server on pop3 container
|
|
||||||
assert_raises "docker exec mail_pop3 nc -w 1 0.0.0.0 110 | grep '+OK'" 0
|
|
||||||
assert_raises "docker exec mail_pop3 /bin/sh -c 'nc -w 1 0.0.0.0 110 < /tmp/test/auth/pop3-auth.txt'" 0
|
|
||||||
|
|
||||||
# Testing SASL
|
|
||||||
assert_raises "docker exec mail testsaslauthd -u user2 -r otherdomain.tld -p mypassword | grep 'OK \"Success.\"'" 0
|
|
||||||
assert_raises "docker exec mail testsaslauthd -u user2 -r otherdomain.tld -p BADPASSWORD | grep 'NO \"authentication failed\"'" 0
|
|
||||||
assert_raises "docker exec mail /bin/sh -c 'nc -w 1 0.0.0.0 25 < /tmp/test/auth/smtp-auth-plain.txt' | grep 'Authentication successful'"
|
|
||||||
assert_raises "docker exec mail /bin/sh -c 'nc -w 1 0.0.0.0 25 < /tmp/test/auth/smtp-auth-login.txt' | grep 'Authentication successful'"
|
|
||||||
|
|
||||||
# Testing user creation
|
|
||||||
assert "docker exec mail sasldblistusers2" "user1@localhost.localdomain: userPassword\nuser2@otherdomain.tld: userPassword"
|
|
||||||
assert "docker exec mail ls -A /var/mail/localhost.localdomain/user1" ".Drafts\n.Sent\n.Trash\ncourierimapsubscribed\ncur\nnew\ntmp"
|
|
||||||
assert "docker exec mail ls -A /var/mail/otherdomain.tld/user2" ".Drafts\n.Sent\n.Trash\ncourierimapsubscribed\ncur\nnew\ntmp"
|
|
||||||
|
|
||||||
# Testing `vhost` creation
|
|
||||||
assert "docker exec mail cat /etc/postfix/vhost" "localhost.localdomain\notherdomain.tld"
|
|
||||||
|
|
||||||
# Testing that mail is received for existing user
|
|
||||||
assert_raises "docker exec mail grep 'status=sent (delivered to maildir)' /var/log/mail.log" 0
|
|
||||||
assert "docker exec mail ls -A /var/mail/localhost.localdomain/user1/new | wc -l" "2"
|
|
||||||
|
|
||||||
# Testing that mail is rejected for non existing user
|
|
||||||
assert_raises "docker exec mail grep '<nouser@localhost.localdomain>: Recipient address rejected: User unknown in virtual mailbox table' /var/log/mail.log" 0
|
|
||||||
|
|
||||||
# Testing that mail is received for existing alias
|
|
||||||
assert_raises "docker exec mail grep 'to=<user1@localhost.localdomain>, orig_to=<alias1@localhost.localdomain>' /var/log/mail.log | grep 'status=sent'" 0
|
|
||||||
|
|
||||||
# Testing that mail is redirected for external alias
|
|
||||||
assert_raises "docker exec mail grep -- '-> <external1@otherdomain.tld>' /var/log/mail.log" 0
|
|
||||||
|
|
||||||
# Testing that a SPAM is rejected
|
|
||||||
assert_raises "docker exec mail grep 'Blocked SPAM' /var/log/mail.log | grep spam@external.tld" 0
|
|
||||||
|
|
||||||
# Testing that a Virus is rejected
|
|
||||||
assert_raises "docker exec mail grep 'Blocked INFECTED' /var/log/mail.log | grep virus@external.tld" 0
|
|
||||||
|
|
||||||
# Testing presence of freshclam CRON
|
|
||||||
assert "docker exec mail crontab -l" "0 1 * * * /usr/bin/freshclam --quiet"
|
|
||||||
|
|
||||||
# Testing that log don't display errors
|
|
||||||
assert_raises "docker exec mail grep 'non-null host address bits in' /var/log/mail.log" 1
|
|
||||||
assert_raises "docker exec mail grep ': error:' /var/log/mail.log" 1
|
|
||||||
|
|
||||||
# Testing that pop3 container log don't display errors
|
|
||||||
assert_raises "docker exec mail_pop3 grep 'non-null host address bits in' /var/log/mail.log" 1
|
|
||||||
assert_raises "docker exec mail_pop3 grep ': error:' /var/log/mail.log" 1
|
|
||||||
|
|
||||||
# Testing Spamssassin config in Amavis
|
|
||||||
assert_raises "docker exec mail_pop3 grep '\$sa_tag_level_deflt' /etc/amavis/conf.d/20-debian_defaults | grep '= 2.0'" 0
|
|
||||||
assert_raises "docker exec mail_pop3 grep '\$sa_tag2_level_deflt' /etc/amavis/conf.d/20-debian_defaults | grep '= 6.31'" 0
|
|
||||||
assert_raises "docker exec mail_pop3 grep '\$sa_kill_level_deflt' /etc/amavis/conf.d/20-debian_defaults | grep '= 6.31'" 0
|
|
||||||
assert_raises "docker exec mail grep '\$sa_tag_level_deflt' /etc/amavis/conf.d/20-debian_defaults | grep '= 1.0'" 0
|
|
||||||
assert_raises "docker exec mail grep '\$sa_tag2_level_deflt' /etc/amavis/conf.d/20-debian_defaults | grep '= 2.0'" 0
|
|
||||||
assert_raises "docker exec mail grep '\$sa_kill_level_deflt' /etc/amavis/conf.d/20-debian_defaults | grep '= 3.0'" 0
|
|
||||||
|
|
||||||
# Testing OpenDKIM
|
|
||||||
assert "docker exec mail cat /etc/opendkim/KeyTable | wc -l" "2"
|
|
||||||
assert "docker exec mail ls -l /etc/opendkim/keys/ | grep '^d' | wc -l" "2"
|
|
||||||
|
|
||||||
# Testing OpenDMARC
|
|
||||||
assert "docker exec mail cat /etc/opendmarc.conf | grep ^AuthservID | wc -l" "1"
|
|
||||||
assert "docker exec mail cat /etc/opendmarc.conf | grep ^TrustedAuthservID | wc -l" "1"
|
|
||||||
|
|
||||||
# Testing hostname config
|
|
||||||
assert "docker exec mail cat /etc/mailname" "my-domain.com"
|
|
||||||
|
|
||||||
# Testing presence of LetsEncrypt signed certs
|
|
||||||
assert_raises "docker exec mail grep 'BEGIN CERTIFICATE' /etc/ssl/certs/lets-encrypt-x1-cross-signed.pem" "0"
|
|
||||||
assert_raises "docker exec mail grep 'BEGIN CERTIFICATE' /etc/ssl/certs/lets-encrypt-x2-cross-signed.pem" "0"
|
|
||||||
|
|
||||||
# Testing generated ssl certs
|
|
||||||
assert_raises "docker exec mail openssl s_client -connect 0.0.0.0:587 -starttls smtp -CApath /etc/ssl/certs/ | grep 'Verify return code: 0 (ok)'" "0"
|
|
||||||
|
|
||||||
# Testing fail2ban
|
|
||||||
assert_raises "docker exec mail fail2ban-client status sasl | grep 'IP list:\s*127.0.0.1'" 1
|
|
||||||
|
|
||||||
docker exec mail fail2ban-client set sasl delignoreip 127.0.0.1/8 &> /dev/null
|
|
||||||
|
|
||||||
docker exec mail /bin/sh -c 'nc -w 1 0.0.0.0 25 < /tmp/test/auth/smtp-auth-login-wrong.txt' &> /dev/null
|
|
||||||
docker exec mail /bin/sh -c 'nc -w 1 0.0.0.0 25 < /tmp/test/auth/smtp-auth-login-wrong.txt' &> /dev/null
|
|
||||||
docker exec mail /bin/sh -c 'nc -w 1 0.0.0.0 25 < /tmp/test/auth/smtp-auth-login-wrong.txt' &> /dev/null
|
|
||||||
|
|
||||||
sleep 10
|
|
||||||
assert_raises "docker exec mail fail2ban-client status sasl | grep 'IP list:\s*127.0.0.1'" 0
|
|
||||||
|
|
||||||
docker exec mail fail2ban-client set sasl addignoreip 127.0.0.1/8 &> /dev/null
|
|
||||||
docker exec mail fail2ban-client set sasl unbanip 127.0.0.1 &> /dev/null
|
|
||||||
|
|
||||||
sleep 10
|
|
||||||
assert_raises "docker exec mail fail2ban-client status sasl | grep 'IP list:\s*127.0.0.1'" 1
|
|
||||||
|
|
||||||
# Ending tests
|
|
||||||
assert_end
|
|
Loading…
Reference in a new issue