PageRenderTime 24ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/Lib/test/zxjdbc/runner.py

http://github.com/nriley/jython
Python | 204 lines | 151 code | 33 blank | 20 comment | 26 complexity | c6b9059ebb29ad50ad2abebdaf1909d7 MD5 | raw file
  1. # Jython Database Specification API 2.0
  2. #
  3. # $Id$
  4. #
  5. # Copyright (c) 2001 brian zimmer <bzimmer@ziclix.com>
  6. """
  7. To run the tests, simply invoke this script from the commandline:
  8. jython runner.py <xml config file> [vendor, ...]
  9. If no vendors are given, then all vendors will be tested. If a
  10. vendor is given, then only that vendor will be tested.
  11. """
  12. import unittest, os
  13. import xmllib, __builtin__, re
  14. def __imp__(module, attr=None):
  15. if attr:
  16. j = __import__(module, globals(), locals())
  17. return getattr(j, attr)
  18. else:
  19. last = module.split(".")[-1]
  20. return __import__(module, globals(), locals(), last)
  21. class Factory:
  22. def __init__(self, classname, method):
  23. self.classname = classname
  24. self.method = method
  25. self.arguments = []
  26. self.keywords = {}
  27. class Testcase:
  28. def __init__(self, frm, impt):
  29. self.frm = frm
  30. self.impt = impt
  31. self.ignore = []
  32. class Test:
  33. def __init__(self, name, os):
  34. self.name = name
  35. self.os = os
  36. self.factory = None
  37. self.tests = []
  38. class Vendor:
  39. def __init__(self, name, datahandler=None):
  40. self.name = name
  41. self.scroll = None
  42. self.datahandler = datahandler
  43. self.tests = []
  44. self.tables = {}
  45. class ConfigParser(xmllib.XMLParser):
  46. """
  47. A simple XML parser for the config file.
  48. """
  49. def __init__(self, **kw):
  50. apply(xmllib.XMLParser.__init__, (self,), kw)
  51. self.vendors = []
  52. self.table_stack = []
  53. self.re_var = re.compile(r"\${(.*?)}")
  54. def vendor(self):
  55. assert len(self.vendors) > 0, "no vendors"
  56. return self.vendors[-1]
  57. def test(self):
  58. v = self.vendor()
  59. assert len(v.tests) > 0, "no tests"
  60. return v.tests[-1]
  61. def factory(self):
  62. c = self.test()
  63. assert c.factory, "no factory"
  64. return c.factory
  65. def testcase(self):
  66. s = self.test()
  67. assert len(s.tests) > 0, "no testcases"
  68. return s.tests[-1]
  69. def value(self, value):
  70. def repl(sub):
  71. from java.lang import System
  72. return System.getProperty(sub.group(1), sub.group(1))
  73. value = self.re_var.sub(repl, value)
  74. return value
  75. def start_vendor(self, attrs):
  76. if attrs.has_key('datahandler'):
  77. v = Vendor(attrs['name'], attrs['datahandler'])
  78. else:
  79. v = Vendor(attrs['name'])
  80. if attrs.has_key('scroll'):
  81. v.scroll = attrs['scroll']
  82. self.vendors.append(v)
  83. def start_test(self, attrs):
  84. v = self.vendor()
  85. c = Test(attrs['name'], attrs['os'])
  86. v.tests.append(c)
  87. def start_factory(self, attrs):
  88. c = self.test()
  89. f = Factory(attrs['class'], attrs['method'])
  90. c.factory = f
  91. def start_argument(self, attrs):
  92. f = self.factory()
  93. if attrs.has_key('type'):
  94. f.arguments.append((attrs['name'], getattr(__builtin__, attrs['type'])(self.value(attrs['value']))))
  95. else:
  96. f.arguments.append((attrs['name'], self.value(attrs['value'])))
  97. def start_keyword(self, attrs):
  98. f = self.factory()
  99. if attrs.has_key('type'):
  100. f.keywords[attrs['name']] = getattr(__builtin__, attrs['type'])(self.value(attrs['value']))
  101. else:
  102. f.keywords[attrs['name']] = self.value(attrs['value'])
  103. def start_ignore(self, attrs):
  104. t = self.testcase()
  105. t.ignore.append(attrs['name'])
  106. def start_testcase(self, attrs):
  107. c = self.test()
  108. c.tests.append(Testcase(attrs['from'], attrs['import']))
  109. def start_table(self, attrs):
  110. self.table_stack.append((attrs['ref'], attrs['name']))
  111. def end_table(self):
  112. del self.table_stack[-1]
  113. def handle_data(self, data):
  114. if len(self.table_stack):
  115. ref, tabname = self.table_stack[-1]
  116. self.vendor().tables[ref] = (tabname, data.strip())
  117. class SQLTestCase(unittest.TestCase):
  118. """
  119. Base testing class. It contains the list of table and factory information
  120. to run any tests.
  121. """
  122. def __init__(self, name, vendor, factory):
  123. unittest.TestCase.__init__(self, name)
  124. self.vendor = vendor
  125. self.factory = factory
  126. if self.vendor.datahandler:
  127. self.datahandler = __imp__(self.vendor.datahandler)
  128. def table(self, name):
  129. return self.vendor.tables[name]
  130. def has_table(self, name):
  131. return self.vendor.tables.has_key(name)
  132. def make_suite(vendor, testcase, factory, mask=None):
  133. clz = __imp__(testcase.frm, testcase.impt)
  134. caseNames = filter(lambda x, i=testcase.ignore: x not in i, unittest.getTestCaseNames(clz, "test"))
  135. if mask is not None:
  136. caseNames = filter(lambda x, mask=mask: x == mask, caseNames)
  137. tests = [clz(caseName, vendor, factory) for caseName in caseNames]
  138. return unittest.TestSuite(tests)
  139. def test(vendors, include=None, mask=None):
  140. for vendor in vendors:
  141. if not include or vendor.name in include:
  142. print
  143. print "testing [%s]" % (vendor.name)
  144. for test in vendor.tests:
  145. if not test.os or test.os == os.name:
  146. for testcase in test.tests:
  147. suite = make_suite(vendor, testcase, test.factory, mask)
  148. unittest.TextTestRunner().run(suite)
  149. else:
  150. print
  151. print "skipping [%s]" % (vendor.name)
  152. if __name__ == '__main__':
  153. import sys, getopt
  154. try:
  155. opts, args = getopt.getopt(sys.argv[1:], "t:", [])
  156. except getopt.error, msg:
  157. print "%s -t [testmask] <vendor>[,<vendor>]"
  158. sys.exit(0)
  159. mask = None
  160. for a in opts:
  161. opt, arg = a
  162. if opt == '-t':
  163. mask = arg
  164. configParser = ConfigParser()
  165. fp = open(args[0], "r")
  166. configParser.feed(fp.read())
  167. fp.close()
  168. test(configParser.vendors, args[1:], mask=mask)
  169. sys.exit(0)