| Index: third_party/twisted_8_1/twisted/trial/test/test_reporter.py
|
| diff --git a/third_party/twisted_8_1/twisted/trial/test/test_reporter.py b/third_party/twisted_8_1/twisted/trial/test/test_reporter.py
|
| deleted file mode 100644
|
| index 06f59862674bcdec2058b67ac7c2fa31472f26c4..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/trial/test/test_reporter.py
|
| +++ /dev/null
|
| @@ -1,1031 +0,0 @@
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -#
|
| -# Maintainer: Jonathan Lange <jml@twistedmatrix.com>
|
| -
|
| -
|
| -import errno, sys, os, re, StringIO
|
| -from twisted.internet.utils import suppressWarnings
|
| -from twisted.python.failure import Failure
|
| -from twisted.trial import itrial, unittest, runner, reporter, util
|
| -from twisted.trial.reporter import UncleanWarningsReporterWrapper
|
| -from twisted.trial.test import erroneous
|
| -from twisted.trial.unittest import makeTodo, SkipTest, Todo
|
| -
|
| -
|
| -class BrokenStream(object):
|
| - """
|
| - Stream-ish object that raises a signal interrupt error. We use this to make
|
| - sure that Trial still manages to write what it needs to write.
|
| - """
|
| - written = False
|
| - flushed = False
|
| -
|
| - def __init__(self, fObj):
|
| - self.fObj = fObj
|
| -
|
| - def write(self, s):
|
| - if self.written:
|
| - return self.fObj.write(s)
|
| - self.written = True
|
| - raise IOError(errno.EINTR, "Interrupted write")
|
| -
|
| - def flush(self):
|
| - if self.flushed:
|
| - return self.fObj.flush()
|
| - self.flushed = True
|
| - raise IOError(errno.EINTR, "Interrupted flush")
|
| -
|
| -
|
| -class StringTest(unittest.TestCase):
|
| - def stringComparison(self, expect, output):
|
| - output = filter(None, output)
|
| - self.failUnless(len(expect) <= len(output),
|
| - "Must have more observed than expected"
|
| - "lines %d < %d" % (len(output), len(expect)))
|
| - REGEX_PATTERN_TYPE = type(re.compile(''))
|
| - for line_number, (exp, out) in enumerate(zip(expect, output)):
|
| - if exp is None:
|
| - continue
|
| - elif isinstance(exp, str):
|
| - self.assertSubstring(exp, out, "Line %d: %r not in %r"
|
| - % (line_number, exp, out))
|
| - elif isinstance(exp, REGEX_PATTERN_TYPE):
|
| - self.failUnless(exp.match(out),
|
| - "Line %d: %r did not match string %r"
|
| - % (line_number, exp.pattern, out))
|
| - else:
|
| - raise TypeError("don't know what to do with object %r"
|
| - % (exp,))
|
| -
|
| -
|
| -class TestTestResult(unittest.TestCase):
|
| - def setUp(self):
|
| - self.result = reporter.TestResult()
|
| -
|
| - def test_pyunitAddError(self):
|
| - # pyunit passes an exc_info tuple directly to addError
|
| - try:
|
| - raise RuntimeError('foo')
|
| - except RuntimeError, excValue:
|
| - self.result.addError(self, sys.exc_info())
|
| - failure = self.result.errors[0][1]
|
| - self.assertEqual(excValue, failure.value)
|
| - self.assertEqual(RuntimeError, failure.type)
|
| -
|
| - def test_pyunitAddFailure(self):
|
| - # pyunit passes an exc_info tuple directly to addFailure
|
| - try:
|
| - raise self.failureException('foo')
|
| - except self.failureException, excValue:
|
| - self.result.addFailure(self, sys.exc_info())
|
| - failure = self.result.failures[0][1]
|
| - self.assertEqual(excValue, failure.value)
|
| - self.assertEqual(self.failureException, failure.type)
|
| -
|
| -
|
| -class TestReporterRealtime(TestTestResult):
|
| - def setUp(self):
|
| - output = StringIO.StringIO()
|
| - self.result = reporter.Reporter(output, realtime=True)
|
| -
|
| -
|
| -class TestErrorReporting(StringTest):
|
| - doubleSeparator = re.compile(r'^=+$')
|
| -
|
| - def setUp(self):
|
| - self.loader = runner.TestLoader()
|
| - self.output = StringIO.StringIO()
|
| - self.result = reporter.Reporter(self.output)
|
| -
|
| - def getOutput(self, suite):
|
| - result = self.getResult(suite)
|
| - result.done()
|
| - return self.output.getvalue()
|
| -
|
| - def getResult(self, suite):
|
| - suite.run(self.result)
|
| - return self.result
|
| -
|
| - def testFormatErroredMethod(self):
|
| - suite = self.loader.loadClass(erroneous.TestFailureInSetUp)
|
| - output = self.getOutput(suite).splitlines()
|
| - match = [self.doubleSeparator,
|
| - ('[ERROR]: twisted.trial.test.erroneous.'
|
| - 'TestFailureInSetUp.test_noop'),
|
| - 'Traceback (most recent call last):',
|
| - re.compile(r'^\s+File .*erroneous\.py., line \d+, in setUp$'),
|
| - re.compile(r'^\s+raise FoolishError, '
|
| - r'.I am a broken setUp method.$'),
|
| - ('twisted.trial.test.erroneous.FoolishError: '
|
| - 'I am a broken setUp method')]
|
| - self.stringComparison(match, output)
|
| -
|
| - def testFormatFailedMethod(self):
|
| - suite = self.loader.loadMethod(erroneous.TestRegularFail.test_fail)
|
| - output = self.getOutput(suite).splitlines()
|
| - match = [
|
| - self.doubleSeparator,
|
| - '[FAIL]: '
|
| - 'twisted.trial.test.erroneous.TestRegularFail.test_fail',
|
| - 'Traceback (most recent call last):',
|
| - re.compile(r'^\s+File .*erroneous\.py., line \d+, in test_fail$'),
|
| - re.compile(r'^\s+self\.fail\("I fail"\)$'),
|
| - 'twisted.trial.unittest.FailTest: I fail'
|
| - ]
|
| - self.stringComparison(match, output)
|
| -
|
| - def testDoctestError(self):
|
| - from twisted.trial.test import erroneous
|
| - suite = unittest.decorate(
|
| - self.loader.loadDoctests(erroneous), itrial.ITestCase)
|
| - output = self.getOutput(suite)
|
| - path = 'twisted.trial.test.erroneous.unexpectedException'
|
| - for substring in ['1/0', 'ZeroDivisionError',
|
| - 'Exception raised:', path]:
|
| - self.assertSubstring(substring, output)
|
| - self.failUnless(re.search('Fail(ed|ure in) example:', output),
|
| - "Couldn't match 'Failure in example: ' "
|
| - "or 'Failed example: '")
|
| - expect = [self.doubleSeparator,
|
| - re.compile(r'\[(ERROR|FAIL)\]: .*' + re.escape(path))]
|
| - self.stringComparison(expect, output.splitlines())
|
| -
|
| - def testHiddenException(self):
|
| - """
|
| - Check that errors in C{DelayedCall}s get reported, even if the
|
| - test already has a failure.
|
| -
|
| - Only really necessary for testing the deprecated style of tests that
|
| - use iterate() directly. See
|
| - L{erroneous.DelayedCall.testHiddenException} for more details.
|
| - """
|
| - test = erroneous.DelayedCall('testHiddenException')
|
| - output = self.getOutput(test).splitlines()
|
| - match = [
|
| - self.doubleSeparator,
|
| - '[FAIL]: '
|
| - 'twisted.trial.test.erroneous.DelayedCall.testHiddenException',
|
| - 'Traceback (most recent call last):',
|
| - re.compile(r'^\s+File .*erroneous\.py., line \d+, in '
|
| - 'testHiddenException$'),
|
| - re.compile(r'^\s+self\.fail\("Deliberate failure to mask the '
|
| - 'hidden exception"\)$'),
|
| - 'twisted.trial.unittest.FailTest: '
|
| - 'Deliberate failure to mask the hidden exception',
|
| - self.doubleSeparator,
|
| - '[ERROR]: '
|
| - 'twisted.trial.test.erroneous.DelayedCall.testHiddenException',
|
| - 'Traceback (most recent call last):',
|
| - re.compile(r'^\s+File .* in runUntilCurrent'),
|
| - re.compile(r'^\s+.*'),
|
| - re.compile('^\s+File .*erroneous\.py", line \d+, in go'),
|
| - re.compile('^\s+raise RuntimeError\(self.hiddenExceptionMsg\)'),
|
| - 'exceptions.RuntimeError: something blew up',
|
| - ]
|
| -
|
| - self.stringComparison(match, output)
|
| -
|
| -
|
| -
|
| -class TestUncleanWarningWrapperErrorReporting(TestErrorReporting):
|
| - """
|
| - Tests that the L{UncleanWarningsReporterWrapper} can sufficiently proxy
|
| - IReporter failure and error reporting methods to a L{reporter.Reporter}.
|
| - """
|
| - def setUp(self):
|
| - self.loader = runner.TestLoader()
|
| - self.output = StringIO.StringIO()
|
| - self.result = UncleanWarningsReporterWrapper(
|
| - reporter.Reporter(self.output))
|
| -
|
| -
|
| -
|
| -class TracebackHandling(unittest.TestCase):
|
| - def getErrorFrames(self, test):
|
| - stream = StringIO.StringIO()
|
| - result = reporter.Reporter(stream)
|
| - test.run(result)
|
| - bads = result.failures + result.errors
|
| - assert len(bads) == 1
|
| - assert bads[0][0] == test
|
| - return result._trimFrames(bads[0][1].frames)
|
| -
|
| - def checkFrames(self, observedFrames, expectedFrames):
|
| - for observed, expected in zip(observedFrames, expectedFrames):
|
| - self.assertEqual(observed[0], expected[0])
|
| - observedSegs = os.path.splitext(observed[1])[0].split(os.sep)
|
| - expectedSegs = expected[1].split('/')
|
| - self.assertEqual(observedSegs[-len(expectedSegs):],
|
| - expectedSegs)
|
| - self.assertEqual(len(observedFrames), len(expectedFrames))
|
| -
|
| - def test_basic(self):
|
| - test = erroneous.TestRegularFail('test_fail')
|
| - frames = self.getErrorFrames(test)
|
| - self.checkFrames(frames,
|
| - [('test_fail', 'twisted/trial/test/erroneous')])
|
| -
|
| - def test_subroutine(self):
|
| - test = erroneous.TestRegularFail('test_subfail')
|
| - frames = self.getErrorFrames(test)
|
| - self.checkFrames(frames,
|
| - [('test_subfail', 'twisted/trial/test/erroneous'),
|
| - ('subroutine', 'twisted/trial/test/erroneous')])
|
| -
|
| - def test_deferred(self):
|
| - test = erroneous.TestFailureInDeferredChain('test_fail')
|
| - frames = self.getErrorFrames(test)
|
| - self.checkFrames(frames,
|
| - [('_later', 'twisted/trial/test/erroneous')])
|
| -
|
| - def test_noFrames(self):
|
| - result = reporter.Reporter(None)
|
| - self.assertEqual([], result._trimFrames([]))
|
| -
|
| - def test_oneFrame(self):
|
| - result = reporter.Reporter(None)
|
| - self.assertEqual(['fake frame'], result._trimFrames(['fake frame']))
|
| -
|
| -
|
| -class FormatFailures(StringTest):
|
| - def setUp(self):
|
| - try:
|
| - raise RuntimeError('foo')
|
| - except RuntimeError:
|
| - self.f = Failure()
|
| - self.f.frames = [
|
| - ['foo', 'foo/bar.py', 5, [('x', 5)], [('y', 'orange')]],
|
| - ['qux', 'foo/bar.py', 10, [('a', 'two')], [('b', 'MCMXCIX')]]
|
| - ]
|
| - self.stream = StringIO.StringIO()
|
| - self.result = reporter.Reporter(self.stream)
|
| -
|
| - def test_formatDefault(self):
|
| - tb = self.result._formatFailureTraceback(self.f)
|
| - self.stringComparison([
|
| - 'Traceback (most recent call last):',
|
| - ' File "foo/bar.py", line 5, in foo',
|
| - re.compile(r'^\s*$'),
|
| - ' File "foo/bar.py", line 10, in qux',
|
| - re.compile(r'^\s*$'),
|
| - 'RuntimeError: foo'], tb.splitlines())
|
| -
|
| - def test_formatString(self):
|
| - tb = '''
|
| - File "twisted/trial/unittest.py", line 256, in failUnlessSubstring
|
| - return self.failUnlessIn(substring, astring, msg)
|
| -exceptions.TypeError: iterable argument required
|
| -
|
| -'''
|
| - expected = '''
|
| - File "twisted/trial/unittest.py", line 256, in failUnlessSubstring
|
| - return self.failUnlessIn(substring, astring, msg)
|
| -exceptions.TypeError: iterable argument required
|
| -'''
|
| - formatted = self.result._formatFailureTraceback(tb)
|
| - self.assertEqual(expected, formatted)
|
| -
|
| - def test_mutation(self):
|
| - frames = self.f.frames[:]
|
| - tb = self.result._formatFailureTraceback(self.f)
|
| - self.assertEqual(self.f.frames, frames)
|
| -
|
| -
|
| -class PyunitTestNames(unittest.TestCase):
|
| - def setUp(self):
|
| - from twisted.trial.test import sample
|
| - self.stream = StringIO.StringIO()
|
| - self.test = sample.PyunitTest('test_foo')
|
| -
|
| - def test_verboseReporter(self):
|
| - result = reporter.VerboseTextReporter(self.stream)
|
| - result.startTest(self.test)
|
| - output = self.stream.getvalue()
|
| - self.failUnlessEqual(
|
| - output, 'twisted.trial.test.sample.PyunitTest.test_foo ... ')
|
| -
|
| - def test_treeReporter(self):
|
| - result = reporter.TreeReporter(self.stream)
|
| - result.startTest(self.test)
|
| - output = self.stream.getvalue()
|
| - output = output.splitlines()[-1].strip()
|
| - self.failUnlessEqual(output, result.getDescription(self.test) + ' ...')
|
| -
|
| - def test_getDescription(self):
|
| - result = reporter.TreeReporter(self.stream)
|
| - output = result.getDescription(self.test)
|
| - self.failUnlessEqual(output, 'test_foo')
|
| -
|
| -
|
| - def test_minimalReporter(self):
|
| - """
|
| - The summary of L{reporter.MinimalReporter} is a simple list of
|
| - numbers, indicating how many tests ran, how many failed etc.
|
| - """
|
| - result = reporter.MinimalReporter(self.stream)
|
| - self.test.run(result)
|
| - result._printSummary()
|
| - output = self.stream.getvalue().strip().split(' ')
|
| - self.failUnlessEqual(output[1:], ['1', '1', '0', '0', '0'])
|
| -
|
| -
|
| -
|
| -class TestDirtyReactor(unittest.TestCase):
|
| - """
|
| - The trial script has an option to treat L{DirtyReactorAggregateError}s as
|
| - warnings, as a migration tool for test authors. It causes a wrapper to be
|
| - placed around reporters that replaces L{DirtyReactorAggregatErrors} with
|
| - warnings.
|
| - """
|
| -
|
| - def setUp(self):
|
| - self.dirtyError = Failure(
|
| - util.DirtyReactorAggregateError(['foo'], ['bar']))
|
| - self.output = StringIO.StringIO()
|
| - self.test = TestDirtyReactor('test_errorByDefault')
|
| -
|
| -
|
| - def test_errorByDefault(self):
|
| - """
|
| - C{DirtyReactorAggregateError}s are reported as errors with the default
|
| - Reporter.
|
| - """
|
| - result = reporter.Reporter(stream=self.output)
|
| - result.addError(self.test, self.dirtyError)
|
| - self.assertEqual(len(result.errors), 1)
|
| - self.assertEqual(result.errors[0][1], self.dirtyError)
|
| -
|
| -
|
| - def test_warningsEnabled(self):
|
| - """
|
| - C{DirtyReactorErrors}s are reported as warnings when using the
|
| - L{UncleanWarningsReporterWrapper}.
|
| - """
|
| - result = UncleanWarningsReporterWrapper(
|
| - reporter.Reporter(stream=self.output))
|
| - self.assertWarns(UserWarning, self.dirtyError.getErrorMessage(),
|
| - reporter.__file__,
|
| - result.addError, self.test, self.dirtyError)
|
| -
|
| -
|
| - def test_warningsMaskErrors(self):
|
| - """
|
| - C{DirtyReactorErrors}s are I{not} reported as errors if the
|
| - L{UncleanWarningsReporterWrapper} is used.
|
| - """
|
| - result = UncleanWarningsReporterWrapper(
|
| - reporter.Reporter(stream=self.output))
|
| - self.assertWarns(UserWarning, self.dirtyError.getErrorMessage(),
|
| - reporter.__file__,
|
| - result.addError, self.test, self.dirtyError)
|
| - self.assertEquals(result._originalReporter.errors, [])
|
| -
|
| -
|
| - def test_dealsWithThreeTuples(self):
|
| - """
|
| - Some annoying stuff can pass three-tuples to addError instead of
|
| - Failures (like PyUnit). The wrapper, of course, handles this case,
|
| - since it is a part of L{twisted.trial.itrial.IReporter}! But it does
|
| - not convert L{DirtyReactorError} to warnings in this case, because
|
| - nobody should be passing those in the form of three-tuples.
|
| - """
|
| - result = UncleanWarningsReporterWrapper(
|
| - reporter.Reporter(stream=self.output))
|
| - result.addError(self.test,
|
| - (self.dirtyError.type, self.dirtyError.value, None))
|
| - self.assertEqual(len(result._originalReporter.errors), 1)
|
| - self.assertEquals(result._originalReporter.errors[0][1].type,
|
| - self.dirtyError.type)
|
| - self.assertEquals(result._originalReporter.errors[0][1].value,
|
| - self.dirtyError.value)
|
| -
|
| -
|
| -
|
| -class TrialTestNames(unittest.TestCase):
|
| -
|
| - def setUp(self):
|
| - from twisted.trial.test import sample
|
| - self.stream = StringIO.StringIO()
|
| - self.test = sample.FooTest('test_foo')
|
| -
|
| - def test_verboseReporter(self):
|
| - result = reporter.VerboseTextReporter(self.stream)
|
| - result.startTest(self.test)
|
| - output = self.stream.getvalue()
|
| - self.failUnlessEqual(output, self.test.id() + ' ... ')
|
| -
|
| - def test_treeReporter(self):
|
| - result = reporter.TreeReporter(self.stream)
|
| - result.startTest(self.test)
|
| - output = self.stream.getvalue()
|
| - output = output.splitlines()[-1].strip()
|
| - self.failUnlessEqual(output, result.getDescription(self.test) + ' ...')
|
| -
|
| - def test_treeReporterWithDocstrings(self):
|
| - """A docstring"""
|
| - result = reporter.TreeReporter(self.stream)
|
| - self.assertEqual(result.getDescription(self),
|
| - 'test_treeReporterWithDocstrings')
|
| -
|
| - def test_getDescription(self):
|
| - result = reporter.TreeReporter(self.stream)
|
| - output = result.getDescription(self.test)
|
| - self.failUnlessEqual(output, "test_foo")
|
| -
|
| -
|
| -class TestSkip(unittest.TestCase):
|
| - """
|
| - Tests for L{reporter.Reporter}'s handling of skips.
|
| - """
|
| - def setUp(self):
|
| - from twisted.trial.test import sample
|
| - self.stream = StringIO.StringIO()
|
| - self.result = reporter.Reporter(self.stream)
|
| - self.test = sample.FooTest('test_foo')
|
| -
|
| - def _getSkips(self, result):
|
| - """
|
| - Get the number of skips that happened to a reporter.
|
| - """
|
| - return len(result.skips)
|
| -
|
| - def test_accumulation(self):
|
| - self.result.addSkip(self.test, 'some reason')
|
| - self.assertEqual(self._getSkips(self.result), 1)
|
| -
|
| - def test_success(self):
|
| - self.result.addSkip(self.test, 'some reason')
|
| - self.failUnlessEqual(True, self.result.wasSuccessful())
|
| -
|
| -
|
| - def test_summary(self):
|
| - """
|
| - The summary of a successful run with skips indicates that the test
|
| - suite passed and includes the number of skips.
|
| - """
|
| - self.result.addSkip(self.test, 'some reason')
|
| - self.result.done()
|
| - output = self.stream.getvalue().splitlines()[-1]
|
| - prefix = 'PASSED '
|
| - self.failUnless(output.startswith(prefix))
|
| - self.failUnlessEqual(output[len(prefix):].strip(), '(skips=1)')
|
| -
|
| -
|
| - def test_basicErrors(self):
|
| - """
|
| - The output at the end of a test run with skips includes the reasons
|
| - for skipping those tests.
|
| - """
|
| - self.result.addSkip(self.test, 'some reason')
|
| - self.result.done()
|
| - output = self.stream.getvalue().splitlines()[4]
|
| - self.failUnlessEqual(output.strip(), 'some reason')
|
| -
|
| -
|
| - def test_booleanSkip(self):
|
| - """
|
| - Tests can be skipped without specifying a reason by setting the 'skip'
|
| - attribute to True. When this happens, the test output includes 'True'
|
| - as the reason.
|
| - """
|
| - self.result.addSkip(self.test, True)
|
| - self.result.done()
|
| - output = self.stream.getvalue().splitlines()[4]
|
| - self.failUnlessEqual(output, 'True')
|
| -
|
| -
|
| - def test_exceptionSkip(self):
|
| - """
|
| - Skips can be raised as errors. When this happens, the error is
|
| - included in the summary at the end of the test suite.
|
| - """
|
| - try:
|
| - 1/0
|
| - except Exception, e:
|
| - error = e
|
| - self.result.addSkip(self.test, error)
|
| - self.result.done()
|
| - output = '\n'.join(self.stream.getvalue().splitlines()[3:5]).strip()
|
| - self.failUnlessEqual(output, str(e))
|
| -
|
| -
|
| -class UncleanWarningSkipTest(TestSkip):
|
| - """
|
| - Tests for skips on a L{reporter.Reporter} wrapped by an
|
| - L{UncleanWarningsReporterWrapper}.
|
| - """
|
| - def setUp(self):
|
| - TestSkip.setUp(self)
|
| - self.result = UncleanWarningsReporterWrapper(self.result)
|
| -
|
| - def _getSkips(self, result):
|
| - """
|
| - Get the number of skips that happened to a reporter inside of an
|
| - unclean warnings reporter wrapper.
|
| - """
|
| - return len(result._originalReporter.skips)
|
| -
|
| -
|
| -
|
| -class TodoTest(unittest.TestCase):
|
| - """
|
| - Tests for L{reporter.Reporter}'s handling of todos.
|
| - """
|
| -
|
| - def setUp(self):
|
| - from twisted.trial.test import sample
|
| - self.stream = StringIO.StringIO()
|
| - self.result = reporter.Reporter(self.stream)
|
| - self.test = sample.FooTest('test_foo')
|
| -
|
| -
|
| - def _getTodos(self, result):
|
| - """
|
| - Get the number of todos that happened to a reporter.
|
| - """
|
| - return len(result.expectedFailures)
|
| -
|
| -
|
| - def _getUnexpectedSuccesses(self, result):
|
| - """
|
| - Get the number of unexpected successes that happened to a reporter.
|
| - """
|
| - return len(result.unexpectedSuccesses)
|
| -
|
| -
|
| - def test_accumulation(self):
|
| - """
|
| - L{reporter.Reporter} accumulates the expected failures that it
|
| - is notified of.
|
| - """
|
| - self.result.addExpectedFailure(self.test, Failure(Exception()),
|
| - makeTodo('todo!'))
|
| - self.assertEqual(self._getTodos(self.result), 1)
|
| -
|
| -
|
| - def test_success(self):
|
| - """
|
| - A test run is still successful even if there are expected failures.
|
| - """
|
| - self.result.addExpectedFailure(self.test, Failure(Exception()),
|
| - makeTodo('todo!'))
|
| - self.assertEqual(True, self.result.wasSuccessful())
|
| -
|
| -
|
| - def test_unexpectedSuccess(self):
|
| - """
|
| - A test which is marked as todo but succeeds will have an unexpected
|
| - success reported to its result. A test run is still successful even
|
| - when this happens.
|
| - """
|
| - self.result.addUnexpectedSuccess(self.test, makeTodo("Heya!"))
|
| - self.assertEqual(True, self.result.wasSuccessful())
|
| - self.assertEqual(self._getUnexpectedSuccesses(self.result), 1)
|
| -
|
| -
|
| - def test_summary(self):
|
| - """
|
| - The reporter's C{printSummary} method should print the number of
|
| - expected failures that occured.
|
| - """
|
| - self.result.addExpectedFailure(self.test, Failure(Exception()),
|
| - makeTodo('some reason'))
|
| - self.result.done()
|
| - output = self.stream.getvalue().splitlines()[-1]
|
| - prefix = 'PASSED '
|
| - self.failUnless(output.startswith(prefix))
|
| - self.assertEqual(output[len(prefix):].strip(),
|
| - '(expectedFailures=1)')
|
| -
|
| -
|
| - def test_basicErrors(self):
|
| - """
|
| - The reporter's L{printErrors} method should include the value of the
|
| - Todo.
|
| - """
|
| - self.result.addExpectedFailure(self.test, Failure(Exception()),
|
| - makeTodo('some reason'))
|
| - self.result.done()
|
| - output = self.stream.getvalue().splitlines()[4].strip()
|
| - self.assertEqual(output, "Reason: 'some reason'")
|
| -
|
| -
|
| - def test_booleanTodo(self):
|
| - """
|
| - Booleans CAN'T be used as the value of a todo. Maybe this sucks. This
|
| - is a test for current behavior, not a requirement.
|
| - """
|
| - self.result.addExpectedFailure(self.test, Failure(Exception()),
|
| - makeTodo(True))
|
| - self.assertRaises(Exception, self.result.done)
|
| -
|
| -
|
| - def test_exceptionTodo(self):
|
| - """
|
| - The exception for expected failures should be shown in the
|
| - C{printErrors} output.
|
| - """
|
| - try:
|
| - 1/0
|
| - except Exception, e:
|
| - error = e
|
| - self.result.addExpectedFailure(self.test, Failure(error),
|
| - makeTodo("todo!"))
|
| - self.result.done()
|
| - output = '\n'.join(self.stream.getvalue().splitlines()[3:]).strip()
|
| - self.assertTrue(str(e) in output)
|
| -
|
| -
|
| -
|
| -class UncleanWarningTodoTest(TodoTest):
|
| - """
|
| - Tests for L{UncleanWarningsReporterWrapper}'s handling of todos.
|
| - """
|
| -
|
| - def setUp(self):
|
| - TodoTest.setUp(self)
|
| - self.result = UncleanWarningsReporterWrapper(self.result)
|
| -
|
| -
|
| - def _getTodos(self, result):
|
| - """
|
| - Get the number of todos that happened to a reporter inside of an
|
| - unclean warnings reporter wrapper.
|
| - """
|
| - return len(result._originalReporter.expectedFailures)
|
| -
|
| -
|
| - def _getUnexpectedSuccesses(self, result):
|
| - """
|
| - Get the number of unexpected successes that happened to a reporter
|
| - inside of an unclean warnings reporter wrapper.
|
| - """
|
| - return len(result._originalReporter.unexpectedSuccesses)
|
| -
|
| -
|
| -
|
| -class MockColorizer:
|
| - """
|
| - Used by TestTreeReporter to make sure that output is colored correctly.
|
| - """
|
| - def __init__(self, stream):
|
| - self.log = []
|
| -
|
| - def supported(self):
|
| - return True
|
| - supported = classmethod(supported)
|
| -
|
| - def write(self, text, color):
|
| - self.log.append((color, text))
|
| -
|
| -
|
| -class TestTreeReporter(unittest.TestCase):
|
| - def setUp(self):
|
| - from twisted.trial.test import sample
|
| - self.test = sample.FooTest('test_foo')
|
| - self.stream = StringIO.StringIO()
|
| - self.result = reporter.TreeReporter(self.stream)
|
| - self.result._colorizer = MockColorizer(self.stream)
|
| - self.log = self.result._colorizer.log
|
| -
|
| - def makeError(self):
|
| - try:
|
| - 1/0
|
| - except ZeroDivisionError:
|
| - f = Failure()
|
| - return f
|
| -
|
| - def test_cleanupError(self):
|
| - """
|
| - Run cleanupErrors and check that the output is correct, and colored
|
| - correctly.
|
| - """
|
| - f = self.makeError()
|
| - self.result.cleanupErrors(f)
|
| - color, text = self.log[0]
|
| - self.assertEqual(color.strip(), self.result.ERROR)
|
| - self.assertEqual(text.strip(), 'cleanup errors')
|
| - color, text = self.log[1]
|
| - self.assertEqual(color.strip(), self.result.ERROR)
|
| - self.assertEqual(text.strip(), '[ERROR]')
|
| - test_cleanupError = suppressWarnings(
|
| - test_cleanupError,
|
| - util.suppress(category=reporter.BrokenTestCaseWarning),
|
| - util.suppress(category=DeprecationWarning))
|
| -
|
| -
|
| - def test_upDownError(self):
|
| - """
|
| - Run upDownError and check that the output is correct and colored
|
| - correctly.
|
| - """
|
| - self.result.upDownError("method", None, None, False)
|
| - color, text = self.log[0]
|
| - self.assertEqual(color.strip(), self.result.ERROR)
|
| - self.assertEqual(text.strip(), 'method')
|
| - test_upDownError = suppressWarnings(
|
| - test_upDownError,
|
| - util.suppress(category=DeprecationWarning,
|
| - message="upDownError is deprecated in Twisted 8.0."))
|
| -
|
| -
|
| - def test_summaryColoredSuccess(self):
|
| - """
|
| - The summary in case of success should have a good count of successes
|
| - and be colored properly.
|
| - """
|
| - self.result.addSuccess(self.test)
|
| - self.result.done()
|
| - self.assertEquals(self.log[1], (self.result.SUCCESS, 'PASSED'))
|
| - self.assertEquals(
|
| - self.stream.getvalue().splitlines()[-1].strip(), "(successes=1)")
|
| -
|
| -
|
| - def test_summaryColoredFailure(self):
|
| - """
|
| - The summary in case of failure should have a good count of errors
|
| - and be colored properly.
|
| - """
|
| - try:
|
| - raise RuntimeError('foo')
|
| - except RuntimeError, excValue:
|
| - self.result.addError(self, sys.exc_info())
|
| - self.result.done()
|
| - self.assertEquals(self.log[1], (self.result.FAILURE, 'FAILED'))
|
| - self.assertEquals(
|
| - self.stream.getvalue().splitlines()[-1].strip(), "(errors=1)")
|
| -
|
| -
|
| - def test_getPrelude(self):
|
| - """
|
| - The tree needs to get the segments of the test ID that correspond
|
| - to the module and class that it belongs to.
|
| - """
|
| - self.assertEqual(
|
| - ['foo.bar', 'baz'],
|
| - self.result._getPreludeSegments('foo.bar.baz.qux'))
|
| - self.assertEqual(
|
| - ['foo', 'bar'],
|
| - self.result._getPreludeSegments('foo.bar.baz'))
|
| - self.assertEqual(
|
| - ['foo'],
|
| - self.result._getPreludeSegments('foo.bar'))
|
| - self.assertEqual([], self.result._getPreludeSegments('foo'))
|
| -
|
| -
|
| -class TestReporter(unittest.TestCase):
|
| - resultFactory = reporter.Reporter
|
| -
|
| - def setUp(self):
|
| - from twisted.trial.test import sample
|
| - self.test = sample.FooTest('test_foo')
|
| - self.stream = StringIO.StringIO()
|
| - self.result = self.resultFactory(self.stream)
|
| - self._timer = 0
|
| - self.result._getTime = self._getTime
|
| -
|
| - def _getTime(self):
|
| - self._timer += 1
|
| - return self._timer
|
| -
|
| - def test_startStop(self):
|
| - self.result.startTest(self.test)
|
| - self.result.stopTest(self.test)
|
| - self.assertTrue(self.result._lastTime > 0)
|
| - self.assertEqual(self.result.testsRun, 1)
|
| - self.assertEqual(self.result.wasSuccessful(), True)
|
| -
|
| -
|
| - def test_brokenStream(self):
|
| - """
|
| - Test that the reporter safely writes to its stream.
|
| - """
|
| - result = self.resultFactory(stream=BrokenStream(self.stream))
|
| - result._writeln("Hello")
|
| - self.assertEqual(self.stream.getvalue(), 'Hello\n')
|
| - self.stream.truncate(0)
|
| - result._writeln("Hello %s!", 'World')
|
| - self.assertEqual(self.stream.getvalue(), 'Hello World!\n')
|
| -
|
| -
|
| -
|
| - def test_printErrorsDeprecated(self):
|
| - """
|
| - L{IReporter.printErrors} was deprecated in Twisted 8.0.
|
| - """
|
| - def f():
|
| - self.result.printErrors()
|
| - self.assertWarns(
|
| - DeprecationWarning, "printErrors is deprecated in Twisted 8.0.",
|
| - __file__, f)
|
| -
|
| -
|
| - def test_printSummaryDeprecated(self):
|
| - """
|
| - L{IReporter.printSummary} was deprecated in Twisted 8.0.
|
| - """
|
| - def f():
|
| - self.result.printSummary()
|
| - self.assertWarns(
|
| - DeprecationWarning, "printSummary is deprecated in Twisted 8.0.",
|
| - __file__, f)
|
| -
|
| -
|
| - def test_writeDeprecated(self):
|
| - """
|
| - L{IReporter.write} was deprecated in Twisted 8.0.
|
| - """
|
| - def f():
|
| - self.result.write("")
|
| - self.assertWarns(
|
| - DeprecationWarning, "write is deprecated in Twisted 8.0.",
|
| - __file__, f)
|
| -
|
| -
|
| - def test_writelnDeprecated(self):
|
| - """
|
| - L{IReporter.writeln} was deprecated in Twisted 8.0.
|
| - """
|
| - def f():
|
| - self.result.writeln("")
|
| - self.assertWarns(
|
| - DeprecationWarning, "writeln is deprecated in Twisted 8.0.",
|
| - __file__, f)
|
| -
|
| -
|
| - def test_separatorDeprecated(self):
|
| - """
|
| - L{IReporter.separator} was deprecated in Twisted 8.0.
|
| - """
|
| - def f():
|
| - return self.result.separator
|
| - self.assertWarns(
|
| - DeprecationWarning, "separator is deprecated in Twisted 8.0.",
|
| - __file__, f)
|
| -
|
| -
|
| - def test_streamDeprecated(self):
|
| - """
|
| - L{IReporter.stream} was deprecated in Twisted 8.0.
|
| - """
|
| - def f():
|
| - return self.result.stream
|
| - self.assertWarns(
|
| - DeprecationWarning, "stream is deprecated in Twisted 8.0.",
|
| - __file__, f)
|
| -
|
| -
|
| - def test_upDownErrorDeprecated(self):
|
| - """
|
| - L{IReporter.upDownError} was deprecated in Twisted 8.0.
|
| - """
|
| - def f():
|
| - self.result.upDownError(None, None, None, None)
|
| - self.assertWarns(
|
| - DeprecationWarning, "upDownError is deprecated in Twisted 8.0.",
|
| - __file__, f)
|
| -
|
| -
|
| -
|
| -class TestSafeStream(unittest.TestCase):
|
| - def test_safe(self):
|
| - """
|
| - Test that L{reporter.SafeStream} successfully write to its original
|
| - stream even if an interrupt happens during the write.
|
| - """
|
| - stream = StringIO.StringIO()
|
| - broken = BrokenStream(stream)
|
| - safe = reporter.SafeStream(broken)
|
| - safe.write("Hello")
|
| - self.assertEqual(stream.getvalue(), "Hello")
|
| -
|
| -
|
| -class TestTimingReporter(TestReporter):
|
| - resultFactory = reporter.TimingTextReporter
|
| -
|
| -
|
| -
|
| -class LoggingReporter(reporter.Reporter):
|
| - """
|
| - Simple reporter that stores the last test that was passed to it.
|
| - """
|
| -
|
| - def __init__(self, *args, **kwargs):
|
| - reporter.Reporter.__init__(self, *args, **kwargs)
|
| - self.test = None
|
| -
|
| - def addError(self, test, error):
|
| - self.test = test
|
| -
|
| - def addExpectedFailure(self, test, failure, todo):
|
| - self.test = test
|
| -
|
| - def addFailure(self, test, failure):
|
| - self.test = test
|
| -
|
| - def addSkip(self, test, skip):
|
| - self.test = test
|
| -
|
| - def addUnexpectedSuccess(self, test, todo):
|
| - self.test = test
|
| -
|
| - def startTest(self, test):
|
| - self.test = test
|
| -
|
| - def stopTest(self, test):
|
| - self.test = test
|
| -
|
| -
|
| -
|
| -class TestAdaptedReporter(unittest.TestCase):
|
| - """
|
| - L{reporter._AdaptedReporter} is a reporter wrapper that wraps all of the
|
| - tests it receives before passing them on to the original reporter.
|
| - """
|
| -
|
| - def setUp(self):
|
| - self.wrappedResult = self.getWrappedResult()
|
| -
|
| -
|
| - def _testAdapter(self, test):
|
| - return test.id()
|
| -
|
| -
|
| - def assertWrapped(self, wrappedResult, test):
|
| - self.assertEqual(wrappedResult._originalReporter.test, self._testAdapter(test))
|
| -
|
| -
|
| - def getFailure(self, exceptionInstance):
|
| - """
|
| - Return a L{Failure} from raising the given exception.
|
| -
|
| - @param exceptionInstance: The exception to raise.
|
| - @return: L{Failure}
|
| - """
|
| - try:
|
| - raise exceptionInstance
|
| - except:
|
| - return Failure()
|
| -
|
| -
|
| - def getWrappedResult(self):
|
| - result = LoggingReporter()
|
| - return reporter._AdaptedReporter(result, self._testAdapter)
|
| -
|
| -
|
| - def test_addError(self):
|
| - """
|
| - C{addError} wraps its test with the provided adapter.
|
| - """
|
| - self.wrappedResult.addError(self, self.getFailure(RuntimeError()))
|
| - self.assertWrapped(self.wrappedResult, self)
|
| -
|
| -
|
| - def test_addFailure(self):
|
| - """
|
| - C{addFailure} wraps its test with the provided adapter.
|
| - """
|
| - self.wrappedResult.addFailure(self, self.getFailure(AssertionError()))
|
| - self.assertWrapped(self.wrappedResult, self)
|
| -
|
| -
|
| - def test_addSkip(self):
|
| - """
|
| - C{addSkip} wraps its test with the provided adapter.
|
| - """
|
| - self.wrappedResult.addSkip(self, self.getFailure(SkipTest('no reason')))
|
| - self.assertWrapped(self.wrappedResult, self)
|
| -
|
| -
|
| - def test_startTest(self):
|
| - """
|
| - C{startTest} wraps its test with the provided adapter.
|
| - """
|
| - self.wrappedResult.startTest(self)
|
| - self.assertWrapped(self.wrappedResult, self)
|
| -
|
| -
|
| - def test_stopTest(self):
|
| - """
|
| - C{stopTest} wraps its test with the provided adapter.
|
| - """
|
| - self.wrappedResult.stopTest(self)
|
| - self.assertWrapped(self.wrappedResult, self)
|
| -
|
| -
|
| - def test_addExpectedFailure(self):
|
| - """
|
| - C{addExpectedFailure} wraps its test with the provided adapter.
|
| - """
|
| - self.wrappedResult.addExpectedFailure(
|
| - self, self.getFailure(RuntimeError()), Todo("no reason"))
|
| - self.assertWrapped(self.wrappedResult, self)
|
| -
|
| -
|
| - def test_addUnexpectedSuccess(self):
|
| - """
|
| - C{addUnexpectedSuccess} wraps its test with the provided adapter.
|
| - """
|
| - self.wrappedResult.addUnexpectedSuccess(self, Todo("no reason"))
|
| - self.assertWrapped(self.wrappedResult, self)
|
|
|