103
128
self.failUnlessExists(filename)
106
class TestTransportScenarios(tests.TestCase):
131
class TestTransportProviderAdapter(TestCase):
107
132
"""A group of tests that test the transport implementation adaption core.
109
This is a meta test that the tests are applied to all available
134
This is a meta test that the tests are applied to all available
112
This will be generalised in the future which is why it is in this
137
This will be generalised in the future which is why it is in this
113
138
test file even though it is specific to transport tests at the moment.
116
141
def test_get_transport_permutations(self):
117
142
# this checks that get_test_permutations defined by the module is
118
# called by the get_transport_test_permutations function.
143
# called by the adapter get_transport_test_permutations method.
119
144
class MockModule(object):
120
145
def get_test_permutations(self):
121
146
return sample_permutation
122
147
sample_permutation = [(1,2), (3,4)]
123
from bzrlib.tests.per_transport import get_transport_test_permutations
148
from bzrlib.tests.test_transport_implementations \
149
import TransportTestProviderAdapter
150
adapter = TransportTestProviderAdapter()
124
151
self.assertEqual(sample_permutation,
125
get_transport_test_permutations(MockModule()))
152
adapter.get_transport_test_permutations(MockModule()))
127
def test_scenarios_invlude_all_modules(self):
128
# this checks that the scenario generator returns as many permutations
129
# as there are in all the registered transport modules - we assume if
130
# this matches its probably doing the right thing especially in
131
# combination with the tests for setting the right classes below.
132
from bzrlib.tests.per_transport import transport_test_permutations
154
def test_adapter_checks_all_modules(self):
155
# this checks that the adapter returns as many permutations as there
156
# are in all the registered transport modules - we assume if this
157
# matches its probably doing the right thing especially in combination
158
# with the tests for setting the right classes below.
159
from bzrlib.tests.test_transport_implementations \
160
import TransportTestProviderAdapter
133
161
from bzrlib.transport import _get_transport_modules
134
162
modules = _get_transport_modules()
135
163
permutation_count = 0
136
164
for module in modules:
138
permutation_count += len(reduce(getattr,
166
permutation_count += len(reduce(getattr,
139
167
(module + ".get_test_permutations").split('.')[1:],
140
168
__import__(module))())
141
169
except errors.DependencyNotPresent:
143
scenarios = transport_test_permutations()
144
self.assertEqual(permutation_count, len(scenarios))
171
input_test = TestTransportProviderAdapter(
172
"test_adapter_sets_transport_class")
173
adapter = TransportTestProviderAdapter()
174
self.assertEqual(permutation_count,
175
len(list(iter(adapter.adapt(input_test)))))
146
def test_scenarios_include_transport_class(self):
177
def test_adapter_sets_transport_class(self):
178
# Check that the test adapter inserts a transport and server into the
147
181
# This test used to know about all the possible transports and the
148
182
# order they were returned but that seems overly brittle (mbp
150
from bzrlib.tests.per_transport import transport_test_permutations
151
scenarios = transport_test_permutations()
184
from bzrlib.tests.test_transport_implementations \
185
import TransportTestProviderAdapter
186
scenarios = TransportTestProviderAdapter().scenarios
152
187
# there are at least that many builtin transports
153
188
self.assertTrue(len(scenarios) > 6)
154
189
one_scenario = scenarios[0]
252
class TestTestScenarioApplication(tests.TestCase):
292
class TestTestScenarioApplier(TestCase):
253
293
"""Tests for the test adaption facilities."""
255
def test_apply_scenario(self):
256
from bzrlib.tests import apply_scenario
257
input_test = TestTestScenarioApplication("test_apply_scenario")
295
def test_adapt_applies_scenarios(self):
296
from bzrlib.tests.repository_implementations import TestScenarioApplier
297
input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
298
adapter = TestScenarioApplier()
299
adapter.scenarios = [("1", "dict"), ("2", "settings")]
301
def capture_call(test, scenario):
302
calls.append((test, scenario))
304
adapter.adapt_test_to_scenario = capture_call
305
adapter.adapt(input_test)
306
self.assertEqual([(input_test, ("1", "dict")),
307
(input_test, ("2", "settings"))], calls)
309
def test_adapt_test_to_scenario(self):
310
from bzrlib.tests.repository_implementations import TestScenarioApplier
311
input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
312
adapter = TestScenarioApplier()
258
313
# setup two adapted tests
259
adapted_test1 = apply_scenario(input_test,
314
adapted_test1 = adapter.adapt_test_to_scenario(input_test,
261
316
{"bzrdir_format":"bzr_format",
262
317
"repository_format":"repo_fmt",
263
318
"transport_server":"transport_server",
264
319
"transport_readonly_server":"readonly-server"}))
265
adapted_test2 = apply_scenario(input_test,
320
adapted_test2 = adapter.adapt_test_to_scenario(input_test,
266
321
("new id 2", {"bzrdir_format":None}))
267
322
# input_test should have been altered.
268
323
self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
269
# the new tests are mutually incompatible, ensuring it has
324
# the new tests are mutually incompatible, ensuring it has
270
325
# made new ones, and unspecified elements in the scenario
271
326
# should not have been altered.
272
327
self.assertEqual("bzr_format", adapted_test1.bzrdir_format)
275
330
self.assertEqual("readonly-server",
276
331
adapted_test1.transport_readonly_server)
277
332
self.assertEqual(
278
"bzrlib.tests.test_selftest.TestTestScenarioApplication."
279
"test_apply_scenario(new id)",
333
"bzrlib.tests.test_selftest.TestTestScenarioApplier."
334
"test_adapt_test_to_scenario(new id)",
280
335
adapted_test1.id())
281
336
self.assertEqual(None, adapted_test2.bzrdir_format)
282
337
self.assertEqual(
283
"bzrlib.tests.test_selftest.TestTestScenarioApplication."
284
"test_apply_scenario(new id 2)",
338
"bzrlib.tests.test_selftest.TestTestScenarioApplier."
339
"test_adapt_test_to_scenario(new id 2)",
285
340
adapted_test2.id())
288
class TestInterRepositoryScenarios(tests.TestCase):
343
class TestInterRepositoryProviderAdapter(TestCase):
344
"""A group of tests that test the InterRepository test adapter."""
290
def test_scenarios(self):
346
def test_adapted_tests(self):
291
347
# check that constructor parameters are passed through to the adapted
293
from bzrlib.tests.per_interrepository import make_scenarios
349
from bzrlib.tests.interrepository_implementations import \
350
InterRepositoryTestProviderAdapter
296
353
formats = [(str, "C1", "C2"), (int, "D1", "D2")]
297
scenarios = make_scenarios(server1, server2, formats)
354
adapter = InterRepositoryTestProviderAdapter(server1, server2, formats)
298
355
self.assertEqual([
300
357
{'interrepo_class': str,
308
365
'repository_format_to': 'D2',
309
366
'transport_readonly_server': 'b',
310
367
'transport_server': 'a'})],
314
class TestWorkingTreeScenarios(tests.TestCase):
368
adapter.formats_to_scenarios(formats))
371
class TestWorkingTreeProviderAdapter(TestCase):
372
"""A group of tests that test the workingtree implementation test adapter."""
316
374
def test_scenarios(self):
317
375
# check that constructor parameters are passed through to the adapted
319
from bzrlib.tests.per_workingtree import make_scenarios
377
from bzrlib.tests.workingtree_implementations \
378
import WorkingTreeTestProviderAdapter
322
381
formats = [workingtree.WorkingTreeFormat2(),
323
382
workingtree.WorkingTreeFormat3(),]
324
scenarios = make_scenarios(server1, server2, formats)
383
adapter = WorkingTreeTestProviderAdapter(server1, server2, formats)
325
384
self.assertEqual([
326
385
('WorkingTreeFormat2',
327
386
{'bzrdir_format': formats[0]._matchingbzrdir,
333
392
'transport_readonly_server': 'b',
334
393
'transport_server': 'a',
335
394
'workingtree_format': formats[1]})],
339
class TestTreeScenarios(tests.TestCase):
341
def test_scenarios(self):
342
# the tree implementation scenario generator is meant to setup one
343
# instance for each working tree format, and one additional instance
344
# that will use the default wt format, but create a revision tree for
345
# the tests. this means that the wt ones should have the
346
# workingtree_to_test_tree attribute set to 'return_parameter' and the
347
# revision one set to revision_tree_from_workingtree.
349
from bzrlib.tests.per_tree import (
350
_dirstate_tree_from_workingtree,
398
class TestTreeProviderAdapter(TestCase):
399
"""Test the setup of tree_implementation tests."""
401
def test_adapted_tests(self):
402
# the tree implementation adapter is meant to setup one instance for
403
# each working tree format, and one additional instance that will
404
# use the default wt format, but create a revision tree for the tests.
405
# this means that the wt ones should have the workingtree_to_test_tree
406
# attribute set to 'return_parameter' and the revision one set to
407
# revision_tree_from_workingtree.
409
from bzrlib.tests.tree_implementations import (
410
TreeTestProviderAdapter,
354
411
return_parameter,
355
412
revision_tree_from_workingtree
414
input_test = TestTreeProviderAdapter(
415
"test_adapted_tests")
359
418
formats = [workingtree.WorkingTreeFormat2(),
360
419
workingtree.WorkingTreeFormat3(),]
361
scenarios = make_scenarios(server1, server2, formats)
362
self.assertEqual(7, len(scenarios))
363
default_wt_format = workingtree.WorkingTreeFormat4._default_format
364
wt4_format = workingtree.WorkingTreeFormat4()
365
wt5_format = workingtree.WorkingTreeFormat5()
366
expected_scenarios = [
367
('WorkingTreeFormat2',
368
{'bzrdir_format': formats[0]._matchingbzrdir,
369
'transport_readonly_server': 'b',
370
'transport_server': 'a',
371
'workingtree_format': formats[0],
372
'_workingtree_to_test_tree': return_parameter,
374
('WorkingTreeFormat3',
375
{'bzrdir_format': formats[1]._matchingbzrdir,
376
'transport_readonly_server': 'b',
377
'transport_server': 'a',
378
'workingtree_format': formats[1],
379
'_workingtree_to_test_tree': return_parameter,
382
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
383
'bzrdir_format': default_wt_format._matchingbzrdir,
384
'transport_readonly_server': 'b',
385
'transport_server': 'a',
386
'workingtree_format': default_wt_format,
388
('DirStateRevisionTree,WT4',
389
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
390
'bzrdir_format': wt4_format._matchingbzrdir,
391
'transport_readonly_server': 'b',
392
'transport_server': 'a',
393
'workingtree_format': wt4_format,
395
('DirStateRevisionTree,WT5',
396
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
397
'bzrdir_format': wt5_format._matchingbzrdir,
398
'transport_readonly_server': 'b',
399
'transport_server': 'a',
400
'workingtree_format': wt5_format,
403
{'_workingtree_to_test_tree': preview_tree_pre,
404
'bzrdir_format': default_wt_format._matchingbzrdir,
405
'transport_readonly_server': 'b',
406
'transport_server': 'a',
407
'workingtree_format': default_wt_format}),
409
{'_workingtree_to_test_tree': preview_tree_post,
410
'bzrdir_format': default_wt_format._matchingbzrdir,
411
'transport_readonly_server': 'b',
412
'transport_server': 'a',
413
'workingtree_format': default_wt_format}),
415
self.assertEqual(expected_scenarios, scenarios)
418
class TestInterTreeScenarios(tests.TestCase):
420
adapter = TreeTestProviderAdapter(server1, server2, formats)
421
suite = adapter.adapt(input_test)
422
tests = list(iter(suite))
423
# XXX We should not have tests fail as we add more scenarios
425
self.assertEqual(5, len(tests))
426
# this must match the default format setp up in
427
# TreeTestProviderAdapter.adapt
428
default_format = workingtree.WorkingTreeFormat3
429
self.assertEqual(tests[0].workingtree_format, formats[0])
430
self.assertEqual(tests[0].bzrdir_format, formats[0]._matchingbzrdir)
431
self.assertEqual(tests[0].transport_server, server1)
432
self.assertEqual(tests[0].transport_readonly_server, server2)
433
self.assertEqual(tests[0]._workingtree_to_test_tree, return_parameter)
434
self.assertEqual(tests[1].workingtree_format, formats[1])
435
self.assertEqual(tests[1].bzrdir_format, formats[1]._matchingbzrdir)
436
self.assertEqual(tests[1].transport_server, server1)
437
self.assertEqual(tests[1].transport_readonly_server, server2)
438
self.assertEqual(tests[1]._workingtree_to_test_tree, return_parameter)
439
self.assertIsInstance(tests[2].workingtree_format, default_format)
440
#self.assertEqual(tests[2].bzrdir_format,
441
# default_format._matchingbzrdir)
442
self.assertEqual(tests[2].transport_server, server1)
443
self.assertEqual(tests[2].transport_readonly_server, server2)
444
self.assertEqual(tests[2]._workingtree_to_test_tree,
445
revision_tree_from_workingtree)
448
class TestInterTreeProviderAdapter(TestCase):
419
449
"""A group of tests that test the InterTreeTestAdapter."""
421
def test_scenarios(self):
451
def test_adapted_tests(self):
422
452
# check that constructor parameters are passed through to the adapted
424
454
# for InterTree tests we want the machinery to bring up two trees in
428
458
# unlike the TestProviderAdapter we dont want to automatically add a
429
459
# parameterized one for WorkingTree - the optimisers will tell us what
431
from bzrlib.tests.per_tree import (
461
from bzrlib.tests.tree_implementations import (
432
462
return_parameter,
433
463
revision_tree_from_workingtree
435
from bzrlib.tests.per_intertree import (
465
from bzrlib.tests.intertree_implementations import (
466
InterTreeTestProviderAdapter,
438
468
from bzrlib.workingtree import WorkingTreeFormat2, WorkingTreeFormat3
439
input_test = TestInterTreeScenarios(
469
input_test = TestInterTreeProviderAdapter(
470
"test_adapted_tests")
443
473
format1 = WorkingTreeFormat2()
444
474
format2 = WorkingTreeFormat3()
445
formats = [("1", str, format1, format2, "converter1"),
446
("2", int, format2, format1, "converter2")]
447
scenarios = make_scenarios(server1, server2, formats)
448
self.assertEqual(2, len(scenarios))
449
expected_scenarios = [
451
"bzrdir_format": format1._matchingbzrdir,
452
"intertree_class": formats[0][1],
453
"workingtree_format": formats[0][2],
454
"workingtree_format_to": formats[0][3],
455
"mutable_trees_to_test_trees": formats[0][4],
456
"_workingtree_to_test_tree": return_parameter,
457
"transport_server": server1,
458
"transport_readonly_server": server2,
461
"bzrdir_format": format2._matchingbzrdir,
462
"intertree_class": formats[1][1],
463
"workingtree_format": formats[1][2],
464
"workingtree_format_to": formats[1][3],
465
"mutable_trees_to_test_trees": formats[1][4],
466
"_workingtree_to_test_tree": return_parameter,
467
"transport_server": server1,
468
"transport_readonly_server": server2,
471
self.assertEqual(scenarios, expected_scenarios)
474
class TestTestCaseInTempDir(tests.TestCaseInTempDir):
475
formats = [(str, format1, format2, "converter1"),
476
(int, format2, format1, "converter2")]
477
adapter = InterTreeTestProviderAdapter(server1, server2, formats)
478
suite = adapter.adapt(input_test)
479
tests = list(iter(suite))
480
self.assertEqual(2, len(tests))
481
self.assertEqual(tests[0].intertree_class, formats[0][0])
482
self.assertEqual(tests[0].workingtree_format, formats[0][1])
483
self.assertEqual(tests[0].workingtree_format_to, formats[0][2])
484
self.assertEqual(tests[0].mutable_trees_to_test_trees, formats[0][3])
485
self.assertEqual(tests[0]._workingtree_to_test_tree, return_parameter)
486
self.assertEqual(tests[0].transport_server, server1)
487
self.assertEqual(tests[0].transport_readonly_server, server2)
488
self.assertEqual(tests[1].intertree_class, formats[1][0])
489
self.assertEqual(tests[1].workingtree_format, formats[1][1])
490
self.assertEqual(tests[1].workingtree_format_to, formats[1][2])
491
self.assertEqual(tests[1].mutable_trees_to_test_trees, formats[1][3])
492
self.assertEqual(tests[1]._workingtree_to_test_tree, return_parameter)
493
self.assertEqual(tests[1].transport_server, server1)
494
self.assertEqual(tests[1].transport_readonly_server, server2)
497
class TestTestCaseInTempDir(TestCaseInTempDir):
476
499
def test_home_is_not_working(self):
477
500
self.assertNotEqual(self.test_dir, self.test_home_dir)
479
502
self.assertIsSameRealPath(self.test_dir, cwd)
480
503
self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
482
def test_assertEqualStat_equal(self):
483
from bzrlib.tests.test_dirstate import _FakeStat
484
self.build_tree(["foo"])
485
real = os.lstat("foo")
486
fake = _FakeStat(real.st_size, real.st_mtime, real.st_ctime,
487
real.st_dev, real.st_ino, real.st_mode)
488
self.assertEqualStat(real, fake)
490
def test_assertEqualStat_notequal(self):
491
self.build_tree(["foo", "bar"])
492
self.assertRaises(AssertionError, self.assertEqualStat,
493
os.lstat("foo"), os.lstat("bar"))
496
class TestTestCaseWithMemoryTransport(tests.TestCaseWithMemoryTransport):
506
class TestTestCaseWithMemoryTransport(TestCaseWithMemoryTransport):
498
508
def test_home_is_non_existant_dir_under_root(self):
499
509
"""The test_home_dir for TestCaseWithMemoryTransport is missing.
501
511
This is because TestCaseWithMemoryTransport is for tests that do not
502
need any disk resources: they should be hooked into bzrlib in such a
503
way that no global settings are being changed by the test (only a
512
need any disk resources: they should be hooked into bzrlib in such a
513
way that no global settings are being changed by the test (only a
504
514
few tests should need to do that), and having a missing dir as home is
505
515
an effective way to ensure that this is the case.
817
815
def test_known_failure(self):
818
816
"""A KnownFailure being raised should trigger several result actions."""
819
class InstrumentedTestResult(tests.ExtendedTestResult):
821
def startTests(self): pass
817
class InstrumentedTestResult(ExtendedTestResult):
822
819
def report_test_start(self, test): pass
823
820
def report_known_failure(self, test, err):
824
821
self._call = test, err
825
822
result = InstrumentedTestResult(None, None, None, None)
826
823
def test_function():
827
raise tests.KnownFailure('failed!')
824
raise KnownFailure('failed!')
828
825
test = unittest.FunctionTestCase(test_function)
830
827
# it should invoke 'report_known_failure'.
831
828
self.assertEqual(2, len(result._call))
832
829
self.assertEqual(test, result._call[0])
833
self.assertEqual(tests.KnownFailure, result._call[1][0])
834
self.assertIsInstance(result._call[1][1], tests.KnownFailure)
830
self.assertEqual(KnownFailure, result._call[1][0])
831
self.assertIsInstance(result._call[1][1], KnownFailure)
835
832
# we dont introspec the traceback, if the rest is ok, it would be
836
833
# exceptional for it not to be.
837
834
# it should update the known_failure_count on the object.
1057
1037
This current saves and restores:
1058
1038
TestCaseInTempDir.TEST_ROOT
1060
There should be no tests in this file that use
1061
bzrlib.tests.TextTestRunner without using this convenience method,
1062
because of our use of global state.
1040
There should be no tests in this file that use bzrlib.tests.TextTestRunner
1041
without using this convenience method, because of our use of global state.
1064
old_root = tests.TestCaseInTempDir.TEST_ROOT
1043
old_root = TestCaseInTempDir.TEST_ROOT
1066
tests.TestCaseInTempDir.TEST_ROOT = None
1045
TestCaseInTempDir.TEST_ROOT = None
1067
1046
return testrunner.run(test)
1069
tests.TestCaseInTempDir.TEST_ROOT = old_root
1048
TestCaseInTempDir.TEST_ROOT = old_root
1071
1050
def test_known_failure_failed_run(self):
1072
1051
# run a test that generates a known failure which should be printed in
1073
1052
# the final output when real failures occur.
1074
1053
def known_failure_test():
1075
raise tests.KnownFailure('failed')
1054
raise KnownFailure('failed')
1076
1055
test = unittest.TestSuite()
1077
1056
test.addTest(unittest.FunctionTestCase(known_failure_test))
1078
1057
def failing_test():
1079
1058
raise AssertionError('foo')
1080
1059
test.addTest(unittest.FunctionTestCase(failing_test))
1081
1060
stream = StringIO()
1082
runner = tests.TextTestRunner(stream=stream)
1061
runner = TextTestRunner(stream=stream)
1083
1062
result = self.run_test_runner(runner, test)
1084
1063
lines = stream.getvalue().splitlines()
1085
1064
self.assertEqual([
1350
1328
class _TestException(Exception):
1353
class TestTestCase(tests.TestCase):
1331
class TestTestCase(TestCase):
1354
1332
"""Tests that test the core bzrlib TestCase."""
1356
def test_assertLength_matches_empty(self):
1358
self.assertLength(0, a_list)
1360
def test_assertLength_matches_nonempty(self):
1362
self.assertLength(3, a_list)
1364
def test_assertLength_fails_different(self):
1366
self.assertRaises(AssertionError, self.assertLength, 1, a_list)
1368
def test_assertLength_shows_sequence_in_failure(self):
1370
exception = self.assertRaises(AssertionError, self.assertLength, 2,
1372
self.assertEqual('Incorrect length: wanted 2, got 3 for [1, 2, 3]',
1375
def test_base_setUp_not_called_causes_failure(self):
1376
class TestCaseWithBrokenSetUp(tests.TestCase):
1378
pass # does not call TestCase.setUp
1381
test = TestCaseWithBrokenSetUp('test_foo')
1382
result = unittest.TestResult()
1384
self.assertFalse(result.wasSuccessful())
1385
self.assertEqual(1, result.testsRun)
1387
def test_base_tearDown_not_called_causes_failure(self):
1388
class TestCaseWithBrokenTearDown(tests.TestCase):
1390
pass # does not call TestCase.tearDown
1393
test = TestCaseWithBrokenTearDown('test_foo')
1394
result = unittest.TestResult()
1396
self.assertFalse(result.wasSuccessful())
1397
self.assertEqual(1, result.testsRun)
1399
1334
def test_debug_flags_sanitised(self):
1400
1335
"""The bzrlib debug flags should be sanitised by setUp."""
1401
if 'allow_debug' in tests.selftest_debug_flags:
1402
raise tests.TestNotApplicable(
1403
'-Eallow_debug option prevents debug flag sanitisation')
1404
1336
# we could set something and run a test that will check
1405
1337
# it gets santised, but this is probably sufficient for now:
1406
1338
# if someone runs the test with -Dsomething it will error.
1407
1339
self.assertEqual(set(), bzrlib.debug.debug_flags)
1409
def change_selftest_debug_flags(self, new_flags):
1410
orig_selftest_flags = tests.selftest_debug_flags
1411
self.addCleanup(self._restore_selftest_debug_flags, orig_selftest_flags)
1412
tests.selftest_debug_flags = set(new_flags)
1414
def _restore_selftest_debug_flags(self, flags):
1415
tests.selftest_debug_flags = flags
1417
def test_allow_debug_flag(self):
1418
"""The -Eallow_debug flag prevents bzrlib.debug.debug_flags from being
1419
sanitised (i.e. cleared) before running a test.
1421
self.change_selftest_debug_flags(set(['allow_debug']))
1422
bzrlib.debug.debug_flags = set(['a-flag'])
1423
class TestThatRecordsFlags(tests.TestCase):
1424
def test_foo(nested_self):
1425
self.flags = set(bzrlib.debug.debug_flags)
1426
test = TestThatRecordsFlags('test_foo')
1427
test.run(self.make_test_result())
1428
self.assertEqual(set(['a-flag']), self.flags)
1430
def test_debug_flags_restored(self):
1431
"""The bzrlib debug flags should be restored to their original state
1432
after the test was run, even if allow_debug is set.
1434
self.change_selftest_debug_flags(set(['allow_debug']))
1435
# Now run a test that modifies debug.debug_flags.
1436
bzrlib.debug.debug_flags = set(['original-state'])
1437
class TestThatModifiesFlags(tests.TestCase):
1439
bzrlib.debug.debug_flags = set(['modified'])
1440
test = TestThatModifiesFlags('test_foo')
1441
test.run(self.make_test_result())
1442
self.assertEqual(set(['original-state']), bzrlib.debug.debug_flags)
1444
def make_test_result(self):
1445
return tests.TextTestResult(self._log_file, descriptions=0, verbosity=1)
1447
1341
def inner_test(self):
1448
1342
# the inner child test
1449
1343
note("inner_test")
1491
1389
sample_test.run(result)
1492
1390
self.assertContainsRe(
1493
1391
output_stream.getvalue(),
1392
r"\d+ms/ +\d+ms\n$")
1496
1394
def test_hooks_sanitised(self):
1497
1395
"""The bzrlib hooks should be sanitised by setUp."""
1498
# Note this test won't fail with hooks that the core library doesn't
1499
# use - but it trigger with a plugin that adds hooks, so its still a
1500
# useful warning in that case.
1501
1396
self.assertEqual(bzrlib.branch.BranchHooks(),
1502
1397
bzrlib.branch.Branch.hooks)
1503
1398
self.assertEqual(bzrlib.smart.server.SmartServerHooks(),
1504
1399
bzrlib.smart.server.SmartTCPServer.hooks)
1505
self.assertEqual(bzrlib.commands.CommandHooks(),
1506
bzrlib.commands.Command.hooks)
1508
1401
def test__gather_lsprof_in_benchmarks(self):
1509
1402
"""When _gather_lsprof_in_benchmarks is on, accumulate profile data.
1511
1404
Each self.time() call is individually and separately profiled.
1513
1406
self.requireFeature(test_lsprof.LSProfFeature)
1514
# overrides the class member with an instance member so no cleanup
1407
# overrides the class member with an instance member so no cleanup
1516
1409
self._gather_lsprof_in_benchmarks = True
1517
1410
self.time(time.sleep, 0.000)
1525
1418
def test_knownFailure(self):
1526
1419
"""Self.knownFailure() should raise a KnownFailure exception."""
1527
self.assertRaises(tests.KnownFailure, self.knownFailure, "A Failure")
1420
self.assertRaises(KnownFailure, self.knownFailure, "A Failure")
1529
1422
def test_requireFeature_available(self):
1530
1423
"""self.requireFeature(available) is a no-op."""
1531
class Available(tests.Feature):
1424
class Available(Feature):
1532
1425
def _probe(self):return True
1533
1426
feature = Available()
1534
1427
self.requireFeature(feature)
1536
1429
def test_requireFeature_unavailable(self):
1537
1430
"""self.requireFeature(unavailable) raises UnavailableFeature."""
1538
class Unavailable(tests.Feature):
1431
class Unavailable(Feature):
1539
1432
def _probe(self):return False
1540
1433
feature = Unavailable()
1541
self.assertRaises(tests.UnavailableFeature,
1542
self.requireFeature, feature)
1434
self.assertRaises(UnavailableFeature, self.requireFeature, feature)
1544
1436
def test_run_no_parameters(self):
1545
1437
test = SampleTestCase('_test_pass')
1548
1440
def test_run_enabled_unittest_result(self):
1549
1441
"""Test we revert to regular behaviour when the test is enabled."""
1550
1442
test = SampleTestCase('_test_pass')
1676
1567
def sample_normal_method(self):
1677
1568
"""A undeprecated method."""
1679
@deprecated_method(deprecated_in((0, 10, 0)))
1570
@symbol_versioning.deprecated_method(zero_ten)
1680
1571
def sample_nested_deprecation(self):
1681
1572
return sample_deprecated_function()
1684
class TestExtraAssertions(tests.TestCase):
1575
class TestExtraAssertions(TestCase):
1685
1576
"""Tests for new test assertions in bzrlib test suite"""
1687
1578
def test_assert_isinstance(self):
1688
1579
self.assertIsInstance(2, int)
1689
1580
self.assertIsInstance(u'', basestring)
1690
e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1691
self.assertEquals(str(e),
1692
"None is an instance of <type 'NoneType'> rather than <type 'int'>")
1581
self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1693
1582
self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1694
e = self.assertRaises(AssertionError,
1695
self.assertIsInstance, None, int, "it's just not")
1696
self.assertEquals(str(e),
1697
"None is an instance of <type 'NoneType'> rather than <type 'int'>"
1700
1584
def test_assertEndsWith(self):
1701
1585
self.assertEndsWith('foo', 'oo')
1704
1588
def test_applyDeprecated_not_deprecated(self):
1705
1589
sample_object = ApplyDeprecatedHelper()
1706
1590
# calling an undeprecated callable raises an assertion
1707
self.assertRaises(AssertionError, self.applyDeprecated,
1708
deprecated_in((0, 11, 0)),
1591
self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
1709
1592
sample_object.sample_normal_method)
1710
self.assertRaises(AssertionError, self.applyDeprecated,
1711
deprecated_in((0, 11, 0)),
1593
self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
1712
1594
sample_undeprecated_function, "a param value")
1713
1595
# calling a deprecated callable (function or method) with the wrong
1714
1596
# expected deprecation fails.
1715
self.assertRaises(AssertionError, self.applyDeprecated,
1716
deprecated_in((0, 10, 0)),
1597
self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
1717
1598
sample_object.sample_deprecated_method, "a param value")
1718
self.assertRaises(AssertionError, self.applyDeprecated,
1719
deprecated_in((0, 10, 0)),
1599
self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
1720
1600
sample_deprecated_function)
1721
1601
# calling a deprecated callable (function or method) with the right
1722
1602
# expected deprecation returns the functions result.
1723
self.assertEqual("a param value",
1724
self.applyDeprecated(deprecated_in((0, 11, 0)),
1603
self.assertEqual("a param value", self.applyDeprecated(zero_eleven,
1725
1604
sample_object.sample_deprecated_method, "a param value"))
1726
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 11, 0)),
1605
self.assertEqual(2, self.applyDeprecated(zero_eleven,
1727
1606
sample_deprecated_function))
1728
1607
# calling a nested deprecation with the wrong deprecation version
1729
# fails even if a deeper nested function was deprecated with the
1608
# fails even if a deeper nested function was deprecated with the
1730
1609
# supplied version.
1731
1610
self.assertRaises(AssertionError, self.applyDeprecated,
1732
deprecated_in((0, 11, 0)), sample_object.sample_nested_deprecation)
1611
zero_eleven, sample_object.sample_nested_deprecation)
1733
1612
# calling a nested deprecation with the right deprecation value
1734
1613
# returns the calls result.
1735
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 10, 0)),
1614
self.assertEqual(2, self.applyDeprecated(zero_ten,
1736
1615
sample_object.sample_nested_deprecation))
1738
1617
def test_callDeprecated(self):
1739
1618
def testfunc(be_deprecated, result=None):
1740
1619
if be_deprecated is True:
1741
symbol_versioning.warn('i am deprecated', DeprecationWarning,
1620
symbol_versioning.warn('i am deprecated', DeprecationWarning,
1744
1623
result = self.callDeprecated(['i am deprecated'], testfunc, True)
1799
1678
tree.branch.repository.bzrdir.root_transport)
1802
class TestSelftest(tests.TestCase):
1681
class TestSelftest(TestCase):
1803
1682
"""Tests of bzrlib.tests.selftest."""
1805
1684
def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(self):
1806
1685
factory_called = []
1808
1687
factory_called.append(True)
1809
return TestUtil.TestSuite()
1810
1689
out = StringIO()
1811
1690
err = StringIO()
1812
self.apply_redirected(out, err, None, bzrlib.tests.selftest,
1691
self.apply_redirected(out, err, None, bzrlib.tests.selftest,
1813
1692
test_suite_factory=factory)
1814
1693
self.assertEqual([True], factory_called)
1817
class TestKnownFailure(tests.TestCase):
1696
class TestKnownFailure(TestCase):
1819
1698
def test_known_failure(self):
1820
1699
"""Check that KnownFailure is defined appropriately."""
1821
1700
# a KnownFailure is an assertion error for compatability with unaware
1823
self.assertIsInstance(tests.KnownFailure(""), AssertionError)
1702
self.assertIsInstance(KnownFailure(""), AssertionError)
1825
1704
def test_expect_failure(self):
1827
1706
self.expectFailure("Doomed to failure", self.assertTrue, False)
1828
except tests.KnownFailure, e:
1707
except KnownFailure, e:
1829
1708
self.assertEqual('Doomed to failure', e.args[0])
1831
1710
self.expectFailure("Doomed to failure", self.assertTrue, True)
1890
1768
def test_condition_id_re(self):
1891
1769
test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
1892
1770
'test_condition_id_re')
1893
filtered_suite = tests.filter_suite_by_condition(
1894
self.suite, tests.condition_id_re('test_condition_id_re'))
1771
filtered_suite = filter_suite_by_condition(self.suite,
1772
condition_id_re('test_condition_id_re'))
1895
1773
self.assertEqual([test_name], _test_ids(filtered_suite))
1897
1775
def test_condition_id_in_list(self):
1898
1776
test_names = ['bzrlib.tests.test_selftest.TestSelftestFiltering.'
1899
1777
'test_condition_id_in_list']
1900
1778
id_list = tests.TestIdList(test_names)
1901
filtered_suite = tests.filter_suite_by_condition(
1779
filtered_suite = filter_suite_by_condition(
1902
1780
self.suite, tests.condition_id_in_list(id_list))
1903
1781
my_pattern = 'TestSelftestFiltering.*test_condition_id_in_list'
1904
re_filtered = tests.filter_suite_by_re(self.suite, my_pattern)
1782
re_filtered = filter_suite_by_re(self.suite, my_pattern)
1905
1783
self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
1907
1785
def test_condition_id_startswith(self):
1908
1786
klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
1909
start1 = klass + 'test_condition_id_starts'
1910
start2 = klass + 'test_condition_id_in'
1911
test_names = [ klass + 'test_condition_id_in_list',
1912
klass + 'test_condition_id_startswith',
1914
filtered_suite = tests.filter_suite_by_condition(
1915
self.suite, tests.condition_id_startswith([start1, start2]))
1916
self.assertEqual(test_names, _test_ids(filtered_suite))
1787
start = klass + 'test_condition_id_starts'
1788
test_names = [klass + 'test_condition_id_startswith']
1789
filtered_suite = filter_suite_by_condition(
1790
self.suite, tests.condition_id_startswith(start))
1791
my_pattern = 'TestSelftestFiltering.*test_condition_id_startswith'
1792
re_filtered = filter_suite_by_re(self.suite, my_pattern)
1793
self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
1918
1795
def test_condition_isinstance(self):
1919
filtered_suite = tests.filter_suite_by_condition(
1920
self.suite, tests.condition_isinstance(self.__class__))
1796
filtered_suite = filter_suite_by_condition(self.suite,
1797
condition_isinstance(self.__class__))
1921
1798
class_pattern = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
1922
re_filtered = tests.filter_suite_by_re(self.suite, class_pattern)
1799
re_filtered = filter_suite_by_re(self.suite, class_pattern)
1923
1800
self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
1925
1802
def test_exclude_tests_by_condition(self):
1926
1803
excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
1927
1804
'test_exclude_tests_by_condition')
1928
filtered_suite = tests.exclude_tests_by_condition(self.suite,
1805
filtered_suite = exclude_tests_by_condition(self.suite,
1929
1806
lambda x:x.id() == excluded_name)
1930
1807
self.assertEqual(len(self.all_names) - 1,
1931
1808
filtered_suite.countTestCases())
1975
1850
def test_filter_suite_by_id_startswith(self):
1976
1851
# By design this test may fail if another test is added whose name also
1977
# begins with one of the start value used.
1852
# begins with the start value used.
1978
1853
klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
1979
start1 = klass + 'test_filter_suite_by_id_starts'
1980
start2 = klass + 'test_filter_suite_by_id_li'
1981
test_list = [klass + 'test_filter_suite_by_id_list',
1982
klass + 'test_filter_suite_by_id_startswith',
1984
filtered_suite = tests.filter_suite_by_id_startswith(
1985
self.suite, [start1, start2])
1854
start = klass + 'test_filter_suite_by_id_starts'
1855
test_list = [klass + 'test_filter_suite_by_id_startswith']
1856
filtered_suite = tests.filter_suite_by_id_startswith(self.suite, start)
1857
filtered_names = _test_ids(filtered_suite)
1986
1858
self.assertEqual(
1988
_test_ids(filtered_suite),
1860
['bzrlib.tests.test_selftest.'
1861
'TestSelftestFiltering.test_filter_suite_by_id_startswith'])
1991
1863
def test_preserve_input(self):
1992
1864
# NB: Surely this is something in the stdlib to do this?
1993
self.assertTrue(self.suite is tests.preserve_input(self.suite))
1994
self.assertTrue("@#$" is tests.preserve_input("@#$"))
1865
self.assertTrue(self.suite is preserve_input(self.suite))
1866
self.assertTrue("@#$" is preserve_input("@#$"))
1996
1868
def test_randomize_suite(self):
1997
randomized_suite = tests.randomize_suite(self.suite)
1869
randomized_suite = randomize_suite(self.suite)
1998
1870
# randomizing should not add or remove test names.
1999
1871
self.assertEqual(set(_test_ids(self.suite)),
2000
1872
set(_test_ids(randomized_suite)))
2201
class TestTestSuite(tests.TestCase):
2203
def test_test_suite(self):
2204
# This test is slow, so we do a single test with one test in each
2208
'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
2209
('bzrlib.tests.per_transport.TransportTests'
2210
'.test_abspath(LocalURLServer)'),
2211
'bzrlib.tests.test_selftest.TestTestSuite.test_test_suite',
2212
# modules_to_doctest
2213
'bzrlib.timestamp.format_highres_date',
2214
# plugins can't be tested that way since selftest may be run with
2217
suite = tests.test_suite(test_list)
2218
self.assertEquals(test_list, _test_ids(suite))
2220
def test_test_suite_list_and_start(self):
2221
test_list = ['bzrlib.tests.test_selftest.TestTestSuite.test_test_suite']
2222
suite = tests.test_suite(test_list,
2223
['bzrlib.tests.test_selftest.TestTestSuite'])
2224
# test_test_suite_list_and_start is not included
2225
self.assertEquals(test_list, _test_ids(suite))
2228
2090
class TestLoadTestIdList(tests.TestCaseInTempDir):
2230
2092
def _create_test_list_file(self, file_name, content):
2309
2171
suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2310
2172
self.assertEquals([], _test_ids(suite))
2313
class TestTestPrefixRegistry(tests.TestCase):
2315
def _get_registry(self):
2316
tp_registry = tests.TestPrefixAliasRegistry()
2319
def test_register_new_prefix(self):
2320
tpr = self._get_registry()
2321
tpr.register('foo', 'fff.ooo.ooo')
2322
self.assertEquals('fff.ooo.ooo', tpr.get('foo'))
2324
def test_register_existing_prefix(self):
2325
tpr = self._get_registry()
2326
tpr.register('bar', 'bbb.aaa.rrr')
2327
tpr.register('bar', 'bBB.aAA.rRR')
2328
self.assertEquals('bbb.aaa.rrr', tpr.get('bar'))
2329
self.assertContainsRe(self._get_log(keep_log_file=True),
2330
r'.*bar.*bbb.aaa.rrr.*bBB.aAA.rRR')
2332
def test_get_unknown_prefix(self):
2333
tpr = self._get_registry()
2334
self.assertRaises(KeyError, tpr.get, 'I am not a prefix')
2336
def test_resolve_prefix(self):
2337
tpr = self._get_registry()
2338
tpr.register('bar', 'bb.aa.rr')
2339
self.assertEquals('bb.aa.rr', tpr.resolve_alias('bar'))
2341
def test_resolve_unknown_alias(self):
2342
tpr = self._get_registry()
2343
self.assertRaises(errors.BzrCommandError,
2344
tpr.resolve_alias, 'I am not a prefix')
2346
def test_predefined_prefixes(self):
2347
tpr = tests.test_prefix_alias_registry
2348
self.assertEquals('bzrlib', tpr.resolve_alias('bzrlib'))
2349
self.assertEquals('bzrlib.doc', tpr.resolve_alias('bd'))
2350
self.assertEquals('bzrlib.utils', tpr.resolve_alias('bu'))
2351
self.assertEquals('bzrlib.tests', tpr.resolve_alias('bt'))
2352
self.assertEquals('bzrlib.tests.blackbox', tpr.resolve_alias('bb'))
2353
self.assertEquals('bzrlib.plugins', tpr.resolve_alias('bp'))
2356
class TestRunSuite(tests.TestCase):
2358
def test_runner_class(self):
2359
"""run_suite accepts and uses a runner_class keyword argument."""
2360
class Stub(tests.TestCase):
2363
suite = Stub("test_foo")
2365
class MyRunner(tests.TextTestRunner):
2366
def run(self, test):
2368
return tests.ExtendedTestResult(self.stream, self.descriptions,
2370
tests.run_suite(suite, runner_class=MyRunner, stream=StringIO())
2371
self.assertEqual(calls, [suite])
2373
def test_done(self):
2374
"""run_suite should call result.done()"""
2376
def one_more_call(): self.calls += 1
2377
def test_function():
2379
test = unittest.FunctionTestCase(test_function)
2380
class InstrumentedTestResult(tests.ExtendedTestResult):
2381
def done(self): one_more_call()
2382
class MyRunner(tests.TextTestRunner):
2383
def run(self, test):
2384
return InstrumentedTestResult(self.stream, self.descriptions,
2386
tests.run_suite(test, runner_class=MyRunner, stream=StringIO())
2387
self.assertEquals(1, self.calls)