Merge d6925f0c2d
into fd8ad784d1
This commit is contained in:
commit
9426e9c8c1
|
@ -1 +1,2 @@
|
|||
test/onedir
|
||||
test/
|
||||
elk/
|
|
@ -1,6 +1,9 @@
|
|||
.DS_Store
|
||||
docker-compose.yml
|
||||
.idea
|
||||
test/bats/*
|
||||
test/test_helper/bats-assert/*
|
||||
test/test_helper/bats-support/*
|
||||
test/config/empty/
|
||||
test/config/without-accounts/
|
||||
test/config/without-virtual/
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
[submodule "test/bats"]
|
||||
path = test/bats
|
||||
url = https://github.com/sstephenson/bats
|
||||
[submodule "test/test_helper/bats-assert"]
|
||||
path = test/test_helper/bats-assert
|
||||
url = https://github.com/ztombol/bats-assert
|
||||
[submodule "test/test_helper/bats-support"]
|
||||
path = test/test_helper/bats-support
|
||||
url = https://github.com/ztombol/bats-support
|
|
@ -6,11 +6,16 @@ sudo: required
|
|||
services:
|
||||
- docker
|
||||
install:
|
||||
- travis_wait make build-no-cache
|
||||
- travis_wait 30 make build-no-cache
|
||||
script:
|
||||
- make generate-accounts run fixtures tests
|
||||
after_script:
|
||||
- make clean
|
||||
env:
|
||||
- SMTP_ONLY=0 ENABLE_LDAP=0 ENABLE_CLAMAV=1 ENABLE_SPAMASSASSIN=1 ENABLE_FAIL2BAN=1 ONE_DIR=1 ENABLE_POP3=1 ENABLE_MANAGESIEVE=1 ENABLE_FETCHMAIL=1 PERMIT_DOCKER=host DMS_DEBUG=0 SA_TAG=1.0 SA_TAG2=2.0 SA_KILL=3.0 VIRUSMAILS_DELETE_DELAY=7 SASL_PASSWD="external domain.com username:password"
|
||||
- SMTP_ONLY=0 ENABLE_LDAP=0 ENABLE_CLAMAV=0 ENABLE_SPAMASSASSIN=0 ENABLE_FAIL2BAN=0 ONE_DIR=0 ENABLE_POP3=0 ENABLE_MANAGESIEVE=0 ENABLE_FETCHMAIL=0 PERMIT_DOCKER=network DMS_DEBUG=1
|
||||
- SMTP_ONLY=1 ENABLE_LDAP=1 LDAP_SERVER_HOST=ldap LDAP_SEARCH_BASE="ou=people,dc=localhost,dc=localdomain" LDAP_BIND_DN="cn=admin,dc=localhost,dc=localdomain" ENABLE_SASLAUTHD=1 SASLAUTHD_MECHANISMS=ldap SASLAUTHD_LDAP_SERVER=ldap SASLAUTHD_LDAP_BIND_DN="cn=admin,dc=localhost,dc=localdomain" SASLAUTHD_LDAP_PASSWORD=admin SASLAUTHD_LDAP_SEARCH_BASE="ou=people,dc=localhost,dc=localdomain" POSTMASTER_ADDRESS=postmaster@localhost.localdomain
|
||||
|
||||
notifications:
|
||||
slack:
|
||||
secure: TTo1z9nbZCWcIdfPwypubNa3y+pwvfgDGlzEVAGEuK7uuIpmEoAcAUNSSPTnbewDGHnDl8t/ml93MtvP+a+IVuAKytMqF39PHyoZO7aUl9J62V+G75OmnyGjXGJm40pQosCS6LzqoRRYXotl9+fwH568Kf4ifXCrMZX1d+ir7Ww=
|
||||
|
|
130
Makefile
130
Makefile
|
@ -2,6 +2,7 @@ NAME = tvial/docker-mailserver:testing
|
|||
|
||||
all: build-no-cache generate-accounts run fixtures tests clean
|
||||
all-fast: build generate-accounts run fixtures tests clean
|
||||
all-fast-local: build generate-accounts run-local fixtures tests clean
|
||||
no-build: generate-accounts run fixtures tests clean
|
||||
|
||||
build-no-cache:
|
||||
|
@ -17,92 +18,64 @@ generate-accounts:
|
|||
docker run --rm -e MAIL_USER=user2@otherdomain.tld -e MAIL_PASS=mypassword -t $(NAME) /bin/sh -c 'echo "$$MAIL_USER|$$(doveadm pw -s SHA512-CRYPT -u $$MAIL_USER -p $$MAIL_PASS)"' >> test/config/postfix-accounts.cf
|
||||
|
||||
run:
|
||||
# Run containers
|
||||
ifeq ($(ENABLE_LDAP),1)
|
||||
# Run ldap
|
||||
docker run -d --name ldap-for-mail \
|
||||
-e LDAP_DOMAIN="localhost.localdomain" \
|
||||
-h mail.my-domain.com -t ldap
|
||||
endif
|
||||
|
||||
# Run mail container
|
||||
docker run -d --name mail \
|
||||
-v "`pwd`/test/config":/tmp/docker-mailserver \
|
||||
-v "`pwd`/test":/tmp/docker-mailserver-test \
|
||||
-v "`pwd`/test/onedir":/var/mail-state \
|
||||
-e ENABLE_CLAMAV=1 \
|
||||
-e ENABLE_SPAMASSASSIN=1 \
|
||||
-e SA_TAG=1.0 \
|
||||
-e SA_TAG2=2.0 \
|
||||
-e SA_KILL=3.0 \
|
||||
-e VIRUSMAILS_DELETE_DELAY=7 \
|
||||
-e SASL_PASSWD="external-domain.com username:password" \
|
||||
-e ENABLE_MANAGESIEVE=1 \
|
||||
-e PERMIT_DOCKER=host \
|
||||
-e DMS_DEBUG=0 \
|
||||
-h mail.my-domain.com -t $(NAME)
|
||||
sleep 15
|
||||
docker run -d --name mail_pop3 \
|
||||
-v "`pwd`/test/config":/tmp/docker-mailserver \
|
||||
-v "`pwd`/test":/tmp/docker-mailserver-test \
|
||||
-v "`pwd`/test/config/letsencrypt":/etc/letsencrypt/live \
|
||||
-e ENABLE_POP3=1 \
|
||||
-e DMS_DEBUG=1 \
|
||||
-e SSL_TYPE=letsencrypt \
|
||||
-h mail.my-domain.com -t $(NAME)
|
||||
sleep 15
|
||||
docker run -d --name mail_smtponly \
|
||||
-v "`pwd`/test/config":/tmp/docker-mailserver \
|
||||
-v "`pwd`/test":/tmp/docker-mailserver-test \
|
||||
-e SMTP_ONLY=1 \
|
||||
-e PERMIT_DOCKER=network\
|
||||
-h mail.my-domain.com -t $(NAME)
|
||||
sleep 15
|
||||
docker run -d --name mail_fail2ban \
|
||||
-v "`pwd`/test/config":/tmp/docker-mailserver \
|
||||
-v "`pwd`/test":/tmp/docker-mailserver-test \
|
||||
-e ENABLE_FAIL2BAN=1 \
|
||||
-e ENABLE_CLAMAV=$(ENABLE_CLAMAV) \
|
||||
-e ENABLE_SPAMASSASSIN=$(ENABLE_SPAMASSASSIN) \
|
||||
-e ENABLE_POP3=$(ENABLE_POP3) \
|
||||
-e ENABLE_FAIL2BAN=$(ENABLE_FAIL2BAN) \
|
||||
-e ENABLE_MANAGESIEVE=$(ENABLE_MANAGESIEVE) \
|
||||
-e ENABLE_FETCHMAIL=$(ENABLE_FETCHMAIL) \
|
||||
-e ONE_DIR=$(ONE_DIR) \
|
||||
-e PERMIT_DOCKER=$(PERMIT_DOCKER) \
|
||||
-e ENABLE_LDAP=$(ENABLE_LDAP) \
|
||||
-e LDAP_SERVER_HOST=$(LDAP_SERVER_HOST) \
|
||||
-e LDAP_SEARCH_BASE=$(LDAP_SEARCH_BASE) \
|
||||
-e LDAP_BIND_DN=$(LDAP_BIND_DN) \
|
||||
-e ENABLE_SASLAUTHD=$(ENABLE_SASLAUTHD) \
|
||||
-e SASLAUTHD_MECHANISMS=$(SASLAUTHD_MECHANISMS) \
|
||||
-e SASLAUTHD_LDAP_SERVER=$(SASLAUTHD_LDAP_SERVER) \
|
||||
-e SASLAUTHD_LDAP_BIND_DN=$(SASLAUTHD_LDAP_BIND_DN) \
|
||||
-e SASLAUTHD_LDAP_PASSWORD=$(SASLAUTHD_LDAP_PASSWORD) \
|
||||
-e SASLAUTHD_LDAP_SEARCH_BASE=$(SASLAUTHD_LDAP_SEARCH_BASE) \
|
||||
-e SMTP_ONLY=$(SMTP_ONLY) \
|
||||
-e SA_TAG=$(SA_TAG) \
|
||||
-e SA_TAG2=$(SA_TAG2) \
|
||||
-e SA_KILL=$(SA_KILL) \
|
||||
-e VIRUSMAILS_DELETE_DELAY=$(VIRUSMAILS_DELETE_DELAY) \
|
||||
-e SASL_PASSWD="$(SASL_PASSWD)" \
|
||||
-e DMS_DEBUG=$(DMS_DEBUG) \
|
||||
--cap-add=NET_ADMIN \
|
||||
-h mail.my-domain.com -t $(NAME)
|
||||
|
||||
# Wait for containers to fully start
|
||||
sleep 15
|
||||
docker run -d --name mail_fetchmail \
|
||||
|
||||
run-local:
|
||||
docker run -d --name mail \
|
||||
-v "`pwd`/test/config":/tmp/docker-mailserver \
|
||||
-v "`pwd`/test":/tmp/docker-mailserver-test \
|
||||
-e ENABLE_FETCHMAIL=1 \
|
||||
-v "`pwd`/test/onedir":/var/mail-state \
|
||||
--env-file=.env-testing \
|
||||
--cap-add=NET_ADMIN \
|
||||
-h mail.my-domain.com -t $(NAME)
|
||||
sleep 15
|
||||
docker run -d --name mail_disabled_clamav_spamassassin \
|
||||
-v "`pwd`/test/config":/tmp/docker-mailserver \
|
||||
-v "`pwd`/test":/tmp/docker-mailserver-test \
|
||||
-e ENABLE_CLAMAV=0 \
|
||||
-e ENABLE_SPAMASSASSIN=0 \
|
||||
-h mail.my-domain.com -t $(NAME)
|
||||
sleep 15
|
||||
docker run -d --name mail_manual_ssl \
|
||||
-v "`pwd`/test/config":/tmp/docker-mailserver \
|
||||
-v "`pwd`/test":/tmp/docker-mailserver-test \
|
||||
-e SSL_TYPE=manual \
|
||||
-e SSL_CERT_PATH=/tmp/docker-mailserver/letsencrypt/mail.my-domain.com/fullchain.pem \
|
||||
-e SSL_KEY_PATH=/tmp/docker-mailserver/letsencrypt/mail.my-domain.com/privkey.pem \
|
||||
-h mail.my-domain.com -t $(NAME)
|
||||
sleep 15
|
||||
docker run -d --name ldap_for_mail \
|
||||
-e LDAP_DOMAIN="localhost.localdomain" \
|
||||
-h mail.my-domain.com -t ldap
|
||||
sleep 15
|
||||
docker run -d --name mail_with_ldap \
|
||||
-v "`pwd`/test/config":/tmp/docker-mailserver \
|
||||
-v "`pwd`/test":/tmp/docker-mailserver-test \
|
||||
-e ENABLE_LDAP=1 \
|
||||
-e LDAP_SERVER_HOST=ldap \
|
||||
-e LDAP_SEARCH_BASE=ou=people,dc=localhost,dc=localdomain \
|
||||
-e LDAP_BIND_DN=cn=admin,dc=localhost,dc=localdomain \
|
||||
-e ENABLE_SASLAUTHD=1 \
|
||||
-e SASLAUTHD_MECHANISMS=ldap \
|
||||
-e SASLAUTHD_LDAP_SERVER=ldap \
|
||||
-e SASLAUTHD_LDAP_BIND_DN=cn=admin,dc=localhost,dc=localdomain \
|
||||
-e SASLAUTHD_LDAP_PASSWORD=admin \
|
||||
-e SASLAUTHD_LDAP_SEARCH_BASE=ou=people,dc=localhost,dc=localdomain \
|
||||
-e POSTMASTER_ADDRESS=postmaster@localhost.localdomain \
|
||||
--link ldap_for_mail:ldap \
|
||||
--add-host=pop3.example.tld:127.0.0.1 \
|
||||
-h mail.my-domain.com -t $(NAME)
|
||||
# Wait for containers to fully start
|
||||
sleep 15
|
||||
|
||||
fixtures:
|
||||
# Display env configuration
|
||||
docker exec mail printenv
|
||||
cp config/postfix-accounts.cf config/postfix-accounts.cf.bak
|
||||
# Setup sieve & create filtering folder (INBOX/spam)
|
||||
docker cp "`pwd`/test/config/sieve/dovecot.sieve" mail:/var/mail/localhost.localdomain/user1/.dovecot.sieve
|
||||
|
@ -120,27 +93,19 @@ fixtures:
|
|||
docker exec mail /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/email-templates/existing-catchall-local.txt"
|
||||
docker exec mail /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/email-templates/sieve-spam-folder.txt"
|
||||
docker exec mail /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/email-templates/non-existing-user.txt"
|
||||
docker exec mail_disabled_clamav_spamassassin /bin/sh -c "nc 0.0.0.0 25 < /tmp/docker-mailserver-test/email-templates/existing-user.txt"
|
||||
# Wait for mails to be analyzed
|
||||
sleep 10
|
||||
|
||||
tests:
|
||||
# Start tests
|
||||
./test/bats/bats test/tests.bats
|
||||
./test/bats/bin/bats test/tests.bats
|
||||
|
||||
clean:
|
||||
# Remove running test containers
|
||||
-docker rm -f \
|
||||
mail \
|
||||
mail_pop3 \
|
||||
mail_smtponly \
|
||||
mail_fail2ban \
|
||||
mail_fetchmail \
|
||||
fail-auth-mailer \
|
||||
mail_disabled_clamav_spamassassin \
|
||||
mail_manual_ssl \
|
||||
ldap_for_mail \
|
||||
mail_with_ldap
|
||||
ldap-for-mail
|
||||
|
||||
@if [ -f config/postfix-accounts.cf.bak ]; then\
|
||||
rm -f config/postfix-accounts.cf ;\
|
||||
|
@ -149,4 +114,5 @@ clean:
|
|||
-sudo rm -rf test/onedir \
|
||||
test/config/empty \
|
||||
test/config/without-accounts \
|
||||
test/config/without-virtual
|
||||
test/config/without-virtual \
|
||||
test/config/postfix-accounts.cf.bak
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
|
|
@ -7,17 +7,18 @@
|
|||
# Example: DEFAULT_VARS["KEY"]="VALUE"
|
||||
##########################################################################
|
||||
declare -A DEFAULT_VARS
|
||||
DEFAULT_VARS["ENABLE_CLAMAV"]="${ENABLE_CLAMAV:="0"}"
|
||||
DEFAULT_VARS["ENABLE_SPAMASSASSIN"]="${ENABLE_SPAMASSASSIN:="0"}"
|
||||
DEFAULT_VARS["ENABLE_POP3"]="${ENABLE_POP3:="0"}"
|
||||
DEFAULT_VARS["ENABLE_FAIL2BAN"]="${ENABLE_FAIL2BAN:="0"}"
|
||||
DEFAULT_VARS["ENABLE_MANAGESIEVE"]="${ENABLE_MANAGESIEVE:="0"}"
|
||||
DEFAULT_VARS["ENABLE_FETCHMAIL"]="${ENABLE_FETCHMAIL:="0"}"
|
||||
DEFAULT_VARS["ENABLE_LDAP"]="${ENABLE_LDAP:="0"}"
|
||||
DEFAULT_VARS["ENABLE_SASLAUTHD"]="${ENABLE_SASLAUTHD:="0"}"
|
||||
DEFAULT_VARS["SMTP_ONLY"]="${SMTP_ONLY:="0"}"
|
||||
DEFAULT_VARS["VIRUSMAILS_DELETE_DELAY"]="${VIRUSMAILS_DELETE_DELAY:="7"}"
|
||||
DEFAULT_VARS["DMS_DEBUG"]="${DMS_DEBUG:="0"}"
|
||||
DEFAULT_VARS["ENABLE_CLAMAV"]=${ENABLE_CLAMAV:=0}
|
||||
DEFAULT_VARS["ENABLE_SPAMASSASSIN"]=${ENABLE_SPAMASSASSIN:=0}
|
||||
DEFAULT_VARS["ENABLE_POP3"]=${ENABLE_POP3:=0}
|
||||
DEFAULT_VARS["ENABLE_FAIL2BAN"]=${ENABLE_FAIL2BAN:=0}
|
||||
DEFAULT_VARS["ENABLE_MANAGESIEVE"]=${ENABLE_MANAGESIEVE:=0}
|
||||
DEFAULT_VARS["ENABLE_FETCHMAIL"]=${ENABLE_FETCHMAIL:=0}
|
||||
DEFAULT_VARS["ENABLE_LDAP"]=${ENABLE_LDAP:=0}
|
||||
DEFAULT_VARS["ENABLE_SASLAUTHD"]=${ENABLE_SASLAUTHD:=0}
|
||||
DEFAULT_VARS["ONE_DIR"]=${ONE_DIR:=0}
|
||||
DEFAULT_VARS["SMTP_ONLY"]=${SMTP_ONLY:=0}
|
||||
DEFAULT_VARS["VIRUSMAILS_DELETE_DELAY"]=${VIRUSMAILS_DELETE_DELAY:=7}
|
||||
DEFAULT_VARS["DMS_DEBUG"]=${DMS_DEBUG:=0}
|
||||
##########################################################################
|
||||
# << DEFAULT VARS
|
||||
##########################################################################
|
||||
|
@ -334,6 +335,7 @@ function _setup_default_vars() {
|
|||
|
||||
for var in ${!DEFAULT_VARS[@]}; do
|
||||
echo "export $var=${DEFAULT_VARS[$var]}" >> /root/.bashrc
|
||||
export $var=${DEFAULT_VARS[$var]}
|
||||
[ $? != 0 ] && notify 'err' "Unable to set $var=${DEFAULT_VARS[$var]}" && return 1
|
||||
notify 'inf' "Set $var=${DEFAULT_VARS[$var]}"
|
||||
done
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 03608115df2071fff4eaaff1605768c275e5f81f
|
142
test/bats/bats
142
test/bats/bats
|
@ -1,142 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
version() {
|
||||
echo "Bats 0.4.0"
|
||||
}
|
||||
|
||||
usage() {
|
||||
version
|
||||
echo "Usage: bats [-c] [-p | -t] <test> [<test> ...]"
|
||||
}
|
||||
|
||||
help() {
|
||||
usage
|
||||
echo
|
||||
echo " <test> is the path to a Bats test file, or the path to a directory"
|
||||
echo " containing Bats test files."
|
||||
echo
|
||||
echo " -c, --count Count the number of test cases without running any tests"
|
||||
echo " -h, --help Display this help message"
|
||||
echo " -p, --pretty Show results in pretty format (default for terminals)"
|
||||
echo " -t, --tap Show results in TAP format"
|
||||
echo " -v, --version Display the version number"
|
||||
echo
|
||||
echo " For more information, see https://github.com/sstephenson/bats"
|
||||
echo
|
||||
}
|
||||
|
||||
resolve_link() {
|
||||
$(type -p greadlink readlink | head -1) "$1"
|
||||
}
|
||||
|
||||
abs_dirname() {
|
||||
local cwd="$(pwd)"
|
||||
local path="$1"
|
||||
|
||||
while [ -n "$path" ]; do
|
||||
cd "${path%/*}"
|
||||
local name="${path##*/}"
|
||||
path="$(resolve_link "$name" || true)"
|
||||
done
|
||||
|
||||
pwd
|
||||
cd "$cwd"
|
||||
}
|
||||
|
||||
expand_path() {
|
||||
{ cd "$(dirname "$1")" 2>/dev/null
|
||||
local dirname="$PWD"
|
||||
cd "$OLDPWD"
|
||||
echo "$dirname/$(basename "$1")"
|
||||
} || echo "$1"
|
||||
}
|
||||
|
||||
BATS_LIBEXEC="$(abs_dirname "$0")"
|
||||
export BATS_PREFIX="$(abs_dirname "$BATS_LIBEXEC")"
|
||||
export BATS_CWD="$(abs_dirname .)"
|
||||
export PATH="$BATS_LIBEXEC:$PATH"
|
||||
|
||||
options=()
|
||||
arguments=()
|
||||
for arg in "$@"; do
|
||||
if [ "${arg:0:1}" = "-" ]; then
|
||||
if [ "${arg:1:1}" = "-" ]; then
|
||||
options[${#options[*]}]="${arg:2}"
|
||||
else
|
||||
index=1
|
||||
while option="${arg:$index:1}"; do
|
||||
[ -n "$option" ] || break
|
||||
options[${#options[*]}]="$option"
|
||||
let index+=1
|
||||
done
|
||||
fi
|
||||
else
|
||||
arguments[${#arguments[*]}]="$arg"
|
||||
fi
|
||||
done
|
||||
|
||||
unset count_flag pretty
|
||||
[ -t 0 ] && [ -t 1 ] && pretty="1"
|
||||
[ -n "$CI" ] && pretty=""
|
||||
|
||||
for option in "${options[@]}"; do
|
||||
case "$option" in
|
||||
"h" | "help" )
|
||||
help
|
||||
exit 0
|
||||
;;
|
||||
"v" | "version" )
|
||||
version
|
||||
exit 0
|
||||
;;
|
||||
"c" | "count" )
|
||||
count_flag="-c"
|
||||
;;
|
||||
"t" | "tap" )
|
||||
pretty=""
|
||||
;;
|
||||
"p" | "pretty" )
|
||||
pretty="1"
|
||||
;;
|
||||
* )
|
||||
usage >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "${#arguments[@]}" -eq 0 ]; then
|
||||
usage >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
filenames=()
|
||||
for filename in "${arguments[@]}"; do
|
||||
if [ -d "$filename" ]; then
|
||||
shopt -s nullglob
|
||||
for suite_filename in "$(expand_path "$filename")"/*.bats; do
|
||||
filenames["${#filenames[@]}"]="$suite_filename"
|
||||
done
|
||||
shopt -u nullglob
|
||||
else
|
||||
filenames["${#filenames[@]}"]="$(expand_path "$filename")"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "${#filenames[@]}" -eq 1 ]; then
|
||||
command="bats-exec-test"
|
||||
else
|
||||
command="bats-exec-suite"
|
||||
fi
|
||||
|
||||
if [ -n "$pretty" ]; then
|
||||
extended_syntax_flag="-x"
|
||||
formatter="bats-format-tap-stream"
|
||||
else
|
||||
extended_syntax_flag=""
|
||||
formatter="cat"
|
||||
fi
|
||||
|
||||
set -o pipefail execfail
|
||||
exec "$command" $count_flag $extended_syntax_flag "${filenames[@]}" | "$formatter"
|
|
@ -1,55 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
count_only_flag=""
|
||||
if [ "$1" = "-c" ]; then
|
||||
count_only_flag=1
|
||||
shift
|
||||
fi
|
||||
|
||||
extended_syntax_flag=""
|
||||
if [ "$1" = "-x" ]; then
|
||||
extended_syntax_flag="-x"
|
||||
shift
|
||||
fi
|
||||
|
||||
trap "kill 0; exit 1" int
|
||||
|
||||
count=0
|
||||
for filename in "$@"; do
|
||||
let count+="$(bats-exec-test -c "$filename")"
|
||||
done
|
||||
|
||||
if [ -n "$count_only_flag" ]; then
|
||||
echo "$count"
|
||||
exit
|
||||
fi
|
||||
|
||||
echo "1..$count"
|
||||
status=0
|
||||
offset=0
|
||||
for filename in "$@"; do
|
||||
index=0
|
||||
{
|
||||
IFS= read -r # 1..n
|
||||
while IFS= read -r line; do
|
||||
case "$line" in
|
||||
"begin "* )
|
||||
let index+=1
|
||||
echo "${line/ $index / $(($offset + $index)) }"
|
||||
;;
|
||||
"ok "* | "not ok "* )
|
||||
[ -n "$extended_syntax_flag" ] || let index+=1
|
||||
echo "${line/ $index / $(($offset + $index)) }"
|
||||
[ "${line:0:6}" != "not ok" ] || status=1
|
||||
;;
|
||||
* )
|
||||
echo "$line"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
} < <( bats-exec-test $extended_syntax_flag "$filename" )
|
||||
offset=$(($offset + $index))
|
||||
done
|
||||
|
||||
exit "$status"
|
|
@ -1,346 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
set -E
|
||||
set -T
|
||||
|
||||
BATS_COUNT_ONLY=""
|
||||
if [ "$1" = "-c" ]; then
|
||||
BATS_COUNT_ONLY=1
|
||||
shift
|
||||
fi
|
||||
|
||||
BATS_EXTENDED_SYNTAX=""
|
||||
if [ "$1" = "-x" ]; then
|
||||
BATS_EXTENDED_SYNTAX="$1"
|
||||
shift
|
||||
fi
|
||||
|
||||
BATS_TEST_FILENAME="$1"
|
||||
if [ -z "$BATS_TEST_FILENAME" ]; then
|
||||
echo "usage: bats-exec <filename>" >&2
|
||||
exit 1
|
||||
elif [ ! -f "$BATS_TEST_FILENAME" ]; then
|
||||
echo "bats: $BATS_TEST_FILENAME does not exist" >&2
|
||||
exit 1
|
||||
else
|
||||
shift
|
||||
fi
|
||||
|
||||
BATS_TEST_DIRNAME="$(dirname "$BATS_TEST_FILENAME")"
|
||||
BATS_TEST_NAMES=()
|
||||
|
||||
load() {
|
||||
local name="$1"
|
||||
local filename
|
||||
|
||||
if [ "${name:0:1}" = "/" ]; then
|
||||
filename="${name}"
|
||||
else
|
||||
filename="$BATS_TEST_DIRNAME/${name}.bash"
|
||||
fi
|
||||
|
||||
[ -f "$filename" ] || {
|
||||
echo "bats: $filename does not exist" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
source "${filename}"
|
||||
}
|
||||
|
||||
run() {
|
||||
local e E T oldIFS
|
||||
[[ ! "$-" =~ e ]] || e=1
|
||||
[[ ! "$-" =~ E ]] || E=1
|
||||
[[ ! "$-" =~ T ]] || T=1
|
||||
set +e
|
||||
set +E
|
||||
set +T
|
||||
output="$("$@" 2>&1)"
|
||||
status="$?"
|
||||
oldIFS=$IFS
|
||||
IFS=$'\n' lines=($output)
|
||||
[ -z "$e" ] || set -e
|
||||
[ -z "$E" ] || set -E
|
||||
[ -z "$T" ] || set -T
|
||||
IFS=$oldIFS
|
||||
}
|
||||
|
||||
setup() {
|
||||
true
|
||||
}
|
||||
|
||||
teardown() {
|
||||
true
|
||||
}
|
||||
|
||||
skip() {
|
||||
BATS_TEST_SKIPPED=${1:-1}
|
||||
BATS_TEST_COMPLETED=1
|
||||
exit 0
|
||||
}
|
||||
|
||||
bats_test_begin() {
|
||||
BATS_TEST_DESCRIPTION="$1"
|
||||
if [ -n "$BATS_EXTENDED_SYNTAX" ]; then
|
||||
echo "begin $BATS_TEST_NUMBER $BATS_TEST_DESCRIPTION" >&3
|
||||
fi
|
||||
setup
|
||||
}
|
||||
|
||||
bats_test_function() {
|
||||
local test_name="$1"
|
||||
BATS_TEST_NAMES["${#BATS_TEST_NAMES[@]}"]="$test_name"
|
||||
}
|
||||
|
||||
bats_capture_stack_trace() {
|
||||
BATS_PREVIOUS_STACK_TRACE=( "${BATS_CURRENT_STACK_TRACE[@]}" )
|
||||
BATS_CURRENT_STACK_TRACE=()
|
||||
|
||||
local test_pattern=" $BATS_TEST_NAME $BATS_TEST_SOURCE"
|
||||
local setup_pattern=" setup $BATS_TEST_SOURCE"
|
||||
local teardown_pattern=" teardown $BATS_TEST_SOURCE"
|
||||
|
||||
local frame
|
||||
local index=1
|
||||
|
||||
while frame="$(caller "$index")"; do
|
||||
BATS_CURRENT_STACK_TRACE["${#BATS_CURRENT_STACK_TRACE[@]}"]="$frame"
|
||||
if [[ "$frame" = *"$test_pattern" || \
|
||||
"$frame" = *"$setup_pattern" || \
|
||||
"$frame" = *"$teardown_pattern" ]]; then
|
||||
break
|
||||
else
|
||||
let index+=1
|
||||
fi
|
||||
done
|
||||
|
||||
BATS_SOURCE="$(bats_frame_filename "${BATS_CURRENT_STACK_TRACE[0]}")"
|
||||
BATS_LINENO="$(bats_frame_lineno "${BATS_CURRENT_STACK_TRACE[0]}")"
|
||||
}
|
||||
|
||||
bats_print_stack_trace() {
|
||||
local frame
|
||||
local index=1
|
||||
local count="${#@}"
|
||||
|
||||
for frame in "$@"; do
|
||||
local filename="$(bats_trim_filename "$(bats_frame_filename "$frame")")"
|
||||
local lineno="$(bats_frame_lineno "$frame")"
|
||||
|
||||
if [ $index -eq 1 ]; then
|
||||
echo -n "# ("
|
||||
else
|
||||
echo -n "# "
|
||||
fi
|
||||
|
||||
local fn="$(bats_frame_function "$frame")"
|
||||
if [ "$fn" != "$BATS_TEST_NAME" ]; then
|
||||
echo -n "from function \`$fn' "
|
||||
fi
|
||||
|
||||
if [ $index -eq $count ]; then
|
||||
echo "in test file $filename, line $lineno)"
|
||||
else
|
||||
echo "in file $filename, line $lineno,"
|
||||
fi
|
||||
|
||||
let index+=1
|
||||
done
|
||||
}
|
||||
|
||||
bats_print_failed_command() {
|
||||
local frame="$1"
|
||||
local status="$2"
|
||||
local filename="$(bats_frame_filename "$frame")"
|
||||
local lineno="$(bats_frame_lineno "$frame")"
|
||||
|
||||
local failed_line="$(bats_extract_line "$filename" "$lineno")"
|
||||
local failed_command="$(bats_strip_string "$failed_line")"
|
||||
echo -n "# \`${failed_command}' "
|
||||
|
||||
if [ $status -eq 1 ]; then
|
||||
echo "failed"
|
||||
else
|
||||
echo "failed with status $status"
|
||||
fi
|
||||
}
|
||||
|
||||
bats_frame_lineno() {
|
||||
local frame="$1"
|
||||
local lineno="${frame%% *}"
|
||||
echo "$lineno"
|
||||
}
|
||||
|
||||
bats_frame_function() {
|
||||
local frame="$1"
|
||||
local rest="${frame#* }"
|
||||
local fn="${rest%% *}"
|
||||
echo "$fn"
|
||||
}
|
||||
|
||||
bats_frame_filename() {
|
||||
local frame="$1"
|
||||
local rest="${frame#* }"
|
||||
local filename="${rest#* }"
|
||||
|
||||
if [ "$filename" = "$BATS_TEST_SOURCE" ]; then
|
||||
echo "$BATS_TEST_FILENAME"
|
||||
else
|
||||
echo "$filename"
|
||||
fi
|
||||
}
|
||||
|
||||
bats_extract_line() {
|
||||
local filename="$1"
|
||||
local lineno="$2"
|
||||
sed -n "${lineno}p" "$filename"
|
||||
}
|
||||
|
||||
bats_strip_string() {
|
||||
local string="$1"
|
||||
printf "%s" "$string" | sed -e "s/^[ "$'\t'"]*//" -e "s/[ "$'\t'"]*$//"
|
||||
}
|
||||
|
||||
bats_trim_filename() {
|
||||
local filename="$1"
|
||||
local length="${#BATS_CWD}"
|
||||
|
||||
if [ "${filename:0:length+1}" = "${BATS_CWD}/" ]; then
|
||||
echo "${filename:length+1}"
|
||||
else
|
||||
echo "$filename"
|
||||
fi
|
||||
}
|
||||
|
||||
bats_debug_trap() {
|
||||
if [ "$BASH_SOURCE" != "$1" ]; then
|
||||
bats_capture_stack_trace
|
||||
fi
|
||||
}
|
||||
|
||||
bats_error_trap() {
|
||||
BATS_ERROR_STATUS="$?"
|
||||
BATS_ERROR_STACK_TRACE=( "${BATS_PREVIOUS_STACK_TRACE[@]}" )
|
||||
trap - debug
|
||||
}
|
||||
|
||||
bats_teardown_trap() {
|
||||
trap "bats_exit_trap" exit
|
||||
local status=0
|
||||
teardown >>"$BATS_OUT" 2>&1 || status="$?"
|
||||
|
||||
if [ $status -eq 0 ]; then
|
||||
BATS_TEARDOWN_COMPLETED=1
|
||||
elif [ -n "$BATS_TEST_COMPLETED" ]; then
|
||||
BATS_ERROR_STATUS="$status"
|
||||
BATS_ERROR_STACK_TRACE=( "${BATS_CURRENT_STACK_TRACE[@]}" )
|
||||
fi
|
||||
|
||||
bats_exit_trap
|
||||
}
|
||||
|
||||
bats_exit_trap() {
|
||||
local status
|
||||
local skipped
|
||||
trap - err exit
|
||||
|
||||
skipped=""
|
||||
if [ -n "$BATS_TEST_SKIPPED" ]; then
|
||||
skipped=" # skip"
|
||||
if [ "1" != "$BATS_TEST_SKIPPED" ]; then
|
||||
skipped+=" ($BATS_TEST_SKIPPED)"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$BATS_TEST_COMPLETED" ] || [ -z "$BATS_TEARDOWN_COMPLETED" ]; then
|
||||
echo "not ok $BATS_TEST_NUMBER $BATS_TEST_DESCRIPTION" >&3
|
||||
bats_print_stack_trace "${BATS_ERROR_STACK_TRACE[@]}" >&3
|
||||
bats_print_failed_command "${BATS_ERROR_STACK_TRACE[${#BATS_ERROR_STACK_TRACE[@]}-1]}" "$BATS_ERROR_STATUS" >&3
|
||||
sed -e "s/^/# /" < "$BATS_OUT" >&3
|
||||
status=1
|
||||
else
|
||||
echo "ok ${BATS_TEST_NUMBER}${skipped} ${BATS_TEST_DESCRIPTION}" >&3
|
||||
status=0
|
||||
fi
|
||||
|
||||
rm -f "$BATS_OUT"
|
||||
exit "$status"
|
||||
}
|
||||
|
||||
bats_perform_tests() {
|
||||
echo "1..$#"
|
||||
test_number=1
|
||||
status=0
|
||||
for test_name in "$@"; do
|
||||
"$0" $BATS_EXTENDED_SYNTAX "$BATS_TEST_FILENAME" "$test_name" "$test_number" || status=1
|
||||
let test_number+=1
|
||||
done
|
||||
exit "$status"
|
||||
}
|
||||
|
||||
bats_perform_test() {
|
||||
BATS_TEST_NAME="$1"
|
||||
if [ "$(type -t "$BATS_TEST_NAME" || true)" = "function" ]; then
|
||||
BATS_TEST_NUMBER="$2"
|
||||
if [ -z "$BATS_TEST_NUMBER" ]; then
|
||||
echo "1..1"
|
||||
BATS_TEST_NUMBER="1"
|
||||
fi
|
||||
|
||||
BATS_TEST_COMPLETED=""
|
||||
BATS_TEARDOWN_COMPLETED=""
|
||||
trap "bats_debug_trap \"\$BASH_SOURCE\"" debug
|
||||
trap "bats_error_trap" err
|
||||
trap "bats_teardown_trap" exit
|
||||
"$BATS_TEST_NAME" >>"$BATS_OUT" 2>&1
|
||||
BATS_TEST_COMPLETED=1
|
||||
|
||||
else
|
||||
echo "bats: unknown test name \`$BATS_TEST_NAME'" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -z "$TMPDIR" ]; then
|
||||
BATS_TMPDIR="/tmp"
|
||||
else
|
||||
BATS_TMPDIR="${TMPDIR%/}"
|
||||
fi
|
||||
|
||||
BATS_TMPNAME="$BATS_TMPDIR/bats.$$"
|
||||
BATS_PARENT_TMPNAME="$BATS_TMPDIR/bats.$PPID"
|
||||
BATS_OUT="${BATS_TMPNAME}.out"
|
||||
|
||||
bats_preprocess_source() {
|
||||
BATS_TEST_SOURCE="${BATS_TMPNAME}.src"
|
||||
{ tr -d '\r' < "$BATS_TEST_FILENAME"; echo; } | bats-preprocess > "$BATS_TEST_SOURCE"
|
||||
trap "bats_cleanup_preprocessed_source" err exit
|
||||
trap "bats_cleanup_preprocessed_source; exit 1" int
|
||||
}
|
||||
|
||||
bats_cleanup_preprocessed_source() {
|
||||
rm -f "$BATS_TEST_SOURCE"
|
||||
}
|
||||
|
||||
bats_evaluate_preprocessed_source() {
|
||||
if [ -z "$BATS_TEST_SOURCE" ]; then
|
||||
BATS_TEST_SOURCE="${BATS_PARENT_TMPNAME}.src"
|
||||
fi
|
||||
source "$BATS_TEST_SOURCE"
|
||||
}
|
||||
|
||||
exec 3<&1
|
||||
|
||||
if [ "$#" -eq 0 ]; then
|
||||
bats_preprocess_source
|
||||
bats_evaluate_preprocessed_source
|
||||
|
||||
if [ -n "$BATS_COUNT_ONLY" ]; then
|
||||
echo "${#BATS_TEST_NAMES[@]}"
|
||||
else
|
||||
bats_perform_tests "${BATS_TEST_NAMES[@]}"
|
||||
fi
|
||||
else
|
||||
bats_evaluate_preprocessed_source
|
||||
bats_perform_test "$@"
|
||||
fi
|
|
@ -1,165 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
# Just stream the TAP output (sans extended syntax) if tput is missing
|
||||
command -v tput >/dev/null || exec grep -v "^begin "
|
||||
|
||||
header_pattern='[0-9]+\.\.[0-9]+'
|
||||
IFS= read -r header
|
||||
|
||||
if [[ "$header" =~ $header_pattern ]]; then
|
||||
count="${header:3}"
|
||||
index=0
|
||||
failures=0
|
||||
skipped=0
|
||||
name=""
|
||||
count_column_width=$(( ${#count} * 2 + 2 ))
|
||||
else
|
||||
# If the first line isn't a TAP plan, print it and pass the rest through
|
||||
printf "%s\n" "$header"
|
||||
exec cat
|
||||
fi
|
||||
|
||||
update_screen_width() {
|
||||
screen_width="$(tput cols)"
|
||||
count_column_left=$(( $screen_width - $count_column_width ))
|
||||
}
|
||||
|
||||
trap update_screen_width WINCH
|
||||
update_screen_width
|
||||
|
||||
begin() {
|
||||
go_to_column 0
|
||||
printf_with_truncation $(( $count_column_left - 1 )) " %s" "$name"
|
||||
clear_to_end_of_line
|
||||
go_to_column $count_column_left
|
||||
printf "%${#count}s/${count}" "$index"
|
||||
go_to_column 1
|
||||
}
|
||||
|
||||
pass() {
|
||||
go_to_column 0
|
||||
printf " ✓ %s" "$name"
|
||||
advance
|
||||
}
|
||||
|
||||
skip() {
|
||||
local reason="$1"
|
||||
[ -z "$reason" ] || reason=": $reason"
|
||||
go_to_column 0
|
||||
printf " - %s (skipped%s)" "$name" "$reason"
|
||||
advance
|
||||
}
|
||||
|
||||
fail() {
|
||||
go_to_column 0
|
||||
set_color 1 bold
|
||||
printf " ✗ %s" "$name"
|
||||
advance
|
||||
}
|
||||
|
||||
log() {
|
||||
set_color 1
|
||||
printf " %s\n" "$1"
|
||||
clear_color
|
||||
}
|
||||
|
||||
summary() {
|
||||
printf "\n%d test%s" "$count" "$(plural "$count")"
|
||||
|
||||
printf ", %d failure%s" "$failures" "$(plural "$failures")"
|
||||
|
||||
if [ "$skipped" -gt 0 ]; then
|
||||
printf ", %d skipped" "$skipped"
|
||||
fi
|
||||
|
||||
printf "\n"
|
||||
}
|
||||
|
||||
printf_with_truncation() {
|
||||
local width="$1"
|
||||
shift
|
||||
local string="$(printf "$@")"
|
||||
|
||||
if [ "${#string}" -gt "$width" ]; then
|
||||
printf "%s..." "${string:0:$(( $width - 4 ))}"
|
||||
else
|
||||
printf "%s" "$string"
|
||||
fi
|
||||
}
|
||||
|
||||
go_to_column() {
|
||||
local column="$1"
|
||||
printf "\x1B[%dG" $(( $column + 1 ))
|
||||
}
|
||||
|
||||
clear_to_end_of_line() {
|
||||
printf "\x1B[K"
|
||||
}
|
||||
|
||||
advance() {
|
||||
clear_to_end_of_line
|
||||
echo
|
||||
clear_color
|
||||
}
|
||||
|
||||
set_color() {
|
||||
local color="$1"
|
||||
local weight="$2"
|
||||
printf "\x1B[%d;%dm" $(( 30 + $color )) "$( [ "$weight" = "bold" ] && echo 1 || echo 22 )"
|
||||
}
|
||||
|
||||
clear_color() {
|
||||
printf "\x1B[0m"
|
||||
}
|
||||
|
||||
plural() {
|
||||
[ "$1" -eq 1 ] || echo "s"
|
||||
}
|
||||
|
||||
_buffer=""
|
||||
|
||||
buffer() {
|
||||
_buffer="${_buffer}$("$@")"
|
||||
}
|
||||
|
||||
flush() {
|
||||
printf "%s" "$_buffer"
|
||||
_buffer=""
|
||||
}
|
||||
|
||||
finish() {
|
||||
flush
|
||||
printf "\n"
|
||||
}
|
||||
|
||||
trap finish EXIT
|
||||
|
||||
while IFS= read -r line; do
|
||||
case "$line" in
|
||||
"begin "* )
|
||||
let index+=1
|
||||
name="${line#* $index }"
|
||||
buffer begin
|
||||
flush
|
||||
;;
|
||||
"ok "* )
|
||||
skip_expr="ok $index # skip (\(([^)]*)\))?"
|
||||
if [[ "$line" =~ $skip_expr ]]; then
|
||||
let skipped+=1
|
||||
buffer skip "${BASH_REMATCH[2]}"
|
||||
else
|
||||
buffer pass
|
||||
fi
|
||||
;;
|
||||
"not ok "* )
|
||||
let failures+=1
|
||||
buffer fail
|
||||
;;
|
||||
"# "* )
|
||||
buffer log "${line:2}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
buffer summary
|
|
@ -1,52 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
encode_name() {
|
||||
local name="$1"
|
||||
local result="test_"
|
||||
|
||||
if [[ ! "$name" =~ [^[:alnum:]\ _-] ]]; then
|
||||
name="${name//_/-5f}"
|
||||
name="${name//-/-2d}"
|
||||
name="${name// /_}"
|
||||
result+="$name"
|
||||
else
|
||||
local length="${#name}"
|
||||
local char i
|
||||
|
||||
for ((i=0; i<length; i++)); do
|
||||
char="${name:$i:1}"
|
||||
if [ "$char" = " " ]; then
|
||||
result+="_"
|
||||
elif [[ "$char" =~ [[:alnum:]] ]]; then
|
||||
result+="$char"
|
||||
else
|
||||
result+="$(printf -- "-%02x" \'"$char")"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "$result"
|
||||
}
|
||||
|
||||
tests=()
|
||||
index=0
|
||||
pattern='^ *@test *([^ ].*) *\{ *(.*)$'
|
||||
|
||||
while IFS= read -r line; do
|
||||
let index+=1
|
||||
if [[ "$line" =~ $pattern ]]; then
|
||||
quoted_name="${BASH_REMATCH[1]}"
|
||||
body="${BASH_REMATCH[2]}"
|
||||
name="$(eval echo "$quoted_name")"
|
||||
encoded_name="$(encode_name "$name")"
|
||||
tests["${#tests[@]}"]="$encoded_name"
|
||||
echo "${encoded_name}() { bats_test_begin ${quoted_name} ${index}; ${body}"
|
||||
else
|
||||
printf "%s\n" "$line"
|
||||
fi
|
||||
done
|
||||
|
||||
for test_name in "${tests[@]}"; do
|
||||
echo "bats_test_function ${test_name}"
|
||||
done
|
|
@ -1,4 +1,4 @@
|
|||
poll pop3.example.com with proto POP3
|
||||
poll pop3.example.tld with proto POP3
|
||||
user 'username' there with
|
||||
password 'secret'
|
||||
is 'user2@domain.tld'
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 9f88b4207da750093baabc4e3f41bf68f0dd3630
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 004e707638eedd62e0481e8cdc9223ad471f12ee
|
652
test/tests.bats
652
test/tests.bats
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue