mirror of
https://github.com/docker-mailserver/docker-mailserver.git
synced 2024-01-19 02:48:50 +00:00
3b4f44e837
* tests(fix): Increase some timeouts Running tests locally via a VM these tests would fail sometimes due to the time from being queued and Amavis actually processing being roughly around 30 seconds. There should be no harm in raising this to 60 seconds, other than delaying a failure case which will ripple through other time sensitive tests. It's better to pass when functionality is actually correct but just needs a bit longer to complete. * tests(fix): Don't setup an invalid hostname During container startup `helpers/dns.sh` would panic with `hostname -f` failing. Dropping `--domainname` for this container is fine and does not affect the point of it's test. --- It's unclear why this does not occur in CI. Possibly changes within the docker daemon since as CI runs docker on Ubuntu 20.04? (2020). For clarity, this may be equivalent to setting a hostname of `domain.com.domain.com`, or `--hostname` value truncated the NIS domain (`--domainname`) of the same value. IIRC, it would still fail with both options using different values if `--hostname` was multi-label. I believe I've documented how non-deterministic these options can be across different environments. `--hostname` should be preferred. There doesn't seem to be any reason to actually need `--domainname` (which is NIS domain name, unrelated to the DNS domain name). We still need to properly investigate reworking our ENV support that `dns.sh` manages. --- Containers were also not removing themselves after failures either (missing teardown). Which would cause problems when running tests again. * chore: Normalize white-space Sets a consistent indent size of 2 spaces. Previously this varied a fair bit, sometimes with tabs or mixed tabs and spaces. Some formatting with blank lines. Easier to review with white-space in diff ignored. Some minor edits besides blank lines, but no change in functionality. * fix: `setup.sh` target container under test Some of the `setup.sh` commands did not specify the container which was problematic if another `docker-mailserver` container was running, causing test failures. This probably doesn't help with `test/no_container.bats`, but at least prevents `test/tests.bats` failing at this point.
90 lines
4.2 KiB
Bash
90 lines
4.2 KiB
Bash
load 'test_helper/common'
|
|
|
|
NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME=non-default-docker-mail-network
|
|
setup_file() {
|
|
docker network create --driver bridge "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}"
|
|
docker network create --driver bridge "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}2"
|
|
|
|
# use two networks (default ("bridge") and our custom network) to recreate problematic test case where PERMIT_DOCKER=host would not help
|
|
# currently we cannot use --network in `docker run` multiple times, it will just use the last one
|
|
# instead we need to use create, network connect and start (see https://success.docker.com/article/multiple-docker-networks)
|
|
local PRIVATE_CONFIG
|
|
|
|
PRIVATE_CONFIG=$(duplicate_config_for_container . mail_smtponly_second_network)
|
|
docker create --name mail_smtponly_second_network \
|
|
-v "${PRIVATE_CONFIG}":/tmp/docker-mailserver \
|
|
-v "$(pwd)/test/test-files":/tmp/docker-mailserver-test:ro \
|
|
-e SMTP_ONLY=1 \
|
|
-e PERMIT_DOCKER=connected-networks \
|
|
-e OVERRIDE_HOSTNAME=mail.my-domain.com \
|
|
--network "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}" \
|
|
-t "${NAME}"
|
|
|
|
docker network connect "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}2" mail_smtponly_second_network
|
|
docker start mail_smtponly_second_network
|
|
|
|
PRIVATE_CONFIG=$(duplicate_config_for_container . mail_smtponly_second_network_sender)
|
|
docker run -d --name mail_smtponly_second_network_sender \
|
|
-v "${PRIVATE_CONFIG}":/tmp/docker-mailserver \
|
|
-v "$(pwd)/test/test-files":/tmp/docker-mailserver-test:ro \
|
|
-e SMTP_ONLY=1 \
|
|
-e PERMIT_DOCKER=connected-networks \
|
|
-e OVERRIDE_HOSTNAME=mail.my-domain.com \
|
|
--network "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}2" \
|
|
-t "${NAME}"
|
|
|
|
# wait until postfix is up
|
|
wait_for_smtp_port_in_container mail_smtponly_second_network
|
|
|
|
# create another container that enforces authentication even on local connections
|
|
docker run -d --name mail_smtponly_force_authentication \
|
|
-v "${PRIVATE_CONFIG}":/tmp/docker-mailserver \
|
|
-v "$(pwd)/test/test-files":/tmp/docker-mailserver-test:ro \
|
|
-e SMTP_ONLY=1 \
|
|
-e PERMIT_DOCKER=none \
|
|
-e OVERRIDE_HOSTNAME=mail.my-domain.com \
|
|
-t "${NAME}"
|
|
|
|
# wait until postfix is up
|
|
wait_for_smtp_port_in_container mail_smtponly_force_authentication
|
|
}
|
|
|
|
teardown_file() {
|
|
docker logs mail_smtponly_second_network
|
|
docker rm -f mail_smtponly_second_network mail_smtponly_second_network_sender mail_smtponly_force_authentication
|
|
docker network rm "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}" "${NON_DEFAULT_DOCKER_MAIL_NETWORK_NAME}2"
|
|
}
|
|
|
|
@test "checking PERMIT_DOCKER: connected-networks" {
|
|
IPNET1=$(docker network inspect --format '{{(index .IPAM.Config 0).Subnet}}' non-default-docker-mail-network)
|
|
IPNET2=$(docker network inspect --format '{{(index .IPAM.Config 0).Subnet}}' non-default-docker-mail-network2)
|
|
run docker exec mail_smtponly_second_network /bin/sh -c "postconf | grep '^mynetworks ='"
|
|
assert_output --partial "${IPNET1}"
|
|
assert_output --partial "${IPNET2}"
|
|
|
|
run docker exec mail_smtponly_second_network /bin/sh -c "postconf -e smtp_host_lookup=no"
|
|
assert_success
|
|
|
|
run docker exec mail_smtponly_second_network /bin/sh -c "/etc/init.d/postfix reload"
|
|
assert_success
|
|
|
|
# we should be able to send from the other container on the second network!
|
|
run docker exec mail_smtponly_second_network_sender /bin/sh -c "nc mail_smtponly_second_network 25 < /tmp/docker-mailserver-test/email-templates/smtp-only.txt"
|
|
assert_output --partial "250 2.0.0 Ok: queued as "
|
|
repeat_until_success_or_timeout 60 run docker exec mail_smtponly_second_network /bin/sh -c 'grep -cE "to=<user2\@external.tld>.*status\=sent" /var/log/mail/mail.log'
|
|
[[ ${status} -ge 0 ]]
|
|
}
|
|
|
|
@test "checking PERMIT_DOCKER: none" {
|
|
run docker exec mail_smtponly_force_authentication /bin/sh -c "postconf -e smtp_host_lookup=no"
|
|
assert_success
|
|
|
|
run docker exec mail_smtponly_force_authentication /bin/sh -c "/etc/init.d/postfix reload"
|
|
assert_success
|
|
|
|
# the mailserver should require authentication and a protocol error should occur when using TLS
|
|
run docker exec mail_smtponly_force_authentication /bin/sh -c "nc localhost 25 < /tmp/docker-mailserver-test/email-templates/smtp-only.txt"
|
|
assert_output --partial "550 5.5.1 Protocol error"
|
|
[[ ${status} -ge 0 ]]
|
|
}
|