275
268
"""Tests for the test adaption facilities."""
277
270
def test_apply_scenario(self):
278
from breezy.tests import apply_scenario
271
from brzlib.tests import apply_scenario
279
272
input_test = TestTestScenarioApplication("test_apply_scenario")
280
273
# setup two adapted tests
281
274
adapted_test1 = apply_scenario(input_test,
283
{"bzrdir_format": "bzr_format",
284
"repository_format": "repo_fmt",
285
"transport_server": "transport_server",
286
"transport_readonly_server": "readonly-server"}))
276
{"bzrdir_format":"bzr_format",
277
"repository_format":"repo_fmt",
278
"transport_server":"transport_server",
279
"transport_readonly_server":"readonly-server"}))
287
280
adapted_test2 = apply_scenario(input_test,
288
("new id 2", {"bzrdir_format": None}))
281
("new id 2", {"bzrdir_format":None}))
289
282
# input_test should have been altered.
290
283
self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
291
284
# the new tests are mutually incompatible, ensuring it has
338
331
def test_scenarios(self):
339
332
# check that constructor parameters are passed through to the adapted
341
from .per_workingtree import make_scenarios
334
from brzlib.tests.per_workingtree import make_scenarios
344
337
formats = [workingtree_4.WorkingTreeFormat4(),
345
338
workingtree_3.WorkingTreeFormat3(),
346
339
workingtree_4.WorkingTreeFormat6()]
347
340
scenarios = make_scenarios(server1, server2, formats,
348
remote_server='c', remote_readonly_server='d',
349
remote_backing_server='e')
341
remote_server='c', remote_readonly_server='d',
342
remote_backing_server='e')
350
343
self.assertEqual([
351
344
('WorkingTreeFormat4',
352
{'bzrdir_format': formats[0]._matchingcontroldir,
345
{'bzrdir_format': formats[0]._matchingbzrdir,
353
346
'transport_readonly_server': 'b',
354
347
'transport_server': 'a',
355
348
'workingtree_format': formats[0]}),
356
349
('WorkingTreeFormat3',
357
{'bzrdir_format': formats[1]._matchingcontroldir,
350
{'bzrdir_format': formats[1]._matchingbzrdir,
358
351
'transport_readonly_server': 'b',
359
352
'transport_server': 'a',
360
353
'workingtree_format': formats[1]}),
361
354
('WorkingTreeFormat6',
362
{'bzrdir_format': formats[2]._matchingcontroldir,
355
{'bzrdir_format': formats[2]._matchingbzrdir,
363
356
'transport_readonly_server': 'b',
364
357
'transport_server': 'a',
365
358
'workingtree_format': formats[2]}),
366
359
('WorkingTreeFormat6,remote',
367
{'bzrdir_format': formats[2]._matchingcontroldir,
360
{'bzrdir_format': formats[2]._matchingbzrdir,
368
361
'repo_is_remote': True,
369
362
'transport_readonly_server': 'd',
370
363
'transport_server': 'c',
399
392
smart_readonly_server = test_server.ReadonlySmartTCPServer_for_testing
400
393
mem_server = memory.MemoryServer
401
394
formats = [workingtree_4.WorkingTreeFormat4(),
402
workingtree_3.WorkingTreeFormat3(), ]
395
workingtree_3.WorkingTreeFormat3(),]
403
396
scenarios = make_scenarios(server1, server2, formats)
404
self.assertEqual(9, len(scenarios))
397
self.assertEqual(8, len(scenarios))
405
398
default_wt_format = workingtree.format_registry.get_default()
406
399
wt4_format = workingtree_4.WorkingTreeFormat4()
407
400
wt5_format = workingtree_4.WorkingTreeFormat5()
408
401
wt6_format = workingtree_4.WorkingTreeFormat6()
409
git_wt_format = git_workingtree.GitWorkingTreeFormat()
410
402
expected_scenarios = [
411
403
('WorkingTreeFormat4',
412
{'bzrdir_format': formats[0]._matchingcontroldir,
404
{'bzrdir_format': formats[0]._matchingbzrdir,
413
405
'transport_readonly_server': 'b',
414
406
'transport_server': 'a',
415
407
'workingtree_format': formats[0],
416
408
'_workingtree_to_test_tree': return_parameter,
418
410
('WorkingTreeFormat3',
419
{'bzrdir_format': formats[1]._matchingcontroldir,
411
{'bzrdir_format': formats[1]._matchingbzrdir,
420
412
'transport_readonly_server': 'b',
421
413
'transport_server': 'a',
422
414
'workingtree_format': formats[1],
423
415
'_workingtree_to_test_tree': return_parameter,
425
417
('WorkingTreeFormat6,remote',
426
{'bzrdir_format': wt6_format._matchingcontroldir,
418
{'bzrdir_format': wt6_format._matchingbzrdir,
427
419
'repo_is_remote': True,
428
420
'transport_readonly_server': smart_readonly_server,
429
421
'transport_server': smart_server,
430
422
'vfs_transport_factory': mem_server,
431
423
'workingtree_format': wt6_format,
432
424
'_workingtree_to_test_tree': return_parameter,
435
427
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
436
'bzrdir_format': default_wt_format._matchingcontroldir,
428
'bzrdir_format': default_wt_format._matchingbzrdir,
437
429
'transport_readonly_server': 'b',
438
430
'transport_server': 'a',
439
431
'workingtree_format': default_wt_format,
442
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
443
'bzrdir_format': git_wt_format._matchingcontroldir,
444
'transport_readonly_server': 'b',
445
'transport_server': 'a',
446
'workingtree_format': git_wt_format,
449
433
('DirStateRevisionTree,WT4',
450
434
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
451
'bzrdir_format': wt4_format._matchingcontroldir,
435
'bzrdir_format': wt4_format._matchingbzrdir,
452
436
'transport_readonly_server': 'b',
453
437
'transport_server': 'a',
454
438
'workingtree_format': wt4_format,
456
440
('DirStateRevisionTree,WT5',
457
441
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
458
'bzrdir_format': wt5_format._matchingcontroldir,
442
'bzrdir_format': wt5_format._matchingbzrdir,
459
443
'transport_readonly_server': 'b',
460
444
'transport_server': 'a',
461
445
'workingtree_format': wt5_format,
464
448
{'_workingtree_to_test_tree': preview_tree_pre,
465
'bzrdir_format': default_wt_format._matchingcontroldir,
449
'bzrdir_format': default_wt_format._matchingbzrdir,
466
450
'transport_readonly_server': 'b',
467
451
'transport_server': 'a',
468
452
'workingtree_format': default_wt_format}),
469
453
('PreviewTreePost',
470
454
{'_workingtree_to_test_tree': preview_tree_post,
471
'bzrdir_format': default_wt_format._matchingcontroldir,
455
'bzrdir_format': default_wt_format._matchingbzrdir,
472
456
'transport_readonly_server': 'b',
473
457
'transport_server': 'a',
474
458
'workingtree_format': default_wt_format}),
476
460
self.assertEqual(expected_scenarios, scenarios)
504
488
format1 = WorkingTreeFormat4()
505
489
format2 = WorkingTreeFormat3()
506
490
formats = [("1", str, format1, format2, "converter1"),
507
("2", int, format2, format1, "converter2")]
491
("2", int, format2, format1, "converter2")]
508
492
scenarios = make_scenarios(server1, server2, formats)
509
493
self.assertEqual(2, len(scenarios))
510
494
expected_scenarios = [
512
"bzrdir_format": format1._matchingcontroldir,
496
"bzrdir_format": format1._matchingbzrdir,
513
497
"intertree_class": formats[0][1],
514
498
"workingtree_format": formats[0][2],
515
499
"workingtree_format_to": formats[0][3],
541
525
self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
543
527
def test_assertEqualStat_equal(self):
544
from .test_dirstate import _FakeStat
528
from brzlib.tests.test_dirstate import _FakeStat
545
529
self.build_tree(["foo"])
546
530
real = os.lstat("foo")
547
531
fake = _FakeStat(real.st_size, real.st_mtime, real.st_ctime,
548
real.st_dev, real.st_ino, real.st_mode)
532
real.st_dev, real.st_ino, real.st_mode)
549
533
self.assertEqualStat(real, fake)
551
535
def test_assertEqualStat_notequal(self):
552
536
self.build_tree(["foo", "longname"])
553
537
self.assertRaises(AssertionError, self.assertEqualStat,
554
os.lstat("foo"), os.lstat("longname"))
538
os.lstat("foo"), os.lstat("longname"))
540
def test_failUnlessExists(self):
541
"""Deprecated failUnlessExists and failIfExists"""
542
self.applyDeprecated(
543
deprecated_in((2, 4)),
544
self.failUnlessExists, '.')
545
self.build_tree(['foo/', 'foo/bar'])
546
self.applyDeprecated(
547
deprecated_in((2, 4)),
548
self.failUnlessExists, 'foo/bar')
549
self.applyDeprecated(
550
deprecated_in((2, 4)),
551
self.failIfExists, 'foo/foo')
556
553
def test_assertPathExists(self):
557
554
self.assertPathExists('.')
836
832
# this should appear in the output stream of our test result.
837
833
output = result_stream.getvalue()
838
834
self.assertContainsRe(output,
839
r"LSProf output for <class 'str'>\(\(b'hello',\), {'errors': 'replace'}\)")
840
self.assertContainsRe(output,
841
r"LSProf output for <class 'str'>\(\(b'world',\), {'errors': 'replace'}\)")
842
self.assertContainsRe(output,
843
r" *CallCount *Recursive *Total\(ms\) *Inline\(ms\) *module:lineno\(function\)\n")
844
self.assertContainsRe(output,
845
r"( +1 +0 +0\.\d+ +0\.\d+ +<method 'disable' of '_lsprof\.Profiler' objects>\n)?")
835
r"LSProf output for <type 'unicode'>\(\('hello',\), {'errors': 'replace'}\)")
836
self.assertContainsRe(output,
837
r" *CallCount *Recursive *Total\(ms\) *Inline\(ms\) *module:lineno\(function\)\n")
838
self.assertContainsRe(output,
839
r"( +1 +0 +0\.\d+ +0\.\d+ +<method 'disable' of '_lsprof\.Profiler' objects>\n)?")
840
self.assertContainsRe(output,
841
r"LSProf output for <type 'unicode'>\(\('world',\), {'errors': 'replace'}\)\n")
847
843
def test_uses_time_from_testtools(self):
848
844
"""Test case timings in verbose results should use testtools times"""
851
846
class TimeAddedVerboseTestResult(tests.VerboseTestResult):
852
847
def startTest(self, test):
853
848
self.time(datetime.datetime.utcfromtimestamp(1.145))
854
849
super(TimeAddedVerboseTestResult, self).startTest(test)
856
850
def addSuccess(self, test):
857
851
self.time(datetime.datetime.utcfromtimestamp(51.147))
858
852
super(TimeAddedVerboseTestResult, self).addSuccess(test)
860
853
def report_tests_starting(self): pass
862
855
self.get_passing_test().run(TimeAddedVerboseTestResult(sio, 0, 2))
1067
1048
self.expectFailure('failed', self.assertTrue, False)
1068
1049
test = unittest.TestSuite()
1069
1050
test.addTest(Test("known_failure_test"))
1071
1051
def failing_test():
1072
1052
raise AssertionError('foo')
1073
1053
test.addTest(unittest.FunctionTestCase(failing_test))
1074
1054
stream = StringIO()
1075
1055
runner = tests.TextTestRunner(stream=stream)
1076
self.run_test_runner(runner, test)
1077
self.assertContainsRe(
1056
result = self.run_test_runner(runner, test)
1057
lines = stream.getvalue().splitlines()
1058
self.assertContainsRe(stream.getvalue(),
1079
1059
'(?sm)^brz selftest.*$'
1081
1061
'^======================================================================\n'
1082
1062
'^FAIL: failing_test\n'
1083
1063
'^----------------------------------------------------------------------\n'
1084
1064
'Traceback \\(most recent call last\\):\n'
1085
' .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1065
' .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1086
1066
' raise AssertionError\\(\'foo\'\\)\n'
1088
1068
'^----------------------------------------------------------------------\n'
1099
1079
test = Test("known_failure_test")
1100
1080
stream = StringIO()
1101
1081
runner = tests.TextTestRunner(stream=stream)
1102
self.run_test_runner(runner, test)
1082
result = self.run_test_runner(runner, test)
1103
1083
self.assertContainsRe(stream.getvalue(),
1106
'Ran 1 test in .*\n'
1108
'OK \\(known_failures=1\\)\n')
1086
'Ran 1 test in .*\n'
1088
'OK \\(known_failures=1\\)\n')
1110
1090
def test_unexpected_success_bad(self):
1111
1091
class Test(tests.TestCase):
1112
1092
def test_truth(self):
1113
1093
self.expectFailure("No absolute truth", self.assertTrue, True)
1114
1094
runner = tests.TextTestRunner(stream=StringIO())
1115
self.run_test_runner(runner, Test("test_truth"))
1095
result = self.run_test_runner(runner, Test("test_truth"))
1116
1096
self.assertContainsRe(runner.stream.getvalue(),
1118
"FAIL: \\S+\\.test_truth\n"
1121
"\\s*(?:Text attachment: )?reason"
1127
"Ran 1 test in .*\n"
1129
"FAILED \\(failures=1\\)\n\\Z")
1098
"FAIL: \\S+\.test_truth\n"
1101
"\\s*(?:Text attachment: )?reason"
1107
"Ran 1 test in .*\n"
1109
"FAILED \\(failures=1\\)\n\\Z")
1131
1111
def test_result_decorator(self):
1132
1112
# decorate results
1135
1114
class LoggingDecorator(ExtendedToOriginalDecorator):
1136
1115
def startTest(self, test):
1137
1116
ExtendedToOriginalDecorator.startTest(self, test)
1138
1117
calls.append('start')
1139
test = unittest.FunctionTestCase(lambda: None)
1118
test = unittest.FunctionTestCase(lambda:None)
1140
1119
stream = StringIO()
1141
1120
runner = tests.TextTestRunner(stream=stream,
1142
result_decorators=[LoggingDecorator])
1143
self.run_test_runner(runner, test)
1121
result_decorators=[LoggingDecorator])
1122
result = self.run_test_runner(runner, test)
1144
1123
self.assertLength(1, calls)
1146
1125
def test_skipped_test(self):
1210
1187
runner = tests.TextTestRunner(stream=out, verbosity=2)
1211
1188
test = Test("not_applicable_test")
1212
1189
result = self.run_test_runner(runner, test)
1213
self.log(out.getvalue())
1190
self._log_file.write(out.getvalue())
1214
1191
self.assertTrue(result.wasSuccessful())
1215
1192
self.assertTrue(result.wasStrictlySuccessful())
1216
1193
self.assertContainsRe(out.getvalue(),
1217
r'(?m)not_applicable_test * N/A')
1194
r'(?m)not_applicable_test * N/A')
1218
1195
self.assertContainsRe(out.getvalue(),
1219
r'(?m)^ this test never runs')
1196
r'(?m)^ this test never runs')
1221
1198
def test_unsupported_features_listed(self):
1222
1199
"""When unsupported features are encountered they are detailed."""
1223
1200
class Feature1(features.Feature):
1201
def _probe(self): return False
1227
1202
class Feature2(features.Feature):
1203
def _probe(self): return False
1230
1204
# create sample tests
1231
1205
test1 = SampleTestCase('_test_pass')
1232
1206
test1._test_needs_features = [Feature1()]
1255
1229
stream = StringIO()
1256
1230
runner = tests.TextTestRunner(stream=stream, verbosity=2)
1257
1231
# Need to use the CountingDecorator as that's what sets num_tests
1258
self.run_test_runner(runner, tests.CountingDecorator(suite))
1232
result = self.run_test_runner(runner, tests.CountingDecorator(suite))
1259
1233
self.assertStartsWith(stream.getvalue(), "running 2 tests")
1261
1235
def test_startTestRun(self):
1262
1236
"""run should call result.startTestRun()"""
1265
1238
class LoggingDecorator(ExtendedToOriginalDecorator):
1266
1239
def startTestRun(self):
1267
1240
ExtendedToOriginalDecorator.startTestRun(self)
1268
1241
calls.append('startTestRun')
1269
test = unittest.FunctionTestCase(lambda: None)
1242
test = unittest.FunctionTestCase(lambda:None)
1270
1243
stream = StringIO()
1271
1244
runner = tests.TextTestRunner(stream=stream,
1272
result_decorators=[LoggingDecorator])
1273
self.run_test_runner(runner, test)
1245
result_decorators=[LoggingDecorator])
1246
result = self.run_test_runner(runner, test)
1274
1247
self.assertLength(1, calls)
1276
1249
def test_stopTestRun(self):
1277
1250
"""run should call result.stopTestRun()"""
1280
1252
class LoggingDecorator(ExtendedToOriginalDecorator):
1281
1253
def stopTestRun(self):
1282
1254
ExtendedToOriginalDecorator.stopTestRun(self)
1283
1255
calls.append('stopTestRun')
1284
test = unittest.FunctionTestCase(lambda: None)
1256
test = unittest.FunctionTestCase(lambda:None)
1285
1257
stream = StringIO()
1286
1258
runner = tests.TextTestRunner(stream=stream,
1287
result_decorators=[LoggingDecorator])
1288
self.run_test_runner(runner, test)
1259
result_decorators=[LoggingDecorator])
1260
result = self.run_test_runner(runner, test)
1289
1261
self.assertLength(1, calls)
1291
1263
def test_unicode_test_output_on_ascii_stream(self):
1379
1345
if self._lock_check_thorough:
1380
1346
flags.add('strict_locks')
1381
self.assertEqual(flags, breezy.debug.debug_flags)
1347
self.assertEqual(flags, brzlib.debug.debug_flags)
1383
1349
def change_selftest_debug_flags(self, new_flags):
1384
1350
self.overrideAttr(tests, 'selftest_debug_flags', set(new_flags))
1386
1352
def test_allow_debug_flag(self):
1387
"""The -Eallow_debug flag prevents breezy.debug.debug_flags from being
1353
"""The -Eallow_debug flag prevents brzlib.debug.debug_flags from being
1388
1354
sanitised (i.e. cleared) before running a test.
1390
self.change_selftest_debug_flags({'allow_debug'})
1391
breezy.debug.debug_flags = {'a-flag'}
1356
self.change_selftest_debug_flags(set(['allow_debug']))
1357
brzlib.debug.debug_flags = set(['a-flag'])
1393
1358
class TestThatRecordsFlags(tests.TestCase):
1394
1359
def test_foo(nested_self):
1395
self.flags = set(breezy.debug.debug_flags)
1360
self.flags = set(brzlib.debug.debug_flags)
1396
1361
test = TestThatRecordsFlags('test_foo')
1397
1362
test.run(self.make_test_result())
1363
flags = set(['a-flag'])
1399
1364
if 'disable_lock_checks' not in tests.selftest_debug_flags:
1400
1365
flags.add('strict_locks')
1401
1366
self.assertEqual(flags, self.flags)
1423
1388
def test_this_fails_strict_lock_check(self):
1424
1389
class TestThatRecordsFlags(tests.TestCase):
1425
1390
def test_foo(nested_self):
1426
self.flags1 = set(breezy.debug.debug_flags)
1391
self.flags1 = set(brzlib.debug.debug_flags)
1427
1392
self.thisFailsStrictLockCheck()
1428
self.flags2 = set(breezy.debug.debug_flags)
1393
self.flags2 = set(brzlib.debug.debug_flags)
1429
1394
# Make sure lock checking is active
1430
1395
self.change_selftest_debug_flags(set())
1431
1396
test = TestThatRecordsFlags('test_foo')
1432
1397
test.run(self.make_test_result())
1433
self.assertEqual({'strict_locks'}, self.flags1)
1398
self.assertEqual(set(['strict_locks']), self.flags1)
1434
1399
self.assertEqual(set(), self.flags2)
1436
1401
def test_debug_flags_restored(self):
1437
"""The breezy debug flags should be restored to their original state
1402
"""The brzlib debug flags should be restored to their original state
1438
1403
after the test was run, even if allow_debug is set.
1440
self.change_selftest_debug_flags({'allow_debug'})
1405
self.change_selftest_debug_flags(set(['allow_debug']))
1441
1406
# Now run a test that modifies debug.debug_flags.
1442
breezy.debug.debug_flags = {'original-state'}
1407
brzlib.debug.debug_flags = set(['original-state'])
1444
1408
class TestThatModifiesFlags(tests.TestCase):
1445
1409
def test_foo(self):
1446
breezy.debug.debug_flags = {'modified'}
1410
brzlib.debug.debug_flags = set(['modified'])
1447
1411
test = TestThatModifiesFlags('test_foo')
1448
1412
test.run(self.make_test_result())
1449
self.assertEqual({'original-state'}, breezy.debug.debug_flags)
1413
self.assertEqual(set(['original-state']), brzlib.debug.debug_flags)
1451
1415
def make_test_result(self):
1452
"""Get a test result that writes to a StringIO."""
1453
return tests.TextTestResult(StringIO(), descriptions=0, verbosity=1)
1416
"""Get a test result that writes to the test log file."""
1417
return tests.TextTestResult(self._log_file, descriptions=0, verbosity=1)
1455
1419
def inner_test(self):
1456
1420
# the inner child test
1504
1468
def test_hooks_sanitised(self):
1505
"""The breezy hooks should be sanitised by setUp."""
1469
"""The brzlib hooks should be sanitised by setUp."""
1506
1470
# Note this test won't fail with hooks that the core library doesn't
1507
1471
# use - but it trigger with a plugin that adds hooks, so its still a
1508
1472
# useful warning in that case.
1509
self.assertEqual(breezy.branch.BranchHooks(),
1510
breezy.branch.Branch.hooks)
1512
breezy.bzr.smart.server.SmartServerHooks(),
1513
breezy.bzr.smart.server.SmartTCPServer.hooks)
1515
breezy.commands.CommandHooks(), breezy.commands.Command.hooks)
1473
self.assertEqual(brzlib.branch.BranchHooks(), brzlib.branch.Branch.hooks)
1475
brzlib.smart.server.SmartServerHooks(),
1476
brzlib.smart.server.SmartTCPServer.hooks)
1478
brzlib.commands.CommandHooks(), brzlib.commands.Command.hooks)
1517
1480
def test__gather_lsprof_in_benchmarks(self):
1518
1481
"""When _gather_lsprof_in_benchmarks is on, accumulate profile data.
1605
1564
def test_run_disabled_supporting_result(self):
1606
1565
"""Test disabled tests behaviour with support aware results."""
1607
1566
test = SampleTestCase('_test_pass')
1609
1567
class DisabledFeature(object):
1610
1568
def __eq__(self, other):
1611
1569
return isinstance(other, DisabledFeature)
1613
1570
def available(self):
1615
1572
the_feature = DisabledFeature()
1616
1573
test._test_needs_features = [the_feature]
1618
1574
class InstrumentedTestResult(unittest.TestResult):
1619
1575
def __init__(self):
1620
1576
unittest.TestResult.__init__(self)
1621
1577
self.calls = []
1623
1578
def startTest(self, test):
1624
1579
self.calls.append(('startTest', test))
1626
1580
def stopTest(self, test):
1627
1581
self.calls.append(('stopTest', test))
1629
1582
def addNotSupported(self, test, feature):
1630
1583
self.calls.append(('addNotSupported', test, feature))
1631
1584
result = InstrumentedTestResult()
1966
1908
class TestExtraAssertions(tests.TestCase):
1967
"""Tests for new test assertions in breezy test suite"""
1909
"""Tests for new test assertions in brzlib test suite"""
1969
1911
def test_assert_isinstance(self):
1970
1912
self.assertIsInstance(2, int)
1971
self.assertIsInstance(u'', str)
1913
self.assertIsInstance(u'', basestring)
1972
1914
e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1975
["None is an instance of <type 'NoneType'> rather than "
1977
"None is an instance of <class 'NoneType'> rather than "
1915
self.assertEqual(str(e),
1916
"None is an instance of <type 'NoneType'> rather than <type 'int'>")
1979
1917
self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1980
1918
e = self.assertRaises(AssertionError,
1981
self.assertIsInstance, None, int,
1985
"None is an instance of <class 'NoneType'> rather "
1986
"than <class 'int'>: it's just not")
1919
self.assertIsInstance, None, int, "it's just not")
1920
self.assertEqual(str(e),
1921
"None is an instance of <type 'NoneType'> rather than <type 'int'>"
1988
1924
def test_assertEndsWith(self):
1989
1925
self.assertEndsWith('foo', 'oo')
2008
1944
sample_object = ApplyDeprecatedHelper()
2009
1945
# calling an undeprecated callable raises an assertion
2010
1946
self.assertRaises(AssertionError, self.applyDeprecated,
2011
deprecated_in((0, 11, 0)),
2012
sample_object.sample_normal_method)
1947
deprecated_in((0, 11, 0)),
1948
sample_object.sample_normal_method)
2013
1949
self.assertRaises(AssertionError, self.applyDeprecated,
2014
deprecated_in((0, 11, 0)),
2015
sample_undeprecated_function, "a param value")
1950
deprecated_in((0, 11, 0)),
1951
sample_undeprecated_function, "a param value")
2016
1952
# calling a deprecated callable (function or method) with the wrong
2017
1953
# expected deprecation fails.
2018
1954
self.assertRaises(AssertionError, self.applyDeprecated,
2019
deprecated_in((0, 10, 0)),
2020
sample_object.sample_deprecated_method,
1955
deprecated_in((0, 10, 0)),
1956
sample_object.sample_deprecated_method, "a param value")
2022
1957
self.assertRaises(AssertionError, self.applyDeprecated,
2023
deprecated_in((0, 10, 0)),
2024
sample_deprecated_function)
1958
deprecated_in((0, 10, 0)),
1959
sample_deprecated_function)
2025
1960
# calling a deprecated callable (function or method) with the right
2026
1961
# expected deprecation returns the functions result.
2029
self.applyDeprecated(
2030
deprecated_in((0, 11, 0)),
2031
sample_object.sample_deprecated_method, "a param value"))
1962
self.assertEqual("a param value",
1963
self.applyDeprecated(deprecated_in((0, 11, 0)),
1964
sample_object.sample_deprecated_method, "a param value"))
2032
1965
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 11, 0)),
2033
sample_deprecated_function))
1966
sample_deprecated_function))
2034
1967
# calling a nested deprecation with the wrong deprecation version
2035
1968
# fails even if a deeper nested function was deprecated with the
2036
1969
# supplied version.
2038
AssertionError, self.applyDeprecated,
1970
self.assertRaises(AssertionError, self.applyDeprecated,
2039
1971
deprecated_in((0, 11, 0)), sample_object.sample_nested_deprecation)
2040
1972
# calling a nested deprecation with the right deprecation value
2041
1973
# returns the calls result.
2043
2, self.applyDeprecated(
2044
deprecated_in((0, 10, 0)),
2045
sample_object.sample_nested_deprecation))
1974
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 10, 0)),
1975
sample_object.sample_nested_deprecation))
2047
1977
def test_callDeprecated(self):
2048
1978
def testfunc(be_deprecated, result=None):
2097
2026
self.transport_server = test_server.FakeVFATServer
2098
2027
self.assertFalse(self.get_url('t1').startswith('file://'))
2099
2028
tree = self.make_branch_and_tree('t1')
2100
base = tree.controldir.root_transport.base
2029
base = tree.bzrdir.root_transport.base
2101
2030
self.assertStartsWith(base, 'file://')
2102
self.assertEqual(tree.controldir.root_transport,
2103
tree.branch.controldir.root_transport)
2104
self.assertEqual(tree.controldir.root_transport,
2105
tree.branch.repository.controldir.root_transport)
2031
self.assertEqual(tree.bzrdir.root_transport,
2032
tree.branch.bzrdir.root_transport)
2033
self.assertEqual(tree.bzrdir.root_transport,
2034
tree.branch.repository.bzrdir.root_transport)
2108
2037
class SelfTestHelper(object):
2110
2039
def run_selftest(self, **kwargs):
2111
2040
"""Run selftest returning its output."""
2113
output = TextIOWrapper(bio, 'utf-8')
2114
old_transport = breezy.tests.default_transport
2042
old_transport = brzlib.tests.default_transport
2115
2043
old_root = tests.TestCaseWithMemoryTransport.TEST_ROOT
2116
2044
tests.TestCaseWithMemoryTransport.TEST_ROOT = None
2118
2046
self.assertEqual(True, tests.selftest(stream=output, **kwargs))
2120
breezy.tests.default_transport = old_transport
2048
brzlib.tests.default_transport = old_transport
2121
2049
tests.TestCaseWithMemoryTransport.TEST_ROOT = old_root
2128
2054
class TestSelftest(tests.TestCase, SelfTestHelper):
2129
"""Tests of breezy.tests.selftest."""
2055
"""Tests of brzlib.tests.selftest."""
2131
def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(
2057
def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(self):
2133
2058
factory_called = []
2136
2060
factory_called.append(True)
2137
2061
return TestUtil.TestSuite()
2138
2062
out = StringIO()
2139
2063
err = StringIO()
2140
self.apply_redirected(out, err, None, breezy.tests.selftest,
2141
test_suite_factory=factory)
2064
self.apply_redirected(out, err, None, brzlib.tests.selftest,
2065
test_suite_factory=factory)
2142
2066
self.assertEqual([True], factory_called)
2144
2068
def factory(self):
2145
2069
"""A test suite factory."""
2146
2070
class Test(tests.TestCase):
2148
return __name__ + ".Test." + self._testMethodName
2158
2077
return TestUtil.TestSuite([Test("a"), Test("b"), Test("c")])
2160
2079
def test_list_only(self):
2161
2080
output = self.run_selftest(test_suite_factory=self.factory,
2163
2082
self.assertEqual(3, len(output.readlines()))
2165
2084
def test_list_only_filtered(self):
2166
2085
output = self.run_selftest(test_suite_factory=self.factory,
2167
list_only=True, pattern="Test.b")
2168
self.assertEndsWith(output.getvalue(), b"Test.b\n")
2086
list_only=True, pattern="Test.b")
2087
self.assertEndsWith(output.getvalue(), "Test.b\n")
2169
2088
self.assertLength(1, output.readlines())
2171
2090
def test_list_only_excludes(self):
2172
2091
output = self.run_selftest(test_suite_factory=self.factory,
2173
list_only=True, exclude_pattern="Test.b")
2174
self.assertNotContainsRe(b"Test.b", output.getvalue())
2092
list_only=True, exclude_pattern="Test.b")
2093
self.assertNotContainsRe("Test.b", output.getvalue())
2175
2094
self.assertLength(2, output.readlines())
2177
2096
def test_lsprof_tests(self):
2178
2097
self.requireFeature(features.lsprof_feature)
2181
2099
class Test(object):
2182
2100
def __call__(test, result):
2183
2101
test.run(result)
2185
2102
def run(test, result):
2186
2103
results.append(result)
2188
2104
def countTestCases(self):
2190
2106
self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
2205
2121
def test_random_reuse_is_same_order(self):
2206
2122
# test randomising by listing a number of tests.
2207
2123
expected = self.run_selftest(test_suite_factory=self.factory,
2208
list_only=True, random_seed="123")
2124
list_only=True, random_seed="123")
2209
2125
repeated = self.run_selftest(test_suite_factory=self.factory,
2210
list_only=True, random_seed="123")
2126
list_only=True, random_seed="123")
2211
2127
self.assertEqual(expected.getvalue(), repeated.getvalue())
2213
2129
def test_runner_class(self):
2214
2130
self.requireFeature(features.subunit)
2215
2131
from subunit import ProtocolTestCase
2216
stream = self.run_selftest(
2217
runner_class=tests.SubUnitBzrRunnerv1,
2132
stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
2218
2133
test_suite_factory=self.factory)
2219
2134
test = ProtocolTestCase(stream)
2220
2135
result = unittest.TestResult()
2224
2139
def test_starting_with_single_argument(self):
2225
2140
output = self.run_selftest(test_suite_factory=self.factory,
2227
'breezy.tests.test_selftest.Test.a'],
2229
self.assertEqual(b'breezy.tests.test_selftest.Test.a\n',
2141
starting_with=['brzlib.tests.test_selftest.Test.a'],
2143
self.assertEqual('brzlib.tests.test_selftest.Test.a\n',
2232
2146
def test_starting_with_multiple_argument(self):
2233
output = self.run_selftest(
2234
test_suite_factory=self.factory,
2235
starting_with=['breezy.tests.test_selftest.Test.a',
2236
'breezy.tests.test_selftest.Test.b'],
2147
output = self.run_selftest(test_suite_factory=self.factory,
2148
starting_with=['brzlib.tests.test_selftest.Test.a',
2149
'brzlib.tests.test_selftest.Test.b'],
2237
2150
list_only=True)
2238
self.assertEqual(b'breezy.tests.test_selftest.Test.a\n'
2239
b'breezy.tests.test_selftest.Test.b\n',
2151
self.assertEqual('brzlib.tests.test_selftest.Test.a\n'
2152
'brzlib.tests.test_selftest.Test.b\n',
2242
2155
def check_transport_set(self, transport_server):
2243
2156
captured_transport = []
2245
2157
def seen_transport(a_transport):
2246
2158
captured_transport.append(a_transport)
2248
2159
class Capture(tests.TestCase):
2250
seen_transport(breezy.tests.default_transport)
2161
seen_transport(brzlib.tests.default_transport)
2253
2163
return TestUtil.TestSuite([Capture("a")])
2254
self.run_selftest(transport=transport_server,
2255
test_suite_factory=factory)
2164
self.run_selftest(transport=transport_server, test_suite_factory=factory)
2256
2165
self.assertEqual(transport_server, captured_transport[0])
2258
2167
def test_transport_sftp(self):
2259
2168
self.requireFeature(features.paramiko)
2260
from breezy.tests import stub_sftp
2169
from brzlib.tests import stub_sftp
2261
2170
self.check_transport_set(stub_sftp.SFTPAbsoluteServer)
2263
2172
def test_transport_memory(self):
2303
2210
def test_fail_has_log(self):
2304
2211
content, result = self.run_subunit_stream('test_fail')
2305
2212
self.assertEqual(1, len(result.failures))
2306
self.assertContainsRe(content, b'(?m)^log$')
2307
self.assertContainsRe(content, b'this test will fail')
2213
self.assertContainsRe(content, '(?m)^log$')
2214
self.assertContainsRe(content, 'this test will fail')
2309
2216
def test_error_has_log(self):
2310
2217
content, result = self.run_subunit_stream('test_error')
2311
self.assertContainsRe(content, b'(?m)^log$')
2312
self.assertContainsRe(content, b'this test errored')
2218
self.assertContainsRe(content, '(?m)^log$')
2219
self.assertContainsRe(content, 'this test errored')
2314
2221
def test_skip_has_no_log(self):
2315
2222
content, result = self.run_subunit_stream('test_skip')
2316
self.assertNotContainsRe(content, b'(?m)^log$')
2317
self.assertNotContainsRe(content, b'this test will be skipped')
2318
reasons = result.skip_reasons
2319
self.assertEqual({'reason'}, set(reasons))
2320
skips = reasons['reason']
2223
self.assertNotContainsRe(content, '(?m)^log$')
2224
self.assertNotContainsRe(content, 'this test will be skipped')
2225
self.assertEqual(['reason'], result.skip_reasons.keys())
2226
skips = result.skip_reasons['reason']
2321
2227
self.assertEqual(1, len(skips))
2323
2229
# RemotedTestCase doesn't preserve the "details"
2324
# self.assertFalse('log' in test.getDetails())
2230
## self.assertFalse('log' in test.getDetails())
2326
2232
def test_missing_feature_has_no_log(self):
2327
2233
content, result = self.run_subunit_stream('test_missing_feature')
2328
self.assertNotContainsRe(content, b'(?m)^log$')
2329
self.assertNotContainsRe(content, b'missing the feature')
2330
reasons = result.skip_reasons
2331
self.assertEqual({'_MissingFeature\n'}, set(reasons))
2332
skips = reasons['_MissingFeature\n']
2234
self.assertNotContainsRe(content, '(?m)^log$')
2235
self.assertNotContainsRe(content, 'missing the feature')
2236
self.assertEqual(['_MissingFeature\n'], result.skip_reasons.keys())
2237
skips = result.skip_reasons['_MissingFeature\n']
2333
2238
self.assertEqual(1, len(skips))
2335
2240
# RemotedTestCase doesn't preserve the "details"
2336
# self.assertFalse('log' in test.getDetails())
2241
## self.assertFalse('log' in test.getDetails())
2338
2243
def test_xfail_has_no_log(self):
2339
2244
content, result = self.run_subunit_stream('test_xfail')
2340
self.assertNotContainsRe(content, b'(?m)^log$')
2341
self.assertNotContainsRe(content, b'test with expected failure')
2245
self.assertNotContainsRe(content, '(?m)^log$')
2246
self.assertNotContainsRe(content, 'test with expected failure')
2342
2247
self.assertEqual(1, len(result.expectedFailures))
2343
2248
result_content = result.expectedFailures[0][1]
2344
2249
self.assertNotContainsRe(result_content,
2345
'(?m)^(?:Text attachment: )?log(?:$|: )')
2250
'(?m)^(?:Text attachment: )?log(?:$|: )')
2346
2251
self.assertNotContainsRe(result_content, 'test with expected failure')
2348
2253
def test_unexpected_success_has_log(self):
2349
2254
content, result = self.run_subunit_stream('test_unexpected_success')
2350
self.assertContainsRe(content, b'(?m)^log$')
2351
self.assertContainsRe(content, b'test with unexpected success')
2255
self.assertContainsRe(content, '(?m)^log$')
2256
self.assertContainsRe(content, 'test with unexpected success')
2257
# GZ 2011-05-18: Old versions of subunit treat unexpected success as a
2258
# success, if a min version check is added remove this
2259
from subunit import TestProtocolClient as _Client
2260
if _Client.addUnexpectedSuccess.im_func is _Client.addSuccess.im_func:
2261
self.expectFailure('subunit treats "unexpectedSuccess"'
2262
' as a plain success',
2263
self.assertEqual, 1, len(result.unexpectedSuccesses))
2352
2264
self.assertEqual(1, len(result.unexpectedSuccesses))
2353
# test = result.unexpectedSuccesses[0]
2265
test = result.unexpectedSuccesses[0]
2354
2266
# RemotedTestCase doesn't preserve the "details"
2355
# self.assertTrue('log' in test.getDetails())
2267
## self.assertTrue('log' in test.getDetails())
2357
2269
def test_success_has_no_log(self):
2358
2270
content, result = self.run_subunit_stream('test_success')
2359
2271
self.assertEqual(1, result.testsRun)
2360
self.assertNotContainsRe(content, b'(?m)^log$')
2361
self.assertNotContainsRe(content, b'this test succeeds')
2272
self.assertNotContainsRe(content, '(?m)^log$')
2273
self.assertNotContainsRe(content, 'this test succeeds')
2364
2276
class TestRunBzr(tests.TestCase):
2370
def _run_bzr_core(self, argv, encoding=None, stdin=None,
2371
stdout=None, stderr=None, working_dir=None):
2281
def _run_bzr_core(self, argv, retcode=0, encoding=None, stdin=None,
2372
2283
"""Override _run_bzr_core to test how it is invoked by run_bzr.
2374
2285
Attempts to run bzr from inside this class don't actually run it.
2405
2314
def test_encoding(self):
2406
2315
"""Test that run_bzr passes encoding to _run_bzr_core"""
2407
2316
self.run_bzr('foo bar')
2408
self.assertEqual(osutils.get_user_encoding(), self.encoding)
2317
self.assertEqual(None, self.encoding)
2409
2318
self.assertEqual(['foo', 'bar'], self.argv)
2411
2320
self.run_bzr('foo bar', encoding='baz')
2412
2321
self.assertEqual('baz', self.encoding)
2413
2322
self.assertEqual(['foo', 'bar'], self.argv)
2324
def test_retcode(self):
2325
"""Test that run_bzr passes retcode to _run_bzr_core"""
2326
# Default is retcode == 0
2327
self.run_bzr('foo bar')
2328
self.assertEqual(0, self.retcode)
2329
self.assertEqual(['foo', 'bar'], self.argv)
2331
self.run_bzr('foo bar', retcode=1)
2332
self.assertEqual(1, self.retcode)
2333
self.assertEqual(['foo', 'bar'], self.argv)
2335
self.run_bzr('foo bar', retcode=None)
2336
self.assertEqual(None, self.retcode)
2337
self.assertEqual(['foo', 'bar'], self.argv)
2339
self.run_bzr(['foo', 'bar'], retcode=3)
2340
self.assertEqual(3, self.retcode)
2341
self.assertEqual(['foo', 'bar'], self.argv)
2415
2343
def test_stdin(self):
2416
2344
# test that the stdin keyword to run_bzr is passed through to
2417
2345
# _run_bzr_core as-is. We do this by overriding
2548
2475
self.next_subprocess = process
2550
2477
result = self.run_bzr_subprocess(*args, **kwargs)
2551
except BaseException:
2552
2479
self.next_subprocess = None
2553
for key, expected in expected_args.items():
2480
for key, expected in expected_args.iteritems():
2554
2481
self.assertEqual(expected, self.subprocess_calls[-1][key])
2557
2484
self.next_subprocess = None
2558
for key, expected in expected_args.items():
2485
for key, expected in expected_args.iteritems():
2559
2486
self.assertEqual(expected, self.subprocess_calls[-1][key])
2562
2489
def test_run_bzr_subprocess(self):
2563
2490
"""The run_bzr_helper_external command behaves nicely."""
2564
self.assertRunBzrSubprocess({'process_args': ['--version']},
2565
StubProcess(), '--version')
2566
self.assertRunBzrSubprocess({'process_args': ['--version']},
2567
StubProcess(), ['--version'])
2491
self.assertRunBzrSubprocess({'process_args':['--version']},
2492
StubProcess(), '--version')
2493
self.assertRunBzrSubprocess({'process_args':['--version']},
2494
StubProcess(), ['--version'])
2568
2495
# retcode=None disables retcode checking
2569
result = self.assertRunBzrSubprocess(
2570
{}, StubProcess(retcode=3), '--version', retcode=None)
2571
result = self.assertRunBzrSubprocess(
2572
{}, StubProcess(out="is free software"), '--version')
2496
result = self.assertRunBzrSubprocess({},
2497
StubProcess(retcode=3), '--version', retcode=None)
2498
result = self.assertRunBzrSubprocess({},
2499
StubProcess(out="is free software"), '--version')
2573
2500
self.assertContainsRe(result[0], 'is free software')
2574
2501
# Running a subcommand that is missing errors
2575
2502
self.assertRaises(AssertionError, self.assertRunBzrSubprocess,
2576
{'process_args': ['--versionn']
2577
}, StubProcess(retcode=3),
2503
{'process_args':['--versionn']}, StubProcess(retcode=3),
2579
2505
# Unless it is told to expect the error from the subprocess
2580
result = self.assertRunBzrSubprocess(
2581
{}, StubProcess(retcode=3), '--versionn', retcode=3)
2506
result = self.assertRunBzrSubprocess({},
2507
StubProcess(retcode=3), '--versionn', retcode=3)
2582
2508
# Or to ignore retcode checking
2583
result = self.assertRunBzrSubprocess(
2584
{}, StubProcess(err="unknown command", retcode=3),
2585
'--versionn', retcode=None)
2509
result = self.assertRunBzrSubprocess({},
2510
StubProcess(err="unknown command", retcode=3), '--versionn',
2586
2512
self.assertContainsRe(result[1], 'unknown command')
2588
2514
def test_env_change_passes_through(self):
2589
2515
self.assertRunBzrSubprocess(
2590
{'env_changes': {'new': 'value', 'changed': 'newvalue', 'deleted': None}},
2516
{'env_changes':{'new':'value', 'changed':'newvalue', 'deleted':None}},
2591
2517
StubProcess(), '',
2592
env_changes={'new': 'value', 'changed': 'newvalue', 'deleted': None})
2518
env_changes={'new':'value', 'changed':'newvalue', 'deleted':None})
2594
2520
def test_no_working_dir_passed_as_None(self):
2595
2521
self.assertRunBzrSubprocess({'working_dir': None}, StubProcess(), '')
2597
2523
def test_no_working_dir_passed_through(self):
2598
2524
self.assertRunBzrSubprocess({'working_dir': 'dir'}, StubProcess(), '',
2601
2527
def test_run_bzr_subprocess_no_plugins(self):
2602
2528
self.assertRunBzrSubprocess({'allow_plugins': False},
2605
2531
def test_allow_plugins(self):
2606
2532
self.assertRunBzrSubprocess({'allow_plugins': True},
2607
StubProcess(), '', allow_plugins=True)
2533
StubProcess(), '', allow_plugins=True)
2610
2536
class TestFinishBzrSubprocess(TestWithFakedStartBzrSubprocess):
2672
2598
def test_set_env(self):
2673
2599
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2674
2600
# set in the child
2676
2601
def check_environment():
2677
2602
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2678
2603
self.check_popen_state = check_environment
2679
2604
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2680
env_changes={'EXISTANT_ENV_VAR': 'set variable'})
2605
env_changes={'EXISTANT_ENV_VAR':'set variable'})
2681
2606
# not set in theparent
2682
2607
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2684
2609
def test_run_bzr_subprocess_env_del(self):
2685
2610
"""run_bzr_subprocess can remove environment variables too."""
2686
2611
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2688
2612
def check_environment():
2689
2613
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2690
2614
os.environ['EXISTANT_ENV_VAR'] = 'set variable'
2691
2615
self.check_popen_state = check_environment
2692
2616
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2693
env_changes={'EXISTANT_ENV_VAR': None})
2617
env_changes={'EXISTANT_ENV_VAR':None})
2694
2618
# Still set in parent
2695
2619
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2696
2620
del os.environ['EXISTANT_ENV_VAR']
2698
2622
def test_env_del_missing(self):
2699
2623
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2701
2624
def check_environment():
2702
2625
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2703
2626
self.check_popen_state = check_environment
2704
2627
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2705
env_changes={'NON_EXISTANT_ENV_VAR': None})
2628
env_changes={'NON_EXISTANT_ENV_VAR':None})
2707
2630
def test_working_dir(self):
2708
2631
"""Test that we can specify the working dir for the child"""
2632
orig_getcwd = osutils.getcwd
2633
orig_chdir = os.chdir
2711
2635
def chdir(path):
2712
2636
chdirs.append(path)
2713
2637
self.overrideAttr(os, 'chdir', chdir)
2716
2639
return 'current'
2717
2640
self.overrideAttr(osutils, 'getcwd', getcwd)
2783
2706
def test_condition_isinstance(self):
2784
2707
filtered_suite = tests.filter_suite_by_condition(
2785
2708
self.suite, tests.condition_isinstance(self.__class__))
2786
class_pattern = 'breezy.tests.test_selftest.TestSelftestFiltering.'
2709
class_pattern = 'brzlib.tests.test_selftest.TestSelftestFiltering.'
2787
2710
re_filtered = tests.filter_suite_by_re(self.suite, class_pattern)
2788
2711
self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
2790
2713
def test_exclude_tests_by_condition(self):
2791
excluded_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2792
'test_exclude_tests_by_condition')
2793
filtered_suite = tests.exclude_tests_by_condition(
2794
self.suite, lambda x: x.id() == excluded_name)
2714
excluded_name = ('brzlib.tests.test_selftest.TestSelftestFiltering.'
2715
'test_exclude_tests_by_condition')
2716
filtered_suite = tests.exclude_tests_by_condition(self.suite,
2717
lambda x:x.id() == excluded_name)
2795
2718
self.assertEqual(len(self.all_names) - 1,
2796
filtered_suite.countTestCases())
2719
filtered_suite.countTestCases())
2797
2720
self.assertFalse(excluded_name in _test_ids(filtered_suite))
2798
2721
remaining_names = list(self.all_names)
2799
2722
remaining_names.remove(excluded_name)
2803
2726
self.all_names = _test_ids(self.suite)
2804
2727
filtered_suite = tests.exclude_tests_by_re(self.suite,
2805
2728
'exclude_tests_by_re')
2806
excluded_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2807
'test_exclude_tests_by_re')
2729
excluded_name = ('brzlib.tests.test_selftest.TestSelftestFiltering.'
2730
'test_exclude_tests_by_re')
2808
2731
self.assertEqual(len(self.all_names) - 1,
2809
filtered_suite.countTestCases())
2732
filtered_suite.countTestCases())
2810
2733
self.assertFalse(excluded_name in _test_ids(filtered_suite))
2811
2734
remaining_names = list(self.all_names)
2812
2735
remaining_names.remove(excluded_name)
2813
2736
self.assertEqual(remaining_names, _test_ids(filtered_suite))
2815
2738
def test_filter_suite_by_condition(self):
2816
test_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2817
'test_filter_suite_by_condition')
2818
filtered_suite = tests.filter_suite_by_condition(
2819
self.suite, lambda x: x.id() == test_name)
2739
test_name = ('brzlib.tests.test_selftest.TestSelftestFiltering.'
2740
'test_filter_suite_by_condition')
2741
filtered_suite = tests.filter_suite_by_condition(self.suite,
2742
lambda x:x.id() == test_name)
2820
2743
self.assertEqual([test_name], _test_ids(filtered_suite))
2822
2745
def test_filter_suite_by_re(self):
2823
2746
filtered_suite = tests.filter_suite_by_re(self.suite,
2824
2747
'test_filter_suite_by_r')
2825
2748
filtered_names = _test_ids(filtered_suite)
2827
filtered_names, ['breezy.tests.test_selftest.'
2828
'TestSelftestFiltering.test_filter_suite_by_re'])
2749
self.assertEqual(filtered_names, ['brzlib.tests.test_selftest.'
2750
'TestSelftestFiltering.test_filter_suite_by_re'])
2830
2752
def test_filter_suite_by_id_list(self):
2831
test_list = ['breezy.tests.test_selftest.'
2753
test_list = ['brzlib.tests.test_selftest.'
2832
2754
'TestSelftestFiltering.test_filter_suite_by_id_list']
2833
2755
filtered_suite = tests.filter_suite_by_id_list(
2834
2756
self.suite, tests.TestIdList(test_list))
2835
2757
filtered_names = _test_ids(filtered_suite)
2836
2758
self.assertEqual(
2837
2759
filtered_names,
2838
['breezy.tests.test_selftest.'
2760
['brzlib.tests.test_selftest.'
2839
2761
'TestSelftestFiltering.test_filter_suite_by_id_list'])
2841
2763
def test_filter_suite_by_id_startswith(self):
2842
2764
# By design this test may fail if another test is added whose name also
2843
2765
# begins with one of the start value used.
2844
klass = 'breezy.tests.test_selftest.TestSelftestFiltering.'
2766
klass = 'brzlib.tests.test_selftest.TestSelftestFiltering.'
2845
2767
start1 = klass + 'test_filter_suite_by_id_starts'
2846
2768
start2 = klass + 'test_filter_suite_by_id_li'
2847
2769
test_list = [klass + 'test_filter_suite_by_id_list',
2951
2873
"""Gets a TestLoader and a module with one test in it."""
2952
2874
loader = TestUtil.TestLoader()
2955
2876
class Stub(tests.TestCase):
2956
2877
def test_foo(self):
2959
2879
class MyModule(object):
2961
2881
MyModule.a_class = Stub
2962
2882
module = MyModule()
2963
module.__name__ = 'fake_module'
2964
2883
return loader, module
2966
2885
def test_module_no_load_tests_attribute_loads_classes(self):
2967
2886
loader, module = self._get_loader_and_module()
2968
self.assertEqual(1, loader.loadTestsFromModule(
2969
module).countTestCases())
2887
self.assertEqual(1, loader.loadTestsFromModule(module).countTestCases())
2971
2889
def test_module_load_tests_attribute_gets_called(self):
2972
2890
loader, module = self._get_loader_and_module()
2974
def load_tests(loader, standard_tests, pattern):
2891
# 'self' is here because we're faking the module with a class. Regular
2892
# load_tests do not need that :)
2893
def load_tests(self, standard_tests, module, loader):
2975
2894
result = loader.suiteClass()
2976
2895
for test in tests.iter_suite_tests(standard_tests):
2977
2896
result.addTests([test, test])
2979
2898
# add a load_tests() method which multiplies the tests from the module.
2980
module.__class__.load_tests = staticmethod(load_tests)
2982
2 * [str(module.a_class('test_foo'))],
2983
list(map(str, loader.loadTestsFromModule(module))))
2899
module.__class__.load_tests = load_tests
2900
self.assertEqual(2, loader.loadTestsFromModule(module).countTestCases())
2985
2902
def test_load_tests_from_module_name_smoke_test(self):
2986
2903
loader = TestUtil.TestLoader()
2987
suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
2988
self.assertEqual(['breezy.tests.test_sampler.DemoTest.test_nothing'],
2904
suite = loader.loadTestsFromModuleName('brzlib.tests.test_sampler')
2905
self.assertEqual(['brzlib.tests.test_sampler.DemoTest.test_nothing'],
2991
2908
def test_load_tests_from_module_name_with_bogus_module_name(self):
2992
2909
loader = TestUtil.TestLoader()
3095
3012
self.assertEqual([], test_list)
3097
3014
self.assertSubset([
3102
3019
def test_test_suite(self):
3103
3020
# test_suite() loads the entire test suite to operate. To avoid this
3104
3021
# overhead, and yet still be confident that things are happening,
3105
# we temporarily replace two functions used by test_suite with
3022
# we temporarily replace two functions used by test_suite with
3106
3023
# test doubles that supply a few sample tests to load, and check they
3110
3026
def testmod_names():
3111
3027
calls.append("testmod_names")
3113
'breezy.tests.blackbox.test_branch',
3114
'breezy.tests.per_transport',
3115
'breezy.tests.test_selftest',
3029
'brzlib.tests.blackbox.test_branch',
3030
'brzlib.tests.per_transport',
3031
'brzlib.tests.test_selftest',
3117
3033
self.overrideAttr(tests, '_test_suite_testmod_names', testmod_names)
3119
3034
def doctests():
3120
3035
calls.append("modules_to_doctest")
3121
3036
if __doc__ is None:
3123
return ['breezy.timestamp']
3038
return ['brzlib.timestamp']
3124
3039
self.overrideAttr(tests, '_test_suite_modules_to_doctest', doctests)
3125
3040
expected_test_list = [
3126
3041
# testmod_names
3127
'breezy.tests.blackbox.test_branch.TestBranch.test_branch',
3128
('breezy.tests.per_transport.TransportTests'
3042
'brzlib.tests.blackbox.test_branch.TestBranch.test_branch',
3043
('brzlib.tests.per_transport.TransportTests'
3129
3044
'.test_abspath(LocalTransport,LocalURLServer)'),
3130
'breezy.tests.test_selftest.TestTestSuite.test_test_suite',
3045
'brzlib.tests.test_selftest.TestTestSuite.test_test_suite',
3131
3046
# plugins can't be tested that way since selftest may be run with
3049
if __doc__ is not None:
3050
expected_test_list.extend([
3051
# modules_to_doctest
3052
'brzlib.timestamp.format_highres_date',
3134
3054
suite = tests.test_suite()
3135
self.assertEqual({"testmod_names", "modules_to_doctest"}, set(calls))
3055
self.assertEqual(set(["testmod_names", "modules_to_doctest"]),
3136
3057
self.assertSubset(expected_test_list, _test_ids(suite))
3138
3059
def test_test_suite_list_and_start(self):
3139
# We cannot test this at the same time as the main load, because we
3140
# want to know that starting_with == None works. So a second load is
3141
# incurred - note that the starting_with parameter causes a partial
3142
# load rather than a full load so this test should be pretty quick.
3144
'breezy.tests.test_selftest.TestTestSuite.test_test_suite']
3060
# We cannot test this at the same time as the main load, because we want
3061
# to know that starting_with == None works. So a second load is
3062
# incurred - note that the starting_with parameter causes a partial load
3063
# rather than a full load so this test should be pretty quick.
3064
test_list = ['brzlib.tests.test_selftest.TestTestSuite.test_test_suite']
3145
3065
suite = tests.test_suite(test_list,
3146
['breezy.tests.test_selftest.TestTestSuite'])
3147
# test_test_suite_list_and_start is not included
3066
['brzlib.tests.test_selftest.TestTestSuite'])
3067
# test_test_suite_list_and_start is not included
3148
3068
self.assertEqual(test_list, _test_ids(suite))
3212
3132
def test_load_tests(self):
3213
test_list = ['breezy.tests.test_sampler.DemoTest.test_nothing']
3214
loader = self._create_loader('breezy.tests.test_samp')
3133
test_list = ['brzlib.tests.test_sampler.DemoTest.test_nothing']
3134
loader = self._create_loader('brzlib.tests.test_samp')
3216
suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
3136
suite = loader.loadTestsFromModuleName('brzlib.tests.test_sampler')
3217
3137
self.assertEqual(test_list, _test_ids(suite))
3219
3139
def test_load_tests_inside_module(self):
3220
test_list = ['breezy.tests.test_sampler.DemoTest.test_nothing']
3221
loader = self._create_loader('breezy.tests.test_sampler.Demo')
3140
test_list = ['brzlib.tests.test_sampler.DemoTest.test_nothing']
3141
loader = self._create_loader('brzlib.tests.test_sampler.Demo')
3223
suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
3143
suite = loader.loadTestsFromModuleName('brzlib.tests.test_sampler')
3224
3144
self.assertEqual(test_list, _test_ids(suite))
3226
3146
def test_exclude_tests(self):
3147
test_list = ['bogus']
3227
3148
loader = self._create_loader('bogus')
3229
suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
3150
suite = loader.loadTestsFromModuleName('brzlib.tests.test_sampler')
3230
3151
self.assertEqual([], _test_ids(suite))
3267
3188
def test_predefined_prefixes(self):
3268
3189
tpr = tests.test_prefix_alias_registry
3269
self.assertEqual('breezy', tpr.resolve_alias('breezy'))
3270
self.assertEqual('breezy.doc', tpr.resolve_alias('bd'))
3271
self.assertEqual('breezy.utils', tpr.resolve_alias('bu'))
3272
self.assertEqual('breezy.tests', tpr.resolve_alias('bt'))
3273
self.assertEqual('breezy.tests.blackbox', tpr.resolve_alias('bb'))
3274
self.assertEqual('breezy.plugins', tpr.resolve_alias('bp'))
3190
self.assertEqual('brzlib', tpr.resolve_alias('brzlib'))
3191
self.assertEqual('brzlib.doc', tpr.resolve_alias('bd'))
3192
self.assertEqual('brzlib.utils', tpr.resolve_alias('bu'))
3193
self.assertEqual('brzlib.tests', tpr.resolve_alias('bt'))
3194
self.assertEqual('brzlib.tests.blackbox', tpr.resolve_alias('bb'))
3195
self.assertEqual('brzlib.plugins', tpr.resolve_alias('bp'))
3277
3198
class TestThreadLeakDetection(tests.TestCase):
3405
3318
raise self.failureException
3406
3319
result = self.TracebackRecordingResult()
3407
3320
Test().run(result)
3408
self.assertEqual(result.postcode, Test.runTest.__code__)
3321
self.assertEqual(result.postcode, Test.runTest.func_code)
3410
3323
def test_location_bt_error(self):
3411
"""Needs right post mortem traceback with erroring breezy.tests case"""
3324
"""Needs right post mortem traceback with erroring brzlib.tests case"""
3412
3325
class Test(tests.TestCase):
3413
3326
def test_error(self):
3414
3327
raise RuntimeError
3415
3328
result = self.TracebackRecordingResult()
3416
3329
Test("test_error").run(result)
3417
self.assertEqual(result.postcode, Test.test_error.__code__)
3330
self.assertEqual(result.postcode, Test.test_error.func_code)
3419
3332
def test_location_bt_failure(self):
3420
"""Needs right post mortem traceback with failing breezy.tests case"""
3333
"""Needs right post mortem traceback with failing brzlib.tests case"""
3421
3334
class Test(tests.TestCase):
3422
3335
def test_failure(self):
3423
3336
raise self.failureException
3424
3337
result = self.TracebackRecordingResult()
3425
3338
Test("test_failure").run(result)
3426
self.assertEqual(result.postcode, Test.test_failure.__code__)
3339
self.assertEqual(result.postcode, Test.test_failure.func_code)
3428
3341
def test_env_var_triggers_post_mortem(self):
3429
"""Check pdb.post_mortem is called iff BRZ_TEST_PDB is set"""
3342
"""Check pdb.post_mortem is called iff BZR_TEST_PDB is set"""
3431
3344
result = tests.ExtendedTestResult(StringIO(), 0, 1)
3432
3345
post_mortem_calls = []
3433
3346
self.overrideAttr(pdb, "post_mortem", post_mortem_calls.append)
3434
self.overrideEnv('BRZ_TEST_PDB', None)
3347
self.overrideEnv('BZR_TEST_PDB', None)
3435
3348
result._post_mortem(1)
3436
self.overrideEnv('BRZ_TEST_PDB', 'on')
3349
self.overrideEnv('BZR_TEST_PDB', 'on')
3437
3350
result._post_mortem(2)
3438
3351
self.assertEqual([2], post_mortem_calls)
3568
3475
def test_pattern(self):
3569
3476
out = self._run_selftest_with_suite(pattern="test_(?:pass|self_ref)$")
3570
self.assertNotContainsRe(out, b"test_skip")
3477
self.assertNotContainsRe(out, "test_skip")
3572
3479
def test_exclude_pattern(self):
3573
3480
out = self._run_selftest_with_suite(exclude_pattern="test_skip$")
3574
self.assertNotContainsRe(out, b"test_skip")
3481
self.assertNotContainsRe(out, "test_skip")
3576
3483
def test_random_seed(self):
3577
3484
self._run_selftest_with_suite(random_seed="now")
3579
3486
def test_matching_tests_first(self):
3580
3487
self._run_selftest_with_suite(matching_tests_first=True,
3581
pattern="test_self_ref$")
3488
pattern="test_self_ref$")
3583
3490
def test_starting_with_and_exclude(self):
3584
3491
out = self._run_selftest_with_suite(starting_with=["bt."],
3585
exclude_pattern="test_skip$")
3586
self.assertNotContainsRe(out, b"test_skip")
3492
exclude_pattern="test_skip$")
3493
self.assertNotContainsRe(out, "test_skip")
3588
3495
def test_additonal_decorator(self):
3589
self._run_selftest_with_suite(suite_decorators=[tests.TestDecorator])
3496
out = self._run_selftest_with_suite(
3497
suite_decorators=[tests.TestDecorator])
3592
3500
class TestUncollectedWarningsSubunit(TestUncollectedWarnings):