#
# $Id: functions,v 1.3 2002/11/01 11:40:56 okir Exp $
#
# Test functions for resmgr
#
# Copyright (C) 2002, Olaf Kirch <okir@lst.de>
#

export RESMGR_TEST_ROOT=${TMPDIR:-/tmp}/resmgrtest
export RESMGR_SOCKET=$RESMGR_TEST_ROOT/.socket
export RESMGR_PIDFILE=$RESMGR_TEST_ROOT/pid
export RESMGR_TESTUSERS=30
export verbose=false
export strace=

function resmgr_init {

	rm -rf $RESMGR_TEST_ROOT

	mkdir -m 755 -p $RESMGR_TEST_ROOT || exit 1

	PATH=$PWD:$PATH

	num=0
	while [ $num -lt $RESMGR_TESTUSERS ]; do
		user="test$num"
		grep -qs "^$user:" /etc/passwd ||
		echo "$user:x:77$num:100:resmgr:/:/bin/sh" >> /etc/passwd
		let num=$num+1
	done
	test -x /usr/sbin/nscd && /usr/sbin/nscd -i passwd

	trap resmgr_exit 0 1 2 15
}

function resmgr_exit {

	resmgr_stop_daemon
	rm -rf $RESMGR_TEST_ROOT
}

function log_info {

	echo ":::$log_pid $*" >&2
}

function log_err {

	echo "--- $*" >&2
}

function log_output {

	func=$1
	prefix=$2
	echo "$3" | while read line; do
		$func "$prefix$line"
	done
}

function do_command {

	local cmd
	local output

	$verbose && log_info $*

	cmd=$1; shift
	if [ $cmd = "-t" ]; then
		output=
		strace -fo trace.`basename $cmd` $cmd "$@" &
		sleep 1
	else
		output=`$cmd "$@" 2>&1`
	fi

	if [ $? -ne 0 ]; then
		log_err "Command failed: $cmd $*"
		log_err "Exit status   : $?"
		log_output log_err "Output        : " "$output"
		return 1
	fi

	$verbose && log_output log_info "      " "$output"
	echo $output
}

function resmgr_start_daemon {

	resmgr_stop_daemon
	do_command $strace ./resmgrd -p $RESMGR_PIDFILE \
			-s $RESMGR_SOCKET \
			-f /dev/null $*
}

function resmgr_stop_daemon {

	if test -r $RESMGR_PIDFILE; then
		./resmgrd -dl $RESMGR_PIDFILE -k
	fi
}

function resmgr_attach_debugger {

	echo "*** Attaching debugger to resmgr daemon ***" >&2
	gdb -n resmgrd `cat $RESMGR_PIDFILE`
}

function resmgr {

	do_command ./resmgr -t "$@"
}

function run_test {

	local test

	for test; do
		log_info "Running test $test"
		. $test
	done
}

function assert {

	cmp=$1
	match=$2
	shift 2

	output=`$@` || return 1

	case $output in
	$match)	res=eq;;
	*)	res=ne;;
	esac

	if [ $cmp != $res ]; then
		log_err "Test failed: command $*"
		log_err "Expected:    $match"
		log_output \
		log_err "Got:         " "$output"
		return 1
	fi
}
