d0df704d8a
added python.path vm arg to startup script fixed infinite loop in unwrap() when displaying sequences of sequences git-svn-id: http://google-refine.googlecode.com/svn/trunk@509 7d457c2a-affb-35e4-300a-418c747d4874
205 lines
5.9 KiB
Python
205 lines
5.9 KiB
Python
|
|
# Jython Database Specification API 2.0
|
|
#
|
|
# $Id: runner.py 6647 2009-08-10 17:23:22Z fwierzbicki $
|
|
#
|
|
# Copyright (c) 2001 brian zimmer <bzimmer@ziclix.com>
|
|
|
|
"""
|
|
To run the tests, simply invoke this script from the commandline:
|
|
|
|
jython runner.py <xml config file> [vendor, ...]
|
|
|
|
If no vendors are given, then all vendors will be tested. If a
|
|
vendor is given, then only that vendor will be tested.
|
|
"""
|
|
|
|
import unittest, os
|
|
import xmllib, __builtin__, re
|
|
|
|
def __imp__(module, attr=None):
|
|
if attr:
|
|
j = __import__(module, globals(), locals())
|
|
return getattr(j, attr)
|
|
else:
|
|
last = module.split(".")[-1]
|
|
return __import__(module, globals(), locals(), last)
|
|
|
|
class Factory:
|
|
def __init__(self, classname, method):
|
|
self.classname = classname
|
|
self.method = method
|
|
self.arguments = []
|
|
self.keywords = {}
|
|
|
|
class Testcase:
|
|
def __init__(self, frm, impt):
|
|
self.frm = frm
|
|
self.impt = impt
|
|
self.ignore = []
|
|
|
|
class Test:
|
|
def __init__(self, name, os):
|
|
self.name = name
|
|
self.os = os
|
|
self.factory = None
|
|
self.tests = []
|
|
|
|
class Vendor:
|
|
def __init__(self, name, datahandler=None):
|
|
self.name = name
|
|
self.scroll = None
|
|
self.datahandler = datahandler
|
|
self.tests = []
|
|
self.tables = {}
|
|
|
|
class ConfigParser(xmllib.XMLParser):
|
|
"""
|
|
A simple XML parser for the config file.
|
|
"""
|
|
def __init__(self, **kw):
|
|
apply(xmllib.XMLParser.__init__, (self,), kw)
|
|
self.vendors = []
|
|
self.table_stack = []
|
|
self.re_var = re.compile(r"\${(.*?)}")
|
|
|
|
def vendor(self):
|
|
assert len(self.vendors) > 0, "no vendors"
|
|
return self.vendors[-1]
|
|
|
|
def test(self):
|
|
v = self.vendor()
|
|
assert len(v.tests) > 0, "no tests"
|
|
return v.tests[-1]
|
|
|
|
def factory(self):
|
|
c = self.test()
|
|
assert c.factory, "no factory"
|
|
return c.factory
|
|
|
|
def testcase(self):
|
|
s = self.test()
|
|
assert len(s.tests) > 0, "no testcases"
|
|
return s.tests[-1]
|
|
|
|
def value(self, value):
|
|
def repl(sub):
|
|
from java.lang import System
|
|
return System.getProperty(sub.group(1), sub.group(1))
|
|
value = self.re_var.sub(repl, value)
|
|
return value
|
|
|
|
def start_vendor(self, attrs):
|
|
if attrs.has_key('datahandler'):
|
|
v = Vendor(attrs['name'], attrs['datahandler'])
|
|
else:
|
|
v = Vendor(attrs['name'])
|
|
if attrs.has_key('scroll'):
|
|
v.scroll = attrs['scroll']
|
|
self.vendors.append(v)
|
|
|
|
def start_test(self, attrs):
|
|
v = self.vendor()
|
|
c = Test(attrs['name'], attrs['os'])
|
|
v.tests.append(c)
|
|
|
|
def start_factory(self, attrs):
|
|
c = self.test()
|
|
f = Factory(attrs['class'], attrs['method'])
|
|
c.factory = f
|
|
|
|
def start_argument(self, attrs):
|
|
f = self.factory()
|
|
if attrs.has_key('type'):
|
|
f.arguments.append((attrs['name'], getattr(__builtin__, attrs['type'])(self.value(attrs['value']))))
|
|
else:
|
|
f.arguments.append((attrs['name'], self.value(attrs['value'])))
|
|
|
|
def start_keyword(self, attrs):
|
|
f = self.factory()
|
|
if attrs.has_key('type'):
|
|
f.keywords[attrs['name']] = getattr(__builtin__, attrs['type'])(self.value(attrs['value']))
|
|
else:
|
|
f.keywords[attrs['name']] = self.value(attrs['value'])
|
|
|
|
def start_ignore(self, attrs):
|
|
t = self.testcase()
|
|
t.ignore.append(attrs['name'])
|
|
|
|
def start_testcase(self, attrs):
|
|
c = self.test()
|
|
c.tests.append(Testcase(attrs['from'], attrs['import']))
|
|
|
|
def start_table(self, attrs):
|
|
self.table_stack.append((attrs['ref'], attrs['name']))
|
|
|
|
def end_table(self):
|
|
del self.table_stack[-1]
|
|
|
|
def handle_data(self, data):
|
|
if len(self.table_stack):
|
|
ref, tabname = self.table_stack[-1]
|
|
self.vendor().tables[ref] = (tabname, data.strip())
|
|
|
|
class SQLTestCase(unittest.TestCase):
|
|
"""
|
|
Base testing class. It contains the list of table and factory information
|
|
to run any tests.
|
|
"""
|
|
def __init__(self, name, vendor, factory):
|
|
unittest.TestCase.__init__(self, name)
|
|
self.vendor = vendor
|
|
self.factory = factory
|
|
if self.vendor.datahandler:
|
|
self.datahandler = __imp__(self.vendor.datahandler)
|
|
|
|
def table(self, name):
|
|
return self.vendor.tables[name]
|
|
|
|
def has_table(self, name):
|
|
return self.vendor.tables.has_key(name)
|
|
|
|
def make_suite(vendor, testcase, factory, mask=None):
|
|
clz = __imp__(testcase.frm, testcase.impt)
|
|
caseNames = filter(lambda x, i=testcase.ignore: x not in i, unittest.getTestCaseNames(clz, "test"))
|
|
if mask is not None:
|
|
caseNames = filter(lambda x, mask=mask: x == mask, caseNames)
|
|
tests = [clz(caseName, vendor, factory) for caseName in caseNames]
|
|
return unittest.TestSuite(tests)
|
|
|
|
def test(vendors, include=None, mask=None):
|
|
for vendor in vendors:
|
|
if not include or vendor.name in include:
|
|
print
|
|
print "testing [%s]" % (vendor.name)
|
|
for test in vendor.tests:
|
|
if not test.os or test.os == os.name:
|
|
for testcase in test.tests:
|
|
suite = make_suite(vendor, testcase, test.factory, mask)
|
|
unittest.TextTestRunner().run(suite)
|
|
else:
|
|
print
|
|
print "skipping [%s]" % (vendor.name)
|
|
|
|
if __name__ == '__main__':
|
|
import sys, getopt
|
|
|
|
try:
|
|
opts, args = getopt.getopt(sys.argv[1:], "t:", [])
|
|
except getopt.error, msg:
|
|
print "%s -t [testmask] <vendor>[,<vendor>]"
|
|
sys.exit(0)
|
|
|
|
mask = None
|
|
for a in opts:
|
|
opt, arg = a
|
|
if opt == '-t':
|
|
mask = arg
|
|
|
|
configParser = ConfigParser()
|
|
fp = open(args[0], "r")
|
|
configParser.feed(fp.read())
|
|
fp.close()
|
|
test(configParser.vendors, args[1:], mask=mask)
|
|
sys.exit(0)
|