diff options
Diffstat (limited to 'distro/tests/test-bird.sh')
-rwxr-xr-x | distro/tests/test-bird.sh | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/distro/tests/test-bird.sh b/distro/tests/test-bird.sh new file mode 100755 index 00000000..464be32f --- /dev/null +++ b/distro/tests/test-bird.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +set -e + +LOCAL=2001:db8:dead:: + +EXTERNAL=2001:db8:beef:: +EXTERNAL_NET=${EXTERNAL}/48 +EXTERNAL_NH=${LOCAL}beef + +LEARN=2001:db8:feed:: +LEARN_NET=${LEARN}/48 +LEARN_NH=${LOCAL}feed + +IFACE=bird-test-dummy +IFACE_EXISTS=false + +BIRD_RUNNING=false + +D=$(mktemp -d) +pushd ${D} >/dev/null + +stop_bird() { + birdc -l down >/dev/null + sleep 1 + grep -q "<FATAL> Shutdown completed" bird.log + [ ! -e bird.pid ] + [ ! -e bird.ctl ] +} + +cleanup() { + if ${BIRD_RUNNING}; then + stop_bird + if [ -e bird.pid ]; then + kill -9 $(<bird.pid) + fi + fi + + if ${IFACE_EXISTS}; then + ip link del ${IFACE} + fi + + + popd > /dev/null + rm -rf ${D} +} + +failed() { + cleanup + exit 1 +} + +trap failed ERR +trap failed INT +trap failed HUP + +ip link add ${IFACE} type dummy +IFACE_EXISTS=true + +ip link set ${IFACE} up +ip -6 addr add ${LOCAL}/64 dev bird-test-dummy + +ip -6 route add ${LEARN_NET} via ${LEARN_NH} + +cat >bird.conf <<EOF +log "bird.log" all; + +protocol device {} + +protocol kernel { + ipv6 { import all; export all; }; + learn; +} + +protocol static { + ipv6; + route ${EXTERNAL_NET} via ${EXTERNAL_NH}; +} +EOF + +bird -l -P bird.pid + +if [ ! -S bird.ctl ] || [ ! -f bird.pid ] || [ ! -f bird.log ]; then + failed +fi + +BIRD_RUNNING=true + +ROUTE_INSERTED=false +for _ in $(seq 10); do + if ip -6 route show ${EXTERNAL_NET} | egrep -q "${EXTERNAL_NET} via ${EXTERNAL_NH} dev ${IFACE} proto bird metric [0-9]+ pref medium"; then + ROUTE_INSERTED=true + break + fi + sleep 1 +done + +$ROUTE_INSERTED || failed + +if birdc -l show route "${LEARN_NET}" | egrep -q "Network not found"; then + failed +fi + +cleanup +exit 0 |