#!/bin/bash -x

# Start an X session, fire up some xterms and GL apps, then bounce them
# all over the screen.

# Copyright (C) 2003-2006 IBM
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.


# X11 testing -- this is a daemon test!
# Run for 20m
TEST_DURATION=1200

# Always start X.
NEED_TO_START_X=1
#if [ -z "$DISPLAY" ]; then
#	NEED_TO_START_X=1
#fi

# Kill test if we don't want it.
if [ -z "$DO_X_TESTS" -o "$DO_X_TESTS" == "0" ]; then
	echo "X11 testing is off."
	exit -1
fi

# Can we find the startx script?
RAW_X_SERVER=0
XSERVER_FILE=`which startx 2> /dev/null`
if [ -z "$XSERVER_FILE" -o ! -x "$XSERVER_FILE" ]; then
	RAW_X_SERVER=1
	XSERVER_FILE=`which X 2> /dev/null`
	if [ -z "$XSERVER_FILE" -o ! -x "$XSERVER_FILE" ]; then
		echo "startx script not found."
		exit -1
	fi
fi

# Count X servers
OLD_XSERVERS=`pgrep -l X | grep -v Xprt | wc -l`

# Start X server
if [ $NEED_TO_START_X -eq 1 ]; then
	echo "xterm_stress: Starting X..."

	rm -rf /var/log/Xorg.2.log /var/log/XFree86.2.log

	export DISPLAY=:2
	if [ $RAW_X_SERVER -eq 0 ]; then
		$XSERVER_FILE -- $DISPLAY -ac vt9 &
	else
		$POUNDER_HOME/timed_loop $TEST_DURATION $XSERVER_FILE $DISPLAY -ac vt9 &
	fi

	while true; do
		NEW_XSERVERS=`pgrep -l X | grep -v Xprt | wc -l`
		if [ $NEW_XSERVERS -gt $OLD_XSERVERS ]; then
			export XPID=`pgrep -l X -n | grep -v Xprt | awk -F " " '{print $1}'`
			echo -n " -$XPID" >> $POUNDER_PIDFILE
			break
		fi
	done
fi

trap 'kill -4 $XPID' 15

# Did we see any failures?
LOGFILE=`ls /var/log/X*.2.log`
ERRORS=`egrep -ic "(fatal)" $LOGFILE`
if [ $ERRORS -gt 0 ]; then
	if [ $ERRORS -eq 255 ]; then
		ERRORS=254
	fi
	cp $LOGFILE $POUNDER_TMPDIR/x-log-$XPID
	kill -4 $XPID
	exit $ERRORS
fi

# Now start the window manager if we couldn't find startx.
if [ $NEED_TO_START_X -eq 1 -a $RAW_X_SERVER -eq 1 ]; then
	sleep 5
	echo "xterm_stress: Starting twm - 5s"
	twm &
fi

# Sleep a little more so that the session can start before
# we start flooding X with crud.
sleep 15

# sets the list delimiter to :
IFS=:
# Add some screensavers to the path (OpenGL testing)
export PATH=$PATH:/usr/lib/xscreensaver:/usr/X11R6/lib/xscreensaver

# command list
cmd="dmesg:ls -l:cat /var/log/messages:dmesg:ls -l:cat /var/log/messages"
xcmd="sproingies -fps -delay 0:flyingtoasters -fps -delay 0:glmatrix -fps -delay 0"

# Begin logging
xterm -geom 80x25+0+0 -e "bash -c $POUNDER_SRCDIR/dump_xserver_statm" &

#start text-based programs
for i in $cmd
do
	exe="while true; do $i; done"
	xterm -geometry 80x25`$POUNDER_SRCDIR/randacoords/coords 600 400` -e "bash -c '$exe'" &
	sleep 1
done

#start gui programs
for i in $xcmd
do
	bash -c "$i" &
	sleep 1
done

# Put up a top window for top monitoring.
xterm -geom 100x9+0+0 -e top &
echo "xterm_stress: Test started"

# Now make the windows go bonkers!
$POUNDER_SRCDIR/xbonkers/xbonkers -i 500 -s 10000 &

# If we started X via startx, we need to wait 1200s and then
# kill $XPID.
if [ $RAW_X_SERVER -eq 0 ]; then
	sleep $TEST_DURATION
	kill -4 $XPID
fi

# Track the number of times we wait for X server to die.
DIE_TIMEOUT_LOOPS=0

# Loop until the X server goes away
while true; do
	XSERVERS=`pgrep -l X | grep -v Xprt | wc -l`
	if [ $XSERVERS -lt $OLD_XSERVERS ]; then
		# Did we see any failures?
		LOGFILE=`ls /var/log/X*.2.log`
		ERRORS=`egrep -ic "(fatal)" $LOGFILE`

		# There will always be one fatal error--we killed X.
		exit $((ERRORS - 1))
	fi
	if [ $DIE_TIMEOUT_LOOPS -gt 180 ]; then
		# Three minutes; try something stronger.
		echo "First attempt to kill X server failed; trying -9."
		kill -9 $XPID
	fi
	if [ $DIE_TIMEOUT_LOOPS -gt 360 ]; then
		# Six minutes.  Still not dead?  Abort script.
		echo "Second attempt to kill X server failed.  Aborting."
		exit -1
	fi

	OLD_XSERVERS=$XSERVERS
	DIE_TIMEOUT_LOOPS=$((DIE_TIMEOUT_LOOPS + 1))
	sleep 1
done

echo "ERROR: Jumped to somewhere where we should never be."
# We're not supposed to get here.
exit 254