#!/bin/bash
#
# Mithun Roy
# Nov 10, 2010
# documentation boilerplate
CONFIGFILES=" \
./1.ipn.tcp/host1.ionrc \
./1.ipn.tcp/host1.ionconfig \
./1.ipn.tcp/host1.ipnrc \
./1.ipn.tcp/host1.bprc \
./1.ipn.tcp/host1.ionsecrc \
./3.ipn.tcp/host3.ipnrc \
./3.ipn.tcp/host3.bprc \
./3.ipn.tcp/host3.ionsecrc \
./3.ipn.tcp/host3.ionrc \
./3.ipn.tcp/host3.ionconfig \
./2.ipn.tcp/host2.ionrc \
./2.ipn.tcp/host2.ionsecrc \
./2.ipn.tcp/host2.ionconfig \
./2.ipn.tcp/host2.ipnrc \
./2.ipn.tcp/host2.bprc \
"

echo "########################################"
echo
pwd | sed "s/\/.*\///" | xargs echo "NAME: "
echo
echo "PURPOSE: To test the elimination of bug issues 234 & 235; both having
	to do with mutex bugs in PSM and SDR. This scripts starts ION on 3 
	nodes, and then uses bpdriver/bpcounter streaming mode to transfer
	10000 bundles with custody transfer. Node 1 runs bpdriver and Node 3
	runs bpcounter. If node 3 receives all the bundles the test passes."
echo
echo "CONFIG: 3 node custom configuration:"
echo
for N in $CONFIGFILES
do
	echo "$N:"
	cat $N
	echo "# EOF"
	echo
done
echo "OUTPUT: If node 3 receives all the bundles the test passes, this is
	determined by checking the contents of bpcounter.txt"
echo
echo "########################################"


BUNDLEMESSAGE="Bundles received: 10000"
BPDRIVERFILE=./bpdriver.txt
BPCOUNTERFILE=./bpcounter.txt

echo "Starting ION..."
export ION_NODE_LIST_DIR=$PWD
rm -rf ./ion_nodes

# Start nodes.
cd 1.ipn.tcp
ionadmin host1.ionrc
cd ../2.ipn.tcp
ionadmin host2.ionrc
cd ../3.ipn.tcp
ionadmin host3.ionrc

cd ../1.ipn.tcp
ionsecadmin host1.ionsecrc
cd ../2.ipn.tcp
ionsecadmin host2.ionsecrc
cd ../3.ipn.tcp
ionsecadmin host3.ionsecrc

cd ../1.ipn.tcp
bpadmin host1.bprc
cd ../2.ipn.tcp
bpadmin host2.bprc
cd ../3.ipn.tcp
bpadmin host3.bprc

cd ../1.ipn.tcp
ipnadmin host1.ipnrc
cd ../2.ipn.tcp
ipnadmin host2.ipnrc
cd ../3.ipn.tcp
ipnadmin host3.ipnrc

# start bpcounter on node 3
cd ../3.ipn.tcp

echo "Starting bpcounter on node 3..."
sleep 1
bpcounter ipn:3.1 >$BPCOUNTERFILE &
BPCOUNTERPID=$!


# start bpdriver on node 1
cd ../1.ipn.tcp

echo "Starting bpdriver on node 1..."
sleep 1
bpdriver -10000 ipn:1.1 ipn:3.1 -100 > $BPDRIVERFILE &
BPDRIVERPID=$!

echo "Waiting..."
sleep 180

echo "Killing bpdriver if it is still running..."
killall -9 $BPDRIVERPID >/dev/null 2>&1

echo "Stopping bpcounter..."
kill -2 $BPCOUNTERPID >/dev/null 2>&1
sleep 1
kill -9 $BPCOUNTERPID >/dev/null 2>&1

# Shut down ION processes.
echo "Stopping ION..."
cd ../1.ipn.tcp 
./ionstop &
cd ../2.ipn.tcp 
./ionstop &
cd ../3.ipn.tcp 
./ionstop &

# Give all three nodes time to shut down, then clean up.
sleep 5
killm

echo "Verifying results..."
cd ../3.ipn.tcp
# compare the sent message to the received one
if ! grep -q "$BUNDLEMESSAGE" $BPCOUNTERFILE; then
    echo "ERROR: bpcounter/bpdriver failed!!"
    RETVAL=1
else 
    echo "OK: bpcounter/bpdriver successful!"
    RETVAL=0
fi

exit $RETVAL
