#!/bin/bash
snum="unknown"
case "$#" in
    1)
	case "$1" in
	    "-?"|"--help")
		echo "Usage: $0 [serial]"
		exit 0
		;;
	esac
	snum="$1"
	serial="--serial $1"
	;;
    0)
	snum=`sudo dmesg -t | awk '/usb.*Product:/ { ck = index($0, "ChaosKey"); }
		     /usb.*SerialNumber:/ { if (ck) print $4; }' | tail -1`

	case "$snum" in
	    "")
		serial=""
		;;
	    *)
		serial="--serial $snum"
		;;
	esac
	;;
    *)
	echo "Usage: $0 [serial]"
	exit 1
	;;
esac

echo -e '\e[34mTesting ChaosKey' $snum '\e[39m'

tests="0:100 1:100 2:100 3:100 12:10 13:100 15:10000 16:250 202:1000 203:100 204:500 206:20 207:1000:32 209:1000"

PASS=0
FAIL=0
WEAK=0
chaosread $serial --infinite --bytes | for test in $tests done; do
    case $test in
	*:*:*)
	    dnum=`echo $test | sed 's/:.*$//'`
	    tnum=`echo $test | sed 's/^[^:]*://'`
	    tnum=`echo $test | sed 's/^[^:]*://' | sed 's/:.*$//'`
	    nnum=`echo $test | sed 's/^.*://'`
	    opts="-d $dnum -t $tnum -n $nnum"
	    ;;
	*:*)
	    dnum=`echo $test | sed 's/:.*$//'`
	    tnum=`echo $test | sed 's/^.*://'`
	    opts="-d $dnum -t $tnum"
	    ;;
	*)
	    dnum=$test
	    opts="-d $dnum"
	    ;;
    esac
    case $dnum in
    done)
	echo DONE
	;;
    *)
	echo TEST $dnum
	dieharder -g 200 $opts
	;;
    esac
done | while read result; do
    case "$result" in
	TEST*)
	    testnum=`echo $result | sed 's/TEST //'`
	    ;;
	*PASSED*)
	    PASS=`expr $PASS + 1`
	    ;;
	*WEAK*)
	    WEAK=`expr $WEAK + 1`
	    ;;
	*FAILED*)
	    echo test $testnum failed
	    FAIL=`expr $FAIL + 1`
	    ;;
	DONE)
	    echo pass $PASS weak $WEAK fail $FAIL
	    case $PASS:$FAIL in
		[1-9]*:0)
		    echo -e '\e[32m'ChaosKey $snum is ready to ship'\e[39m'
		    exit 0
		    ;;
		*)
		    echo -e '\e[31m'ChaosKey $snum failed'\e[39m'
		    exit 1
		    ;;
	    esac
	    ;;
    esac
done
