blob: dcf16293ddc49569b8e1241b2de2f00036734d70 [file] [log] [blame]
#!/bin/sh
# Test the tunneld binary
#
# This test starts a tunnel server and a mounttable server and then verifies
# that vsh can run commands through it and that all the expected names are
# in the mounttable.
toplevel=$(git rev-parse --show-toplevel)
go=${toplevel}/scripts/build/go
thisscript=$0
echo "Test directory: $(dirname $0)"
workdir=$(mktemp -d ${toplevel}/go/tmp.XXXXXXXXXXX)
export TMPDIR=$workdir
trap onexit EXIT
onexit() {
cd /
exec 2> /dev/null
kill -9 $(jobs -p)
rm -rf $workdir
}
FAIL() {
[ $# -gt 0 ] && echo "$thisscript $*"
echo FAIL
exit 1
}
PASS() {
echo PASS
exit 0
}
# Build binaries.
cd $workdir
$go build veyron/examples/tunnel/tunneld || FAIL "line $LINENO: failed to build tunneld"
$go build veyron/examples/tunnel/vsh || FAIL "line $LINENO: failed to build vsh"
$go build veyron/services/mounttable/mounttabled || FAIL "line $LINENO: failed to build mounttabled"
$go build veyron/tools/mounttable || FAIL "line $LINENO: failed to build mounttable"
$go build veyron/tools/identity || FAIL "line $LINENO: failed to build identity"
# Start mounttabled and find its endpoint.
mtlog=${workdir}/mt.log
./mounttabled --address=localhost:0 > $mtlog 2>&1 &
for i in 1 2 3 4; do
ep=$(grep "Mount table service at:" $mtlog | sed -re 's/^.*endpoint: ([^ ]*).*/\1/')
if [ -n "$ep" ]; then
break
fi
sleep 1
done
[ -z $ep ] && FAIL "line $LINENO: no mounttable server"
tmpid=$workdir/id
./identity generate test > $tmpid
export NAMESPACE_ROOT=$ep
export VEYRON_IDENTITY=$tmpid
# Start tunneld and find its endpoint.
tunlog=$workdir/tunnel.log
./tunneld --address=localhost:0 > $tunlog 2>&1 &
for i in 1 2 3 4; do
ep=$(grep "Listening on endpoint" $tunlog | sed -re 's/^.*endpoint ([^ ]*).*/\1/')
if [ -n "$ep" ]; then
break
fi
sleep 1
done
[ -z $ep ] && FAIL "line $LINENO: no tunnel server"
# Run remote command with the endpoint.
got=$(./vsh $ep echo HELLO WORLD)
want="HELLO WORLD"
if [ "$got" != "$want" ]; then
FAIL "line $LINENO: unexpected output. Got $got, want $want"
fi
# Run remote command with the object name.
got=$(./vsh tunnel/id/test echo HELLO WORLD)
want="HELLO WORLD"
if [ "$got" != "$want" ]; then
FAIL "line $LINENO: unexpected output. Got $got, want $want"
fi
# Verify that all the published names are there.
got=$(./mounttable glob $NAMESPACE_ROOT 'tunnel/*/*' | \
sed -e 's/TTL .m..s/TTL XmXXs/' \
-e 's!hwaddr/[^ ]*!hwaddr/XX:XX:XX:XX:XX:XX!' | \
sort)
want="[$NAMESPACE_ROOT]
tunnel/hostname/$(hostname) $ep// (TTL XmXXs)
tunnel/hwaddr/XX:XX:XX:XX:XX:XX $ep// (TTL XmXXs)
tunnel/id/test $ep// (TTL XmXXs)"
if [ "$got" != "$want" ]; then
FAIL "line $LINENO: unexpected output. Got $got, want $want"
fi
PASS