#!/usr/bin/env python
# Copyright (c) 2001-2007 International Computer Science Institute
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software")
# to deal in the Software without restriction, subject to the conditions
# listed in the XORP LICENSE file. These conditions include: you must
# preserve this copyright notice, and you cannot mention the copyright
# holders in advertising related to the Software without their permission.
# The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
# notice is a summary of the XORP LICENSE file; the license in that file is
# legally binding.
# $XORP: xorp/tests/test_main.py,v 1.3 2007/02/16 22:47:30 pavlin Exp $
# A common main to be used by all test programs plus the entry point into
# running the tests.
import getopt
import sys
import os
import time
from test_builddir import builddir
from test_call_xrl import call_xrl
def delay(seconds):
"""
Sleep for the number of seconds specified and provide some feedback
"""
print "Sleeping for %d seconds" % seconds
os.system("date")
columns = 80
slept = 0
if seconds < columns:
bars = columns / seconds
for i in range(seconds):
for b in range(bars):
sys.stdout.write('-')
sys.stdout.flush()
time.sleep(1)
slept += 1
else:
delay = seconds / columns
remainder = seconds % columns
for i in range(columns):
sys.stdout.write('-')
sys.stdout.flush()
if 0 != remainder:
snooze = delay + 1
remainder -= 1
else:
snooze = delay
time.sleep(snooze)
slept += snooze
print
os.system("date")
if slept != seconds:
raise Exception, 'Delay was too short should have been %s was %s' % \
(seconds, slept)
def coord(command):
"""
Send a command to the coordinator
"""
print command
status, message = call_xrl(builddir(1), "finder://coord/coord/0.1/command?command:txt=%s" % command)
if 0 != status:
raise Exception, message
# Wait up to five seconds for this command to complete
for i in range(5):
if pending() == False:
return
delay(1)
print >> sys.stderr, "Still pending"
def pending():
"""
Check the previous command has completed
"""
status, message = call_xrl(builddir(1), "finder://coord/coord/0.1/pending")
if message == "pending:bool=false\n":
return False
else:
return True
def run_test(test, single, configure, TESTS, config_module, test_module):
"""
Run the provided test
"""
bdir = builddir(1)
# First find the test if it exists
test_func = ''
conf_funcs = []
for i in TESTS:
if test == i[0]:
test_func = i[1]
if i[3] != '' and i[4] != '':
print "Both fields should not be set"
return False
if i[3] != '':
conf_funcs.append("UNKNOWN")
test_func += '(bdir,conf)'
if i[4] != '':
print "debug", i[4]
for f in i[4]:
conf_funcs.append(f + '(bdir)')
test_func += '()'
if not single:
print "------ START PROGRAMS ------"
conf_mod = __import__(config_module)
test_mod = __import__(test_module)
print conf_funcs
try:
if configure:
for i in conf_funcs:
if not eval('conf_mod' + '.' + i):
print i, "FAILED"
return False
if not eval('test_mod' + '.' + test_func):
print test, "FAILED"
return False
else:
print test, "SUCCEEDED"
except Exception, (ErrorMessage):
print ErrorMessage
print test, "FAILED"
return False
return True
def test_main(TESTS, config_module, test_module):
def usage():
us = \
"usage: %s [-h|--help] [-t|--test] [-b|--bad] [-s|--single] [-c|--configure]"
print us % sys.argv[0]
try:
opts, args = getopt.getopt(sys.argv[1:], "h:t:bsc", \
["help", \
"test=", \
"bad", \
"single", \
"configure", \
])
except getopt.GetoptError:
usage()
sys.exit(1)
bad = False
single = False
configure = True
tests = []
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-t", "--test"):
tests.append(a)
if o in ("-b", "--bad"):
bad = True
if o in ("-s", "--single"):
single = True
configure = False
if o in ("-c", "--configure"):
configure = True
if not tests:
for i in TESTS:
if bad != i[2]:
tests.append(i[0])
print tests
for i in tests:
if not run_test(i,single,configure,TESTS,config_module,test_module):
print "Test: " + i + " FAILED"
sys.exit(-1)
sys.exit(0)
# Local Variables:
# mode: python
# py-indent-offset: 4
# End:
syntax highlighted by Code2HTML, v. 0.9.1