WIP3
This commit is contained in:
263
roles/bertvv.bind/molecule/default/files/dns.bats
Normal file
263
roles/bertvv.bind/molecule/default/files/dns.bats
Normal file
@@ -0,0 +1,263 @@
|
||||
#! /usr/bin/env bats
|
||||
#
|
||||
# Functional tests for a DNS server set up as a test case for Ansible role
|
||||
# bertvv.bind
|
||||
#
|
||||
# The variable SUT_IP, the IP address of the System Under Test must be set
|
||||
# outside of the script.
|
||||
|
||||
#{{{ Helper functions
|
||||
|
||||
# Usage: assert_forward_lookup NAME DOMAIN IP
|
||||
# Exits with status 0 if NAME.DOMAIN resolves to IP, a nonzero
|
||||
# status otherwise
|
||||
assert_forward_lookup() {
|
||||
local name="$1"
|
||||
local domain="$2"
|
||||
local ip="$3"
|
||||
|
||||
local result
|
||||
result=$(dig @"${SUT_IP}" "${name}.${domain}" +short)
|
||||
|
||||
echo "Expected: ${ip}"
|
||||
echo "Actual : ${result}"
|
||||
[ "${ip}" = "${result}" ]
|
||||
}
|
||||
|
||||
# Usage: assert_forward_ipv6_lookup NAME DOMAIN IP
|
||||
assert_forward_ipv6_lookup() {
|
||||
local name="${1}"
|
||||
local domain="${2}"
|
||||
local ip="${3}"
|
||||
|
||||
local result
|
||||
result=$(dig @"${SUT_IP}" AAAA "${name}.${domain}" +short)
|
||||
|
||||
echo "Expected: ${ip}"
|
||||
echo "Actual : ${result}"
|
||||
[ "${ip}" = "${result}" ]
|
||||
}
|
||||
|
||||
# Usage: assert_reverse_lookup NAME DOMAIN IP
|
||||
# Exits with status 0 if a reverse lookup on IP resolves to NAME,
|
||||
# a nonzero status otherwise
|
||||
assert_reverse_lookup() {
|
||||
local name="$1"
|
||||
local domain="$2"
|
||||
local ip="$3"
|
||||
|
||||
local expected="${name}.${domain}."
|
||||
local result
|
||||
result=$(dig @"${SUT_IP}" -x "${ip}" +short)
|
||||
|
||||
echo "Expected: ${expected}"
|
||||
echo "Actual : ${result}"
|
||||
[ "${expected}" = "${result}" ]
|
||||
}
|
||||
|
||||
# Usage: assert_alias_lookup ALIAS NAME DOMAIN IP
|
||||
# Exits with status 0 if a forward lookup on NAME resolves to the
|
||||
# host name NAME.DOMAIN and to IP, a nonzero status otherwise
|
||||
assert_alias_lookup() {
|
||||
local alias="$1"
|
||||
local name="$2"
|
||||
local domain="$3"
|
||||
local ip="$4"
|
||||
local result
|
||||
result=$(dig @"${SUT_IP}" "${alias}.${domain}" +short)
|
||||
|
||||
grep "${name}\\.${domain}\\." <<< "${result}"
|
||||
grep "${ip}" <<< "${result}"
|
||||
}
|
||||
|
||||
# Usage: assert_ns_lookup DOMAIN NS_NAME...
|
||||
# Exits with status 0 if all specified host names occur in the list of
|
||||
# name servers for the domain.
|
||||
assert_ns_lookup() {
|
||||
local domain="${1}"
|
||||
shift
|
||||
local result
|
||||
result=$(dig @"${SUT_IP}" "${domain}" NS +short)
|
||||
|
||||
[ -n "${result}" ] # the list of name servers should not be empty
|
||||
while (( "$#" )); do
|
||||
grep "$1\\." <<< "${result}"
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
# Usage: assert_mx_lookup DOMAIN PREF1 NAME1 PREF2 NAME2...
|
||||
# e.g. assert_mx_lookup example.com 10 mailsrv1 20 mailsrv2
|
||||
# Exits with status 0 if all specified host names occur in the list of
|
||||
# mail servers for the domain.
|
||||
assert_mx_lookup() {
|
||||
local domain="${1}"
|
||||
shift
|
||||
local result
|
||||
result=$(dig @"${SUT_IP}" "${domain}" MX +short)
|
||||
|
||||
[ -n "${result}" ] # the list of name servers should not be empty
|
||||
while (( "$#" )); do
|
||||
grep "$1 $2\\.${domain}\\." <<< "${result}"
|
||||
shift
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
# Usage: assert_srv_lookup DOMAIN SERVICE WEIGHT PORT TARGET
|
||||
# e.g. assert_srv_lookup example.com _ldap._tcp 0 100 88 ldapsrv
|
||||
assert_srv_lookup() {
|
||||
local domain="${1}"
|
||||
shift
|
||||
local service="${1}"
|
||||
shift
|
||||
local expected="${*}.${domain}."
|
||||
local result
|
||||
result=$(dig @"${SUT_IP}" SRV "${service}.${domain}" +short)
|
||||
|
||||
echo "expected: ${expected}"
|
||||
echo "actual : ${result}"
|
||||
[ "${result}" = "${expected}" ]
|
||||
}
|
||||
|
||||
# Perform a TXT record lookup
|
||||
# Usage: assert_txt_lookup NAME TEXT...
|
||||
# e.g. assert_txt_lookup _kerberos.example.com KERBEROS.EXAMPLE.COM
|
||||
assert_txt_lookup() {
|
||||
local name="$1"
|
||||
shift
|
||||
local result
|
||||
result=$(dig @"${SUT_IP}" TXT "${name}" +short)
|
||||
|
||||
echo "expected: ${*}"
|
||||
echo "actual : ${result}"
|
||||
while [ "$#" -ne "0" ]; do
|
||||
grep "${1}" <<< "${result}"
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
#}}}
|
||||
|
||||
@test "Forward lookups acme-inc.com" {
|
||||
# host name domain IP
|
||||
assert_forward_lookup ns1 acme-inc.com 172.17.0.2
|
||||
assert_forward_lookup ns2 acme-inc.com 172.17.0.3
|
||||
assert_forward_lookup srv001 acme-inc.com 172.17.1.1
|
||||
assert_forward_lookup srv002 acme-inc.com 172.17.1.2
|
||||
assert_forward_lookup mail001 acme-inc.com 172.17.2.1
|
||||
assert_forward_lookup mail002 acme-inc.com 172.17.2.2
|
||||
assert_forward_lookup mail003 acme-inc.com 172.17.2.3
|
||||
assert_forward_lookup srv010 acme-inc.com 10.0.0.10
|
||||
assert_forward_lookup srv011 acme-inc.com 10.0.0.11
|
||||
assert_forward_lookup srv012 acme-inc.com 10.0.0.12
|
||||
}
|
||||
|
||||
@test "Reverse lookups acme-inc.com" {
|
||||
# host name domain IP
|
||||
assert_reverse_lookup ns1 acme-inc.com 172.17.0.2
|
||||
assert_reverse_lookup ns2 acme-inc.com 172.17.0.3
|
||||
assert_reverse_lookup srv001 acme-inc.com 172.17.1.1
|
||||
assert_reverse_lookup srv002 acme-inc.com 172.17.1.2
|
||||
assert_reverse_lookup mail001 acme-inc.com 172.17.2.1
|
||||
assert_reverse_lookup mail002 acme-inc.com 172.17.2.2
|
||||
assert_reverse_lookup mail003 acme-inc.com 172.17.2.3
|
||||
assert_reverse_lookup srv010 acme-inc.com 10.0.0.10
|
||||
assert_reverse_lookup srv011 acme-inc.com 10.0.0.11
|
||||
assert_reverse_lookup srv012 acme-inc.com 10.0.0.12
|
||||
}
|
||||
|
||||
@test "Alias lookups acme-inc.com" {
|
||||
# alias hostname domain IP
|
||||
assert_alias_lookup www srv001 acme-inc.com 172.17.1.1
|
||||
assert_alias_lookup mysql srv002 acme-inc.com 172.17.1.2
|
||||
assert_alias_lookup smtp mail001 acme-inc.com 172.17.2.1
|
||||
assert_alias_lookup mail-in mail001 acme-inc.com 172.17.2.1
|
||||
assert_alias_lookup imap mail003 acme-inc.com 172.17.2.3
|
||||
assert_alias_lookup mail-out mail003 acme-inc.com 172.17.2.3
|
||||
|
||||
}
|
||||
|
||||
@test "IPv6 forward lookups acme-inc.com" {
|
||||
# hostname domain IPv6
|
||||
assert_forward_ipv6_lookup srv001 acme-inc.com 2001:db8::1
|
||||
assert_forward_ipv6_lookup srv002 acme-inc.com 2001:db8::2
|
||||
assert_forward_ipv6_lookup mail001 acme-inc.com 2001:db8::d:1
|
||||
assert_forward_ipv6_lookup mail002 acme-inc.com 2001:db8::d:2
|
||||
assert_forward_ipv6_lookup mail003 acme-inc.com 2001:db8::d:3
|
||||
}
|
||||
|
||||
@test "IPv6 reverse lookups acme-inc.com" {
|
||||
# hostname domain IPv6
|
||||
assert_forward_ipv6_lookup srv001 acme-inc.com 2001:db8::1
|
||||
assert_forward_ipv6_lookup srv002 acme-inc.com 2001:db8::2
|
||||
assert_forward_ipv6_lookup mail001 acme-inc.com 2001:db8::d:1
|
||||
assert_forward_ipv6_lookup mail002 acme-inc.com 2001:db8::d:2
|
||||
assert_forward_ipv6_lookup mail003 acme-inc.com 2001:db8::d:3
|
||||
}
|
||||
|
||||
@test "NS record lookup acme-inc.com" {
|
||||
assert_ns_lookup acme-inc.com \
|
||||
ns1.acme-inc.com \
|
||||
ns2.acme-inc.com
|
||||
}
|
||||
|
||||
@test "Mail server lookup acme-inc.com" {
|
||||
assert_mx_lookup acme-inc.com \
|
||||
10 mail001 \
|
||||
20 mail002
|
||||
}
|
||||
|
||||
@test "Service record lookup acme-inc.com" {
|
||||
assert_srv_lookup acme-inc.com _ldap._tcp 0 100 88 srv010
|
||||
}
|
||||
|
||||
@test "TXT record lookup acme-inc.com" {
|
||||
assert_txt_lookup _kerberos.acme-inc.com KERBEROS.ACME-INC.COM
|
||||
assert_txt_lookup acme-inc.com "some text" "more text"
|
||||
}
|
||||
|
||||
# Tests for domain example.com
|
||||
|
||||
|
||||
@test "Forward lookups example.com" {
|
||||
# host name domain IP
|
||||
assert_forward_lookup srv001 example.com 192.0.2.1
|
||||
assert_forward_lookup srv002 example.com 192.0.2.2
|
||||
assert_forward_lookup mail001 example.com 192.0.2.10
|
||||
}
|
||||
|
||||
@test "Reverse lookups example.com" {
|
||||
# host name domain IP
|
||||
assert_reverse_lookup srv001 example.com 192.0.2.1
|
||||
assert_reverse_lookup srv002 example.com 192.0.2.2
|
||||
assert_reverse_lookup mail001 example.com 192.0.2.10
|
||||
}
|
||||
|
||||
@test "Alias lookups example.com" {
|
||||
# alias hostname domain IP
|
||||
assert_alias_lookup www srv001 example.com 192.0.2.1
|
||||
}
|
||||
|
||||
@test "IPv6 forward lookups example.com" {
|
||||
# hostname domain IPv6
|
||||
assert_forward_ipv6_lookup srv001 example.com 2001:db9::1
|
||||
}
|
||||
|
||||
@test "IPv6 reverse lookups example.com" {
|
||||
# hostname domain IPv6
|
||||
assert_reverse_lookup srv001 example.com 2001:db9::1
|
||||
}
|
||||
|
||||
@test "NS record lookup example.com" {
|
||||
assert_ns_lookup example.com \
|
||||
ns1.acme-inc.com \
|
||||
ns2.acme-inc.com
|
||||
}
|
||||
|
||||
@test "Mail server lookup example.com" {
|
||||
assert_mx_lookup example.com \
|
||||
10 mail001
|
||||
}
|
||||
|
||||
117
roles/bertvv.bind/molecule/default/files/functional-tests.sh
Executable file
117
roles/bertvv.bind/molecule/default/files/functional-tests.sh
Executable file
@@ -0,0 +1,117 @@
|
||||
#! /usr/bin/env bash
|
||||
#
|
||||
# Author: Bert Van Vreckem <bert.vanvreckem@gmail.com>
|
||||
#
|
||||
# Run BATS test files in the current directory, and the ones in the subdirectory
|
||||
# matching the host name.
|
||||
#
|
||||
# The script installs BATS if needed. It's best to put ${bats_install_dir} in
|
||||
# your .gitignore.
|
||||
|
||||
set -o errexit # abort on nonzero exitstatus
|
||||
set -o nounset # abort on unbound variable
|
||||
|
||||
#{{{ Variables
|
||||
|
||||
test_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
bats_archive="v0.4.0.tar.gz"
|
||||
bats_url="https://github.com/sstephenson/bats/archive/${bats_archive}"
|
||||
bats_install_dir="/opt"
|
||||
bats_default_location="${bats_install_dir}/bats/libexec/bats"
|
||||
test_file_pattern="*.bats"
|
||||
|
||||
# Color definitions
|
||||
readonly reset='\e[0m'
|
||||
readonly black='\e[0;30m'
|
||||
readonly red='\e[0;31m'
|
||||
readonly green='\e[0;32m'
|
||||
readonly yellow='\e[0;33m'
|
||||
readonly blue='\e[0;34m'
|
||||
readonly purple='\e[0;35m'
|
||||
readonly cyan='\e[0;36m'
|
||||
readonly white='\e[0;37m'
|
||||
#}}}
|
||||
|
||||
main() {
|
||||
|
||||
bats=$(find_bats_executable)
|
||||
|
||||
if [ -z "${bats}" ]; then
|
||||
install_bats
|
||||
bats="${bats_default_location}"
|
||||
fi
|
||||
|
||||
debug "Using BATS executable at: ${bats}"
|
||||
|
||||
# List all test cases (i.e. files in the test dir matching the test file
|
||||
# pattern)
|
||||
|
||||
# Tests to be run on all hosts
|
||||
global_tests=$(find_tests "${test_dir}" 1)
|
||||
|
||||
# Tests for individual hosts
|
||||
host_tests=$(find_tests "${test_dir}/${HOSTNAME}")
|
||||
|
||||
# Loop over test files
|
||||
for test_case in ${global_tests} ${host_tests}; do
|
||||
info "Running test ${test_case}"
|
||||
${bats} "${test_case}"
|
||||
done
|
||||
}
|
||||
|
||||
#{{{ Functions
|
||||
|
||||
# Tries to find BATS executable in the PATH or the place where this script
|
||||
# installs it.
|
||||
find_bats_executable() {
|
||||
if which bats > /dev/null; then
|
||||
which bats
|
||||
elif [ -x "${bats_default_location}" ]; then
|
||||
echo "${bats_default_location}"
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
# Usage: install_bats
|
||||
install_bats() {
|
||||
pushd "${bats_install_dir}" > /dev/null 2>&1
|
||||
curl --location --remote-name "${bats_url}"
|
||||
tar xzf "${bats_archive}"
|
||||
mv bats-* bats
|
||||
rm "${bats_archive}"
|
||||
popd > /dev/null 2>&1
|
||||
}
|
||||
|
||||
# Usage: find_tests DIR [MAX_DEPTH]
|
||||
#
|
||||
# Finds BATS test suites in the specified directory
|
||||
find_tests() {
|
||||
local max_depth=""
|
||||
if [ "$#" -eq "2" ]; then
|
||||
max_depth="-maxdepth $2"
|
||||
fi
|
||||
|
||||
local tests
|
||||
tests=$(find "$1" ${max_depth} -type f -name "${test_file_pattern}" -printf '%p\n' 2> /dev/null)
|
||||
|
||||
echo "${tests}"
|
||||
}
|
||||
|
||||
# Usage: info [ARG]...
|
||||
#
|
||||
# Prints all arguments on the standard output stream
|
||||
info() {
|
||||
printf "${yellow}### %s${reset}\n" "${*}"
|
||||
}
|
||||
|
||||
# Usage: debug [ARG]...
|
||||
#
|
||||
# Prints all arguments on the standard output stream
|
||||
debug() {
|
||||
printf "${cyan}### %s${reset}\n" "${*}"
|
||||
}
|
||||
#}}}
|
||||
|
||||
main
|
||||
Reference in New Issue
Block a user