#
# Test set 3
#

config=$RESMGR_TEST_ROOT/test.conf
cat > $config <<EOF
class	CLASS0
class	CLASS1
class	CLASS2
class	CLASS3
class	CLASS4
EOF
nclasses=5

ndevices=0
for dev in null zero mem random full kmem; do
	device[$ndevices]=$dev
	let ndevices=$ndevices+1
done

nusers=0
for user in test0 test1 test2 test3 test4 test5 test6 test7; do
	user[$nusers]=$user
	let nusers=$nusers+1
done

flags=$RESMGR_TEST_ROOT/flags
mkdir -p -m 755 $flags/{CLASS{0,1,2,3,4},user}

function rsm {

	assert eq "100*" resmgr "$@"
}

function manager {

	log_pid=" [-mgr-]"
	while [ -f $flags/running ]; do
		# user login/logout
		let n=$RANDOM%$nusers
		name=${user[$n]}
		if [ ! -d $flags/user/$name ]; then
			log_info "login $name"
			rsm login $name /dev/tty-$name
			mkdir $flags/user/$name
		else
			let n="$RANDOM%($nclasses+1)"
			cls=CLASS$n
			if [ $n -eq $nclasses ]; then
				log_info "logout $name"
				rm -rf $flags/user/$name
				sleep 1
				rsm logout /dev/tty-$name
			else
				rsm grant $name $cls
				ln -sf ../../$cls $flags/user/$name/
			fi
		fi

		# random delay
		#let n=1+$RANDOM%10
		#sleep $n

		# add device to class/remove from class
		let n=$RANDOM%$nclasses
		cls=CLASS$n
		let n=$RANDOM%$ndevices
		dev=${device[$n]}
		if [ ! -f $flags/$cls/$dev ]; then
			rsm add /dev/$dev $cls
			touch $flags/$cls/$dev
		else
			rm -f $flags/$cls/$dev
			sleep 1
			rsm remove /dev/$dev $cls
		fi
	done
}

function client {

	local name
	local log_pid
	local x
	local avail

	name=$1
	log_pid=" [$name]"
	while [ -f $flags/running ]; do
		avail=`ls $flags/user/$name/CLASS*/* 2>/dev/null`
		set -- $avail
		if [ $# -eq 0 ]; then
			sleep 2
			continue
		fi
		#log_info "avail:" `for x in $avail; do basename $x; done`
		let n=$RANDOM%$#
		shift $n
		dev=`basename $1`

		rsm -u $name open /dev/$dev
	done
}

resmgr_start_daemon -f $config

touch $flags/running
manager &

let n=0
while [ $n -lt $nusers ]; do
	client ${user[$n]} &
	let n=$n+1
done

sleep 120
rm -f $flags/running
wait

resmgr_stop_daemon
