88
77
TestUtil._load_module_by_name,
89
78
'bzrlib.no-name-yet')
92
80
class MetaTestLog(tests.TestCase):
94
82
def test_logging(self):
95
83
"""Test logs are captured when a test fails."""
96
84
self.log('a test message')
97
details = self.getDetails()
99
self.assertThat(log.content_type, Equals(ContentType(
100
"text", "plain", {"charset": "utf8"})))
101
self.assertThat(u"".join(log.iter_text()), Equals(self.get_log()))
102
self.assertThat(self.get_log(),
103
DocTestMatches(u"...a test message\n", ELLIPSIS))
85
self._log_file.flush()
86
self.assertContainsRe(self._get_log(keep_log_file=True),
106
90
class TestUnicodeFilename(tests.TestCase):
600
576
self.get_transport().get_bytes(
601
577
'dir/.bzr/repository/format'))
579
def test_safety_net(self):
580
"""No test should modify the safety .bzr directory.
582
We just test that the _check_safety_net private method raises
583
AssertionError, it's easier than building a test suite with the same
586
# Oops, a commit in the current directory (i.e. without local .bzr
587
# directory) will crawl up the hierarchy to find a .bzr directory.
588
self.run_bzr(['commit', '-mfoo', '--unchanged'])
589
# But we have a safety net in place.
590
self.assertRaises(AssertionError, self._check_safety_net)
603
592
def test_dangling_locks_cause_failures(self):
604
593
class TestDanglingLock(tests.TestCaseWithMemoryTransport):
605
594
def test_function(self):
841
823
def stopTestRun(self): pass
842
824
def startTests(self): pass
843
825
def report_test_start(self, test): pass
844
def report_known_failure(self, test, err=None, details=None):
845
self._call = test, 'known failure'
826
def report_known_failure(self, test, err):
827
self._call = test, err
846
828
result = InstrumentedTestResult(None, None, None, None)
847
class Test(tests.TestCase):
848
def test_function(self):
849
raise tests.KnownFailure('failed!')
850
test = Test("test_function")
830
raise tests.KnownFailure('failed!')
831
test = unittest.FunctionTestCase(test_function)
852
833
# it should invoke 'report_known_failure'.
853
834
self.assertEqual(2, len(result._call))
854
self.assertEqual(test.id(), result._call[0].id())
855
self.assertEqual('known failure', result._call[1])
835
self.assertEqual(test, result._call[0])
836
self.assertEqual(tests.KnownFailure, result._call[1][0])
837
self.assertIsInstance(result._call[1][1], tests.KnownFailure)
856
838
# we dont introspec the traceback, if the rest is ok, it would be
857
839
# exceptional for it not to be.
858
840
# it should update the known_failure_count on the object.
930
912
result.report_unsupported(test, feature)
931
913
output = result_stream.getvalue()[prefix:]
932
914
lines = output.splitlines()
933
# We don't check for the final '0ms' since it may fail on slow hosts
934
self.assertStartsWith(lines[0], 'NODEP')
935
self.assertEqual(lines[1],
936
" The feature 'Feature' is not available.")
915
self.assertEqual(lines, ['NODEP 0ms',
916
" The feature 'Feature' is not available."])
938
918
def test_unavailable_exception(self):
939
919
"""An UnavailableFeature being raised should invoke addNotSupported."""
945
925
self._call = test, feature
946
926
result = InstrumentedTestResult(None, None, None, None)
947
927
feature = tests.Feature()
948
class Test(tests.TestCase):
949
def test_function(self):
950
raise tests.UnavailableFeature(feature)
951
test = Test("test_function")
929
raise tests.UnavailableFeature(feature)
930
test = unittest.FunctionTestCase(test_function)
953
932
# it should invoke 'addNotSupported'.
954
933
self.assertEqual(2, len(result._call))
955
self.assertEqual(test.id(), result._call[0].id())
934
self.assertEqual(test, result._call[0])
956
935
self.assertEqual(feature, result._call[1])
957
936
# and not count as an error
958
937
self.assertEqual(0, result.error_count)
1034
1013
def test_known_failure_failed_run(self):
1035
1014
# run a test that generates a known failure which should be printed in
1036
1015
# the final output when real failures occur.
1037
class Test(tests.TestCase):
1038
def known_failure_test(self):
1039
self.expectFailure('failed', self.assertTrue, False)
1016
def known_failure_test():
1017
raise tests.KnownFailure('failed')
1040
1018
test = unittest.TestSuite()
1041
test.addTest(Test("known_failure_test"))
1019
test.addTest(unittest.FunctionTestCase(known_failure_test))
1042
1020
def failing_test():
1021
raise AssertionError('foo')
1044
1022
test.addTest(unittest.FunctionTestCase(failing_test))
1045
1023
stream = StringIO()
1046
1024
runner = tests.TextTestRunner(stream=stream)
1047
1025
result = self.run_test_runner(runner, test)
1048
1026
lines = stream.getvalue().splitlines()
1049
1027
self.assertContainsRe(stream.getvalue(),
1050
'(?sm)^bzr selftest.*$'
1052
1030
'^======================================================================\n'
1053
'^FAIL: failing_test\n'
1031
'^FAIL: unittest.FunctionTestCase \\(failing_test\\)\n'
1054
1032
'^----------------------------------------------------------------------\n'
1055
1033
'Traceback \\(most recent call last\\):\n'
1056
1034
' .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1057
' self.fail\\(\'foo\'\\)\n'
1035
' raise AssertionError\\(\'foo\'\\)\n'
1059
1037
'^----------------------------------------------------------------------\n'
1064
1042
def test_known_failure_ok_run(self):
1065
# run a test that generates a known failure which should be printed in
1067
class Test(tests.TestCase):
1068
def known_failure_test(self):
1069
self.expectFailure('failed', self.assertTrue, False)
1070
test = Test("known_failure_test")
1043
# run a test that generates a known failure which should be printed in the final output.
1044
def known_failure_test():
1045
raise tests.KnownFailure('failed')
1046
test = unittest.FunctionTestCase(known_failure_test)
1071
1047
stream = StringIO()
1072
1048
runner = tests.TextTestRunner(stream=stream)
1073
1049
result = self.run_test_runner(runner, test)
1151
1127
def test_not_applicable(self):
1152
1128
# run a test that is skipped because it's not applicable
1153
class Test(tests.TestCase):
1154
def not_applicable_test(self):
1155
raise tests.TestNotApplicable('this test never runs')
1129
def not_applicable_test():
1130
raise tests.TestNotApplicable('this test never runs')
1156
1131
out = StringIO()
1157
1132
runner = tests.TextTestRunner(stream=out, verbosity=2)
1158
test = Test("not_applicable_test")
1133
test = unittest.FunctionTestCase(not_applicable_test)
1159
1134
result = self.run_test_runner(runner, test)
1160
1135
self._log_file.write(out.getvalue())
1161
1136
self.assertTrue(result.wasSuccessful())
1193
def _patch_get_bzr_source_tree(self):
1194
# Reading from the actual source tree breaks isolation, but we don't
1195
# want to assume that thats *all* that would happen.
1196
self._get_source_tree_calls = []
1198
self._get_source_tree_calls.append("called")
1200
self.overrideAttr(bzrlib.version, '_get_bzr_source_tree', new_get)
1202
1168
def test_bench_history(self):
1203
# tests that the running the benchmark passes bench_history into
1204
# the test result object. We can tell that happens if
1205
# _get_bzr_source_tree is called.
1206
self._patch_get_bzr_source_tree()
1169
# tests that the running the benchmark produces a history file
1170
# containing a timestamp and the revision id of the bzrlib source which
1172
workingtree = _get_bzr_source_tree()
1207
1173
test = TestRunner('dummy_test')
1208
1174
output = StringIO()
1209
1175
runner = tests.TextTestRunner(stream=self._log_file,
1211
1177
result = self.run_test_runner(runner, test)
1212
1178
output_string = output.getvalue()
1213
1179
self.assertContainsRe(output_string, "--date [0-9.]+")
1214
self.assertLength(1, self._get_source_tree_calls)
1180
if workingtree is not None:
1181
revision_id = workingtree.get_parent_ids()[0]
1182
self.assertEndsWith(output_string.rstrip(), revision_id)
1184
def assertLogDeleted(self, test):
1185
log = test._get_log()
1186
self.assertEqual("DELETED log file to reduce memory footprint", log)
1187
self.assertEqual('', test._log_contents)
1188
self.assertIs(None, test._log_file_name)
1190
def test_success_log_deleted(self):
1191
"""Successful tests have their log deleted"""
1193
class LogTester(tests.TestCase):
1195
def test_success(self):
1196
self.log('this will be removed\n')
1199
runner = tests.TextTestRunner(stream=sio)
1200
test = LogTester('test_success')
1201
result = self.run_test_runner(runner, test)
1203
self.assertLogDeleted(test)
1205
def test_skipped_log_deleted(self):
1206
"""Skipped tests have their log deleted"""
1208
class LogTester(tests.TestCase):
1210
def test_skipped(self):
1211
self.log('this will be removed\n')
1212
raise tests.TestSkipped()
1215
runner = tests.TextTestRunner(stream=sio)
1216
test = LogTester('test_skipped')
1217
result = self.run_test_runner(runner, test)
1219
self.assertLogDeleted(test)
1221
def test_not_aplicable_log_deleted(self):
1222
"""Not applicable tests have their log deleted"""
1224
class LogTester(tests.TestCase):
1226
def test_not_applicable(self):
1227
self.log('this will be removed\n')
1228
raise tests.TestNotApplicable()
1231
runner = tests.TextTestRunner(stream=sio)
1232
test = LogTester('test_not_applicable')
1233
result = self.run_test_runner(runner, test)
1235
self.assertLogDeleted(test)
1237
def test_known_failure_log_deleted(self):
1238
"""Know failure tests have their log deleted"""
1240
class LogTester(tests.TestCase):
1242
def test_known_failure(self):
1243
self.log('this will be removed\n')
1244
raise tests.KnownFailure()
1247
runner = tests.TextTestRunner(stream=sio)
1248
test = LogTester('test_known_failure')
1249
result = self.run_test_runner(runner, test)
1251
self.assertLogDeleted(test)
1253
def test_fail_log_kept(self):
1254
"""Failed tests have their log kept"""
1256
class LogTester(tests.TestCase):
1258
def test_fail(self):
1259
self.log('this will be kept\n')
1260
self.fail('this test fails')
1263
runner = tests.TextTestRunner(stream=sio)
1264
test = LogTester('test_fail')
1265
result = self.run_test_runner(runner, test)
1267
text = sio.getvalue()
1268
self.assertContainsRe(text, 'this will be kept')
1269
self.assertContainsRe(text, 'this test fails')
1271
log = test._get_log()
1272
self.assertContainsRe(log, 'this will be kept')
1273
self.assertEqual(log, test._log_contents)
1275
def test_error_log_kept(self):
1276
"""Tests with errors have their log kept"""
1278
class LogTester(tests.TestCase):
1280
def test_error(self):
1281
self.log('this will be kept\n')
1282
raise ValueError('random exception raised')
1285
runner = tests.TextTestRunner(stream=sio)
1286
test = LogTester('test_error')
1287
result = self.run_test_runner(runner, test)
1289
text = sio.getvalue()
1290
self.assertContainsRe(text, 'this will be kept')
1291
self.assertContainsRe(text, 'random exception raised')
1293
log = test._get_log()
1294
self.assertContainsRe(log, 'this will be kept')
1295
self.assertEqual(log, test._log_contents)
1216
1297
def test_startTestRun(self):
1217
1298
"""run should call result.startTestRun()"""
1463
1547
"""Self.knownFailure() should raise a KnownFailure exception."""
1464
1548
self.assertRaises(tests.KnownFailure, self.knownFailure, "A Failure")
1466
def test_open_bzrdir_safe_roots(self):
1467
# even a memory transport should fail to open when its url isn't
1469
# Manually set one up (TestCase doesn't and shouldn't provide magic
1471
transport_server = memory.MemoryServer()
1472
transport_server.start_server()
1473
self.addCleanup(transport_server.stop_server)
1474
t = transport.get_transport(transport_server.get_url())
1475
bzrdir.BzrDir.create(t.base)
1476
self.assertRaises(errors.BzrError,
1477
bzrdir.BzrDir.open_from_transport, t)
1478
# But if we declare this as safe, we can open the bzrdir.
1479
self.permit_url(t.base)
1480
self._bzr_selftest_roots.append(t.base)
1481
bzrdir.BzrDir.open_from_transport(t)
1483
1550
def test_requireFeature_available(self):
1484
1551
"""self.requireFeature(available) is a no-op."""
1485
1552
class Available(tests.Feature):
1547
1612
self.calls.append(('addNotSupported', test, feature))
1548
1613
result = InstrumentedTestResult()
1549
1614
test.run(result)
1550
case = result.calls[0][1]
1551
1615
self.assertEqual([
1552
('startTest', case),
1553
('addNotSupported', case, the_feature),
1616
('startTest', test),
1617
('addNotSupported', test, the_feature),
1558
def test_start_server_registers_url(self):
1559
transport_server = memory.MemoryServer()
1560
# A little strict, but unlikely to be changed soon.
1561
self.assertEqual([], self._bzr_selftest_roots)
1562
self.start_server(transport_server)
1563
self.assertSubset([transport_server.get_url()],
1564
self._bzr_selftest_roots)
1566
1622
def test_assert_list_raises_on_generator(self):
1567
1623
def generator_which_will_raise():
1568
1624
# This will not raise until after the first yield
1618
1674
self.assertRaises(AssertionError,
1619
1675
self.assertListRaises, _TestException, success_generator)
1621
def test_overrideAttr_without_value(self):
1622
self.test_attr = 'original' # Define a test attribute
1623
obj = self # Make 'obj' visible to the embedded test
1624
class Test(tests.TestCase):
1627
tests.TestCase.setUp(self)
1628
self.orig = self.overrideAttr(obj, 'test_attr')
1630
def test_value(self):
1631
self.assertEqual('original', self.orig)
1632
self.assertEqual('original', obj.test_attr)
1633
obj.test_attr = 'modified'
1634
self.assertEqual('modified', obj.test_attr)
1636
test = Test('test_value')
1637
test.run(unittest.TestResult())
1638
self.assertEqual('original', obj.test_attr)
1640
def test_overrideAttr_with_value(self):
1641
self.test_attr = 'original' # Define a test attribute
1642
obj = self # Make 'obj' visible to the embedded test
1643
class Test(tests.TestCase):
1646
tests.TestCase.setUp(self)
1647
self.orig = self.overrideAttr(obj, 'test_attr', new='modified')
1649
def test_value(self):
1650
self.assertEqual('original', self.orig)
1651
self.assertEqual('modified', obj.test_attr)
1653
test = Test('test_value')
1654
test.run(unittest.TestResult())
1655
self.assertEqual('original', obj.test_attr)
1658
1678
# NB: Don't delete this; it's not actually from 0.11!
1659
1679
@deprecated_function(deprecated_in((0, 11, 0)))
1702
1722
self.assertEndsWith('foo', 'oo')
1703
1723
self.assertRaises(AssertionError, self.assertEndsWith, 'o', 'oo')
1705
def test_assertEqualDiff(self):
1706
e = self.assertRaises(AssertionError,
1707
self.assertEqualDiff, '', '\n')
1708
self.assertEquals(str(e),
1709
# Don't blink ! The '+' applies to the second string
1710
'first string is missing a final newline.\n+ \n')
1711
e = self.assertRaises(AssertionError,
1712
self.assertEqualDiff, '\n', '')
1713
self.assertEquals(str(e),
1714
# Don't blink ! The '-' applies to the second string
1715
'second string is missing a final newline.\n- \n')
1718
class TestDeprecations(tests.TestCase):
1720
1725
def test_applyDeprecated_not_deprecated(self):
1721
1726
sample_object = ApplyDeprecatedHelper()
1722
1727
# calling an undeprecated callable raises an assertion
1945
1951
self.assertEqual(transport_server, captured_transport[0])
1947
1953
def test_transport_sftp(self):
1948
self.requireFeature(features.paramiko)
1949
from bzrlib.tests import stub_sftp
1950
self.check_transport_set(stub_sftp.SFTPAbsoluteServer)
1955
import bzrlib.transport.sftp
1956
except errors.ParamikoNotPresent:
1957
raise tests.TestSkipped("Paramiko not present")
1958
self.check_transport_set(bzrlib.transport.sftp.SFTPAbsoluteServer)
1952
1960
def test_transport_memory(self):
1953
self.check_transport_set(memory.MemoryServer)
1961
self.check_transport_set(bzrlib.transport.memory.MemoryServer)
1956
1964
class TestSelftestWithIdList(tests.TestCaseInTempDir, SelfTestHelper):
1983
1991
Attempts to run bzr from inside this class don't actually run it.
1985
We test how run_bzr actually invokes bzr in another location. Here we
1986
only need to test that it passes the right parameters to run_bzr.
1993
We test how run_bzr actually invokes bzr in another location.
1994
Here we only need to test that it is run_bzr passes the right
1995
parameters to run_bzr.
1988
1997
self.argv = list(argv)
1989
1998
self.retcode = retcode
1990
1999
self.encoding = encoding
1991
2000
self.stdin = stdin
1992
2001
self.working_dir = working_dir
1993
return self.retcode, self.out, self.err
2002
return self.out, self.err
1995
2004
def test_run_bzr_error(self):
1996
2005
self.out = "It sure does!\n"
1997
2006
out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=34)
1998
2007
self.assertEqual(['rocks'], self.argv)
1999
2008
self.assertEqual(34, self.retcode)
2000
self.assertEqual('It sure does!\n', out)
2001
self.assertEquals(out, self.out)
2002
self.assertEqual('', err)
2003
self.assertEquals(err, self.err)
2009
self.assertEqual(out, 'It sure does!\n')
2005
2011
def test_run_bzr_error_regexes(self):
2007
2013
self.err = "bzr: ERROR: foobarbaz is not versioned"
2008
2014
out, err = self.run_bzr_error(
2009
["bzr: ERROR: foobarbaz is not versioned"],
2010
['file-id', 'foobarbaz'])
2015
["bzr: ERROR: foobarbaz is not versioned"],
2016
['file-id', 'foobarbaz'])
2012
2018
def test_encoding(self):
2013
2019
"""Test that run_bzr passes encoding to _run_bzr_core"""
2357
2362
self.assertEqual('bzr: interrupted\n', result[1])
2365
class TestKnownFailure(tests.TestCase):
2367
def test_known_failure(self):
2368
"""Check that KnownFailure is defined appropriately."""
2369
# a KnownFailure is an assertion error for compatability with unaware
2371
self.assertIsInstance(tests.KnownFailure(""), AssertionError)
2373
def test_expect_failure(self):
2375
self.expectFailure("Doomed to failure", self.assertTrue, False)
2376
except tests.KnownFailure, e:
2377
self.assertEqual('Doomed to failure', e.args[0])
2379
self.expectFailure("Doomed to failure", self.assertTrue, True)
2380
except AssertionError, e:
2381
self.assertEqual('Unexpected success. Should have failed:'
2382
' Doomed to failure', e.args[0])
2384
self.fail('Assertion not raised')
2360
2387
class TestFeature(tests.TestCase):
2362
2389
def test_caching(self):
2398
2425
self.assertIs(feature, exception.args[0])
2401
simple_thunk_feature = tests._CompatabilityThunkFeature(
2402
deprecated_in((2, 1, 0)),
2403
'bzrlib.tests.test_selftest',
2404
'simple_thunk_feature','UnicodeFilename',
2405
replacement_module='bzrlib.tests'
2408
class Test_CompatibilityFeature(tests.TestCase):
2410
def test_does_thunk(self):
2411
res = self.callDeprecated(
2412
['bzrlib.tests.test_selftest.simple_thunk_feature was deprecated'
2413
' in version 2.1.0. Use bzrlib.tests.UnicodeFilename instead.'],
2414
simple_thunk_feature.available)
2415
self.assertEqual(tests.UnicodeFilename.available(), res)
2418
class TestModuleAvailableFeature(tests.TestCase):
2420
def test_available_module(self):
2421
feature = tests.ModuleAvailableFeature('bzrlib.tests')
2422
self.assertEqual('bzrlib.tests', feature.module_name)
2423
self.assertEqual('bzrlib.tests', str(feature))
2424
self.assertTrue(feature.available())
2425
self.assertIs(tests, feature.module)
2427
def test_unavailable_module(self):
2428
feature = tests.ModuleAvailableFeature('bzrlib.no_such_module_exists')
2429
self.assertEqual('bzrlib.no_such_module_exists', str(feature))
2430
self.assertFalse(feature.available())
2431
self.assertIs(None, feature.module)
2434
2428
class TestSelftestFiltering(tests.TestCase):
2436
2430
def setUp(self):
2615
2609
# the test framework
2616
2610
self.assertEquals('always fails', str(e))
2617
2611
# check that there's no traceback in the test log
2618
self.assertNotContainsRe(self.get_log(), r'Traceback')
2612
self.assertNotContainsRe(self._get_log(keep_log_file=True),
2620
2615
def test_run_bzr_user_error_caught(self):
2621
2616
# Running bzr in blackbox mode, normal/expected/user errors should be
2622
2617
# caught in the regular way and turned into an error message plus exit
2624
transport_server = memory.MemoryServer()
2625
transport_server.start_server()
2626
self.addCleanup(transport_server.stop_server)
2627
url = transport_server.get_url()
2628
self.permit_url(url)
2629
out, err = self.run_bzr(["log", "%s/nonexistantpath" % url], retcode=3)
2619
out, err = self.run_bzr(["log", "/nonexistantpath"], retcode=3)
2630
2620
self.assertEqual(out, '')
2631
2621
self.assertContainsRe(err,
2632
2622
'bzr: ERROR: Not a branch: ".*nonexistantpath/".\n')
2789
2775
# test doubles that supply a few sample tests to load, and check they
2792
def testmod_names():
2778
def _test_suite_testmod_names():
2793
2779
calls.append("testmod_names")
2795
2781
'bzrlib.tests.blackbox.test_branch',
2796
2782
'bzrlib.tests.per_transport',
2797
2783
'bzrlib.tests.test_selftest',
2799
self.overrideAttr(tests, '_test_suite_testmod_names', testmod_names)
2785
original_testmod_names = tests._test_suite_testmod_names
2786
def _test_suite_modules_to_doctest():
2801
2787
calls.append("modules_to_doctest")
2804
2788
return ['bzrlib.timestamp']
2805
self.overrideAttr(tests, '_test_suite_modules_to_doctest', doctests)
2789
orig_modules_to_doctest = tests._test_suite_modules_to_doctest
2790
def restore_names():
2791
tests._test_suite_testmod_names = original_testmod_names
2792
tests._test_suite_modules_to_doctest = orig_modules_to_doctest
2793
self.addCleanup(restore_names)
2794
tests._test_suite_testmod_names = _test_suite_testmod_names
2795
tests._test_suite_modules_to_doctest = _test_suite_modules_to_doctest
2806
2796
expected_test_list = [
2807
2797
# testmod_names
2808
2798
'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
2809
2799
('bzrlib.tests.per_transport.TransportTests'
2810
'.test_abspath(LocalTransport,LocalURLServer)'),
2800
'.test_abspath(LocalURLServer)'),
2811
2801
'bzrlib.tests.test_selftest.TestTestSuite.test_test_suite',
2802
# modules_to_doctest
2803
'bzrlib.timestamp.format_highres_date',
2812
2804
# plugins can't be tested that way since selftest may be run with
2815
if __doc__ is not None:
2816
expected_test_list.extend([
2817
# modules_to_doctest
2818
'bzrlib.timestamp.format_highres_date',
2820
2807
suite = tests.test_suite()
2821
2808
self.assertEqual(set(["testmod_names", "modules_to_doctest"]),