#!/bin/sh

LABEL=dp8390
EXEDIR=/usr/build/drivers/dp8390
EXE=$EXEDIR/$LABEL
DAYTIME_HOST=jetsam.cs.vu.nl
FAULTS_PER_BLOCK=1

:>log

fault_blocks=0
connect_blocks=0
dont_connect=0

do_one()
{
	# $1 = test-nr, $2 = count, $3 = seed
	pid=''
	while [ X"$pid" = X ]
	do
		pid=`ps ax | grep $LABEL | grep -v grep |
			sed 's,^[ 	]*,,;s,[ 	].*,,`
		if [ X"$pid" != X ]
		then
			break
		fi
		sleep 10
	done
	echo pid = $pid
	./swifi -f $EXE $pid $1 $2 $3 >/tmp/out
	sleep 1
	fault_blocks=`expr $fault_blocks + 1`
	if kill -0 $pid 
	then
		if [ $dont_connect -eq 0 ]
		then
			if ./socket -t 10 $DAYTIME_HOST daytime < /dev/null
			then
				connect_blocks=`expr $connect_blocks + 1`
			else
				dont_connect=1
			fi
		fi
		echo "driver failed to die, params: test $1, count $2, seed $3"
	else
		connect_blocks=`expr $connect_blocks + 1`
		echo "driver crashed after $fault_blocks blocks"
		echo "driver failed to connect after $connect_blocks blocks"
		fault_blocks=0
		connect_blocks=0
		dont_connect=0
	fi
}

one_round()
{
	# $1 = count, $2 = seed
	count=$1
	seed=$2
	echo "Seed: $seed" >> log
	sync
	do_one 6 $count $seed	# Source fault
	do_one 5 $count $seed	# Destination fault
	do_one 8 $count $seed	# Pointer fault
	do_one 14 $count $seed	# Interface fault
	do_one 12 $count $seed	# Loop fault
	do_one 0 $count $seed	# Text fault
	do_one 4 $count $seed	# Nop fault
}

usage()
{
	echo "Usage: run_t2 <count> <type> <seed>" >&2
	echo \
"Valid types are: source destination pointer interface loop text nop random" >&2
	exit 1
}

select_from()
{
	# $1 = index, $2... = choices
	index="$1"
	index=`expr "$index" + 1`
	shift
	v=`eval echo '$'$index`
	echo "$v"
}

random_type()
{
	# $1 = seed
	seed="$1"
	r=`./rnd -m 7 -s "$seed"`
	select_from "$r" 6 5 8 14 12 0 4
}

if [ $# -ne 3 ]; then usage; fi
count="$1"
type="$2"
seed="$3"

case "$type" in
source)		type_arg=6
;;
destination)	type_arg=5
;;
pointer)	type_arg=8
;;
interface)	type_arg=14
;;
loop)		type_arg=12
;;
text)		type_arg=0
;;
nop)		type_arg=4
;;
random)		
;;
*)
	usage
esac

# Start our own driver.
service down $LABEL
sleep 10	# Allow driver to die
service up $EXE -script `pwd`/rs.restart_imm -config /etc/system.conf -period 3HZ

i=0
while [ $i -lt "$count" ]
do
	echo "Seed: $seed"
	if [ "$type" = "random" ]
	then
		type_arg=`random_type $seed`
	fi
	do_one "$type_arg" $FAULTS_PER_BLOCK $seed
	i=`expr $i + 1`
	seed=`expr $seed + 1`
done

connect_blocks=`expr $connect_blocks + 1`
echo "driver crashed after $fault_blocks blocks"
echo "driver failed to connect after $connect_blocks blocks"

# Restart the driver
service refresh $LABEL
