217
209
'transport_readonly_server': 'b',
218
210
'transport_server': 'a',
219
211
'vfs_transport_factory': 'v'})],
223
class TestRepositoryProviderAdapter(TestCase):
224
"""A group of tests that test the repository implementation test adapter."""
226
def test_constructor(self):
227
# check that constructor parameters are passed through to the
229
from bzrlib.tests.repository_implementations import RepositoryTestProviderAdapter
232
formats = [("c", "C"), ("d", "D")]
233
adapter = RepositoryTestProviderAdapter(server1, server2, formats)
236
{'bzrdir_format': 'C',
237
'repository_format': 'c',
238
'transport_readonly_server': 'b',
239
'transport_server': 'a'}),
241
{'bzrdir_format': 'D',
242
'repository_format': 'd',
243
'transport_readonly_server': 'b',
244
'transport_server': 'a'})],
247
def test_setting_vfs_transport(self):
248
"""The vfs_transport_factory can be set optionally."""
249
from bzrlib.tests.repository_implementations import RepositoryTestProviderAdapter
250
formats = [("a", "b"), ("c", "d")]
251
adapter = RepositoryTestProviderAdapter(None, None, formats,
215
class TestRepositoryScenarios(tests.TestCase):
217
def test_formats_to_scenarios(self):
218
from bzrlib.tests.per_repository import formats_to_scenarios
219
formats = [("(c)", remote.RemoteRepositoryFormat()),
220
("(d)", repository.format_registry.get(
221
'Bazaar repository format 2a (needs bzr 1.16 or later)\n'))]
222
no_vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
224
vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
252
225
vfs_transport_factory="vfs")
255
{'bzrdir_format': 'b',
256
'repository_format': 'a',
257
'transport_readonly_server': None,
258
'transport_server': None,
259
'vfs_transport_factory': 'vfs'}),
261
{'bzrdir_format': 'd',
262
'repository_format': 'c',
263
'transport_readonly_server': None,
264
'transport_server': None,
265
'vfs_transport_factory': 'vfs'})],
268
def test_formats_to_scenarios(self):
269
"""The adapter can generate all the scenarios needed."""
270
from bzrlib.tests.repository_implementations import RepositoryTestProviderAdapter
271
no_vfs_adapter = RepositoryTestProviderAdapter("server", "readonly",
273
vfs_adapter = RepositoryTestProviderAdapter("server", "readonly",
274
[], vfs_transport_factory="vfs")
275
# no_vfs generate scenarios without vfs_transport_factor
276
formats = [("c", "C"), (1, "D")]
279
{'bzrdir_format': 'C',
280
'repository_format': 'c',
226
# no_vfs generate scenarios without vfs_transport_factory
228
('RemoteRepositoryFormat(c)',
229
{'bzrdir_format': remote.RemoteBzrDirFormat(),
230
'repository_format': remote.RemoteRepositoryFormat(),
281
231
'transport_readonly_server': 'readonly',
282
232
'transport_server': 'server'}),
284
{'bzrdir_format': 'D',
285
'repository_format': 1,
233
('RepositoryFormat2a(d)',
234
{'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
235
'repository_format': groupcompress_repo.RepositoryFormat2a(),
286
236
'transport_readonly_server': 'readonly',
287
'transport_server': 'server'})],
288
no_vfs_adapter.formats_to_scenarios(formats))
237
'transport_server': 'server'})]
238
self.assertEqual(expected, no_vfs_scenarios)
289
239
self.assertEqual([
291
{'bzrdir_format': 'C',
292
'repository_format': 'c',
240
('RemoteRepositoryFormat(c)',
241
{'bzrdir_format': remote.RemoteBzrDirFormat(),
242
'repository_format': remote.RemoteRepositoryFormat(),
293
243
'transport_readonly_server': 'readonly',
294
244
'transport_server': 'server',
295
245
'vfs_transport_factory': 'vfs'}),
297
{'bzrdir_format': 'D',
298
'repository_format': 1,
246
('RepositoryFormat2a(d)',
247
{'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
248
'repository_format': groupcompress_repo.RepositoryFormat2a(),
299
249
'transport_readonly_server': 'readonly',
300
250
'transport_server': 'server',
301
251
'vfs_transport_factory': 'vfs'})],
302
vfs_adapter.formats_to_scenarios(formats))
305
class TestTestScenarioApplier(TestCase):
255
class TestTestScenarioApplication(tests.TestCase):
306
256
"""Tests for the test adaption facilities."""
308
def test_adapt_applies_scenarios(self):
309
from bzrlib.tests.repository_implementations import TestScenarioApplier
310
input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
311
adapter = TestScenarioApplier()
312
adapter.scenarios = [("1", "dict"), ("2", "settings")]
314
def capture_call(test, scenario):
315
calls.append((test, scenario))
317
adapter.adapt_test_to_scenario = capture_call
318
adapter.adapt(input_test)
319
self.assertEqual([(input_test, ("1", "dict")),
320
(input_test, ("2", "settings"))], calls)
322
def test_adapt_test_to_scenario(self):
323
from bzrlib.tests.repository_implementations import TestScenarioApplier
324
input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
325
adapter = TestScenarioApplier()
258
def test_apply_scenario(self):
259
from bzrlib.tests import apply_scenario
260
input_test = TestTestScenarioApplication("test_apply_scenario")
326
261
# setup two adapted tests
327
adapted_test1 = adapter.adapt_test_to_scenario(input_test,
262
adapted_test1 = apply_scenario(input_test,
329
264
{"bzrdir_format":"bzr_format",
330
265
"repository_format":"repo_fmt",
331
266
"transport_server":"transport_server",
332
267
"transport_readonly_server":"readonly-server"}))
333
adapted_test2 = adapter.adapt_test_to_scenario(input_test,
268
adapted_test2 = apply_scenario(input_test,
334
269
("new id 2", {"bzrdir_format":None}))
335
270
# input_test should have been altered.
336
271
self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
337
# the new tests are mutually incompatible, ensuring it has
272
# the new tests are mutually incompatible, ensuring it has
338
273
# made new ones, and unspecified elements in the scenario
339
274
# should not have been altered.
340
275
self.assertEqual("bzr_format", adapted_test1.bzrdir_format)
343
278
self.assertEqual("readonly-server",
344
279
adapted_test1.transport_readonly_server)
345
280
self.assertEqual(
346
"bzrlib.tests.test_selftest.TestTestScenarioApplier."
347
"test_adapt_test_to_scenario(new id)",
281
"bzrlib.tests.test_selftest.TestTestScenarioApplication."
282
"test_apply_scenario(new id)",
348
283
adapted_test1.id())
349
284
self.assertEqual(None, adapted_test2.bzrdir_format)
350
285
self.assertEqual(
351
"bzrlib.tests.test_selftest.TestTestScenarioApplier."
352
"test_adapt_test_to_scenario(new id 2)",
286
"bzrlib.tests.test_selftest.TestTestScenarioApplication."
287
"test_apply_scenario(new id 2)",
353
288
adapted_test2.id())
356
class TestInterRepositoryProviderAdapter(TestCase):
357
"""A group of tests that test the InterRepository test adapter."""
291
class TestInterRepositoryScenarios(tests.TestCase):
359
def test_adapted_tests(self):
293
def test_scenarios(self):
360
294
# check that constructor parameters are passed through to the adapted
362
from bzrlib.tests.interrepository_implementations import \
363
InterRepositoryTestProviderAdapter
296
from bzrlib.tests.per_interrepository import make_scenarios
366
formats = [(str, "C1", "C2"), (int, "D1", "D2")]
367
adapter = InterRepositoryTestProviderAdapter(server1, server2, formats)
299
formats = [("C0", "C1", "C2"), ("D0", "D1", "D2")]
300
scenarios = make_scenarios(server1, server2, formats)
368
301
self.assertEqual([
370
{'interrepo_class': str,
371
'repository_format': 'C1',
303
{'repository_format': 'C1',
372
304
'repository_format_to': 'C2',
373
305
'transport_readonly_server': 'b',
374
306
'transport_server': 'a'}),
376
{'interrepo_class': int,
377
'repository_format': 'D1',
308
{'repository_format': 'D1',
378
309
'repository_format_to': 'D2',
379
310
'transport_readonly_server': 'b',
380
311
'transport_server': 'a'})],
381
adapter.formats_to_scenarios(formats))
384
class TestInterVersionedFileProviderAdapter(TestCase):
385
"""A group of tests that test the InterVersionedFile test adapter."""
387
def test_scenarios(self):
388
# check that constructor parameters are passed through to the adapted
390
from bzrlib.tests.interversionedfile_implementations \
391
import InterVersionedFileTestProviderAdapter
394
formats = [(str, "C1", "C2"), (int, "D1", "D2")]
395
adapter = InterVersionedFileTestProviderAdapter(server1, server2, formats)
398
{'interversionedfile_class':str,
399
'transport_readonly_server': 'b',
400
'transport_server': 'a',
401
'versionedfile_factory': 'C1',
402
'versionedfile_factory_to': 'C2'}),
404
{'interversionedfile_class': int,
405
'transport_readonly_server': 'b',
406
'transport_server': 'a',
407
'versionedfile_factory': 'D1',
408
'versionedfile_factory_to': 'D2'})],
412
class TestRevisionStoreProviderAdapter(TestCase):
413
"""A group of tests that test the RevisionStore test adapter."""
415
def test_scenarios(self):
416
# check that constructor parameters are passed through to the adapted
418
from bzrlib.tests.revisionstore_implementations \
419
import RevisionStoreTestProviderAdapter
420
# revision stores need a store factory - i.e. RevisionKnit
421
#, a readonly and rw transport
425
store_factories = ["c", "d"]
426
adapter = RevisionStoreTestProviderAdapter(server1, server2, store_factories)
429
{'store_factory': 'c',
430
'transport_readonly_server': 'b',
431
'transport_server': 'a'}),
433
{'store_factory': 'd',
434
'transport_readonly_server': 'b',
435
'transport_server': 'a'})],
439
class TestWorkingTreeProviderAdapter(TestCase):
440
"""A group of tests that test the workingtree implementation test adapter."""
442
def test_scenarios(self):
443
# check that constructor parameters are passed through to the adapted
445
from bzrlib.tests.workingtree_implementations \
446
import WorkingTreeTestProviderAdapter
449
formats = [("c", "C"), ("d", "D")]
450
adapter = WorkingTreeTestProviderAdapter(server1, server2, formats)
453
{'bzrdir_format': 'C',
454
'transport_readonly_server': 'b',
455
'transport_server': 'a',
456
'workingtree_format': 'c'}),
458
{'bzrdir_format': 'D',
459
'transport_readonly_server': 'b',
460
'transport_server': 'a',
461
'workingtree_format': 'd'})],
465
class TestTreeProviderAdapter(TestCase):
466
"""Test the setup of tree_implementation tests."""
468
def test_adapted_tests(self):
469
# the tree implementation adapter is meant to setup one instance for
470
# each working tree format, and one additional instance that will
471
# use the default wt format, but create a revision tree for the tests.
472
# this means that the wt ones should have the workingtree_to_test_tree
473
# attribute set to 'return_parameter' and the revision one set to
474
# revision_tree_from_workingtree.
476
from bzrlib.tests.tree_implementations import (
477
TreeTestProviderAdapter,
315
class TestWorkingTreeScenarios(tests.TestCase):
317
def test_scenarios(self):
318
# check that constructor parameters are passed through to the adapted
320
from bzrlib.tests.per_workingtree import make_scenarios
323
formats = [workingtree.WorkingTreeFormat2(),
324
workingtree.WorkingTreeFormat3(),]
325
scenarios = make_scenarios(server1, server2, formats)
327
('WorkingTreeFormat2',
328
{'bzrdir_format': formats[0]._matchingbzrdir,
329
'transport_readonly_server': 'b',
330
'transport_server': 'a',
331
'workingtree_format': formats[0]}),
332
('WorkingTreeFormat3',
333
{'bzrdir_format': formats[1]._matchingbzrdir,
334
'transport_readonly_server': 'b',
335
'transport_server': 'a',
336
'workingtree_format': formats[1]})],
340
class TestTreeScenarios(tests.TestCase):
342
def test_scenarios(self):
343
# the tree implementation scenario generator is meant to setup one
344
# instance for each working tree format, and one additional instance
345
# that will use the default wt format, but create a revision tree for
346
# the tests. this means that the wt ones should have the
347
# workingtree_to_test_tree attribute set to 'return_parameter' and the
348
# revision one set to revision_tree_from_workingtree.
350
from bzrlib.tests.per_tree import (
351
_dirstate_tree_from_workingtree,
478
355
return_parameter,
479
356
revision_tree_from_workingtree
481
from bzrlib.workingtree import WorkingTreeFormat, WorkingTreeFormat3
482
input_test = TestTreeProviderAdapter(
483
"test_adapted_tests")
486
formats = [("c", "C"), ("d", "D")]
487
adapter = TreeTestProviderAdapter(server1, server2, formats)
488
suite = adapter.adapt(input_test)
489
tests = list(iter(suite))
490
self.assertEqual(4, len(tests))
491
# this must match the default format setp up in
492
# TreeTestProviderAdapter.adapt
493
default_format = WorkingTreeFormat3
494
self.assertEqual(tests[0].workingtree_format, formats[0][0])
495
self.assertEqual(tests[0].bzrdir_format, formats[0][1])
496
self.assertEqual(tests[0].transport_server, server1)
497
self.assertEqual(tests[0].transport_readonly_server, server2)
498
self.assertEqual(tests[0].workingtree_to_test_tree, return_parameter)
499
self.assertEqual(tests[1].workingtree_format, formats[1][0])
500
self.assertEqual(tests[1].bzrdir_format, formats[1][1])
501
self.assertEqual(tests[1].transport_server, server1)
502
self.assertEqual(tests[1].transport_readonly_server, server2)
503
self.assertEqual(tests[1].workingtree_to_test_tree, return_parameter)
504
self.assertIsInstance(tests[2].workingtree_format, default_format)
505
#self.assertEqual(tests[2].bzrdir_format,
506
# default_format._matchingbzrdir)
507
self.assertEqual(tests[2].transport_server, server1)
508
self.assertEqual(tests[2].transport_readonly_server, server2)
509
self.assertEqual(tests[2].workingtree_to_test_tree,
510
revision_tree_from_workingtree)
513
class TestInterTreeProviderAdapter(TestCase):
360
formats = [workingtree.WorkingTreeFormat2(),
361
workingtree.WorkingTreeFormat3(),]
362
scenarios = make_scenarios(server1, server2, formats)
363
self.assertEqual(7, len(scenarios))
364
default_wt_format = workingtree.WorkingTreeFormat4._default_format
365
wt4_format = workingtree.WorkingTreeFormat4()
366
wt5_format = workingtree.WorkingTreeFormat5()
367
expected_scenarios = [
368
('WorkingTreeFormat2',
369
{'bzrdir_format': formats[0]._matchingbzrdir,
370
'transport_readonly_server': 'b',
371
'transport_server': 'a',
372
'workingtree_format': formats[0],
373
'_workingtree_to_test_tree': return_parameter,
375
('WorkingTreeFormat3',
376
{'bzrdir_format': formats[1]._matchingbzrdir,
377
'transport_readonly_server': 'b',
378
'transport_server': 'a',
379
'workingtree_format': formats[1],
380
'_workingtree_to_test_tree': return_parameter,
383
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
384
'bzrdir_format': default_wt_format._matchingbzrdir,
385
'transport_readonly_server': 'b',
386
'transport_server': 'a',
387
'workingtree_format': default_wt_format,
389
('DirStateRevisionTree,WT4',
390
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
391
'bzrdir_format': wt4_format._matchingbzrdir,
392
'transport_readonly_server': 'b',
393
'transport_server': 'a',
394
'workingtree_format': wt4_format,
396
('DirStateRevisionTree,WT5',
397
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
398
'bzrdir_format': wt5_format._matchingbzrdir,
399
'transport_readonly_server': 'b',
400
'transport_server': 'a',
401
'workingtree_format': wt5_format,
404
{'_workingtree_to_test_tree': preview_tree_pre,
405
'bzrdir_format': default_wt_format._matchingbzrdir,
406
'transport_readonly_server': 'b',
407
'transport_server': 'a',
408
'workingtree_format': default_wt_format}),
410
{'_workingtree_to_test_tree': preview_tree_post,
411
'bzrdir_format': default_wt_format._matchingbzrdir,
412
'transport_readonly_server': 'b',
413
'transport_server': 'a',
414
'workingtree_format': default_wt_format}),
416
self.assertEqual(expected_scenarios, scenarios)
419
class TestInterTreeScenarios(tests.TestCase):
514
420
"""A group of tests that test the InterTreeTestAdapter."""
516
def test_adapted_tests(self):
422
def test_scenarios(self):
517
423
# check that constructor parameters are passed through to the adapted
519
425
# for InterTree tests we want the machinery to bring up two trees in
521
427
# because each optimiser can be direction specific, we need to test
522
428
# each optimiser in its chosen direction.
523
429
# unlike the TestProviderAdapter we dont want to automatically add a
524
# parameterised one for WorkingTree - the optimisers will tell us what
430
# parameterized one for WorkingTree - the optimisers will tell us what
526
from bzrlib.tests.tree_implementations import (
432
from bzrlib.tests.per_tree import (
527
433
return_parameter,
528
434
revision_tree_from_workingtree
530
from bzrlib.tests.intertree_implementations import (
531
InterTreeTestProviderAdapter,
436
from bzrlib.tests.per_intertree import (
533
439
from bzrlib.workingtree import WorkingTreeFormat2, WorkingTreeFormat3
534
input_test = TestInterTreeProviderAdapter(
535
"test_adapted_tests")
440
input_test = TestInterTreeScenarios(
538
444
format1 = WorkingTreeFormat2()
539
445
format2 = WorkingTreeFormat3()
540
formats = [(str, format1, format2, "converter1"),
541
(int, format2, format1, "converter2")]
542
adapter = InterTreeTestProviderAdapter(server1, server2, formats)
543
suite = adapter.adapt(input_test)
544
tests = list(iter(suite))
545
self.assertEqual(2, len(tests))
546
self.assertEqual(tests[0].intertree_class, formats[0][0])
547
self.assertEqual(tests[0].workingtree_format, formats[0][1])
548
self.assertEqual(tests[0].workingtree_format_to, formats[0][2])
549
self.assertEqual(tests[0].mutable_trees_to_test_trees, formats[0][3])
550
self.assertEqual(tests[0].workingtree_to_test_tree, return_parameter)
551
self.assertEqual(tests[0].transport_server, server1)
552
self.assertEqual(tests[0].transport_readonly_server, server2)
553
self.assertEqual(tests[1].intertree_class, formats[1][0])
554
self.assertEqual(tests[1].workingtree_format, formats[1][1])
555
self.assertEqual(tests[1].workingtree_format_to, formats[1][2])
556
self.assertEqual(tests[1].mutable_trees_to_test_trees, formats[1][3])
557
self.assertEqual(tests[1].workingtree_to_test_tree, return_parameter)
558
self.assertEqual(tests[1].transport_server, server1)
559
self.assertEqual(tests[1].transport_readonly_server, server2)
562
class TestTestCaseInTempDir(TestCaseInTempDir):
446
formats = [("1", str, format1, format2, "converter1"),
447
("2", int, format2, format1, "converter2")]
448
scenarios = make_scenarios(server1, server2, formats)
449
self.assertEqual(2, len(scenarios))
450
expected_scenarios = [
452
"bzrdir_format": format1._matchingbzrdir,
453
"intertree_class": formats[0][1],
454
"workingtree_format": formats[0][2],
455
"workingtree_format_to": formats[0][3],
456
"mutable_trees_to_test_trees": formats[0][4],
457
"_workingtree_to_test_tree": return_parameter,
458
"transport_server": server1,
459
"transport_readonly_server": server2,
462
"bzrdir_format": format2._matchingbzrdir,
463
"intertree_class": formats[1][1],
464
"workingtree_format": formats[1][2],
465
"workingtree_format_to": formats[1][3],
466
"mutable_trees_to_test_trees": formats[1][4],
467
"_workingtree_to_test_tree": return_parameter,
468
"transport_server": server1,
469
"transport_readonly_server": server2,
472
self.assertEqual(scenarios, expected_scenarios)
475
class TestTestCaseInTempDir(tests.TestCaseInTempDir):
564
477
def test_home_is_not_working(self):
565
478
self.assertNotEqual(self.test_dir, self.test_home_dir)
566
479
cwd = osutils.getcwd()
567
self.assertEqual(self.test_dir, cwd)
568
self.assertEqual(self.test_home_dir, os.environ['HOME'])
571
class TestTestCaseWithMemoryTransport(TestCaseWithMemoryTransport):
480
self.assertIsSameRealPath(self.test_dir, cwd)
481
self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
483
def test_assertEqualStat_equal(self):
484
from bzrlib.tests.test_dirstate import _FakeStat
485
self.build_tree(["foo"])
486
real = os.lstat("foo")
487
fake = _FakeStat(real.st_size, real.st_mtime, real.st_ctime,
488
real.st_dev, real.st_ino, real.st_mode)
489
self.assertEqualStat(real, fake)
491
def test_assertEqualStat_notequal(self):
492
self.build_tree(["foo", "bar"])
493
self.assertRaises(AssertionError, self.assertEqualStat,
494
os.lstat("foo"), os.lstat("bar"))
497
class TestTestCaseWithMemoryTransport(tests.TestCaseWithMemoryTransport):
573
499
def test_home_is_non_existant_dir_under_root(self):
574
500
"""The test_home_dir for TestCaseWithMemoryTransport is missing.
576
502
This is because TestCaseWithMemoryTransport is for tests that do not
577
need any disk resources: they should be hooked into bzrlib in such a
578
way that no global settings are being changed by the test (only a
503
need any disk resources: they should be hooked into bzrlib in such a
504
way that no global settings are being changed by the test (only a
579
505
few tests should need to do that), and having a missing dir as home is
580
506
an effective way to ensure that this is the case.
582
self.assertEqual(self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
508
self.assertIsSameRealPath(
509
self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
583
510
self.test_home_dir)
584
self.assertEqual(self.test_home_dir, os.environ['HOME'])
511
self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
586
513
def test_cwd_is_TEST_ROOT(self):
587
self.assertEqual(self.test_dir, self.TEST_ROOT)
514
self.assertIsSameRealPath(self.test_dir, self.TEST_ROOT)
588
515
cwd = osutils.getcwd()
589
self.assertEqual(self.test_dir, cwd)
516
self.assertIsSameRealPath(self.test_dir, cwd)
591
518
def test_make_branch_and_memory_tree(self):
592
519
"""In TestCaseWithMemoryTransport we should not make the branch on disk.
1260
1262
self.assertEqual(log, test._log_contents)
1263
class SampleTestCase(TestCase):
1265
class SampleTestCase(tests.TestCase):
1265
1267
def _test_pass(self):
1269
class TestTestCase(TestCase):
1270
class _TestException(Exception):
1274
class TestTestCase(tests.TestCase):
1270
1275
"""Tests that test the core bzrlib TestCase."""
1277
def test_assertLength_matches_empty(self):
1279
self.assertLength(0, a_list)
1281
def test_assertLength_matches_nonempty(self):
1283
self.assertLength(3, a_list)
1285
def test_assertLength_fails_different(self):
1287
self.assertRaises(AssertionError, self.assertLength, 1, a_list)
1289
def test_assertLength_shows_sequence_in_failure(self):
1291
exception = self.assertRaises(AssertionError, self.assertLength, 2,
1293
self.assertEqual('Incorrect length: wanted 2, got 3 for [1, 2, 3]',
1296
def test_base_setUp_not_called_causes_failure(self):
1297
class TestCaseWithBrokenSetUp(tests.TestCase):
1299
pass # does not call TestCase.setUp
1302
test = TestCaseWithBrokenSetUp('test_foo')
1303
result = unittest.TestResult()
1305
self.assertFalse(result.wasSuccessful())
1306
self.assertEqual(1, result.testsRun)
1308
def test_base_tearDown_not_called_causes_failure(self):
1309
class TestCaseWithBrokenTearDown(tests.TestCase):
1311
pass # does not call TestCase.tearDown
1314
test = TestCaseWithBrokenTearDown('test_foo')
1315
result = unittest.TestResult()
1317
self.assertFalse(result.wasSuccessful())
1318
self.assertEqual(1, result.testsRun)
1272
1320
def test_debug_flags_sanitised(self):
1273
1321
"""The bzrlib debug flags should be sanitised by setUp."""
1322
if 'allow_debug' in tests.selftest_debug_flags:
1323
raise tests.TestNotApplicable(
1324
'-Eallow_debug option prevents debug flag sanitisation')
1274
1325
# we could set something and run a test that will check
1275
1326
# it gets santised, but this is probably sufficient for now:
1276
1327
# if someone runs the test with -Dsomething it will error.
1277
self.assertEqual(set(), bzrlib.debug.debug_flags)
1329
if self._lock_check_thorough:
1330
flags.add('strict_locks')
1331
self.assertEqual(flags, bzrlib.debug.debug_flags)
1333
def change_selftest_debug_flags(self, new_flags):
1334
orig_selftest_flags = tests.selftest_debug_flags
1335
self.addCleanup(self._restore_selftest_debug_flags, orig_selftest_flags)
1336
tests.selftest_debug_flags = set(new_flags)
1338
def _restore_selftest_debug_flags(self, flags):
1339
tests.selftest_debug_flags = flags
1341
def test_allow_debug_flag(self):
1342
"""The -Eallow_debug flag prevents bzrlib.debug.debug_flags from being
1343
sanitised (i.e. cleared) before running a test.
1345
self.change_selftest_debug_flags(set(['allow_debug']))
1346
bzrlib.debug.debug_flags = set(['a-flag'])
1347
class TestThatRecordsFlags(tests.TestCase):
1348
def test_foo(nested_self):
1349
self.flags = set(bzrlib.debug.debug_flags)
1350
test = TestThatRecordsFlags('test_foo')
1351
test.run(self.make_test_result())
1352
flags = set(['a-flag'])
1353
if 'disable_lock_checks' not in tests.selftest_debug_flags:
1354
flags.add('strict_locks')
1355
self.assertEqual(flags, self.flags)
1357
def test_disable_lock_checks(self):
1358
"""The -Edisable_lock_checks flag disables thorough checks."""
1359
class TestThatRecordsFlags(tests.TestCase):
1360
def test_foo(nested_self):
1361
self.flags = set(bzrlib.debug.debug_flags)
1362
self.test_lock_check_thorough = nested_self._lock_check_thorough
1363
self.change_selftest_debug_flags(set())
1364
test = TestThatRecordsFlags('test_foo')
1365
test.run(self.make_test_result())
1366
# By default we do strict lock checking and thorough lock/unlock
1368
self.assertTrue(self.test_lock_check_thorough)
1369
self.assertEqual(set(['strict_locks']), self.flags)
1370
# Now set the disable_lock_checks flag, and show that this changed.
1371
self.change_selftest_debug_flags(set(['disable_lock_checks']))
1372
test = TestThatRecordsFlags('test_foo')
1373
test.run(self.make_test_result())
1374
self.assertFalse(self.test_lock_check_thorough)
1375
self.assertEqual(set(), self.flags)
1377
def test_this_fails_strict_lock_check(self):
1378
class TestThatRecordsFlags(tests.TestCase):
1379
def test_foo(nested_self):
1380
self.flags1 = set(bzrlib.debug.debug_flags)
1381
self.thisFailsStrictLockCheck()
1382
self.flags2 = set(bzrlib.debug.debug_flags)
1383
# Make sure lock checking is active
1384
self.change_selftest_debug_flags(set())
1385
test = TestThatRecordsFlags('test_foo')
1386
test.run(self.make_test_result())
1387
self.assertEqual(set(['strict_locks']), self.flags1)
1388
self.assertEqual(set(), self.flags2)
1390
def test_debug_flags_restored(self):
1391
"""The bzrlib debug flags should be restored to their original state
1392
after the test was run, even if allow_debug is set.
1394
self.change_selftest_debug_flags(set(['allow_debug']))
1395
# Now run a test that modifies debug.debug_flags.
1396
bzrlib.debug.debug_flags = set(['original-state'])
1397
class TestThatModifiesFlags(tests.TestCase):
1399
bzrlib.debug.debug_flags = set(['modified'])
1400
test = TestThatModifiesFlags('test_foo')
1401
test.run(self.make_test_result())
1402
self.assertEqual(set(['original-state']), bzrlib.debug.debug_flags)
1404
def make_test_result(self):
1405
return tests.TextTestResult(self._log_file, descriptions=0, verbosity=1)
1279
1407
def inner_test(self):
1280
1408
# the inner child test
1545
1758
tree.branch.repository.bzrdir.root_transport)
1548
class TestSelftest(TestCase):
1761
class SelfTestHelper:
1763
def run_selftest(self, **kwargs):
1764
"""Run selftest returning its output."""
1766
old_transport = bzrlib.tests.default_transport
1767
old_root = tests.TestCaseWithMemoryTransport.TEST_ROOT
1768
tests.TestCaseWithMemoryTransport.TEST_ROOT = None
1770
self.assertEqual(True, tests.selftest(stream=output, **kwargs))
1772
bzrlib.tests.default_transport = old_transport
1773
tests.TestCaseWithMemoryTransport.TEST_ROOT = old_root
1778
class TestSelftest(tests.TestCase, SelfTestHelper):
1549
1779
"""Tests of bzrlib.tests.selftest."""
1551
1781
def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(self):
1552
1782
factory_called = []
1554
1784
factory_called.append(True)
1785
return TestUtil.TestSuite()
1556
1786
out = StringIO()
1557
1787
err = StringIO()
1558
self.apply_redirected(out, err, None, bzrlib.tests.selftest,
1788
self.apply_redirected(out, err, None, bzrlib.tests.selftest,
1559
1789
test_suite_factory=factory)
1560
1790
self.assertEqual([True], factory_called)
1563
class TestKnownFailure(TestCase):
1793
"""A test suite factory."""
1794
class Test(tests.TestCase):
1801
return TestUtil.TestSuite([Test("a"), Test("b"), Test("c")])
1803
def test_list_only(self):
1804
output = self.run_selftest(test_suite_factory=self.factory,
1806
self.assertEqual(3, len(output.readlines()))
1808
def test_list_only_filtered(self):
1809
output = self.run_selftest(test_suite_factory=self.factory,
1810
list_only=True, pattern="Test.b")
1811
self.assertEndsWith(output.getvalue(), "Test.b\n")
1812
self.assertLength(1, output.readlines())
1814
def test_list_only_excludes(self):
1815
output = self.run_selftest(test_suite_factory=self.factory,
1816
list_only=True, exclude_pattern="Test.b")
1817
self.assertNotContainsRe("Test.b", output.getvalue())
1818
self.assertLength(2, output.readlines())
1820
def test_random(self):
1821
# test randomising by listing a number of tests.
1822
output_123 = self.run_selftest(test_suite_factory=self.factory,
1823
list_only=True, random_seed="123")
1824
output_234 = self.run_selftest(test_suite_factory=self.factory,
1825
list_only=True, random_seed="234")
1826
self.assertNotEqual(output_123, output_234)
1827
# "Randominzing test order..\n\n
1828
self.assertLength(5, output_123.readlines())
1829
self.assertLength(5, output_234.readlines())
1831
def test_random_reuse_is_same_order(self):
1832
# test randomising by listing a number of tests.
1833
expected = self.run_selftest(test_suite_factory=self.factory,
1834
list_only=True, random_seed="123")
1835
repeated = self.run_selftest(test_suite_factory=self.factory,
1836
list_only=True, random_seed="123")
1837
self.assertEqual(expected.getvalue(), repeated.getvalue())
1839
def test_runner_class(self):
1840
self.requireFeature(SubUnitFeature)
1841
from subunit import ProtocolTestCase
1842
stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
1843
test_suite_factory=self.factory)
1844
test = ProtocolTestCase(stream)
1845
result = unittest.TestResult()
1847
self.assertEqual(3, result.testsRun)
1849
def test_starting_with_single_argument(self):
1850
output = self.run_selftest(test_suite_factory=self.factory,
1851
starting_with=['bzrlib.tests.test_selftest.Test.a'],
1853
self.assertEqual('bzrlib.tests.test_selftest.Test.a\n',
1856
def test_starting_with_multiple_argument(self):
1857
output = self.run_selftest(test_suite_factory=self.factory,
1858
starting_with=['bzrlib.tests.test_selftest.Test.a',
1859
'bzrlib.tests.test_selftest.Test.b'],
1861
self.assertEqual('bzrlib.tests.test_selftest.Test.a\n'
1862
'bzrlib.tests.test_selftest.Test.b\n',
1865
def check_transport_set(self, transport_server):
1866
captured_transport = []
1867
def seen_transport(a_transport):
1868
captured_transport.append(a_transport)
1869
class Capture(tests.TestCase):
1871
seen_transport(bzrlib.tests.default_transport)
1873
return TestUtil.TestSuite([Capture("a")])
1874
self.run_selftest(transport=transport_server, test_suite_factory=factory)
1875
self.assertEqual(transport_server, captured_transport[0])
1877
def test_transport_sftp(self):
1879
import bzrlib.transport.sftp
1880
except ParamikoNotPresent:
1881
raise TestSkipped("Paramiko not present")
1882
self.check_transport_set(bzrlib.transport.sftp.SFTPAbsoluteServer)
1884
def test_transport_memory(self):
1885
self.check_transport_set(bzrlib.transport.memory.MemoryServer)
1888
class TestSelftestWithIdList(tests.TestCaseInTempDir, SelfTestHelper):
1889
# Does IO: reads test.list
1891
def test_load_list(self):
1892
# Provide a list with one test - this test.
1893
test_id_line = '%s\n' % self.id()
1894
self.build_tree_contents([('test.list', test_id_line)])
1895
# And generate a list of the tests in the suite.
1896
stream = self.run_selftest(load_list='test.list', list_only=True)
1897
self.assertEqual(test_id_line, stream.getvalue())
1899
def test_load_unknown(self):
1900
# Provide a list with one test - this test.
1901
# And generate a list of the tests in the suite.
1902
err = self.assertRaises(errors.NoSuchFile, self.run_selftest,
1903
load_list='missing file name', list_only=True)
1906
class TestRunBzr(tests.TestCase):
1911
def _run_bzr_core(self, argv, retcode=0, encoding=None, stdin=None,
1913
"""Override _run_bzr_core to test how it is invoked by run_bzr.
1915
Attempts to run bzr from inside this class don't actually run it.
1917
We test how run_bzr actually invokes bzr in another location.
1918
Here we only need to test that it is run_bzr passes the right
1919
parameters to run_bzr.
1921
self.argv = list(argv)
1922
self.retcode = retcode
1923
self.encoding = encoding
1925
self.working_dir = working_dir
1926
return self.out, self.err
1928
def test_run_bzr_error(self):
1929
self.out = "It sure does!\n"
1930
out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=34)
1931
self.assertEqual(['rocks'], self.argv)
1932
self.assertEqual(34, self.retcode)
1933
self.assertEqual(out, 'It sure does!\n')
1935
def test_run_bzr_error_regexes(self):
1937
self.err = "bzr: ERROR: foobarbaz is not versioned"
1938
out, err = self.run_bzr_error(
1939
["bzr: ERROR: foobarbaz is not versioned"],
1940
['file-id', 'foobarbaz'])
1942
def test_encoding(self):
1943
"""Test that run_bzr passes encoding to _run_bzr_core"""
1944
self.run_bzr('foo bar')
1945
self.assertEqual(None, self.encoding)
1946
self.assertEqual(['foo', 'bar'], self.argv)
1948
self.run_bzr('foo bar', encoding='baz')
1949
self.assertEqual('baz', self.encoding)
1950
self.assertEqual(['foo', 'bar'], self.argv)
1952
def test_retcode(self):
1953
"""Test that run_bzr passes retcode to _run_bzr_core"""
1954
# Default is retcode == 0
1955
self.run_bzr('foo bar')
1956
self.assertEqual(0, self.retcode)
1957
self.assertEqual(['foo', 'bar'], self.argv)
1959
self.run_bzr('foo bar', retcode=1)
1960
self.assertEqual(1, self.retcode)
1961
self.assertEqual(['foo', 'bar'], self.argv)
1963
self.run_bzr('foo bar', retcode=None)
1964
self.assertEqual(None, self.retcode)
1965
self.assertEqual(['foo', 'bar'], self.argv)
1967
self.run_bzr(['foo', 'bar'], retcode=3)
1968
self.assertEqual(3, self.retcode)
1969
self.assertEqual(['foo', 'bar'], self.argv)
1971
def test_stdin(self):
1972
# test that the stdin keyword to run_bzr is passed through to
1973
# _run_bzr_core as-is. We do this by overriding
1974
# _run_bzr_core in this class, and then calling run_bzr,
1975
# which is a convenience function for _run_bzr_core, so
1977
self.run_bzr('foo bar', stdin='gam')
1978
self.assertEqual('gam', self.stdin)
1979
self.assertEqual(['foo', 'bar'], self.argv)
1981
self.run_bzr('foo bar', stdin='zippy')
1982
self.assertEqual('zippy', self.stdin)
1983
self.assertEqual(['foo', 'bar'], self.argv)
1985
def test_working_dir(self):
1986
"""Test that run_bzr passes working_dir to _run_bzr_core"""
1987
self.run_bzr('foo bar')
1988
self.assertEqual(None, self.working_dir)
1989
self.assertEqual(['foo', 'bar'], self.argv)
1991
self.run_bzr('foo bar', working_dir='baz')
1992
self.assertEqual('baz', self.working_dir)
1993
self.assertEqual(['foo', 'bar'], self.argv)
1995
def test_reject_extra_keyword_arguments(self):
1996
self.assertRaises(TypeError, self.run_bzr, "foo bar",
1997
error_regex=['error message'])
2000
class TestRunBzrCaptured(tests.TestCaseWithTransport):
2001
# Does IO when testing the working_dir parameter.
2003
def apply_redirected(self, stdin=None, stdout=None, stderr=None,
2004
a_callable=None, *args, **kwargs):
2006
self.factory_stdin = getattr(bzrlib.ui.ui_factory, "stdin", None)
2007
self.factory = bzrlib.ui.ui_factory
2008
self.working_dir = osutils.getcwd()
2009
stdout.write('foo\n')
2010
stderr.write('bar\n')
2013
def test_stdin(self):
2014
# test that the stdin keyword to _run_bzr_core is passed through to
2015
# apply_redirected as a StringIO. We do this by overriding
2016
# apply_redirected in this class, and then calling _run_bzr_core,
2017
# which calls apply_redirected.
2018
self.run_bzr(['foo', 'bar'], stdin='gam')
2019
self.assertEqual('gam', self.stdin.read())
2020
self.assertTrue(self.stdin is self.factory_stdin)
2021
self.run_bzr(['foo', 'bar'], stdin='zippy')
2022
self.assertEqual('zippy', self.stdin.read())
2023
self.assertTrue(self.stdin is self.factory_stdin)
2025
def test_ui_factory(self):
2026
# each invocation of self.run_bzr should get its
2027
# own UI factory, which is an instance of TestUIFactory,
2028
# with stdin, stdout and stderr attached to the stdin,
2029
# stdout and stderr of the invoked run_bzr
2030
current_factory = bzrlib.ui.ui_factory
2031
self.run_bzr(['foo'])
2032
self.failIf(current_factory is self.factory)
2033
self.assertNotEqual(sys.stdout, self.factory.stdout)
2034
self.assertNotEqual(sys.stderr, self.factory.stderr)
2035
self.assertEqual('foo\n', self.factory.stdout.getvalue())
2036
self.assertEqual('bar\n', self.factory.stderr.getvalue())
2037
self.assertIsInstance(self.factory, tests.TestUIFactory)
2039
def test_working_dir(self):
2040
self.build_tree(['one/', 'two/'])
2041
cwd = osutils.getcwd()
2043
# Default is to work in the current directory
2044
self.run_bzr(['foo', 'bar'])
2045
self.assertEqual(cwd, self.working_dir)
2047
self.run_bzr(['foo', 'bar'], working_dir=None)
2048
self.assertEqual(cwd, self.working_dir)
2050
# The function should be run in the alternative directory
2051
# but afterwards the current working dir shouldn't be changed
2052
self.run_bzr(['foo', 'bar'], working_dir='one')
2053
self.assertNotEqual(cwd, self.working_dir)
2054
self.assertEndsWith(self.working_dir, 'one')
2055
self.assertEqual(cwd, osutils.getcwd())
2057
self.run_bzr(['foo', 'bar'], working_dir='two')
2058
self.assertNotEqual(cwd, self.working_dir)
2059
self.assertEndsWith(self.working_dir, 'two')
2060
self.assertEqual(cwd, osutils.getcwd())
2063
class StubProcess(object):
2064
"""A stub process for testing run_bzr_subprocess."""
2066
def __init__(self, out="", err="", retcode=0):
2069
self.returncode = retcode
2071
def communicate(self):
2072
return self.out, self.err
2075
class TestRunBzrSubprocess(tests.TestCaseWithTransport):
2078
tests.TestCaseWithTransport.setUp(self)
2079
self.subprocess_calls = []
2081
def start_bzr_subprocess(self, process_args, env_changes=None,
2082
skip_if_plan_to_signal=False,
2084
allow_plugins=False):
2085
"""capture what run_bzr_subprocess tries to do."""
2086
self.subprocess_calls.append({'process_args':process_args,
2087
'env_changes':env_changes,
2088
'skip_if_plan_to_signal':skip_if_plan_to_signal,
2089
'working_dir':working_dir, 'allow_plugins':allow_plugins})
2090
return self.next_subprocess
2092
def assertRunBzrSubprocess(self, expected_args, process, *args, **kwargs):
2093
"""Run run_bzr_subprocess with args and kwargs using a stubbed process.
2095
Inside TestRunBzrSubprocessCommands we use a stub start_bzr_subprocess
2096
that will return static results. This assertion method populates those
2097
results and also checks the arguments run_bzr_subprocess generates.
2099
self.next_subprocess = process
2101
result = self.run_bzr_subprocess(*args, **kwargs)
2103
self.next_subprocess = None
2104
for key, expected in expected_args.iteritems():
2105
self.assertEqual(expected, self.subprocess_calls[-1][key])
2108
self.next_subprocess = None
2109
for key, expected in expected_args.iteritems():
2110
self.assertEqual(expected, self.subprocess_calls[-1][key])
2113
def test_run_bzr_subprocess(self):
2114
"""The run_bzr_helper_external command behaves nicely."""
2115
self.assertRunBzrSubprocess({'process_args':['--version']},
2116
StubProcess(), '--version')
2117
self.assertRunBzrSubprocess({'process_args':['--version']},
2118
StubProcess(), ['--version'])
2119
# retcode=None disables retcode checking
2120
result = self.assertRunBzrSubprocess({},
2121
StubProcess(retcode=3), '--version', retcode=None)
2122
result = self.assertRunBzrSubprocess({},
2123
StubProcess(out="is free software"), '--version')
2124
self.assertContainsRe(result[0], 'is free software')
2125
# Running a subcommand that is missing errors
2126
self.assertRaises(AssertionError, self.assertRunBzrSubprocess,
2127
{'process_args':['--versionn']}, StubProcess(retcode=3),
2129
# Unless it is told to expect the error from the subprocess
2130
result = self.assertRunBzrSubprocess({},
2131
StubProcess(retcode=3), '--versionn', retcode=3)
2132
# Or to ignore retcode checking
2133
result = self.assertRunBzrSubprocess({},
2134
StubProcess(err="unknown command", retcode=3), '--versionn',
2136
self.assertContainsRe(result[1], 'unknown command')
2138
def test_env_change_passes_through(self):
2139
self.assertRunBzrSubprocess(
2140
{'env_changes':{'new':'value', 'changed':'newvalue', 'deleted':None}},
2142
env_changes={'new':'value', 'changed':'newvalue', 'deleted':None})
2144
def test_no_working_dir_passed_as_None(self):
2145
self.assertRunBzrSubprocess({'working_dir': None}, StubProcess(), '')
2147
def test_no_working_dir_passed_through(self):
2148
self.assertRunBzrSubprocess({'working_dir': 'dir'}, StubProcess(), '',
2151
def test_run_bzr_subprocess_no_plugins(self):
2152
self.assertRunBzrSubprocess({'allow_plugins': False},
2155
def test_allow_plugins(self):
2156
self.assertRunBzrSubprocess({'allow_plugins': True},
2157
StubProcess(), '', allow_plugins=True)
2160
class _DontSpawnProcess(Exception):
2161
"""A simple exception which just allows us to skip unnecessary steps"""
2164
class TestStartBzrSubProcess(tests.TestCase):
2166
def check_popen_state(self):
2167
"""Replace to make assertions when popen is called."""
2169
def _popen(self, *args, **kwargs):
2170
"""Record the command that is run, so that we can ensure it is correct"""
2171
self.check_popen_state()
2172
self._popen_args = args
2173
self._popen_kwargs = kwargs
2174
raise _DontSpawnProcess()
2176
def test_run_bzr_subprocess_no_plugins(self):
2177
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [])
2178
command = self._popen_args[0]
2179
self.assertEqual(sys.executable, command[0])
2180
self.assertEqual(self.get_bzr_path(), command[1])
2181
self.assertEqual(['--no-plugins'], command[2:])
2183
def test_allow_plugins(self):
2184
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2186
command = self._popen_args[0]
2187
self.assertEqual([], command[2:])
2189
def test_set_env(self):
2190
self.failIf('EXISTANT_ENV_VAR' in os.environ)
2192
def check_environment():
2193
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2194
self.check_popen_state = check_environment
2195
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2196
env_changes={'EXISTANT_ENV_VAR':'set variable'})
2197
# not set in theparent
2198
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2200
def test_run_bzr_subprocess_env_del(self):
2201
"""run_bzr_subprocess can remove environment variables too."""
2202
self.failIf('EXISTANT_ENV_VAR' in os.environ)
2203
def check_environment():
2204
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2205
os.environ['EXISTANT_ENV_VAR'] = 'set variable'
2206
self.check_popen_state = check_environment
2207
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2208
env_changes={'EXISTANT_ENV_VAR':None})
2209
# Still set in parent
2210
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2211
del os.environ['EXISTANT_ENV_VAR']
2213
def test_env_del_missing(self):
2214
self.failIf('NON_EXISTANT_ENV_VAR' in os.environ)
2215
def check_environment():
2216
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2217
self.check_popen_state = check_environment
2218
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2219
env_changes={'NON_EXISTANT_ENV_VAR':None})
2221
def test_working_dir(self):
2222
"""Test that we can specify the working dir for the child"""
2223
orig_getcwd = osutils.getcwd
2224
orig_chdir = os.chdir
2232
osutils.getcwd = getcwd
2234
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2237
osutils.getcwd = orig_getcwd
2239
os.chdir = orig_chdir
2240
self.assertEqual(['foo', 'current'], chdirs)
2243
class TestBzrSubprocess(tests.TestCaseWithTransport):
2245
def test_start_and_stop_bzr_subprocess(self):
2246
"""We can start and perform other test actions while that process is
2249
process = self.start_bzr_subprocess(['--version'])
2250
result = self.finish_bzr_subprocess(process)
2251
self.assertContainsRe(result[0], 'is free software')
2252
self.assertEqual('', result[1])
2254
def test_start_and_stop_bzr_subprocess_with_error(self):
2255
"""finish_bzr_subprocess allows specification of the desired exit code.
2257
process = self.start_bzr_subprocess(['--versionn'])
2258
result = self.finish_bzr_subprocess(process, retcode=3)
2259
self.assertEqual('', result[0])
2260
self.assertContainsRe(result[1], 'unknown command')
2262
def test_start_and_stop_bzr_subprocess_ignoring_retcode(self):
2263
"""finish_bzr_subprocess allows the exit code to be ignored."""
2264
process = self.start_bzr_subprocess(['--versionn'])
2265
result = self.finish_bzr_subprocess(process, retcode=None)
2266
self.assertEqual('', result[0])
2267
self.assertContainsRe(result[1], 'unknown command')
2269
def test_start_and_stop_bzr_subprocess_with_unexpected_retcode(self):
2270
"""finish_bzr_subprocess raises self.failureException if the retcode is
2271
not the expected one.
2273
process = self.start_bzr_subprocess(['--versionn'])
2274
self.assertRaises(self.failureException, self.finish_bzr_subprocess,
2277
def test_start_and_stop_bzr_subprocess_send_signal(self):
2278
"""finish_bzr_subprocess raises self.failureException if the retcode is
2279
not the expected one.
2281
process = self.start_bzr_subprocess(['wait-until-signalled'],
2282
skip_if_plan_to_signal=True)
2283
self.assertEqual('running\n', process.stdout.readline())
2284
result = self.finish_bzr_subprocess(process, send_signal=signal.SIGINT,
2286
self.assertEqual('', result[0])
2287
self.assertEqual('bzr: interrupted\n', result[1])
2289
def test_start_and_stop_working_dir(self):
2290
cwd = osutils.getcwd()
2291
self.make_branch_and_tree('one')
2292
process = self.start_bzr_subprocess(['root'], working_dir='one')
2293
result = self.finish_bzr_subprocess(process, universal_newlines=True)
2294
self.assertEndsWith(result[0], 'one\n')
2295
self.assertEqual('', result[1])
2298
class TestKnownFailure(tests.TestCase):
1565
2300
def test_known_failure(self):
1566
2301
"""Check that KnownFailure is defined appropriately."""
1567
2302
# a KnownFailure is an assertion error for compatability with unaware
1569
self.assertIsInstance(KnownFailure(""), AssertionError)
2304
self.assertIsInstance(tests.KnownFailure(""), AssertionError)
1571
2306
def test_expect_failure(self):
1573
2308
self.expectFailure("Doomed to failure", self.assertTrue, False)
1574
except KnownFailure, e:
2309
except tests.KnownFailure, e:
1575
2310
self.assertEqual('Doomed to failure', e.args[0])
1577
2312
self.expectFailure("Doomed to failure", self.assertTrue, True)
1610
2345
def test_default_str(self):
1611
2346
"""Feature.__str__ should default to __class__.__name__."""
1612
class NamedFeature(Feature):
2347
class NamedFeature(tests.Feature):
1614
2349
feature = NamedFeature()
1615
2350
self.assertEqual('NamedFeature', str(feature))
1618
class TestUnavailableFeature(TestCase):
2353
class TestUnavailableFeature(tests.TestCase):
1620
2355
def test_access_feature(self):
1622
exception = UnavailableFeature(feature)
2356
feature = tests.Feature()
2357
exception = tests.UnavailableFeature(feature)
1623
2358
self.assertIs(feature, exception.args[0])
1626
class TestSelftestFiltering(TestCase):
2361
class TestSelftestFiltering(tests.TestCase):
1628
2363
def setUp(self):
2364
tests.TestCase.setUp(self)
1629
2365
self.suite = TestUtil.TestSuite()
1630
2366
self.loader = TestUtil.TestLoader()
1631
self.suite.addTest(self.loader.loadTestsFromModuleNames([
1632
'bzrlib.tests.test_selftest']))
1633
self.all_names = [t.id() for t in iter_suite_tests(self.suite)]
2367
self.suite.addTest(self.loader.loadTestsFromModule(
2368
sys.modules['bzrlib.tests.test_selftest']))
2369
self.all_names = _test_ids(self.suite)
2371
def test_condition_id_re(self):
2372
test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2373
'test_condition_id_re')
2374
filtered_suite = tests.filter_suite_by_condition(
2375
self.suite, tests.condition_id_re('test_condition_id_re'))
2376
self.assertEqual([test_name], _test_ids(filtered_suite))
2378
def test_condition_id_in_list(self):
2379
test_names = ['bzrlib.tests.test_selftest.TestSelftestFiltering.'
2380
'test_condition_id_in_list']
2381
id_list = tests.TestIdList(test_names)
2382
filtered_suite = tests.filter_suite_by_condition(
2383
self.suite, tests.condition_id_in_list(id_list))
2384
my_pattern = 'TestSelftestFiltering.*test_condition_id_in_list'
2385
re_filtered = tests.filter_suite_by_re(self.suite, my_pattern)
2386
self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
2388
def test_condition_id_startswith(self):
2389
klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
2390
start1 = klass + 'test_condition_id_starts'
2391
start2 = klass + 'test_condition_id_in'
2392
test_names = [ klass + 'test_condition_id_in_list',
2393
klass + 'test_condition_id_startswith',
2395
filtered_suite = tests.filter_suite_by_condition(
2396
self.suite, tests.condition_id_startswith([start1, start2]))
2397
self.assertEqual(test_names, _test_ids(filtered_suite))
2399
def test_condition_isinstance(self):
2400
filtered_suite = tests.filter_suite_by_condition(
2401
self.suite, tests.condition_isinstance(self.__class__))
2402
class_pattern = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
2403
re_filtered = tests.filter_suite_by_re(self.suite, class_pattern)
2404
self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
2406
def test_exclude_tests_by_condition(self):
2407
excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2408
'test_exclude_tests_by_condition')
2409
filtered_suite = tests.exclude_tests_by_condition(self.suite,
2410
lambda x:x.id() == excluded_name)
2411
self.assertEqual(len(self.all_names) - 1,
2412
filtered_suite.countTestCases())
2413
self.assertFalse(excluded_name in _test_ids(filtered_suite))
2414
remaining_names = list(self.all_names)
2415
remaining_names.remove(excluded_name)
2416
self.assertEqual(remaining_names, _test_ids(filtered_suite))
2418
def test_exclude_tests_by_re(self):
2419
self.all_names = _test_ids(self.suite)
2420
filtered_suite = tests.exclude_tests_by_re(self.suite,
2421
'exclude_tests_by_re')
2422
excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2423
'test_exclude_tests_by_re')
2424
self.assertEqual(len(self.all_names) - 1,
2425
filtered_suite.countTestCases())
2426
self.assertFalse(excluded_name in _test_ids(filtered_suite))
2427
remaining_names = list(self.all_names)
2428
remaining_names.remove(excluded_name)
2429
self.assertEqual(remaining_names, _test_ids(filtered_suite))
2431
def test_filter_suite_by_condition(self):
2432
test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2433
'test_filter_suite_by_condition')
2434
filtered_suite = tests.filter_suite_by_condition(self.suite,
2435
lambda x:x.id() == test_name)
2436
self.assertEqual([test_name], _test_ids(filtered_suite))
1635
2438
def test_filter_suite_by_re(self):
1636
filtered_suite = filter_suite_by_re(self.suite, 'test_filter')
1637
filtered_names = [t.id() for t in iter_suite_tests(filtered_suite)]
2439
filtered_suite = tests.filter_suite_by_re(self.suite,
2440
'test_filter_suite_by_r')
2441
filtered_names = _test_ids(filtered_suite)
1638
2442
self.assertEqual(filtered_names, ['bzrlib.tests.test_selftest.'
1639
2443
'TestSelftestFiltering.test_filter_suite_by_re'])
1641
def test_sort_suite_by_re(self):
1642
sorted_suite = sort_suite_by_re(self.suite, 'test_filter')
1643
sorted_names = [t.id() for t in iter_suite_tests(sorted_suite)]
1644
self.assertEqual(sorted_names[0], 'bzrlib.tests.test_selftest.'
1645
'TestSelftestFiltering.test_filter_suite_by_re')
1646
self.assertEquals(sorted(self.all_names), sorted(sorted_names))
1649
class TestCheckInventoryShape(TestCaseWithTransport):
2445
def test_filter_suite_by_id_list(self):
2446
test_list = ['bzrlib.tests.test_selftest.'
2447
'TestSelftestFiltering.test_filter_suite_by_id_list']
2448
filtered_suite = tests.filter_suite_by_id_list(
2449
self.suite, tests.TestIdList(test_list))
2450
filtered_names = _test_ids(filtered_suite)
2453
['bzrlib.tests.test_selftest.'
2454
'TestSelftestFiltering.test_filter_suite_by_id_list'])
2456
def test_filter_suite_by_id_startswith(self):
2457
# By design this test may fail if another test is added whose name also
2458
# begins with one of the start value used.
2459
klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
2460
start1 = klass + 'test_filter_suite_by_id_starts'
2461
start2 = klass + 'test_filter_suite_by_id_li'
2462
test_list = [klass + 'test_filter_suite_by_id_list',
2463
klass + 'test_filter_suite_by_id_startswith',
2465
filtered_suite = tests.filter_suite_by_id_startswith(
2466
self.suite, [start1, start2])
2469
_test_ids(filtered_suite),
2472
def test_preserve_input(self):
2473
# NB: Surely this is something in the stdlib to do this?
2474
self.assertTrue(self.suite is tests.preserve_input(self.suite))
2475
self.assertTrue("@#$" is tests.preserve_input("@#$"))
2477
def test_randomize_suite(self):
2478
randomized_suite = tests.randomize_suite(self.suite)
2479
# randomizing should not add or remove test names.
2480
self.assertEqual(set(_test_ids(self.suite)),
2481
set(_test_ids(randomized_suite)))
2482
# Technically, this *can* fail, because random.shuffle(list) can be
2483
# equal to list. Trying multiple times just pushes the frequency back.
2484
# As its len(self.all_names)!:1, the failure frequency should be low
2485
# enough to ignore. RBC 20071021.
2486
# It should change the order.
2487
self.assertNotEqual(self.all_names, _test_ids(randomized_suite))
2488
# But not the length. (Possibly redundant with the set test, but not
2490
self.assertEqual(len(self.all_names), len(_test_ids(randomized_suite)))
2492
def test_split_suit_by_condition(self):
2493
self.all_names = _test_ids(self.suite)
2494
condition = tests.condition_id_re('test_filter_suite_by_r')
2495
split_suite = tests.split_suite_by_condition(self.suite, condition)
2496
filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2497
'test_filter_suite_by_re')
2498
self.assertEqual([filtered_name], _test_ids(split_suite[0]))
2499
self.assertFalse(filtered_name in _test_ids(split_suite[1]))
2500
remaining_names = list(self.all_names)
2501
remaining_names.remove(filtered_name)
2502
self.assertEqual(remaining_names, _test_ids(split_suite[1]))
2504
def test_split_suit_by_re(self):
2505
self.all_names = _test_ids(self.suite)
2506
split_suite = tests.split_suite_by_re(self.suite,
2507
'test_filter_suite_by_r')
2508
filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2509
'test_filter_suite_by_re')
2510
self.assertEqual([filtered_name], _test_ids(split_suite[0]))
2511
self.assertFalse(filtered_name in _test_ids(split_suite[1]))
2512
remaining_names = list(self.all_names)
2513
remaining_names.remove(filtered_name)
2514
self.assertEqual(remaining_names, _test_ids(split_suite[1]))
2517
class TestCheckInventoryShape(tests.TestCaseWithTransport):
1651
2519
def test_check_inventory_shape(self):
1652
2520
files = ['a', 'b/', 'b/c']
1658
2526
self.check_inventory_shape(tree.inventory, files)
2531
class TestBlackboxSupport(tests.TestCase):
2532
"""Tests for testsuite blackbox features."""
2534
def test_run_bzr_failure_not_caught(self):
2535
# When we run bzr in blackbox mode, we want any unexpected errors to
2536
# propagate up to the test suite so that it can show the error in the
2537
# usual way, and we won't get a double traceback.
2538
e = self.assertRaises(
2540
self.run_bzr, ['assert-fail'])
2541
# make sure we got the real thing, not an error from somewhere else in
2542
# the test framework
2543
self.assertEquals('always fails', str(e))
2544
# check that there's no traceback in the test log
2545
self.assertNotContainsRe(self._get_log(keep_log_file=True),
2548
def test_run_bzr_user_error_caught(self):
2549
# Running bzr in blackbox mode, normal/expected/user errors should be
2550
# caught in the regular way and turned into an error message plus exit
2552
out, err = self.run_bzr(["log", "/nonexistantpath"], retcode=3)
2553
self.assertEqual(out, '')
2554
self.assertContainsRe(err,
2555
'bzr: ERROR: Not a branch: ".*nonexistantpath/".\n')
2558
class TestTestLoader(tests.TestCase):
2559
"""Tests for the test loader."""
2561
def _get_loader_and_module(self):
2562
"""Gets a TestLoader and a module with one test in it."""
2563
loader = TestUtil.TestLoader()
2565
class Stub(tests.TestCase):
2568
class MyModule(object):
2570
MyModule.a_class = Stub
2572
return loader, module
2574
def test_module_no_load_tests_attribute_loads_classes(self):
2575
loader, module = self._get_loader_and_module()
2576
self.assertEqual(1, loader.loadTestsFromModule(module).countTestCases())
2578
def test_module_load_tests_attribute_gets_called(self):
2579
loader, module = self._get_loader_and_module()
2580
# 'self' is here because we're faking the module with a class. Regular
2581
# load_tests do not need that :)
2582
def load_tests(self, standard_tests, module, loader):
2583
result = loader.suiteClass()
2584
for test in tests.iter_suite_tests(standard_tests):
2585
result.addTests([test, test])
2587
# add a load_tests() method which multiplies the tests from the module.
2588
module.__class__.load_tests = load_tests
2589
self.assertEqual(2, loader.loadTestsFromModule(module).countTestCases())
2591
def test_load_tests_from_module_name_smoke_test(self):
2592
loader = TestUtil.TestLoader()
2593
suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2594
self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
2597
def test_load_tests_from_module_name_with_bogus_module_name(self):
2598
loader = TestUtil.TestLoader()
2599
self.assertRaises(ImportError, loader.loadTestsFromModuleName, 'bogus')
2602
class TestTestIdList(tests.TestCase):
2604
def _create_id_list(self, test_list):
2605
return tests.TestIdList(test_list)
2607
def _create_suite(self, test_id_list):
2609
class Stub(tests.TestCase):
2613
def _create_test_id(id):
2616
suite = TestUtil.TestSuite()
2617
for id in test_id_list:
2618
t = Stub('test_foo')
2619
t.id = _create_test_id(id)
2623
def _test_ids(self, test_suite):
2624
"""Get the ids for the tests in a test suite."""
2625
return [t.id() for t in tests.iter_suite_tests(test_suite)]
2627
def test_empty_list(self):
2628
id_list = self._create_id_list([])
2629
self.assertEquals({}, id_list.tests)
2630
self.assertEquals({}, id_list.modules)
2632
def test_valid_list(self):
2633
id_list = self._create_id_list(
2634
['mod1.cl1.meth1', 'mod1.cl1.meth2',
2635
'mod1.func1', 'mod1.cl2.meth2',
2637
'mod1.submod2.cl1.meth1', 'mod1.submod2.cl2.meth2',
2639
self.assertTrue(id_list.refers_to('mod1'))
2640
self.assertTrue(id_list.refers_to('mod1.submod1'))
2641
self.assertTrue(id_list.refers_to('mod1.submod2'))
2642
self.assertTrue(id_list.includes('mod1.cl1.meth1'))
2643
self.assertTrue(id_list.includes('mod1.submod1'))
2644
self.assertTrue(id_list.includes('mod1.func1'))
2646
def test_bad_chars_in_params(self):
2647
id_list = self._create_id_list(['mod1.cl1.meth1(xx.yy)'])
2648
self.assertTrue(id_list.refers_to('mod1'))
2649
self.assertTrue(id_list.includes('mod1.cl1.meth1(xx.yy)'))
2651
def test_module_used(self):
2652
id_list = self._create_id_list(['mod.class.meth'])
2653
self.assertTrue(id_list.refers_to('mod'))
2654
self.assertTrue(id_list.refers_to('mod.class'))
2655
self.assertTrue(id_list.refers_to('mod.class.meth'))
2657
def test_test_suite_matches_id_list_with_unknown(self):
2658
loader = TestUtil.TestLoader()
2659
suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2660
test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',
2662
not_found, duplicates = tests.suite_matches_id_list(suite, test_list)
2663
self.assertEquals(['bogus'], not_found)
2664
self.assertEquals([], duplicates)
2666
def test_suite_matches_id_list_with_duplicates(self):
2667
loader = TestUtil.TestLoader()
2668
suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2669
dupes = loader.suiteClass()
2670
for test in tests.iter_suite_tests(suite):
2672
dupes.addTest(test) # Add it again
2674
test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',]
2675
not_found, duplicates = tests.suite_matches_id_list(
2677
self.assertEquals([], not_found)
2678
self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
2682
class TestTestSuite(tests.TestCase):
2684
def test_test_suite(self):
2685
# This test is slow - it loads the entire test suite to operate, so we
2686
# do a single test with one test in each category
2689
'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
2690
('bzrlib.tests.per_transport.TransportTests'
2691
'.test_abspath(LocalURLServer)'),
2692
'bzrlib.tests.test_selftest.TestTestSuite.test_test_suite',
2693
# modules_to_doctest
2694
'bzrlib.timestamp.format_highres_date',
2695
# plugins can't be tested that way since selftest may be run with
2698
suite = tests.test_suite(test_list)
2699
self.assertEquals(test_list, _test_ids(suite))
2701
def test_test_suite_list_and_start(self):
2702
# We cannot test this at the same time as the main load, because we want
2703
# to know that starting_with == None works. So a second full load is
2705
test_list = ['bzrlib.tests.test_selftest.TestTestSuite.test_test_suite']
2706
suite = tests.test_suite(test_list,
2707
['bzrlib.tests.test_selftest.TestTestSuite'])
2708
# test_test_suite_list_and_start is not included
2709
self.assertEquals(test_list, _test_ids(suite))
2712
class TestLoadTestIdList(tests.TestCaseInTempDir):
2714
def _create_test_list_file(self, file_name, content):
2715
fl = open(file_name, 'wt')
2719
def test_load_unknown(self):
2720
self.assertRaises(errors.NoSuchFile,
2721
tests.load_test_id_list, 'i_do_not_exist')
2723
def test_load_test_list(self):
2724
test_list_fname = 'test.list'
2725
self._create_test_list_file(test_list_fname,
2726
'mod1.cl1.meth1\nmod2.cl2.meth2\n')
2727
tlist = tests.load_test_id_list(test_list_fname)
2728
self.assertEquals(2, len(tlist))
2729
self.assertEquals('mod1.cl1.meth1', tlist[0])
2730
self.assertEquals('mod2.cl2.meth2', tlist[1])
2732
def test_load_dirty_file(self):
2733
test_list_fname = 'test.list'
2734
self._create_test_list_file(test_list_fname,
2735
' mod1.cl1.meth1\n\nmod2.cl2.meth2 \n'
2737
tlist = tests.load_test_id_list(test_list_fname)
2738
self.assertEquals(4, len(tlist))
2739
self.assertEquals('mod1.cl1.meth1', tlist[0])
2740
self.assertEquals('', tlist[1])
2741
self.assertEquals('mod2.cl2.meth2', tlist[2])
2742
self.assertEquals('bar baz', tlist[3])
2745
class TestFilteredByModuleTestLoader(tests.TestCase):
2747
def _create_loader(self, test_list):
2748
id_filter = tests.TestIdList(test_list)
2749
loader = TestUtil.FilteredByModuleTestLoader(id_filter.refers_to)
2752
def test_load_tests(self):
2753
test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
2754
loader = self._create_loader(test_list)
2756
suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2757
self.assertEquals(test_list, _test_ids(suite))
2759
def test_exclude_tests(self):
2760
test_list = ['bogus']
2761
loader = self._create_loader(test_list)
2763
suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2764
self.assertEquals([], _test_ids(suite))
2767
class TestFilteredByNameStartTestLoader(tests.TestCase):
2769
def _create_loader(self, name_start):
2770
def needs_module(name):
2771
return name.startswith(name_start) or name_start.startswith(name)
2772
loader = TestUtil.FilteredByModuleTestLoader(needs_module)
2775
def test_load_tests(self):
2776
test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
2777
loader = self._create_loader('bzrlib.tests.test_samp')
2779
suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2780
self.assertEquals(test_list, _test_ids(suite))
2782
def test_load_tests_inside_module(self):
2783
test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
2784
loader = self._create_loader('bzrlib.tests.test_sampler.Demo')
2786
suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2787
self.assertEquals(test_list, _test_ids(suite))
2789
def test_exclude_tests(self):
2790
test_list = ['bogus']
2791
loader = self._create_loader('bogus')
2793
suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2794
self.assertEquals([], _test_ids(suite))
2797
class TestTestPrefixRegistry(tests.TestCase):
2799
def _get_registry(self):
2800
tp_registry = tests.TestPrefixAliasRegistry()
2803
def test_register_new_prefix(self):
2804
tpr = self._get_registry()
2805
tpr.register('foo', 'fff.ooo.ooo')
2806
self.assertEquals('fff.ooo.ooo', tpr.get('foo'))
2808
def test_register_existing_prefix(self):
2809
tpr = self._get_registry()
2810
tpr.register('bar', 'bbb.aaa.rrr')
2811
tpr.register('bar', 'bBB.aAA.rRR')
2812
self.assertEquals('bbb.aaa.rrr', tpr.get('bar'))
2813
self.assertContainsRe(self._get_log(keep_log_file=True),
2814
r'.*bar.*bbb.aaa.rrr.*bBB.aAA.rRR')
2816
def test_get_unknown_prefix(self):
2817
tpr = self._get_registry()
2818
self.assertRaises(KeyError, tpr.get, 'I am not a prefix')
2820
def test_resolve_prefix(self):
2821
tpr = self._get_registry()
2822
tpr.register('bar', 'bb.aa.rr')
2823
self.assertEquals('bb.aa.rr', tpr.resolve_alias('bar'))
2825
def test_resolve_unknown_alias(self):
2826
tpr = self._get_registry()
2827
self.assertRaises(errors.BzrCommandError,
2828
tpr.resolve_alias, 'I am not a prefix')
2830
def test_predefined_prefixes(self):
2831
tpr = tests.test_prefix_alias_registry
2832
self.assertEquals('bzrlib', tpr.resolve_alias('bzrlib'))
2833
self.assertEquals('bzrlib.doc', tpr.resolve_alias('bd'))
2834
self.assertEquals('bzrlib.utils', tpr.resolve_alias('bu'))
2835
self.assertEquals('bzrlib.tests', tpr.resolve_alias('bt'))
2836
self.assertEquals('bzrlib.tests.blackbox', tpr.resolve_alias('bb'))
2837
self.assertEquals('bzrlib.plugins', tpr.resolve_alias('bp'))
2840
class TestRunSuite(tests.TestCase):
2842
def test_runner_class(self):
2843
"""run_suite accepts and uses a runner_class keyword argument."""
2844
class Stub(tests.TestCase):
2847
suite = Stub("test_foo")
2849
class MyRunner(tests.TextTestRunner):
2850
def run(self, test):
2852
return tests.ExtendedTestResult(self.stream, self.descriptions,
2854
tests.run_suite(suite, runner_class=MyRunner, stream=StringIO())
2855
self.assertLength(1, calls)
2857
def test_done(self):
2858
"""run_suite should call result.done()"""
2860
def one_more_call(): self.calls += 1
2861
def test_function():
2863
test = unittest.FunctionTestCase(test_function)
2864
class InstrumentedTestResult(tests.ExtendedTestResult):
2865
def done(self): one_more_call()
2866
class MyRunner(tests.TextTestRunner):
2867
def run(self, test):
2868
return InstrumentedTestResult(self.stream, self.descriptions,
2870
tests.run_suite(test, runner_class=MyRunner, stream=StringIO())
2871
self.assertEquals(1, self.calls)