#!/usr/bin/env bash
trap 'killm f' EXIT
#
# 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.  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
./cleanup

echo "Starting ION..."
export ION_NODE_LIST_DIR=$PWD

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

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

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

# 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 180 seconds..."
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 8

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

echo "Stopping ION..."

exit $RETVAL
