| Index: third_party/twisted_8_1/twisted/trial/runner.py
|
| diff --git a/third_party/twisted_8_1/twisted/trial/runner.py b/third_party/twisted_8_1/twisted/trial/runner.py
|
| deleted file mode 100644
|
| index 5743436024633f0ef314a61d36082ff4cd46dd6d..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/trial/runner.py
|
| +++ /dev/null
|
| @@ -1,833 +0,0 @@
|
| -# -*- test-case-name: twisted.trial.test.test_runner -*-
|
| -
|
| -#
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -A miscellany of code used to run Trial tests.
|
| -
|
| -Maintainer: Jonathan Lange <jml@twistedmatrix.com>
|
| -"""
|
| -
|
| -
|
| -import pdb, shutil
|
| -import os, types, warnings, sys, inspect, imp
|
| -import random, doctest, time
|
| -
|
| -from twisted.python import reflect, log, failure, modules
|
| -from twisted.python.util import dsu
|
| -from twisted.python.compat import set
|
| -
|
| -from twisted.internet import defer, interfaces
|
| -from twisted.trial import util, unittest
|
| -from twisted.trial.itrial import ITestCase
|
| -from twisted.trial.reporter import UncleanWarningsReporterWrapper
|
| -
|
| -# These are imported so that they remain in the public API for t.trial.runner
|
| -from twisted.trial.unittest import suiteVisit, TestSuite
|
| -
|
| -from zope.interface import implements
|
| -
|
| -pyunit = __import__('unittest')
|
| -
|
| -
|
| -def isPackage(module):
|
| - """Given an object return True if the object looks like a package"""
|
| - if not isinstance(module, types.ModuleType):
|
| - return False
|
| - basename = os.path.splitext(os.path.basename(module.__file__))[0]
|
| - return basename == '__init__'
|
| -
|
| -
|
| -def isPackageDirectory(dirname):
|
| - """Is the directory at path 'dirname' a Python package directory?
|
| - Returns the name of the __init__ file (it may have a weird extension)
|
| - if dirname is a package directory. Otherwise, returns False"""
|
| - for ext in zip(*imp.get_suffixes())[0]:
|
| - initFile = '__init__' + ext
|
| - if os.path.exists(os.path.join(dirname, initFile)):
|
| - return initFile
|
| - return False
|
| -
|
| -
|
| -def samefile(filename1, filename2):
|
| - """
|
| - A hacky implementation of C{os.path.samefile}. Used by L{filenameToModule}
|
| - when the platform doesn't provide C{os.path.samefile}. Do not use this.
|
| - """
|
| - return os.path.abspath(filename1) == os.path.abspath(filename2)
|
| -
|
| -def filenameToModule(fn):
|
| - """
|
| - Given a filename, do whatever possible to return a module object matching
|
| - that file.
|
| -
|
| - If the file in question is a module in Python path, properly import and
|
| - return that module. Otherwise, load the source manually.
|
| -
|
| - @param fn: A filename.
|
| - @return: A module object.
|
| - @raise ValueError: If C{fn} does not exist.
|
| - """
|
| - if not os.path.exists(fn):
|
| - raise ValueError("%r doesn't exist" % (fn,))
|
| - try:
|
| - ret = reflect.namedAny(reflect.filenameToModuleName(fn))
|
| - except (ValueError, AttributeError):
|
| - # Couldn't find module. The file 'fn' is not in PYTHONPATH
|
| - return _importFromFile(fn)
|
| - # ensure that the loaded module matches the file
|
| - retFile = os.path.splitext(ret.__file__)[0] + '.py'
|
| - # not all platforms (e.g. win32) have os.path.samefile
|
| - same = getattr(os.path, 'samefile', samefile)
|
| - if os.path.isfile(fn) and not same(fn, retFile):
|
| - del sys.modules[ret.__name__]
|
| - ret = _importFromFile(fn)
|
| - return ret
|
| -
|
| -
|
| -def _importFromFile(fn, moduleName=None):
|
| - fn = _resolveDirectory(fn)
|
| - if not moduleName:
|
| - moduleName = os.path.splitext(os.path.split(fn)[-1])[0]
|
| - if moduleName in sys.modules:
|
| - return sys.modules[moduleName]
|
| - fd = open(fn, 'r')
|
| - try:
|
| - module = imp.load_source(moduleName, fn, fd)
|
| - finally:
|
| - fd.close()
|
| - return module
|
| -
|
| -
|
| -def _resolveDirectory(fn):
|
| - if os.path.isdir(fn):
|
| - initFile = isPackageDirectory(fn)
|
| - if initFile:
|
| - fn = os.path.join(fn, initFile)
|
| - else:
|
| - raise ValueError('%r is not a package directory' % (fn,))
|
| - return fn
|
| -
|
| -
|
| -
|
| -class DestructiveTestSuite(TestSuite):
|
| - """
|
| - A test suite which remove the tests once run, to minimize memory usage.
|
| - """
|
| -
|
| - def run(self, result):
|
| - """
|
| - Almost the same as L{TestSuite.run}, but with C{self._tests} being
|
| - empty at the end.
|
| - """
|
| - while self._tests:
|
| - if result.shouldStop:
|
| - break
|
| - test = self._tests.pop(0)
|
| - test(result)
|
| - return result
|
| -
|
| -
|
| -
|
| -# When an error occurs outside of any test, the user will see this string
|
| -# in place of a test's name.
|
| -NOT_IN_TEST = "<not in test>"
|
| -
|
| -
|
| -
|
| -class LoggedSuite(TestSuite):
|
| - """
|
| - Any errors logged in this suite will be reported to the L{TestResult}
|
| - object.
|
| - """
|
| -
|
| - def run(self, result):
|
| - """
|
| - Run the suite, storing all errors in C{result}. If an error is logged
|
| - while no tests are running, then it will be added as an error to
|
| - C{result}.
|
| -
|
| - @param result: A L{TestResult} object.
|
| - """
|
| - observer = unittest._logObserver
|
| - observer._add()
|
| - super(LoggedSuite, self).run(result)
|
| - observer._remove()
|
| - for error in observer.getErrors():
|
| - result.addError(TestHolder(NOT_IN_TEST), error)
|
| - observer.flushErrors()
|
| -
|
| -
|
| -
|
| -class DocTestSuite(TestSuite):
|
| - """
|
| - DEPRECATED in Twisted 8.0.
|
| -
|
| - Behaves like doctest.DocTestSuite, but decorates individual TestCases so
|
| - they support visit and so that id() behaviour is meaningful and consistent
|
| - between Python versions.
|
| - """
|
| -
|
| - def __init__(self, testModule):
|
| - warnings.warn("DocTestSuite is deprecated in Twisted 8.0.",
|
| - category=DeprecationWarning, stacklevel=3)
|
| - TestSuite.__init__(self)
|
| - suite = doctest.DocTestSuite(testModule)
|
| - for test in suite._tests: #yay encapsulation
|
| - self.addTest(ITestCase(test))
|
| -
|
| -
|
| -
|
| -class PyUnitTestCase(object):
|
| - """
|
| - DEPRECATED in Twisted 8.0.
|
| -
|
| - This class decorates the pyunit.TestCase class, mainly to work around the
|
| - differences between unittest in Python 2.3, 2.4, and 2.5. These
|
| - differences are::
|
| -
|
| - - The way doctest unittests describe themselves
|
| - - Where the implementation of TestCase.run is (used to be in __call__)
|
| - - Where the test method name is kept (mangled-private or non-mangled
|
| - private variable)
|
| -
|
| - It also implements visit, which we like.
|
| - """
|
| -
|
| - def __init__(self, test):
|
| - warnings.warn("Deprecated in Twisted 8.0.",
|
| - category=DeprecationWarning)
|
| - self._test = test
|
| - test.id = self.id
|
| -
|
| - def id(self):
|
| - cls = self._test.__class__
|
| - tmn = getattr(self._test, '_TestCase__testMethodName', None)
|
| - if tmn is None:
|
| - # python2.5's 'unittest' module is more sensible; but different.
|
| - tmn = self._test._testMethodName
|
| - return (cls.__module__ + '.' + cls.__name__ + '.' +
|
| - tmn)
|
| -
|
| - def __repr__(self):
|
| - return 'PyUnitTestCase<%r>'%(self.id(),)
|
| -
|
| - def __call__(self, results):
|
| - return self._test(results)
|
| -
|
| -
|
| - def visit(self, visitor):
|
| - """
|
| - Call the given visitor with the original, standard library, test case
|
| - that C{self} wraps. See L{unittest.TestCase.visit}.
|
| -
|
| - Deprecated in Twisted 8.0.
|
| - """
|
| - warnings.warn("Test visitors deprecated in Twisted 8.0",
|
| - category=DeprecationWarning)
|
| - visitor(self._test)
|
| -
|
| -
|
| - def __getattr__(self, name):
|
| - return getattr(self._test, name)
|
| -
|
| -
|
| -
|
| -class DocTestCase(PyUnitTestCase):
|
| - """
|
| - DEPRECATED in Twisted 8.0.
|
| - """
|
| -
|
| - def id(self):
|
| - """
|
| - In Python 2.4, doctests have correct id() behaviour. In Python 2.3,
|
| - id() returns 'runit'.
|
| -
|
| - Here we override id() so that at least it will always contain the
|
| - fully qualified Python name of the doctest.
|
| - """
|
| - return self._test.shortDescription()
|
| -
|
| -
|
| -class TrialSuite(TestSuite):
|
| - """
|
| - Suite to wrap around every single test in a C{trial} run. Used internally
|
| - by Trial to set up things necessary for Trial tests to work, regardless of
|
| - what context they are run in.
|
| - """
|
| -
|
| - def __init__(self, tests=()):
|
| - suite = LoggedSuite(tests)
|
| - super(TrialSuite, self).__init__([suite])
|
| -
|
| -
|
| - def _bail(self):
|
| - from twisted.internet import reactor
|
| - d = defer.Deferred()
|
| - reactor.addSystemEventTrigger('after', 'shutdown',
|
| - lambda: d.callback(None))
|
| - reactor.fireSystemEvent('shutdown') # radix's suggestion
|
| - treactor = interfaces.IReactorThreads(reactor, None)
|
| - if treactor is not None:
|
| - treactor.suggestThreadPoolSize(0)
|
| - # As long as TestCase does crap stuff with the reactor we need to
|
| - # manually shutdown the reactor here, and that requires util.wait
|
| - # :(
|
| - # so that the shutdown event completes
|
| - unittest.TestCase('mktemp')._wait(d)
|
| -
|
| - def run(self, result):
|
| - try:
|
| - TestSuite.run(self, result)
|
| - finally:
|
| - self._bail()
|
| -
|
| -
|
| -def name(thing):
|
| - """
|
| - @param thing: an object from modules (instance of PythonModule,
|
| - PythonAttribute), a TestCase subclass, or an instance of a TestCase.
|
| - """
|
| - if isTestCase(thing):
|
| - # TestCase subclass
|
| - theName = reflect.qual(thing)
|
| - else:
|
| - # thing from trial, or thing from modules.
|
| - # this monstrosity exists so that modules' objects do not have to
|
| - # implement id(). -jml
|
| - try:
|
| - theName = thing.id()
|
| - except AttributeError:
|
| - theName = thing.name
|
| - return theName
|
| -
|
| -
|
| -def isTestCase(obj):
|
| - """
|
| - Returns C{True} if C{obj} is a class that contains test cases, C{False}
|
| - otherwise. Used to find all the tests in a module.
|
| - """
|
| - try:
|
| - return issubclass(obj, pyunit.TestCase)
|
| - except TypeError:
|
| - return False
|
| -
|
| -
|
| -
|
| -class TestHolder(object):
|
| - """
|
| - Placeholder for a L{TestCase} inside a reporter. As far as a L{TestResult}
|
| - is concerned, this looks exactly like a unit test.
|
| - """
|
| -
|
| - implements(ITestCase)
|
| -
|
| - def __init__(self, description):
|
| - """
|
| - @param description: A string to be displayed L{TestResult}.
|
| - """
|
| - self.description = description
|
| -
|
| -
|
| - def id(self):
|
| - return self.description
|
| -
|
| -
|
| - def shortDescription(self):
|
| - return self.description
|
| -
|
| -
|
| -
|
| -class ErrorHolder(TestHolder):
|
| - """
|
| - Used to insert arbitrary errors into a test suite run. Provides enough
|
| - methods to look like a C{TestCase}, however, when it is run, it simply adds
|
| - an error to the C{TestResult}. The most common use-case is for when a
|
| - module fails to import.
|
| - """
|
| -
|
| - def __init__(self, description, error):
|
| - """
|
| - @param description: A string used by C{TestResult}s to identify this
|
| - error. Generally, this is the name of a module that failed to import.
|
| -
|
| - @param error: The error to be added to the result. Can be an exc_info
|
| - tuple or a L{twisted.python.failure.Failure}.
|
| - """
|
| - super(ErrorHolder, self).__init__(description)
|
| - self.error = error
|
| -
|
| -
|
| - def __repr__(self):
|
| - return "<ErrorHolder description=%r error=%r>" % (self.description,
|
| - self.error)
|
| -
|
| -
|
| - def run(self, result):
|
| - result.addError(self, self.error)
|
| -
|
| -
|
| - def __call__(self, result):
|
| - return self.run(result)
|
| -
|
| -
|
| - def countTestCases(self):
|
| - return 0
|
| -
|
| -
|
| - def visit(self, visitor):
|
| - """
|
| - See L{unittest.TestCase.visit}.
|
| - """
|
| - visitor(self)
|
| -
|
| -
|
| -
|
| -class TestLoader(object):
|
| - """
|
| - I find tests inside function, modules, files -- whatever -- then return
|
| - them wrapped inside a Test (either a L{TestSuite} or a L{TestCase}).
|
| -
|
| - @ivar methodPrefix: A string prefix. C{TestLoader} will assume that all the
|
| - methods in a class that begin with C{methodPrefix} are test cases.
|
| -
|
| - @ivar modulePrefix: A string prefix. Every module in a package that begins
|
| - with C{modulePrefix} is considered a module full of tests.
|
| -
|
| - @ivar forceGarbageCollection: A flag applied to each C{TestCase} loaded.
|
| - See L{unittest.TestCase} for more information.
|
| -
|
| - @ivar sorter: A key function used to sort C{TestCase}s, test classes,
|
| - modules and packages.
|
| -
|
| - @ivar suiteFactory: A callable which is passed a list of tests (which
|
| - themselves may be suites of tests). Must return a test suite.
|
| - """
|
| -
|
| - methodPrefix = 'test'
|
| - modulePrefix = 'test_'
|
| -
|
| - def __init__(self):
|
| - self.suiteFactory = TestSuite
|
| - self.sorter = name
|
| - self._importErrors = []
|
| -
|
| - def sort(self, xs):
|
| - """
|
| - Sort the given things using L{sorter}.
|
| -
|
| - @param xs: A list of test cases, class or modules.
|
| - """
|
| - return dsu(xs, self.sorter)
|
| -
|
| - def findTestClasses(self, module):
|
| - """Given a module, return all Trial test classes"""
|
| - classes = []
|
| - for name, val in inspect.getmembers(module):
|
| - if isTestCase(val):
|
| - classes.append(val)
|
| - return self.sort(classes)
|
| -
|
| - def findByName(self, name):
|
| - """
|
| - Return a Python object given a string describing it.
|
| -
|
| - @param name: a string which may be either a filename or a
|
| - fully-qualified Python name.
|
| -
|
| - @return: If C{name} is a filename, return the module. If C{name} is a
|
| - fully-qualified Python name, return the object it refers to.
|
| - """
|
| - if os.path.exists(name):
|
| - return filenameToModule(name)
|
| - return reflect.namedAny(name)
|
| -
|
| - def loadModule(self, module):
|
| - """
|
| - Return a test suite with all the tests from a module.
|
| -
|
| - Included are TestCase subclasses and doctests listed in the module's
|
| - __doctests__ module. If that's not good for you, put a function named
|
| - either C{testSuite} or C{test_suite} in your module that returns a
|
| - TestSuite, and I'll use the results of that instead.
|
| -
|
| - If C{testSuite} and C{test_suite} are both present, then I'll use
|
| - C{testSuite}.
|
| - """
|
| - ## XXX - should I add an optional parameter to disable the check for
|
| - ## a custom suite.
|
| - ## OR, should I add another method
|
| - if not isinstance(module, types.ModuleType):
|
| - raise TypeError("%r is not a module" % (module,))
|
| - if hasattr(module, 'testSuite'):
|
| - return module.testSuite()
|
| - elif hasattr(module, 'test_suite'):
|
| - return module.test_suite()
|
| - suite = self.suiteFactory()
|
| - for testClass in self.findTestClasses(module):
|
| - suite.addTest(self.loadClass(testClass))
|
| - if not hasattr(module, '__doctests__'):
|
| - return suite
|
| - docSuite = self.suiteFactory()
|
| - for doctest in module.__doctests__:
|
| - docSuite.addTest(self.loadDoctests(doctest))
|
| - return self.suiteFactory([suite, docSuite])
|
| - loadTestsFromModule = loadModule
|
| -
|
| - def loadClass(self, klass):
|
| - """
|
| - Given a class which contains test cases, return a sorted list of
|
| - C{TestCase} instances.
|
| - """
|
| - if not (isinstance(klass, type) or isinstance(klass, types.ClassType)):
|
| - raise TypeError("%r is not a class" % (klass,))
|
| - if not isTestCase(klass):
|
| - raise ValueError("%r is not a test case" % (klass,))
|
| - names = self.getTestCaseNames(klass)
|
| - tests = self.sort([self._makeCase(klass, self.methodPrefix+name)
|
| - for name in names])
|
| - return self.suiteFactory(tests)
|
| - loadTestsFromTestCase = loadClass
|
| -
|
| - def getTestCaseNames(self, klass):
|
| - """
|
| - Given a class that contains C{TestCase}s, return a list of names of
|
| - methods that probably contain tests.
|
| - """
|
| - return reflect.prefixedMethodNames(klass, self.methodPrefix)
|
| -
|
| - def loadMethod(self, method):
|
| - """
|
| - Given a method of a C{TestCase} that represents a test, return a
|
| - C{TestCase} instance for that test.
|
| - """
|
| - if not isinstance(method, types.MethodType):
|
| - raise TypeError("%r not a method" % (method,))
|
| - return self._makeCase(method.im_class, method.__name__)
|
| -
|
| - def _makeCase(self, klass, methodName):
|
| - return klass(methodName)
|
| -
|
| - def loadPackage(self, package, recurse=False):
|
| - """
|
| - Load tests from a module object representing a package, and return a
|
| - TestSuite containing those tests.
|
| -
|
| - Tests are only loaded from modules whose name begins with 'test_'
|
| - (or whatever C{modulePrefix} is set to).
|
| -
|
| - @param package: a types.ModuleType object (or reasonable facsimilie
|
| - obtained by importing) which may contain tests.
|
| -
|
| - @param recurse: A boolean. If True, inspect modules within packages
|
| - within the given package (and so on), otherwise, only inspect modules
|
| - in the package itself.
|
| -
|
| - @raise: TypeError if 'package' is not a package.
|
| -
|
| - @return: a TestSuite created with my suiteFactory, containing all the
|
| - tests.
|
| - """
|
| - if not isPackage(package):
|
| - raise TypeError("%r is not a package" % (package,))
|
| - pkgobj = modules.getModule(package.__name__)
|
| - if recurse:
|
| - discovery = pkgobj.walkModules()
|
| - else:
|
| - discovery = pkgobj.iterModules()
|
| - discovered = []
|
| - for disco in discovery:
|
| - if disco.name.split(".")[-1].startswith(self.modulePrefix):
|
| - discovered.append(disco)
|
| - suite = self.suiteFactory()
|
| - for modinfo in self.sort(discovered):
|
| - try:
|
| - module = modinfo.load()
|
| - except:
|
| - thingToAdd = ErrorHolder(modinfo.name, failure.Failure())
|
| - else:
|
| - thingToAdd = self.loadModule(module)
|
| - suite.addTest(thingToAdd)
|
| - return suite
|
| -
|
| - def loadDoctests(self, module):
|
| - """
|
| - Return a suite of tests for all the doctests defined in C{module}.
|
| -
|
| - @param module: A module object or a module name.
|
| - """
|
| - if isinstance(module, str):
|
| - try:
|
| - module = reflect.namedAny(module)
|
| - except:
|
| - return ErrorHolder(module, failure.Failure())
|
| - if not inspect.ismodule(module):
|
| - warnings.warn("trial only supports doctesting modules")
|
| - return
|
| - return doctest.DocTestSuite(module)
|
| -
|
| - def loadAnything(self, thing, recurse=False):
|
| - """
|
| - Given a Python object, return whatever tests that are in it. Whatever
|
| - 'in' might mean.
|
| -
|
| - @param thing: A Python object. A module, method, class or package.
|
| - @param recurse: Whether or not to look in subpackages of packages.
|
| - Defaults to False.
|
| -
|
| - @return: A C{TestCase} or C{TestSuite}.
|
| - """
|
| - if isinstance(thing, types.ModuleType):
|
| - if isPackage(thing):
|
| - return self.loadPackage(thing, recurse)
|
| - return self.loadModule(thing)
|
| - elif isinstance(thing, types.ClassType):
|
| - return self.loadClass(thing)
|
| - elif isinstance(thing, type):
|
| - return self.loadClass(thing)
|
| - elif isinstance(thing, types.MethodType):
|
| - return self.loadMethod(thing)
|
| - raise TypeError("No loader for %r. Unrecognized type" % (thing,))
|
| -
|
| - def loadByName(self, name, recurse=False):
|
| - """
|
| - Given a string representing a Python object, return whatever tests
|
| - are in that object.
|
| -
|
| - If C{name} is somehow inaccessible (e.g. the module can't be imported,
|
| - there is no Python object with that name etc) then return an
|
| - L{ErrorHolder}.
|
| -
|
| - @param name: The fully-qualified name of a Python object.
|
| - """
|
| - try:
|
| - thing = self.findByName(name)
|
| - except:
|
| - return ErrorHolder(name, failure.Failure())
|
| - return self.loadAnything(thing, recurse)
|
| - loadTestsFromName = loadByName
|
| -
|
| - def loadByNames(self, names, recurse=False):
|
| - """
|
| - Construct a TestSuite containing all the tests found in 'names', where
|
| - names is a list of fully qualified python names and/or filenames. The
|
| - suite returned will have no duplicate tests, even if the same object
|
| - is named twice.
|
| - """
|
| - things = []
|
| - errors = []
|
| - for name in names:
|
| - try:
|
| - things.append(self.findByName(name))
|
| - except:
|
| - errors.append(ErrorHolder(name, failure.Failure()))
|
| - suites = [self.loadAnything(thing, recurse)
|
| - for thing in set(things)]
|
| - suites.extend(errors)
|
| - return self.suiteFactory(suites)
|
| -
|
| -
|
| -
|
| -class DryRunVisitor(object):
|
| - """
|
| - A visitor that makes a reporter think that every test visited has run
|
| - successfully.
|
| - """
|
| -
|
| - def __init__(self, reporter):
|
| - """
|
| - @param reporter: A C{TestResult} object.
|
| - """
|
| - self.reporter = reporter
|
| -
|
| -
|
| - def markSuccessful(self, testCase):
|
| - """
|
| - Convince the reporter that this test has been run successfully.
|
| - """
|
| - self.reporter.startTest(testCase)
|
| - self.reporter.addSuccess(testCase)
|
| - self.reporter.stopTest(testCase)
|
| -
|
| -
|
| -
|
| -class TrialRunner(object):
|
| - """
|
| - A specialised runner that the trial front end uses.
|
| - """
|
| -
|
| - DEBUG = 'debug'
|
| - DRY_RUN = 'dry-run'
|
| -
|
| - def _getDebugger(self):
|
| - dbg = pdb.Pdb()
|
| - try:
|
| - import readline
|
| - except ImportError:
|
| - print "readline module not available"
|
| - hasattr(sys, 'exc_clear') and sys.exc_clear()
|
| - for path in ('.pdbrc', 'pdbrc'):
|
| - if os.path.exists(path):
|
| - try:
|
| - rcFile = file(path, 'r')
|
| - except IOError:
|
| - hasattr(sys, 'exc_clear') and sys.exc_clear()
|
| - else:
|
| - dbg.rcLines.extend(rcFile.readlines())
|
| - return dbg
|
| -
|
| - def _setUpTestdir(self):
|
| - self._tearDownLogFile()
|
| - currentDir = os.getcwd()
|
| - testdir = os.path.normpath(os.path.abspath(self.workingDirectory))
|
| - if os.path.exists(testdir):
|
| - try:
|
| - shutil.rmtree(testdir)
|
| - except OSError, e:
|
| - print ("could not remove %r, caught OSError [Errno %s]: %s"
|
| - % (testdir, e.errno,e.strerror))
|
| - try:
|
| - os.rename(testdir,
|
| - os.path.abspath("_trial_temp_old%s"
|
| - % random.randint(0, 99999999)))
|
| - except OSError, e:
|
| - print ("could not rename path, caught OSError [Errno %s]: %s"
|
| - % (e.errno,e.strerror))
|
| - raise
|
| - os.mkdir(testdir)
|
| - os.chdir(testdir)
|
| - return currentDir
|
| -
|
| - def _makeResult(self):
|
| - reporter = self.reporterFactory(self.stream, self.tbformat,
|
| - self.rterrors)
|
| - if self.uncleanWarnings:
|
| - reporter = UncleanWarningsReporterWrapper(reporter)
|
| - return reporter
|
| -
|
| - def __init__(self, reporterFactory,
|
| - mode=None,
|
| - logfile='test.log',
|
| - stream=sys.stdout,
|
| - profile=False,
|
| - tracebackFormat='default',
|
| - realTimeErrors=False,
|
| - uncleanWarnings=False,
|
| - workingDirectory=None,
|
| - forceGarbageCollection=False):
|
| - self.reporterFactory = reporterFactory
|
| - self.logfile = logfile
|
| - self.mode = mode
|
| - self.stream = stream
|
| - self.tbformat = tracebackFormat
|
| - self.rterrors = realTimeErrors
|
| - self.uncleanWarnings = uncleanWarnings
|
| - self._result = None
|
| - self.workingDirectory = workingDirectory or '_trial_temp'
|
| - self._logFileObserver = None
|
| - self._logFileObject = None
|
| - self._logWarnings = False
|
| - self._forceGarbageCollection = forceGarbageCollection
|
| - if profile:
|
| - self.run = util.profiled(self.run, 'profile.data')
|
| -
|
| - def _setUpLogging(self):
|
| - self._setUpLogFile()
|
| - self._setUpLogWarnings()
|
| -
|
| - def _tearDownLogFile(self):
|
| - if self._logFileObserver is not None:
|
| - log.removeObserver(self._logFileObserver.emit)
|
| - self._logFileObserver = None
|
| - if self._logFileObject is not None:
|
| - self._logFileObject.close()
|
| - self._logFileObject = None
|
| -
|
| - def _setUpLogFile(self):
|
| - self._tearDownLogFile()
|
| - if self.logfile == '-':
|
| - logFile = sys.stdout
|
| - else:
|
| - logFile = file(self.logfile, 'a')
|
| - self._logFileObject = logFile
|
| - self._logFileObserver = log.FileLogObserver(logFile)
|
| - log.startLoggingWithObserver(self._logFileObserver.emit, 0)
|
| -
|
| - def _setUpLogWarnings(self):
|
| - if self._logWarnings:
|
| - return
|
| - def seeWarnings(x):
|
| - if x.has_key('warning'):
|
| - print
|
| - print x['format'] % x
|
| - log.addObserver(seeWarnings)
|
| - self._logWarnings = True
|
| -
|
| - def run(self, test):
|
| - """
|
| - Run the test or suite and return a result object.
|
| - """
|
| - result = self._makeResult()
|
| - test = unittest.decorate(test, ITestCase)
|
| - if self._forceGarbageCollection:
|
| - test = unittest.decorate(
|
| - test, unittest._ForceGarbageCollectionDecorator)
|
| - # decorate the suite with reactor cleanup and log starting
|
| - # This should move out of the runner and be presumed to be
|
| - # present
|
| - suite = TrialSuite([test])
|
| - startTime = time.time()
|
| - if self.mode == self.DRY_RUN:
|
| - suite.visit(DryRunVisitor(result).markSuccessful)
|
| - elif self.mode == self.DEBUG:
|
| - # open question - should this be self.debug() instead.
|
| - debugger = self._getDebugger()
|
| - oldDir = self._setUpTestdir()
|
| - try:
|
| - self._setUpLogging()
|
| - debugger.runcall(suite.run, result)
|
| - finally:
|
| - self._tearDownLogFile()
|
| - os.chdir(oldDir)
|
| - else:
|
| - oldDir = self._setUpTestdir()
|
| - try:
|
| - self._setUpLogging()
|
| - suite.run(result)
|
| - finally:
|
| - self._tearDownLogFile()
|
| - os.chdir(oldDir)
|
| - endTime = time.time()
|
| - done = getattr(result, 'done', None)
|
| - if done is None:
|
| - warnings.warn(
|
| - "%s should implement done() but doesn't. Falling back to "
|
| - "printErrors() and friends." % reflect.qual(result.__class__),
|
| - category=DeprecationWarning, stacklevel=2)
|
| - result.printErrors()
|
| - result.writeln(result.separator)
|
| - result.writeln('Ran %d tests in %.3fs', result.testsRun,
|
| - endTime - startTime)
|
| - result.write('\n')
|
| - result.printSummary()
|
| - else:
|
| - result.done()
|
| - return result
|
| -
|
| - def runUntilFailure(self, test):
|
| - """
|
| - Repeatedly run C{test} until it fails.
|
| - """
|
| - count = 0
|
| - while True:
|
| - count += 1
|
| - self.stream.write("Test Pass %d\n" % (count,))
|
| - result = self.run(test)
|
| - if result.testsRun == 0:
|
| - break
|
| - if not result.wasSuccessful():
|
| - break
|
| - return result
|
| -
|
|
|