diff --git a/Makefile b/Makefile index 2367954e..4b270577 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,6 @@ export NAME ?= $(IMAGE_NAME) MAKEFLAGS += --no-print-directory BATS_FLAGS ?= --timing BATS_PARALLEL_JOBS ?= 2 -BATS_FLAGS_PARALLEL ?= $(BATS_FLAGS) --no-parallelize-within-files --jobs $(BATS_PARALLEL_JOBS) .PHONY: ALWAYS_RUN @@ -53,7 +52,8 @@ tests/serial: ALWAYS_RUN @ shopt -s globstar ; ./test/bats/bin/bats $(BATS_FLAGS) test/$@/*.bats tests/parallel/set%: ALWAYS_RUN - @ shopt -s globstar ; ./test/bats/bin/bats $(BATS_FLAGS_PARALLEL) test/$@/**/*.bats + @ shopt -s globstar ; ./test/bats/bin/bats $(BATS_FLAGS) \ + --no-parallelize-within-files --jobs $(BATS_PARALLEL_JOBS) test/$@/**/*.bats test/%: ALWAYS_RUN @ shopt -s globstar nullglob ; ./test/bats/bin/bats $(BATS_FLAGS) test/tests/**/{$*,}.bats diff --git a/test/bats b/test/bats index 410dd229..e8c840b5 160000 --- a/test/bats +++ b/test/bats @@ -1 +1 @@ -Subproject commit 410dd229a5ed005c68167cc90ed0712ad2a1c909 +Subproject commit e8c840b58f0833e23461c682655fe540aa923f85 diff --git a/test/test_helper/bats-assert b/test/test_helper/bats-assert index ffe84ea5..78fa631d 160000 --- a/test/test_helper/bats-assert +++ b/test/test_helper/bats-assert @@ -1 +1 @@ -Subproject commit ffe84ea5dd43b568851549b3e241db150c12929c +Subproject commit 78fa631d1370562d2cd4a1390989e706158e7bf0 diff --git a/test/tests/parallel/set1/default_relay_host.bats b/test/tests/parallel/set1/default_relay_host.bats index 9b79361a..61d6f045 100644 --- a/test/tests/parallel/set1/default_relay_host.bats +++ b/test/tests/parallel/set1/default_relay_host.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='[Relay] ENV:' +BATS_TEST_NAME_PREFIX='[Relay] (ENV) ' CONTAINER_NAME='dms-test_default-relay-host' function setup_file() { @@ -17,7 +17,7 @@ function setup_file() { function teardown_file() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} 'DEFAULT_RELAY_HOST' should configure 'main.cf:relayhost'" { +@test "'DEFAULT_RELAY_HOST' should configure 'main.cf:relayhost'" { _run_in_container bash -c 'grep -e "^relayhost =" /etc/postfix/main.cf' assert_output 'relayhost = default.relay.host.invalid:25' } diff --git a/test/tests/parallel/set1/spam_virus/amavis.bats b/test/tests/parallel/set1/spam_virus/amavis.bats index d2e23a2c..7eb778d8 100644 --- a/test/tests/parallel/set1/spam_virus/amavis.bats +++ b/test/tests/parallel/set1/spam_virus/amavis.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/common" load "${REPOSITORY_ROOT}/test/helper/setup" -TEST_NAME_PREFIX='Amavis:' +BATS_TEST_NAME_PREFIX='[Amavis] ' CONTAINER_NAME='dms-test_amavis' function setup_file() { @@ -18,8 +18,10 @@ function setup_file() { function teardown_file() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} Amavis integration should be active" { - _run_in_container grep 'ANTI-SPAM-SA' /var/log/mail/mail.log +@test "SpamAssassin integration should be active" { + # give Amavis just a bit of time to print out its full debug log + run repeat_in_container_until_success_or_timeout 5 "${CONTAINER_NAME}" grep 'ANTI-SPAM-SA' /var/log/mail/mail.log + assert_success assert_output --partial 'loaded' refute_output --partial 'NOT loaded' } diff --git a/test/tests/parallel/set1/spam_virus/clamav.bats b/test/tests/parallel/set1/spam_virus/clamav.bats index 1a894750..3f0d0cff 100644 --- a/test/tests/parallel/set1/spam_virus/clamav.bats +++ b/test/tests/parallel/set1/spam_virus/clamav.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='ClamAV:' +BATS_TEST_NAME_PREFIX='[ClamAV] ' CONTAINER_NAME='dms-test_clamav' function setup_file() { @@ -34,38 +34,38 @@ function setup_file() { function teardown_file() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} process clamd is running" { +@test "process clamd is running" { run check_if_process_is_running 'clamd' assert_success } -@test "${TEST_NAME_PREFIX} log files exist at /var/log/mail directory" { +@test "log files exist at /var/log/mail directory" { _run_in_container bash -c "ls -1 /var/log/mail/ | grep -E 'clamav|freshclam|mail.log' | wc -l" assert_success assert_output 3 } -@test "${TEST_NAME_PREFIX} should be identified by Amavis" { +@test "should be identified by Amavis" { _run_in_container grep -i 'Found secondary av scanner ClamAV-clamscan' /var/log/mail/mail.log assert_success } -@test "${TEST_NAME_PREFIX} freshclam cron is enabled" { +@test "freshclam cron is enabled" { _run_in_container bash -c "grep '/usr/bin/freshclam' -r /etc/cron.d" assert_success } -@test "${TEST_NAME_PREFIX} env CLAMAV_MESSAGE_SIZE_LIMIT is set correctly" { +@test "env CLAMAV_MESSAGE_SIZE_LIMIT is set correctly" { _run_in_container grep -q '^MaxFileSize 30M$' /etc/clamav/clamd.conf assert_success } -@test "${TEST_NAME_PREFIX} rejects virus" { +@test "rejects virus" { _run_in_container bash -c "grep 'Blocked INFECTED' /var/log/mail/mail.log | grep ' -> '" assert_success } -@test "${TEST_NAME_PREFIX} process clamd restarts when killed" { +@test "process clamd restarts when killed" { _run_in_container pkill 'clamd' assert_success diff --git a/test/tests/parallel/set1/spam_virus/disabled_clamav_spamassassin.bats b/test/tests/parallel/set1/spam_virus/disabled_clamav_spamassassin.bats index b90d9e4b..e3e72635 100644 --- a/test/tests/parallel/set1/spam_virus/disabled_clamav_spamassassin.bats +++ b/test/tests/parallel/set1/spam_virus/disabled_clamav_spamassassin.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='[ClamAV + SA] (disabled):' +BATS_TEST_NAME_PREFIX='[ClamAV + SA] (disabled) ' CONTAINER_NAME='dms-test_clamav-spamassasin_disabled' function setup_file() { @@ -24,22 +24,22 @@ function setup_file() { function teardown_file() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} ClamAV - should be disabled by ENV 'ENABLED_CLAMAV=0'" { +@test "ClamAV - should be disabled by ENV 'ENABLED_CLAMAV=0'" { run check_if_process_is_running 'clamd' assert_failure } -@test "${TEST_NAME_PREFIX} ClamAV - Amavis integration should not be active" { +@test "ClamAV - Amavis integration should not be active" { _run_in_container grep -i 'Found secondary av scanner ClamAV-clamscan' /var/log/mail/mail.log assert_failure } -@test "${TEST_NAME_PREFIX} SA - Amavis integration should not be active" { +@test "SA - Amavis integration should not be active" { _run_in_container bash -c "grep -i 'ANTI-SPAM-SA code' /var/log/mail/mail.log | grep 'NOT loaded'" assert_success } -@test "${TEST_NAME_PREFIX} SA - should not have been called" { +@test "SA - should not have been called" { _run_in_container grep -i 'connect to /var/run/clamav/clamd.ctl failed' /var/log/mail/mail.log assert_failure } diff --git a/test/tests/parallel/set1/spam_virus/dnsbl.bats b/test/tests/parallel/set1/spam_virus/dnsbl.bats index 11cc7ae2..b7a714a2 100644 --- a/test/tests/parallel/set1/spam_virus/dnsbl.bats +++ b/test/tests/parallel/set1/spam_virus/dnsbl.bats @@ -1,8 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='DNSBLs:' - +BATS_TEST_NAME_PREFIX='[DNSBLs] ' CONTAINER1_NAME='dms-test_dnsbl_enabled' CONTAINER2_NAME='dms-test_dnsbl_disabled' @@ -29,33 +28,33 @@ function teardown_file() { } # ENABLE_DNSBL=1 -@test "${TEST_NAME_PREFIX} (enabled) Postfix DNS block list zen.spamhaus.org" { +@test "(enabled) Postfix DNS block list zen.spamhaus.org" { run docker exec "${CONTAINER1_NAME}" postconf smtpd_recipient_restrictions assert_output --partial 'reject_rbl_client zen.spamhaus.org' } -@test "${TEST_NAME_PREFIX} (enabled) Postscreen DNS block lists -> postscreen_dnsbl_action" { +@test "(enabled) Postscreen DNS block lists -> postscreen_dnsbl_action" { run docker exec "${CONTAINER1_NAME}" postconf postscreen_dnsbl_action assert_output 'postscreen_dnsbl_action = enforce' } -@test "${TEST_NAME_PREFIX} (enabled) Postscreen DNS block lists -> postscreen_dnsbl_sites" { +@test "(enabled) Postscreen DNS block lists -> postscreen_dnsbl_sites" { run docker exec "${CONTAINER1_NAME}" postconf postscreen_dnsbl_sites assert_output 'postscreen_dnsbl_sites = zen.spamhaus.org=127.0.0.[2..11]*3 bl.mailspike.net=127.0.0.[2;14;13;12;11;10] b.barracudacentral.org*2 bl.spameatingmonkey.net=127.0.0.2 dnsbl.sorbs.net psbl.surriel.com list.dnswl.org=127.0.[0..255].0*-2 list.dnswl.org=127.0.[0..255].1*-3 list.dnswl.org=127.0.[0..255].[2..3]*-4' } # ENABLE_DNSBL=0 -@test "${TEST_NAME_PREFIX} (disabled) Postfix DNS block list zen.spamhaus.org" { +@test "(disabled) Postfix DNS block list zen.spamhaus.org" { run docker exec "${CONTAINER2_NAME}" postconf smtpd_recipient_restrictions refute_output --partial 'reject_rbl_client zen.spamhaus.org' } -@test "${TEST_NAME_PREFIX} (disabled) Postscreen DNS block lists -> postscreen_dnsbl_action" { +@test "(disabled) Postscreen DNS block lists -> postscreen_dnsbl_action" { run docker exec "${CONTAINER2_NAME}" postconf postscreen_dnsbl_action assert_output 'postscreen_dnsbl_action = ignore' } -@test "${TEST_NAME_PREFIX} (disabled) Postscreen DNS block lists -> postscreen_dnsbl_sites" { +@test "(disabled) Postscreen DNS block lists -> postscreen_dnsbl_sites" { run docker exec "${CONTAINER2_NAME}" postconf postscreen_dnsbl_sites assert_output 'postscreen_dnsbl_sites =' } diff --git a/test/tests/parallel/set1/spam_virus/fail2ban.bats b/test/tests/parallel/set1/spam_virus/fail2ban.bats index a065e06e..6dc79f6c 100644 --- a/test/tests/parallel/set1/spam_virus/fail2ban.bats +++ b/test/tests/parallel/set1/spam_virus/fail2ban.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='Fail2Ban:' +BATS_TEST_NAME_PREFIX='[Fail2Ban] ' CONTAINER1_NAME='dms-test_fail2ban' CONTAINER2_NAME='dms-test_fail2ban_fail-auth-mailer' @@ -33,12 +33,12 @@ function teardown_file() { docker rm -f "${CONTAINER1_NAME}" "${CONTAINER2_NAME}" } -@test "${TEST_NAME_PREFIX} Fail2Ban is running" { +@test "Fail2Ban is running" { run check_if_process_is_running 'fail2ban-server' assert_success } -@test "${TEST_NAME_PREFIX} localhost is not banned because ignored" { +@test "localhost is not banned because ignored" { _run_in_container fail2ban-client status postfix-sasl assert_success refute_output --regexp '.*IP list:.*127\.0\.0\.1.*' @@ -47,13 +47,13 @@ function teardown_file() { assert_success } -@test "${TEST_NAME_PREFIX} fail2ban-fail2ban.cf overrides" { +@test "fail2ban-fail2ban.cf overrides" { _run_in_container fail2ban-client get loglevel assert_success assert_output --partial 'DEBUG' } -@test "${TEST_NAME_PREFIX} fail2ban-jail.cf overrides" { +@test "fail2ban-jail.cf overrides" { for FILTER in 'dovecot' 'postfix' 'postfix-sasl' do _run_in_container fail2ban-client get "${FILTER}" bantime @@ -76,7 +76,7 @@ function teardown_file() { # - After multiple login fails and a slight delay, f2b will ban that IP. # - You could hard-code `sleep 5` on both cases to avoid the alternative assertions, # but the polling + piping into grep approach here reliably minimizes the delay. -@test "${TEST_NAME_PREFIX} ban ip on multiple failed login" { +@test "ban ip on multiple failed login" { CONTAINER1_IP=$(get_container_ip ${CONTAINER1_NAME}) # Trigger a ban by failing to login twice: _run_in_container_explicit "${CONTAINER2_NAME}" bash -c "nc ${CONTAINER1_IP} 25 < /tmp/docker-mailserver-test/auth/smtp-auth-login-wrong.txt" @@ -95,7 +95,7 @@ function teardown_file() { } # NOTE: Depends on previous test case, if no IP was banned at this point, it passes regardless.. -@test "${TEST_NAME_PREFIX} unban ip works" { +@test "unban ip works" { CONTAINER2_IP=$(get_container_ip ${CONTAINER2_NAME}) _run_in_container fail2ban-client set postfix-sasl unbanip "${CONTAINER2_IP}" assert_success @@ -110,7 +110,7 @@ function teardown_file() { refute_output --partial "${CONTAINER2_IP}" } -@test "${TEST_NAME_PREFIX} bans work properly (single IP)" { +@test "bans work properly (single IP)" { _run_in_container fail2ban ban 192.0.66.7 assert_success assert_output 'Banned custom IP: 1' @@ -131,7 +131,7 @@ function teardown_file() { refute_output --partial '192.0.66.7' } -@test "${TEST_NAME_PREFIX} bans work properly (subnet)" { +@test "bans work properly (subnet)" { _run_in_container fail2ban ban 192.0.66.0/24 assert_success assert_output 'Banned custom IP: 1' @@ -152,7 +152,7 @@ function teardown_file() { refute_output --partial '192.0.66.0/24' } -@test "${TEST_NAME_PREFIX} FAIL2BAN_BLOCKTYPE is really set to drop" { +@test "FAIL2BAN_BLOCKTYPE is really set to drop" { # ban IPs here manually so we can be sure something is inside the jails for JAIL in dovecot postfix-sasl custom; do _run_in_container fail2ban-client set "${JAIL}" banip 192.33.44.55 @@ -172,7 +172,7 @@ function teardown_file() { done } -@test "${TEST_NAME_PREFIX} setup.sh fail2ban" { +@test "setup.sh fail2ban" { _run_in_container fail2ban-client set dovecot banip 192.0.66.4 _run_in_container fail2ban-client set dovecot banip 192.0.66.5 @@ -194,7 +194,7 @@ function teardown_file() { assert_output --partial 'You need to specify an IP address: Run' } -@test "${TEST_NAME_PREFIX} restart of Fail2Ban" { +@test "restart of Fail2Ban" { _run_in_container pkill fail2ban assert_success diff --git a/test/tests/parallel/set1/spam_virus/postgrey_enabled.bats b/test/tests/parallel/set1/spam_virus/postgrey_enabled.bats index bc57c73a..efac202a 100644 --- a/test/tests/parallel/set1/spam_virus/postgrey_enabled.bats +++ b/test/tests/parallel/set1/spam_virus/postgrey_enabled.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='Postgrey (enabled):' +BATS_TEST_NAME_PREFIX='[Postgrey] (enabled) ' CONTAINER_NAME='dms-test_postgrey_enabled' function setup_file() { @@ -24,13 +24,13 @@ function setup_file() { function teardown_file() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} should have added Postgrey to 'main.cf:check_policy_service'" { +@test "should have added Postgrey to 'main.cf:check_policy_service'" { _run_in_container grep -F 'check_policy_service inet:127.0.0.1:10023' /etc/postfix/main.cf assert_success _should_output_number_of_lines 1 } -@test "${TEST_NAME_PREFIX} should have configured /etc/default/postgrey with default values and ENV overrides" { +@test "should have configured /etc/default/postgrey with default values and ENV overrides" { _run_in_container grep -F 'POSTGREY_OPTS="--inet=127.0.0.1:10023 --delay=3 --max-age=35 --auto-whitelist-clients=5"' /etc/default/postgrey assert_success _should_output_number_of_lines 1 @@ -40,12 +40,12 @@ function teardown_file() { _default_teardown ; } _should_output_number_of_lines 1 } -@test "${TEST_NAME_PREFIX} Postgrey is running" { +@test "Postgrey is running" { run check_if_process_is_running 'postgrey' assert_success } -@test "${TEST_NAME_PREFIX} should initially reject (greylist) mail from 'user@external.tld'" { +@test "should initially reject (greylist) mail from 'user@external.tld'" { # Modify the postfix config in order to ensure that postgrey handles the test e-mail. # The other spam checks in `main.cf:smtpd_recipient_restrictions` would interfere with testing postgrey. _run_in_container bash -c "sed -ie 's/permit_sasl_authenticated.*policyd-spf,$//g' /etc/postfix/main.cf" @@ -69,8 +69,8 @@ function teardown_file() { _default_teardown ; } } # NOTE: This test case depends on the previous one -@test "${TEST_NAME_PREFIX} should accept mail from 'user@external.tld' after POSTGREY_DELAY duration" { - # Wait until `$POSTGREY_DELAY` seconds pass before trying again: +@test "should accept mail from 'user@external.tld' after POSTGREY_DELAY duration" { + # Wait until `$POSTGREY_DELAY` seconds pass before trying again: sleep 3 # Retry delivering test mail (it should be trusted this time): _send_test_mail '/tmp/docker-mailserver-test/email-templates/postgrey.txt' '25' @@ -90,7 +90,7 @@ function teardown_file() { _default_teardown ; } # - However this does not help verify that the actual client HELO address is properly whitelisted? # - It'd also cause the earlier greylist test to fail. # - TODO: Actually confirm whitelist feature works correctly as these test cases are using a workaround: -@test "${TEST_NAME_PREFIX} should whitelist sender 'user@whitelist.tld'" { +@test "should whitelist sender 'user@whitelist.tld'" { _send_test_mail '/tmp/docker-mailserver-test/nc_templates/postgrey_whitelist.txt' '10023' _should_have_log_entry \ @@ -99,7 +99,7 @@ function teardown_file() { _default_teardown ; } 'client_address=127.0.0.1/32, sender=test@whitelist.tld, recipient=user1@localhost.localdomain' } -@test "${TEST_NAME_PREFIX} should whitelist recipient 'user2@otherdomain.tld'" { +@test "should whitelist recipient 'user2@otherdomain.tld'" { _send_test_mail '/tmp/docker-mailserver-test/nc_templates/postgrey_whitelist_recipients.txt' '10023' _should_have_log_entry \ diff --git a/test/tests/parallel/set1/spam_virus/postscreen.bats b/test/tests/parallel/set1/spam_virus/postscreen.bats index 492bb96b..df76c38d 100644 --- a/test/tests/parallel/set1/spam_virus/postscreen.bats +++ b/test/tests/parallel/set1/spam_virus/postscreen.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='Postscreen:' +BATS_TEST_NAME_PREFIX='[Postscreen] ' CONTAINER1_NAME='dms-test_postscreen_enforce' CONTAINER2_NAME='dms-test_postscreen_sender' @@ -37,7 +37,7 @@ function teardown_file() { docker rm -f "${CONTAINER1_NAME}" "${CONTAINER2_NAME}" } -@test "${TEST_NAME_PREFIX} should fail login when talking out of turn" { +@test "should fail login when talking out of turn" { _run_in_container_explicit "${CONTAINER2_NAME}" bash -c "nc ${CONTAINER1_IP} 25 < /tmp/docker-mailserver-test/auth/smtp-auth-login.txt" assert_success assert_output --partial '502 5.5.2 Error: command not recognized' @@ -47,7 +47,7 @@ function teardown_file() { assert_output --partial 'COMMAND PIPELINING' } -@test "${TEST_NAME_PREFIX} should successfully login (respecting postscreen_greet_wait time)" { +@test "should successfully login (respecting postscreen_greet_wait time)" { # NOTE: Sometimes fails on first attempt (trying too soon?), # Instead of a `run` + asserting partial, Using repeat + internal grep match: repeat_until_success_or_timeout 10 _should_wait_turn_speaking_smtp \ diff --git a/test/tests/parallel/set1/spam_virus/spam_bounced.bats b/test/tests/parallel/set1/spam_virus/spam_bounced.bats index 1931149e..19f176f6 100644 --- a/test/tests/parallel/set1/spam_virus/spam_bounced.bats +++ b/test/tests/parallel/set1/spam_virus/spam_bounced.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='Spam bounced:' +BATS_TEST_NAME_PREFIX='[Spam] (bounced) ' CONTAINER_NAME='dms-test_spam-bounced' function setup_file() { @@ -25,7 +25,7 @@ function teardown_file() { _default_teardown ; } # When SPAMASSASSIN_SPAM_TO_INBOX=0, spam messages must be bounced (rejected). # SPAMASSASSIN_SPAM_TO_INBOX=1 is covered in `mail_spam_junk_folder.bats`. # Original test PR: https://github.com/docker-mailserver/docker-mailserver/pull/1485 -@test "${TEST_NAME_PREFIX} spam message is bounced (rejected)" { +@test "spam message is bounced (rejected)" { # send a spam message _run_in_container /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/email-templates/amavis-spam.txt" assert_success diff --git a/test/tests/parallel/set1/spam_virus/spam_junk_folder.bats b/test/tests/parallel/set1/spam_virus/spam_junk_folder.bats index b69f774d..bafd75b7 100644 --- a/test/tests/parallel/set1/spam_virus/spam_junk_folder.bats +++ b/test/tests/parallel/set1/spam_virus/spam_junk_folder.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='Spam junk folder:' +BATS_TEST_NAME_PREFIX='[Spam] (junk folder) ' CONTAINER1_NAME='dms-test_spam-junk-folder_1' CONTAINER2_NAME='dms-test_spam-junk-folder_2' @@ -12,7 +12,7 @@ function teardown() { _default_teardown ; } # When SPAMASSASSIN_SPAM_TO_INBOX=1, spam messages must be delivered # and eventually (MOVE_SPAM_TO_JUNK=1) moved to the Junk folder. -@test "${TEST_NAME_PREFIX} (Amavis) spam message delivered & moved to Junk folder" { +@test "(Amavis) spam message delivered & moved to Junk folder" { export CONTAINER_NAME=${CONTAINER1_NAME} local CUSTOM_SETUP_ARGUMENTS=( --env ENABLE_AMAVIS=1 @@ -39,7 +39,7 @@ function teardown() { _default_teardown ; } assert_success } -@test "${TEST_NAME_PREFIX} (Amavis) spam message delivered to INBOX" { +@test "(Amavis) spam message delivered to INBOX" { export CONTAINER_NAME=${CONTAINER2_NAME} local CUSTOM_SETUP_ARGUMENTS=( --env ENABLE_AMAVIS=1 diff --git a/test/tests/parallel/set1/spam_virus/undef_spam_subject.bats b/test/tests/parallel/set1/spam_virus/undef_spam_subject.bats index b3b16bbe..9a0a6f0f 100644 --- a/test/tests/parallel/set1/spam_virus/undef_spam_subject.bats +++ b/test/tests/parallel/set1/spam_virus/undef_spam_subject.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='Undefined spam subject:' +BATS_TEST_NAME_PREFIX='[Spam] (undefined subject) ' CONTAINER1_NAME='dms-test_spam-undef-subject_1' CONTAINER2_NAME='dms-test_spam-undef-subject_2' @@ -9,7 +9,7 @@ CONTAINER_NAME=${CONTAINER2_NAME} function teardown() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} 'SA_SPAM_SUBJECT=undef' should update Amavis config" { +@test "'SA_SPAM_SUBJECT=undef' should update Amavis config" { export CONTAINER_NAME=${CONTAINER1_NAME} local CUSTOM_SETUP_ARGUMENTS=( --env ENABLE_AMAVIS=1 @@ -24,7 +24,7 @@ function teardown() { _default_teardown ; } } # TODO: Unclear why some of these ENV are relevant for the test? -@test "${TEST_NAME_PREFIX} Docker env variables are set correctly (custom)" { +@test "Docker env variables are set correctly (custom)" { export CONTAINER_NAME=${CONTAINER2_NAME} local CUSTOM_SETUP_ARGUMENTS=( diff --git a/test/tests/parallel/set2/template.bats b/test/tests/parallel/set2/template.bats index 7415b43a..b020b6bf 100644 --- a/test/tests/parallel/set2/template.bats +++ b/test/tests/parallel/set2/template.bats @@ -4,7 +4,7 @@ load "${REPOSITORY_ROOT}/test/helper/common" # ? global variable initialization # ? to identify the test easily -TEST_NAME_PREFIX='template:' +BATS_TEST_NAME_PREFIX='[no-op template] ' # ? must be unique CONTAINER_NAME='dms-test_template' @@ -33,7 +33,7 @@ function teardown_file() { _default_teardown ; } # ? actual unit tests -@test "${TEST_NAME_PREFIX} default check" { +@test "default check" { _run_in_container bash -c "true" assert_success } diff --git a/test/tests/parallel/set2/tls/tls_cipherlists.bats b/test/tests/parallel/set2/tls/tls_cipherlists.bats index 745cc9ea..57fd1cef 100644 --- a/test/tests/parallel/set2/tls/tls_cipherlists.bats +++ b/test/tests/parallel/set2/tls/tls_cipherlists.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='[Security] TLS (cipher lists):' +BATS_TEST_NAME_PREFIX='[Security] (TLS) (cipher lists) ' CONTAINER_PREFIX='dms-test_tls-cipherlists' # NOTE: Tests cases here cannot be run concurrently: @@ -38,34 +38,34 @@ function teardown_file() { function teardown() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} 'TLS_LEVEL=intermediate' + RSA" { +@test "'TLS_LEVEL=intermediate' + RSA" { configure_and_run_dms_container 'intermediate' 'rsa' should_support_expected_cipherlists } -@test "${TEST_NAME_PREFIX} 'TLS_LEVEL=intermediate' + ECDSA" { +@test "'TLS_LEVEL=intermediate' + ECDSA" { configure_and_run_dms_container 'intermediate' 'ecdsa' should_support_expected_cipherlists } # Only ECDSA with an RSA fallback is tested. # There isn't a situation where RSA with an ECDSA fallback would make sense. -@test "${TEST_NAME_PREFIX} 'TLS_LEVEL=intermediate' + ECDSA with RSA fallback" { +@test "'TLS_LEVEL=intermediate' + ECDSA with RSA fallback" { configure_and_run_dms_container 'intermediate' 'ecdsa' 'rsa' should_support_expected_cipherlists } -@test "${TEST_NAME_PREFIX} 'TLS_LEVEL=modern' + RSA" { +@test "'TLS_LEVEL=modern' + RSA" { configure_and_run_dms_container 'modern' 'rsa' should_support_expected_cipherlists } -@test "${TEST_NAME_PREFIX} 'TLS_LEVEL=modern' + ECDSA" { +@test "'TLS_LEVEL=modern' + ECDSA" { configure_and_run_dms_container 'modern' 'ecdsa' should_support_expected_cipherlists } -@test "${TEST_NAME_PREFIX} 'TLS_LEVEL=modern' + ECDSA with RSA fallback" { +@test "'TLS_LEVEL=modern' + ECDSA with RSA fallback" { configure_and_run_dms_container 'modern' 'ecdsa' 'rsa' should_support_expected_cipherlists } diff --git a/test/tests/parallel/set2/tls/tls_letsencrypt.bats b/test/tests/parallel/set2/tls/tls_letsencrypt.bats index fc6b649e..68f7028c 100644 --- a/test/tests/parallel/set2/tls/tls_letsencrypt.bats +++ b/test/tests/parallel/set2/tls/tls_letsencrypt.bats @@ -2,7 +2,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" load "${REPOSITORY_ROOT}/test/helper/tls" -TEST_NAME_PREFIX='[Security] TLS (SSL_TYPE=letsencrypt):' +BATS_TEST_NAME_PREFIX='[Security] (TLS) (SSL_TYPE=letsencrypt) ' CONTAINER1_NAME='dms-test_tls-letsencrypt_default-hostname' CONTAINER2_NAME='dms-test_tls-letsencrypt_fallback-domainname' CONTAINER3_NAME='dms-test_tls-letsencrypt_support-acme-json' @@ -30,7 +30,7 @@ function _initial_setup() { } # Should detect and choose the cert for FQDN `mail.example.test` (HOSTNAME): -@test "${TEST_NAME_PREFIX} Should default to HOSTNAME (${TEST_FQDN})" { +@test "Should default to HOSTNAME (${TEST_FQDN})" { export CONTAINER_NAME=${CONTAINER1_NAME} _initial_setup @@ -50,7 +50,7 @@ function _initial_setup() { # Should detect and choose cert for FQDN `example.test` (DOMAINNAME), # as fallback when no cert for FQDN `mail.example.test` (HOSTNAME) exists: -@test "${TEST_NAME_PREFIX} Should fallback to DOMAINNAME (example.test)" { +@test "Should fallback to DOMAINNAME (example.test)" { export CONTAINER_NAME=${CONTAINER2_NAME} _initial_setup @@ -75,7 +75,7 @@ function _initial_setup() { # all Subject CN (`main` in acme.json) are `Smallstep Leaf` which is not an FQDN. # While not using a FQDN is valid for that field, # it does mean there is no test coverage against the `acme.json` field `main`. -@test "${TEST_NAME_PREFIX} Traefik 'acme.json' (*.example.test)" { +@test "Traefik 'acme.json' (*.example.test)" { export CONTAINER_NAME=${CONTAINER3_NAME} _initial_setup diff --git a/test/tests/parallel/set2/tls/tls_manual.bats b/test/tests/parallel/set2/tls/tls_manual.bats index bf0d2d86..bdbcf6c7 100644 --- a/test/tests/parallel/set2/tls/tls_manual.bats +++ b/test/tests/parallel/set2/tls/tls_manual.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='[Security] TLS (SSL_TYPE=manual):' +BATS_TEST_NAME_PREFIX='[Security] (TLS) (SSL_TYPE=manual) ' CONTAINER_NAME='dms-test_tls-manual' function setup_file() { @@ -38,7 +38,7 @@ function setup_file() { function teardown_file() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} ENV vars provided are valid files" { +@test "ENV vars provided are valid files" { _run_in_container [ -f "${SSL_CERT_PATH}" ] assert_success @@ -52,7 +52,7 @@ function teardown_file() { _default_teardown ; } assert_success } -@test "${TEST_NAME_PREFIX} manual configuration is correct" { +@test "manual configuration is correct" { local DOVECOT_CONFIG_SSL='/etc/dovecot/conf.d/10-ssl.conf' _run_in_container grep '^smtpd_tls_chain_files =' '/etc/postfix/main.cf' @@ -76,7 +76,7 @@ function teardown_file() { _default_teardown ; } assert_output "ssl_alt_cert = <${FALLBACK_CERT}" } -@test "${TEST_NAME_PREFIX} manual configuration copied files correctly " { +@test "manual configuration copied files correctly " { _run_in_container cmp -s "${PRIMARY_KEY}" "${SSL_KEY_PATH}" assert_success _run_in_container cmp -s "${PRIMARY_CERT}" "${SSL_CERT_PATH}" @@ -89,7 +89,7 @@ function teardown_file() { _default_teardown ; } assert_success } -@test "${TEST_NAME_PREFIX} manual cert works correctly" { +@test "manual cert works correctly" { wait_for_tcp_port_in_container 587 "${CONTAINER_NAME}" local TEST_COMMAND=(timeout 1 openssl s_client -connect mail.example.test:587 -starttls smtp) @@ -106,7 +106,7 @@ function teardown_file() { _default_teardown ; } assert_equal "${RESULT}" 'Verification: OK' } -@test "${TEST_NAME_PREFIX} manual cert changes are picked up by check-for-changes" { +@test "manual cert changes are picked up by check-for-changes" { printf '%s' 'someThingsChangedHere' \ >>"$(pwd)/test/test-files/ssl/${TEST_DOMAIN}/with_ca/ecdsa/key.ecdsa.pem" diff --git a/test/tests/parallel/set3/config-overrides.bats b/test/tests/parallel/set3/config-overrides.bats index 2a42ed55..fa85ae77 100644 --- a/test/tests/parallel/set3/config-overrides.bats +++ b/test/tests/parallel/set3/config-overrides.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/common" load "${REPOSITORY_ROOT}/test/helper/setup" -TEST_NAME_PREFIX='Override Configs:' +BATS_TEST_NAME_PREFIX='[Configuration] (overrides) ' CONTAINER_NAME='dms-test_config-overrides' function setup_file() { @@ -15,7 +15,7 @@ function setup_file() { function teardown_file() { _default_teardown ; } -@test "${TEST_NAME_PREFIX}: Postfix - 'postfix-main.cf' overrides applied to '/etc/postfix/main.cf'" { +@test "Postfix - 'postfix-main.cf' overrides applied to '/etc/postfix/main.cf'" { _run_in_container grep -q 'max_idle = 600s' /tmp/docker-mailserver/postfix-main.cf assert_success @@ -28,7 +28,7 @@ function teardown_file() { _default_teardown ; } assert_output --partial 'readme_directory = /tmp' } -@test "${TEST_NAME_PREFIX}: Postfix - 'postfix-master.cf' overrides applied to '/etc/postfix/master.cf'" { +@test "Postfix - 'postfix-master.cf' overrides applied to '/etc/postfix/master.cf'" { _run_in_container grep -q 'submission/inet/smtpd_sasl_security_options=noanonymous' /tmp/docker-mailserver/postfix-master.cf assert_success @@ -37,7 +37,7 @@ function teardown_file() { _default_teardown ; } assert_output --partial '-o smtpd_sasl_security_options=noanonymous' } -@test "${TEST_NAME_PREFIX}: Dovecot - 'dovecot.cf' overrides applied to '/etc/dovecot/local.conf'" { +@test "Dovecot - 'dovecot.cf' overrides applied to '/etc/dovecot/local.conf'" { _run_in_container grep -q 'mail_max_userip_connections = 69' /tmp/docker-mailserver/dovecot.cf assert_success diff --git a/test/tests/parallel/set3/dovecot-sieve.bats b/test/tests/parallel/set3/dovecot-sieve.bats index e465e623..bdf64a25 100644 --- a/test/tests/parallel/set3/dovecot-sieve.bats +++ b/test/tests/parallel/set3/dovecot-sieve.bats @@ -4,7 +4,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" # Docs: # https://docker-mailserver.github.io/docker-mailserver/edge/config/advanced/mail-sieve/ -TEST_NAME_PREFIX='Dovecot [Sieve Support]:' +BATS_TEST_NAME_PREFIX='[Dovecot] (Sieve support) ' CONTAINER_NAME='dms-test_dovecot-sieve' function setup_file() { @@ -36,20 +36,20 @@ function setup_file() { function teardown_file() { _default_teardown ; } # dovecot-sieve/dovecot.sieve -@test "${TEST_NAME_PREFIX} User Sieve - should store mail from 'spam@spam.com' into recipient (user1) mailbox 'INBOX.spam'" { +@test "User Sieve - should store mail from 'spam@spam.com' into recipient (user1) mailbox 'INBOX.spam'" { _run_in_container bash -c 'ls -A /var/mail/localhost.localdomain/user1/.INBOX.spam/new' assert_success _should_output_number_of_lines 1 } # dovecot-sieve/before.dovecot.sieve -@test "${TEST_NAME_PREFIX} Global Sieve - should have copied mail from 'spam@spam.com' to recipient (user1) inbox" { +@test "Global Sieve - should have copied mail from 'spam@spam.com' to recipient (user1) inbox" { _run_in_container grep 'Spambot ' -R /var/mail/localhost.localdomain/user1/new/ assert_success } # dovecot-sieve/sieve-pipe + dovecot-sieve/user2@otherdomain.tld.dovecot.sieve -@test "${TEST_NAME_PREFIX} Sieve Pipe - should pipe mail received for user2 into '/tmp/pipe-test.out'" { +@test "Sieve Pipe - should pipe mail received for user2 into '/tmp/pipe-test.out'" { _run_in_container bash -c 'ls -A /tmp/pipe-test.out' assert_success _should_output_number_of_lines 1 @@ -57,7 +57,7 @@ function teardown_file() { _default_teardown ; } # Only test coverage for feature is to check that the service is listening on the expected port: # https://doc.dovecot.org/admin_manual/pigeonhole_managesieve_server/ -@test "${TEST_NAME_PREFIX} ENV 'ENABLE_MANAGESIEVE' - should have enabled service on port 4190" { +@test "ENV 'ENABLE_MANAGESIEVE' - should have enabled service on port 4190" { _run_in_container bash -c 'nc -z 0.0.0.0 4190' assert_success } diff --git a/test/tests/parallel/set3/dovecot_inet_protocol.bats b/test/tests/parallel/set3/dovecot_inet_protocol.bats index ce7bd832..3e6fd951 100644 --- a/test/tests/parallel/set3/dovecot_inet_protocol.bats +++ b/test/tests/parallel/set3/dovecot_inet_protocol.bats @@ -1,14 +1,14 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='Dovecot protocols:' +BATS_TEST_NAME_PREFIX='[Dovecot] (protocols) ' CONTAINER1_NAME='dms-test_dovecot_protocols_all' CONTAINER2_NAME='dms-test_dovecot_protocols_ipv4' CONTAINER3_NAME='dms-test_dovecot_protocols_ipv6' function teardown() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} dual-stack IP configuration" { +@test "dual-stack IP configuration" { export CONTAINER_NAME=${CONTAINER1_NAME} local CUSTOM_SETUP_ARGUMENTS=(--env DOVECOT_INET_PROTOCOLS=) @@ -20,7 +20,7 @@ function teardown() { _default_teardown ; } assert_output '#listen = *, ::' } -@test "${TEST_NAME_PREFIX} IPv4 configuration" { +@test "IPv4 configuration" { export CONTAINER_NAME=${CONTAINER2_NAME} local CUSTOM_SETUP_ARGUMENTS=(--env DOVECOT_INET_PROTOCOLS=ipv4) @@ -32,7 +32,7 @@ function teardown() { _default_teardown ; } assert_output 'listen = *' } -@test "${TEST_NAME_PREFIX} IPv6 configuration" { +@test "IPv6 configuration" { export CONTAINER_NAME=${CONTAINER3_NAME} local CUSTOM_SETUP_ARGUMENTS=(--env DOVECOT_INET_PROTOCOLS=ipv6) diff --git a/test/tests/parallel/set3/helper-functions.bats b/test/tests/parallel/set3/helper-functions.bats index 510d79c7..816685dc 100644 --- a/test/tests/parallel/set3/helper-functions.bats +++ b/test/tests/parallel/set3/helper-functions.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/setup" load "${REPOSITORY_ROOT}/test/helper/common" -TEST_NAME_PREFIX='helper functions inside container:' +BATS_TEST_NAME_PREFIX='[Scripts] (helper functions inside container) ' CONTAINER_NAME='dms-test_helper_functions' function setup_file() { @@ -11,7 +11,7 @@ function setup_file() { function teardown_file() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} _sanitize_ipv4_to_subnet_cidr" { +@test "_sanitize_ipv4_to_subnet_cidr" { _run_in_container bash -c "source /usr/local/bin/helpers/index.sh; _sanitize_ipv4_to_subnet_cidr 255.255.255.255/0" assert_output "0.0.0.0/0" diff --git a/test/tests/parallel/set3/smtp-delivery.bats b/test/tests/parallel/set3/smtp-delivery.bats index bea3127d..7beb94b4 100644 --- a/test/tests/parallel/set3/smtp-delivery.bats +++ b/test/tests/parallel/set3/smtp-delivery.bats @@ -1,7 +1,7 @@ load "${REPOSITORY_ROOT}/test/helper/common" load "${REPOSITORY_ROOT}/test/helper/setup" -TEST_NAME_PREFIX='SMTP Delivery:' +BATS_TEST_NAME_PREFIX='[SMTP] (delivery) ' CONTAINER_NAME='dms-test_smtp-delivery' function setup_file() { @@ -86,56 +86,56 @@ function setup_file() { function teardown_file() { _default_teardown ; } -@test "${TEST_NAME_PREFIX} should successfully authenticate with good password (plain)" { +@test "should successfully authenticate with good password (plain)" { _run_in_container bash -c 'nc -w 5 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/smtp-auth-plain.txt' assert_success assert_output --partial 'Authentication successful' } -@test "${TEST_NAME_PREFIX} should fail to authenticate with wrong password (plain)" { +@test "should fail to authenticate with wrong password (plain)" { _run_in_container bash -c 'nc -w 20 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/smtp-auth-plain-wrong.txt' assert_output --partial 'authentication failed' assert_success } -@test "${TEST_NAME_PREFIX} should successfully authenticate with good password (login)" { +@test "should successfully authenticate with good password (login)" { _run_in_container bash -c 'nc -w 5 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/smtp-auth-login.txt' assert_success assert_output --partial 'Authentication successful' } -@test "${TEST_NAME_PREFIX} should fail to authenticate with wrong password (login)" { +@test "should fail to authenticate with wrong password (login)" { _run_in_container bash -c 'nc -w 20 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/smtp-auth-login-wrong.txt' assert_output --partial 'authentication failed' assert_success } -@test "${TEST_NAME_PREFIX} [user: 'added'] should successfully authenticate with good password (plain)" { +@test "[user: 'added'] should successfully authenticate with good password (plain)" { _run_in_container bash -c 'nc -w 5 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/added-smtp-auth-plain.txt' assert_success assert_output --partial 'Authentication successful' } -@test "${TEST_NAME_PREFIX} [user: 'added'] should fail to authenticate with wrong password (plain)" { +@test "[user: 'added'] should fail to authenticate with wrong password (plain)" { _run_in_container bash -c 'nc -w 20 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/added-smtp-auth-plain-wrong.txt' assert_success assert_output --partial 'authentication failed' } -@test "${TEST_NAME_PREFIX} [user: 'added'] should successfully authenticate with good password (login)" { +@test "[user: 'added'] should successfully authenticate with good password (login)" { _run_in_container bash -c 'nc -w 5 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/added-smtp-auth-login.txt' assert_success assert_output --partial 'Authentication successful' } -@test "${TEST_NAME_PREFIX} [user: 'added'] should fail to authenticate with wrong password (login)" { +@test "[user: 'added'] should fail to authenticate with wrong password (login)" { _run_in_container bash -c 'nc -w 20 0.0.0.0 25 < /tmp/docker-mailserver-test/auth/added-smtp-auth-login-wrong.txt' assert_success assert_output --partial 'authentication failed' } # TODO: Add a test covering case SPAMASSASSIN_SPAM_TO_INBOX=1 (default) -@test "${TEST_NAME_PREFIX} delivers mail to existing account" { +@test "delivers mail to existing account" { _run_in_container bash -c "grep 'postfix/lmtp' /var/log/mail/mail.log | grep 'status=sent' | grep ' Saved)' | sed 's/.* to=, orig_to=' /var/log/mail/mail.log assert_success assert_output --partial 'status=sent' _should_output_number_of_lines 1 } -@test "${TEST_NAME_PREFIX} delivers mail to existing alias with recipient delimiter" { +@test "delivers mail to existing alias with recipient delimiter" { _run_in_container grep 'to=, orig_to=' /var/log/mail/mail.log assert_success assert_output --partial 'status=sent' @@ -170,21 +170,21 @@ function teardown_file() { _default_teardown ; } refute_output --partial 'status=bounced' } -@test "${TEST_NAME_PREFIX} delivers mail to existing catchall" { +@test "delivers mail to existing catchall" { _run_in_container grep 'to=, orig_to=' /var/log/mail/mail.log assert_success assert_output --partial 'status=sent' _should_output_number_of_lines 1 } -@test "${TEST_NAME_PREFIX} delivers mail to regexp alias" { +@test "delivers mail to regexp alias" { _run_in_container grep 'to=, orig_to=' /var/log/mail/mail.log assert_success assert_output --partial 'status=sent' _should_output_number_of_lines 1 } -@test "${TEST_NAME_PREFIX} user1 should have received 8 mails" { +@test "user1 should have received 8 mails" { _run_in_container bash -c "grep Subject /var/mail/localhost.localdomain/user1/new/* | sed 's/.*Subject: //g' | sed 's/\.txt.*//g' | sed 's/VIRUS.*/VIRUS/g' | sort" assert_success @@ -205,13 +205,13 @@ function teardown_file() { _default_teardown ; } # _should_output_number_of_lines 11 } -@test "${TEST_NAME_PREFIX} rejects mail to unknown user" { +@test "rejects mail to unknown user" { _run_in_container grep ': Recipient address rejected: User unknown in virtual mailbox table' /var/log/mail/mail.log assert_success _should_output_number_of_lines 1 } -@test "${TEST_NAME_PREFIX} redirects mail to external aliases" { +@test "redirects mail to external aliases" { _run_in_container bash -c "grep 'Passed CLEAN {RelayedInbound}' /var/log/mail/mail.log | grep -- '-> '" assert_success assert_output --partial ' -> ' @@ -220,7 +220,7 @@ function teardown_file() { _default_teardown ; } } # TODO: Add a test covering case SPAMASSASSIN_SPAM_TO_INBOX=1 (default) -@test "${TEST_NAME_PREFIX} rejects spam" { +@test "rejects spam" { _run_in_container grep 'Blocked SPAM {NoBounceInbound,Quarantined}' /var/log/mail/mail.log assert_success assert_output --partial ' -> ' @@ -234,7 +234,7 @@ function teardown_file() { _default_teardown ; } # assert_output --partial 'external.tld=spam@example.test> -> ' } -@test "${TEST_NAME_PREFIX} SA - All registered domains should receive mail with spam headers (X-Spam)" { +@test "SA - All registered domains should receive mail with spam headers (X-Spam)" { _run_in_container grep -ir 'X-Spam-' /var/mail/localhost.localdomain/user1/new assert_success @@ -244,13 +244,13 @@ function teardown_file() { _default_teardown ; } # Dovecot does not support SMTPUTF8, so while we can send we cannot receive # Better disable SMTPUTF8 support entirely if we can't handle it correctly -@test "${TEST_NAME_PREFIX} not advertising smtputf8" { +@test "not advertising smtputf8" { _run_in_container bash -c 'nc 0.0.0.0 25 < /tmp/docker-mailserver-test/email-templates/smtp-ehlo.txt' assert_success refute_output --partial 'SMTPUTF8' } -@test "${TEST_NAME_PREFIX} mail for root was delivered" { +@test "mail for root was delivered" { _run_in_container grep -R 'Subject: Root Test Message' /var/mail/localhost.localdomain/user1/new/ assert_success } diff --git a/test/tests/serial/test_helper.bats b/test/tests/serial/test_helper.bats index 9a9641d9..54d2c145 100644 --- a/test/tests/serial/test_helper.bats +++ b/test/tests/serial/test_helper.bats @@ -1,14 +1,14 @@ load "${REPOSITORY_ROOT}/test/test_helper/common" -TEST_NAME_PREFIX='test helper functions:' +BATS_TEST_NAME_PREFIX='test helper functions:' -@test "${TEST_NAME_PREFIX} repeat_until_success_or_timeout returns instantly on success" { +@test "repeat_until_success_or_timeout returns instantly on success" { SECONDS=0 repeat_until_success_or_timeout 1 true [[ ${SECONDS} -le 1 ]] } -@test "${TEST_NAME_PREFIX} repeat_until_success_or_timeout waits for timeout on persistent failure" { +@test "repeat_until_success_or_timeout waits for timeout on persistent failure" { SECONDS=0 run repeat_until_success_or_timeout 2 false [[ ${SECONDS} -ge 2 ]] @@ -16,7 +16,7 @@ TEST_NAME_PREFIX='test helper functions:' assert_output --partial "Timed out on command" } -@test "${TEST_NAME_PREFIX} repeat_until_success_or_timeout aborts immediately on fatal failure" { +@test "repeat_until_success_or_timeout aborts immediately on fatal failure" { SECONDS=0 run repeat_until_success_or_timeout --fatal-test false 2 false [[ ${SECONDS} -le 1 ]] @@ -24,7 +24,7 @@ TEST_NAME_PREFIX='test helper functions:' assert_output --partial "early aborting" } -@test "${TEST_NAME_PREFIX} repeat_until_success_or_timeout expects integer timeout" { +@test "repeat_until_success_or_timeout expects integer timeout" { run repeat_until_success_or_timeout 1 true assert_success @@ -35,27 +35,27 @@ TEST_NAME_PREFIX='test helper functions:' assert_failure } -@test "${TEST_NAME_PREFIX} run_until_success_or_timeout returns instantly on success" { +@test "run_until_success_or_timeout returns instantly on success" { SECONDS=0 run_until_success_or_timeout 2 true [[ ${SECONDS} -le 1 ]] assert_success } -@test "${TEST_NAME_PREFIX} run_until_success_or_timeout waits for timeout on persistent failure" { +@test "run_until_success_or_timeout waits for timeout on persistent failure" { SECONDS=0 ! run_until_success_or_timeout 2 false [[ ${SECONDS} -ge 2 ]] assert_failure } -@test "${TEST_NAME_PREFIX} repeat_in_container_until_success_or_timeout fails immediately for non-running container" { +@test "repeat_in_container_until_success_or_timeout fails immediately for non-running container" { SECONDS=0 ! repeat_in_container_until_success_or_timeout 10 name-of-non-existing-container true [[ ${SECONDS} -le 1 ]] } -@test "${TEST_NAME_PREFIX} repeat_in_container_until_success_or_timeout run command in container" { +@test "repeat_in_container_until_success_or_timeout run command in container" { local CONTAINER_NAME CONTAINER_NAME=$(docker run --rm -d alpine sleep 100) SECONDS=0 @@ -65,7 +65,7 @@ TEST_NAME_PREFIX='test helper functions:' assert_output "${CONTAINER_NAME}" } -@test "${TEST_NAME_PREFIX} container_is_running" { +@test "container_is_running" { local CONTAINER_NAME CONTAINER_NAME=$(docker run --rm -d alpine sleep 100) container_is_running "${CONTAINER_NAME}" @@ -73,7 +73,7 @@ TEST_NAME_PREFIX='test helper functions:' ! container_is_running "${CONTAINER_NAME}" } -@test "${TEST_NAME_PREFIX} wait_for_smtp_port_in_container aborts wait after timeout" { +@test "wait_for_smtp_port_in_container aborts wait after timeout" { local CONTAINER_NAME CONTAINER_NAME=$(docker run --rm -d alpine sleep 100) SECONDS=0 @@ -84,7 +84,7 @@ TEST_NAME_PREFIX='test helper functions:' } # NOTE: Test requires external network access available -@test "${TEST_NAME_PREFIX} wait_for_smtp_port_in_container returns immediately when port found" { +@test "wait_for_smtp_port_in_container returns immediately when port found" { local CONTAINER_NAME CONTAINER_NAME=$(docker run --rm -d alpine sh -c "sleep 100") @@ -97,7 +97,7 @@ TEST_NAME_PREFIX='test helper functions:' assert_success } -@test "${TEST_NAME_PREFIX} wait_for_finished_setup_in_container" { +@test "wait_for_finished_setup_in_container" { # variable not local to make visible to teardown local PRIVATE_CONFIG PRIVATE_CONFIG=$(duplicate_config_for_container .) @@ -119,7 +119,7 @@ TEST_NAME_PREFIX='test helper functions:' [[ ${SECONDS} -gt 0 ]] } -@test "${TEST_NAME_PREFIX} duplicate_config_for_container" { +@test "duplicate_config_for_container" { local path path=$(duplicate_config_for_container duplicate_config_test) @@ -130,7 +130,7 @@ TEST_NAME_PREFIX='test helper functions:' assert_failure } -@test "${TEST_NAME_PREFIX} container_has_service_running/wait_for_service" { +@test "container_has_service_running/wait_for_service" { local PRIVATE_CONFIG PRIVATE_CONFIG=$(duplicate_config_for_container .) @@ -158,7 +158,7 @@ TEST_NAME_PREFIX='test helper functions:' assert_failure } -@test "${TEST_NAME_PREFIX} wait_for_changes_to_be_detected_in_container fails when timeout is reached" { +@test "wait_for_changes_to_be_detected_in_container fails when timeout is reached" { local PRIVATE_CONFIG PRIVATE_CONFIG=$(duplicate_config_for_container .) @@ -184,7 +184,7 @@ TEST_NAME_PREFIX='test helper functions:' ! TEST_TIMEOUT_IN_SECONDS=0 wait_for_changes_to_be_detected_in_container "${CONTAINER_NAME}" } -@test "${TEST_NAME_PREFIX} wait_for_changes_to_be_detected_in_container succeeds within timeout" { +@test "wait_for_changes_to_be_detected_in_container succeeds within timeout" { local PRIVATE_CONFIG PRIVATE_CONFIG=$(duplicate_config_for_container .) @@ -210,7 +210,7 @@ TEST_NAME_PREFIX='test helper functions:' } # TODO investigate why this test fails -@test "${TEST_NAME_PREFIX} wait_for_empty_mail_queue_in_container fails when timeout reached" { +@test "wait_for_empty_mail_queue_in_container fails when timeout reached" { skip 'disabled as it fails randomly: https://github.com/docker-mailserver/docker-mailserver/pull/2177' local PRIVATE_CONFIG @@ -242,7 +242,7 @@ TEST_NAME_PREFIX='test helper functions:' } # TODO investigate why this test fails -@test "${TEST_NAME_PREFIX} wait_for_empty_mail_queue_in_container succeeds within timeout" { +@test "wait_for_empty_mail_queue_in_container succeeds within timeout" { skip 'disabled as it fails randomly: https://github.com/docker-mailserver/docker-mailserver/pull/2177' local PRIVATE_CONFIG