[pywin32-checkins] pywin32/com/win32com/test util.py,1.17,1.18
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: Mark H. <mha...@us...> - 2009-01-07 06:00:09
|
Update of /cvsroot/pywin32/pywin32/com/win32com/test In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv3949/com/win32com/test Modified Files: util.py Log Message: Rationalize win32com test utilities into new pywin32_testutil module. Includes support for tests being "skipped" rather than failing due to something out of our control, and some helpers for dealing with bytes and buffers on py3k. Index: util.py =================================================================== RCS file: /cvsroot/pywin32/pywin32/com/win32com/test/util.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** util.py 19 Dec 2008 01:54:10 -0000 1.17 --- util.py 7 Jan 2009 05:59:56 -0000 1.18 *************** *** 12,15 **** --- 12,18 ---- import cStringIO as StringIO + import pywin32_testutil + from pywin32_testutil import TestLoader, TestResult, TestRunner, LeakTestCase + def CheckClean(): # Ensure no lingering exceptions - Python should have zero outstanding *************** *** 143,259 **** return len("".join(self.captured).split("\n")) - class LeakTestCase(unittest.TestCase): - def __init__(self, real_test): - unittest.TestCase.__init__(self) - self.real_test = real_test - self.num_test_cases = 1 - self.num_leak_iters = 2 # seems to be enough! - if hasattr(sys, "gettotalrefcount"): - self.num_test_cases = self.num_test_cases + self.num_leak_iters - def countTestCases(self): - return self.num_test_cases - def runTest(self): - assert 0, "not used" - def __call__(self, result = None): - # Always ensure we don't leak gateways/interfaces - gc.collect() - ni = _GetInterfaceCount() - ng = _GetGatewayCount() - self.real_test(result) - # Failed - no point checking anything else - if result.shouldStop or not result.wasSuccessful(): - return - self._do_leak_tests(result) - gc.collect() - lost_i = _GetInterfaceCount() - ni - lost_g = _GetGatewayCount() - ng - if lost_i or lost_g: - msg = "%d interface objects and %d gateway objects leaked" \ - % (lost_i, lost_g) - result.addFailure(self.real_test, (AssertionError, msg, None)) - def _do_leak_tests(self, result = None): - try: - gtrc = sys.gettotalrefcount - except AttributeError: - return # can't do leak tests in this build - def gtrc(): - return 0 - # Assume already called once, to prime any caches etc - trc = gtrc() - for i in range(self.num_leak_iters): - self.real_test(result) - if result.shouldStop: - break - del i # created after we remembered the refcount! - # int division here means one or 2 stray references won't force - # failure, but one per loop - gc.collect() - lost = (gtrc() - trc) // self.num_leak_iters - if lost < 0: - msg = "LeakTest: %s appeared to gain %d references!!" % (self.real_test, -lost) - result.addFailure(self.real_test, (AssertionError, msg, None)) - if lost > 0: - msg = "LeakTest: %s lost %d references" % (self.real_test, lost) - result.addFailure(self.real_test, (AssertionError, msg, None)) - - class TestLoader(unittest.TestLoader): - def loadTestsFromTestCase(self, testCaseClass): - """Return a suite of all tests cases contained in testCaseClass""" - leak_tests = [] - for name in self.getTestCaseNames(testCaseClass): - real_test = testCaseClass(name) - leak_test = self._getTestWrapper(real_test) - leak_tests.append(leak_test) - return self.suiteClass(leak_tests) - def _getTestWrapper(self, test): - no_leak_tests = getattr(test, "no_leak_tests", False) - if no_leak_tests: - print "Test says it doesn't want leak tests!" - return test - return LeakTestCase(test) - def loadTestsFromModule(self, mod): - if hasattr(mod, "suite"): - return mod.suite() - else: - return unittest.TestLoader.loadTestsFromModule(self, mod) - def loadTestsFromName(self, name, module=None): - test = unittest.TestLoader.loadTestsFromName(self, name, module) - if isinstance(test, unittest.TestSuite): - pass # hmmm? print "Don't wrap suites yet!", test._tests - elif isinstance(test, unittest.TestCase): - test = self._getTestWrapper(test) - else: - print "XXX - what is", test - return test - - class TestResult(unittest._TextTestResult): - def __init__(self, *args, **kw): - super(TestResult, self).__init__(*args, **kw) - self.num_invalid_clsid = 0 - - def addError(self, test, err): - """Called when an error has occurred. 'err' is a tuple of values as - returned by sys.exc_info(). - """ - if isinstance(err[1], pythoncom.com_error) and \ - err[1].hresult==winerror.CO_E_CLASSSTRING: - self.num_invalid_clsid += 1 - if self.showAll: - self.stream.writeln("SKIP") - elif self.dots: - self.stream.write('S') - self.stream.flush() - return - super(TestResult, self).addError(test, err) - - def printErrors(self): - super(TestResult, self).printErrors() - if self.num_invalid_clsid: - self.stream.writeln("SKIPPED: %d tests due to missing COM objects used for testing" % - self.num_invalid_clsid) - - class TestRunner(unittest.TextTestRunner): - def _makeResult(self): - return TestResult(self.stream, self.descriptions, self.verbosity) # Utilities to set the win32com logger to something what just captures --- 146,149 ---- *************** *** 331,344 **** return "exec: " + cmd_repr ! class TestProgram(unittest.TestProgram): ! def runTests(self): ! if self.testRunner is None: ! self.testRunner = TestRunner(verbosity=self.verbosity) ! unittest.TestProgram(self) ! def testmain(*args, **kw): ! new_kw = kw.copy() ! if 'testLoader' not in new_kw: ! new_kw['testLoader'] = TestLoader() ! unittest.main(*args, **new_kw) CheckClean() --- 221,226 ---- return "exec: " + cmd_repr ! def testmain(*args, **kw): ! pywin32_testutil.testmain(*args, **new_kw) CheckClean() |