#!/opt/lsb/appbat/bin/python

from pytet import *

import sys,os,re
import signal
from threading import Thread

xvfb_pid = None
test_bin = "./test/unit.3"

def startup():
	global xvfb_pid
        print "tc3: Calling startup"
	try:
		if 'DISPLAY' not in os.environ:
			print "tc3: Starting Xvfb"
			os.environ['DISPLAY'] = ':1.0'
			xvfb_pid = os.fork()
			if not xvfb_pid:
				os.execve('/usr/X11/bin/Xvfb', ['/usr/X11/bin/Xvfb', '-ac', os.environ['DISPLAY']], {})
				print "bad things happened"
			print "Xvfb pid",xvfb_pid
       		print "tc3: finished startup"
	except Exception, e:
		print "tc3: startup: caught exception",e

def cleanup():
	global xvfb_pid
       	print "tc3: Calling cleanup"
	try:
		if xvfb_pid:
			print "killing Xvfb pid",xvfb_pid
			os.kill(xvfb_pid, signal.SIGTERM)
			ret = os.wait(xvfb_pid, 0)
			print "exit code was",ret
       		print "tc3: finished cleanup"
	except Exception, e:
		print "tc3: cleanup: caught exception",e

def thread_target(ret, fd):
	ret = fd.read()

def test1():
        print "tc3: Calling test"
	try:
		if 'DISPLAY' not in os.environ:
			print "DISPLAY environment variable not set!"
			tet_result(TET_FAIL)
			return
		print "Using display on",os.environ['DISPLAY']
		if not os.access( test_bin, os.X_OK ):	
			print "Could not access",test_bin
			tet_result(TET_FAIL)
			return
		stdout,stderr = os.popen3(test_bin)[1:]
		print "waiting for data"
		data_l, fail_l = [], []
		t1 = Thread(target=thread_target, args=(data_l, stdout))
		t2 = Thread(target=thread_target, args=(fail_l, stderr))
		t1.start()
		t2.start()
		t1.join()
		t2.join()
		data = data_l
		failings = fail_l
		stdout.close()
		ret = stderr.close()
		if failings:
			print "tc3: tested failed:"
			print failings
			tet_result(TET_FAIL)
			return
		if ret != None :
       			print "tc3: test returned non-zero",ret
			tet_result(TET_FAIL)
		else:
       			print "tc3: test passed"
			tet_result(TET_PASS)
	
	except Exception, e:
		print "Caught exception",e
		tet_result(TET_FAIL)

testlist = { 1:test1 }
pytet_init(testlist, startup, cleanup)
