860
_get_test("test_xfail").run(result)
861
self.assertContainsRe(result_stream.getvalue(),
862
"\n\\S+\\.test_xfail\\s+XFAIL\\s+\\d+ms\n"
863
"\\s*(?:Text attachment: )?reason"
867
test = self.get_passing_test()
868
result.startTest(test)
869
prefix = len(result_stream.getvalue())
870
# the err parameter has the shape:
871
# (class, exception object, traceback)
872
# KnownFailures dont get their tracebacks shown though, so we
874
err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
875
result.report_known_failure(test, err)
876
output = result_stream.getvalue()[prefix:]
877
lines = output.splitlines()
878
self.assertContainsRe(lines[0], r'XFAIL *\d+ms$')
879
if sys.version_info > (2, 7):
880
self.expectFailure("_ExpectedFailure on 2.7 loses the message",
881
self.assertNotEqual, lines[1], ' ')
882
self.assertEqual(lines[1], ' foo')
883
self.assertEqual(2, len(lines))
868
885
def get_passing_test(self):
869
886
"""Return a test object that can't be run usefully."""
1063
1090
self.expectFailure("No absolute truth", self.assertTrue, True)
1064
1091
runner = tests.TextTestRunner(stream=StringIO())
1065
1092
result = self.run_test_runner(runner, Test("test_truth"))
1066
if testtools_version[:3] <= (0, 9, 11):
1067
self.assertContainsRe(runner.stream.getvalue(),
1069
"FAIL: \\S+\.test_truth\n"
1072
"No absolute truth\n"
1075
"Ran 1 test in .*\n"
1077
"FAILED \\(failures=1\\)\n\\Z")
1079
self.assertContainsRe(runner.stream.getvalue(),
1081
"FAIL: \\S+\.test_truth\n"
1083
"Empty attachments:\n"
1086
"reason: {{{No absolute truth}}}\n"
1088
"Ran 1 test in .*\n"
1090
"FAILED \\(failures=1\\)\n\\Z")
1093
self.assertContainsRe(runner.stream.getvalue(),
1095
"FAIL: \\S+\.test_truth\n"
1098
"No absolute truth\n"
1101
"Ran 1 test in .*\n"
1103
"FAILED \\(failures=1\\)\n\\Z")
1092
1105
def test_result_decorator(self):
1093
1106
# decorate results
1744
1754
result = self._run_test('test_fail')
1745
1755
self.assertEqual(1, len(result.failures))
1746
1756
result_content = result.failures[0][1]
1747
if testtools_version < (0, 9, 12):
1748
self.assertContainsRe(result_content, 'Text attachment: log')
1757
self.assertContainsRe(result_content, 'Text attachment: log')
1749
1758
self.assertContainsRe(result_content, 'this was a failing test')
1751
1760
def test_error_has_log(self):
1752
1761
result = self._run_test('test_error')
1753
1762
self.assertEqual(1, len(result.errors))
1754
1763
result_content = result.errors[0][1]
1755
if testtools_version < (0, 9, 12):
1756
self.assertContainsRe(result_content, 'Text attachment: log')
1764
self.assertContainsRe(result_content, 'Text attachment: log')
1757
1765
self.assertContainsRe(result_content, 'this test errored')
1759
1767
def test_skip_has_no_log(self):
2611
2619
self.assertEqual('bzr: interrupted\n', result[1])
2622
class TestFeature(tests.TestCase):
2624
def test_caching(self):
2625
"""Feature._probe is called by the feature at most once."""
2626
class InstrumentedFeature(tests.Feature):
2628
super(InstrumentedFeature, self).__init__()
2631
self.calls.append('_probe')
2633
feature = InstrumentedFeature()
2635
self.assertEqual(['_probe'], feature.calls)
2637
self.assertEqual(['_probe'], feature.calls)
2639
def test_named_str(self):
2640
"""Feature.__str__ should thunk to feature_name()."""
2641
class NamedFeature(tests.Feature):
2642
def feature_name(self):
2644
feature = NamedFeature()
2645
self.assertEqual('symlinks', str(feature))
2647
def test_default_str(self):
2648
"""Feature.__str__ should default to __class__.__name__."""
2649
class NamedFeature(tests.Feature):
2651
feature = NamedFeature()
2652
self.assertEqual('NamedFeature', str(feature))
2655
class TestUnavailableFeature(tests.TestCase):
2657
def test_access_feature(self):
2658
feature = tests.Feature()
2659
exception = tests.UnavailableFeature(feature)
2660
self.assertIs(feature, exception.args[0])
2663
simple_thunk_feature = tests._CompatabilityThunkFeature(
2664
deprecated_in((2, 1, 0)),
2665
'bzrlib.tests.test_selftest',
2666
'simple_thunk_feature','UnicodeFilename',
2667
replacement_module='bzrlib.tests'
2670
class Test_CompatibilityFeature(tests.TestCase):
2672
def test_does_thunk(self):
2673
res = self.callDeprecated(
2674
['bzrlib.tests.test_selftest.simple_thunk_feature was deprecated'
2675
' in version 2.1.0. Use bzrlib.tests.UnicodeFilename instead.'],
2676
simple_thunk_feature.available)
2677
self.assertEqual(tests.UnicodeFilename.available(), res)
2680
class TestModuleAvailableFeature(tests.TestCase):
2682
def test_available_module(self):
2683
feature = tests.ModuleAvailableFeature('bzrlib.tests')
2684
self.assertEqual('bzrlib.tests', feature.module_name)
2685
self.assertEqual('bzrlib.tests', str(feature))
2686
self.assertTrue(feature.available())
2687
self.assertIs(tests, feature.module)
2689
def test_unavailable_module(self):
2690
feature = tests.ModuleAvailableFeature('bzrlib.no_such_module_exists')
2691
self.assertEqual('bzrlib.no_such_module_exists', str(feature))
2692
self.assertFalse(feature.available())
2693
self.assertIs(None, feature.module)
2614
2696
class TestSelftestFiltering(tests.TestCase):
2616
2698
def setUp(self):
3315
3397
self.assertLength(1, calls)
3318
class TestUncollectedWarnings(tests.TestCase):
3319
"""Check a test case still alive after being run emits a warning"""
3321
class Test(tests.TestCase):
3322
def test_pass(self):
3324
def test_self_ref(self):
3325
self.also_self = self.test_self_ref
3326
def test_skip(self):
3327
self.skip("Don't need")
3329
def _get_suite(self):
3330
return TestUtil.TestSuite([
3331
self.Test("test_pass"),
3332
self.Test("test_self_ref"),
3333
self.Test("test_skip"),
3336
def _inject_stream_into_subunit(self, stream):
3337
"""To be overridden by subclasses that run tests out of process"""
3339
def _run_selftest_with_suite(self, **kwargs):
3341
self._inject_stream_into_subunit(sio)
3342
old_flags = tests.selftest_debug_flags
3343
tests.selftest_debug_flags = old_flags.union(["uncollected_cases"])
3344
gc_on = gc.isenabled()
3348
tests.selftest(test_suite_factory=self._get_suite, stream=sio,
3349
stop_on_failure=False, **kwargs)
3353
tests.selftest_debug_flags = old_flags
3354
output = sio.getvalue()
3355
self.assertNotContainsRe(output, "Uncollected test case.*test_pass")
3356
self.assertContainsRe(output, "Uncollected test case.*test_self_ref")
3359
def test_testsuite(self):
3360
self._run_selftest_with_suite()
3362
def test_pattern(self):
3363
out = self._run_selftest_with_suite(pattern="test_(?:pass|self_ref)$")
3364
self.assertNotContainsRe(out, "test_skip")
3366
def test_exclude_pattern(self):
3367
out = self._run_selftest_with_suite(exclude_pattern="test_skip$")
3368
self.assertNotContainsRe(out, "test_skip")
3370
def test_random_seed(self):
3371
self._run_selftest_with_suite(random_seed="now")
3373
def test_matching_tests_first(self):
3374
self._run_selftest_with_suite(matching_tests_first=True,
3375
pattern="test_self_ref$")
3377
def test_starting_with_and_exclude(self):
3378
out = self._run_selftest_with_suite(starting_with=["bt."],
3379
exclude_pattern="test_skip$")
3380
self.assertNotContainsRe(out, "test_skip")
3382
def test_additonal_decorator(self):
3383
out = self._run_selftest_with_suite(
3384
suite_decorators=[tests.TestDecorator])
3387
class TestUncollectedWarningsSubunit(TestUncollectedWarnings):
3388
"""Check warnings from tests staying alive are emitted with subunit"""
3390
_test_needs_features = [features.subunit]
3392
def _run_selftest_with_suite(self, **kwargs):
3393
return TestUncollectedWarnings._run_selftest_with_suite(self,
3394
runner_class=tests.SubUnitBzrRunner, **kwargs)
3397
class TestUncollectedWarningsForking(TestUncollectedWarnings):
3398
"""Check warnings from tests staying alive are emitted when forking"""
3400
_test_needs_features = [features.subunit]
3402
def _inject_stream_into_subunit(self, stream):
3403
"""Monkey-patch subunit so the extra output goes to stream not stdout
3405
Some APIs need rewriting so this kind of bogus hackery can be replaced
3406
by passing the stream param from run_tests down into ProtocolTestCase.
3408
from subunit import ProtocolTestCase
3409
_original_init = ProtocolTestCase.__init__
3410
def _init_with_passthrough(self, *args, **kwargs):
3411
_original_init(self, *args, **kwargs)
3412
self._passthrough = stream
3413
self.overrideAttr(ProtocolTestCase, "__init__", _init_with_passthrough)
3415
def _run_selftest_with_suite(self, **kwargs):
3416
# GZ 2011-05-26: Add a PosixSystem feature so this check can go away
3417
if getattr(os, "fork", None) is None:
3418
raise tests.TestNotApplicable("Platform doesn't support forking")
3419
# Make sure the fork code is actually invoked by claiming two cores
3420
self.overrideAttr(osutils, "local_concurrency", lambda: 2)
3421
kwargs.setdefault("suite_decorators", []).append(tests.fork_decorator)
3422
return TestUncollectedWarnings._run_selftest_with_suite(self, **kwargs)
3425
3400
class TestEnvironHandling(tests.TestCase):
3427
3402
def test_overrideEnv_None_called_twice_doesnt_leak(self):