323
332
self.assertEqual(tests[1].transport_readonly_server, server2)
335
class TestTreeProviderAdapter(TestCase):
336
"""Test the setup of tree_implementation tests."""
338
def test_adapted_tests(self):
339
# the tree implementation adapter is meant to setup one instance for
340
# each working tree format, and one additional instance that will
341
# use the default wt format, but create a revision tree for the tests.
342
# this means that the wt ones should have the workingtree_to_test_tree
343
# attribute set to 'return_parameter' and the revision one set to
344
# revision_tree_from_workingtree.
346
from bzrlib.tests.tree_implementations import (
347
TreeTestProviderAdapter,
349
revision_tree_from_workingtree
351
from bzrlib.workingtree import WorkingTreeFormat
352
input_test = TestTreeProviderAdapter(
353
"test_adapted_tests")
356
formats = [("c", "C"), ("d", "D")]
357
adapter = TreeTestProviderAdapter(server1, server2, formats)
358
suite = adapter.adapt(input_test)
359
tests = list(iter(suite))
360
self.assertEqual(3, len(tests))
361
default_format = WorkingTreeFormat.get_default_format()
362
self.assertEqual(tests[0].workingtree_format, formats[0][0])
363
self.assertEqual(tests[0].bzrdir_format, formats[0][1])
364
self.assertEqual(tests[0].transport_server, server1)
365
self.assertEqual(tests[0].transport_readonly_server, server2)
366
self.assertEqual(tests[0].workingtree_to_test_tree, return_parameter)
367
self.assertEqual(tests[1].workingtree_format, formats[1][0])
368
self.assertEqual(tests[1].bzrdir_format, formats[1][1])
369
self.assertEqual(tests[1].transport_server, server1)
370
self.assertEqual(tests[1].transport_readonly_server, server2)
371
self.assertEqual(tests[1].workingtree_to_test_tree, return_parameter)
372
self.assertEqual(tests[2].workingtree_format, default_format)
373
self.assertEqual(tests[2].bzrdir_format, default_format._matchingbzrdir)
374
self.assertEqual(tests[2].transport_server, server1)
375
self.assertEqual(tests[2].transport_readonly_server, server2)
376
self.assertEqual(tests[2].workingtree_to_test_tree,
377
revision_tree_from_workingtree)
380
class TestInterTreeProviderAdapter(TestCase):
381
"""A group of tests that test the InterTreeTestAdapter."""
383
def test_adapted_tests(self):
384
# check that constructor parameters are passed through to the adapted
386
# for InterTree tests we want the machinery to bring up two trees in
387
# each instance: the base one, and the one we are interacting with.
388
# because each optimiser can be direction specific, we need to test
389
# each optimiser in its chosen direction.
390
# unlike the TestProviderAdapter we dont want to automatically add a
391
# parameterised one for WorkingTree - the optimisers will tell us what
393
from bzrlib.tests.tree_implementations import (
395
revision_tree_from_workingtree
397
from bzrlib.tests.intertree_implementations import (
398
InterTreeTestProviderAdapter,
400
from bzrlib.workingtree import WorkingTreeFormat2, WorkingTreeFormat3
401
input_test = TestInterTreeProviderAdapter(
402
"test_adapted_tests")
405
format1 = WorkingTreeFormat2()
406
format2 = WorkingTreeFormat3()
407
formats = [(str, format1, format2, False, True),
408
(int, format2, format1, False, True)]
409
adapter = InterTreeTestProviderAdapter(server1, server2, formats)
410
suite = adapter.adapt(input_test)
411
tests = list(iter(suite))
412
self.assertEqual(2, len(tests))
413
self.assertEqual(tests[0].intertree_class, formats[0][0])
414
self.assertEqual(tests[0].workingtree_format, formats[0][1])
415
self.assertEqual(tests[0].workingtree_to_test_tree, formats[0][2])
416
self.assertEqual(tests[0].workingtree_format_to, formats[0][3])
417
self.assertEqual(tests[0].workingtree_to_test_tree_to, formats[0][4])
418
self.assertEqual(tests[0].transport_server, server1)
419
self.assertEqual(tests[0].transport_readonly_server, server2)
420
self.assertEqual(tests[1].intertree_class, formats[1][0])
421
self.assertEqual(tests[1].workingtree_format, formats[1][1])
422
self.assertEqual(tests[1].workingtree_to_test_tree, formats[1][2])
423
self.assertEqual(tests[1].workingtree_format_to, formats[1][3])
424
self.assertEqual(tests[1].workingtree_to_test_tree_to, formats[1][4])
425
self.assertEqual(tests[1].transport_server, server1)
426
self.assertEqual(tests[1].transport_readonly_server, server2)
429
class TestTestCaseInTempDir(TestCaseInTempDir):
431
def test_home_is_not_working(self):
432
self.assertNotEqual(self.test_dir, self.test_home_dir)
433
cwd = osutils.getcwd()
434
self.assertEqual(self.test_dir, cwd)
435
self.assertEqual(self.test_home_dir, os.environ['HOME'])
438
class TestTestCaseWithMemoryTransport(TestCaseWithMemoryTransport):
440
def test_home_is_non_existant_dir_under_root(self):
441
"""The test_home_dir for TestCaseWithMemoryTransport is missing.
443
This is because TestCaseWithMemoryTransport is for tests that do not
444
need any disk resources: they should be hooked into bzrlib in such a
445
way that no global settings are being changed by the test (only a
446
few tests should need to do that), and having a missing dir as home is
447
an effective way to ensure that this is the case.
449
self.assertEqual(self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
451
self.assertEqual(self.test_home_dir, os.environ['HOME'])
453
def test_cwd_is_TEST_ROOT(self):
454
self.assertEqual(self.test_dir, self.TEST_ROOT)
455
cwd = osutils.getcwd()
456
self.assertEqual(self.test_dir, cwd)
458
def test_make_branch_and_memory_tree(self):
459
"""In TestCaseWithMemoryTransport we should not make the branch on disk.
461
This is hard to comprehensively robustly test, so we settle for making
462
a branch and checking no directory was created at its relpath.
464
tree = self.make_branch_and_memory_tree('dir')
465
self.failIfExists('dir')
466
self.assertIsInstance(tree, memorytree.MemoryTree)
326
469
class TestTestCaseWithTransport(TestCaseWithTransport):
327
470
"""Tests for the convenience functions TestCaseWithTransport introduces."""
405
566
mypb = MockProgress()
406
567
mypb.update('Running tests', 0, 4)
407
568
last_calls = mypb.calls[:]
408
570
result = bzrlib.tests._MyResult(self._log_file,
412
574
self.assertEqual(last_calls, mypb.calls)
577
"""Shorten a string based on the terminal width"""
578
return result._ellipsise_unimportant_words(s,
579
osutils.terminal_width())
415
582
result.startTest(dummy_test)
416
583
# starting a test prints the test name
417
self.assertEqual(last_calls + [('update', '...tyle_quiet', 0, None)], mypb.calls)
418
last_calls = mypb.calls[:]
584
last_calls += [('update', '...tyle_quiet', 0, None)]
585
self.assertEqual(last_calls, mypb.calls)
419
586
result.addError(dummy_test, dummy_error)
420
self.assertEqual(last_calls + [('update', 'ERROR ', 1, None)], mypb.calls)
421
last_calls = mypb.calls[:]
587
last_calls += [('update', 'ERROR ', 1, None),
588
('note', shorten(dummy_test.id() + ': ERROR'), ())
590
self.assertEqual(last_calls, mypb.calls)
424
593
result.startTest(dummy_test)
425
self.assertEqual(last_calls + [('update', '...tyle_quiet', 1, None)], mypb.calls)
426
last_calls = mypb.calls[:]
594
last_calls += [('update', '...tyle_quiet', 1, None)]
595
self.assertEqual(last_calls, mypb.calls)
596
last_calls += [('update', 'FAIL ', 2, None),
597
('note', shorten(dummy_test.id() + ': FAIL'), ())
427
599
result.addFailure(dummy_test, dummy_error)
428
self.assertEqual(last_calls + [('update', 'FAIL ', 2, None)], mypb.calls)
429
last_calls = mypb.calls[:]
600
self.assertEqual(last_calls, mypb.calls)
432
603
result.startTest(dummy_test)
433
self.assertEqual(last_calls + [('update', '...tyle_quiet', 2, None)], mypb.calls)
434
last_calls = mypb.calls[:]
604
last_calls += [('update', '...tyle_quiet', 2, None)]
605
self.assertEqual(last_calls, mypb.calls)
435
606
result.addSuccess(dummy_test)
436
self.assertEqual(last_calls + [('update', 'OK ', 3, None)], mypb.calls)
437
last_calls = mypb.calls[:]
607
last_calls += [('update', 'OK ', 3, None)]
608
self.assertEqual(last_calls, mypb.calls)
440
611
result.startTest(dummy_test)
441
self.assertEqual(last_calls + [('update', '...tyle_quiet', 3, None)], mypb.calls)
442
last_calls = mypb.calls[:]
612
last_calls += [('update', '...tyle_quiet', 3, None)]
613
self.assertEqual(last_calls, mypb.calls)
443
614
result.addSkipped(dummy_test, dummy_error)
444
self.assertEqual(last_calls + [('update', 'SKIP ', 4, None)], mypb.calls)
445
last_calls = mypb.calls[:]
615
last_calls += [('update', 'SKIP ', 4, None)]
616
self.assertEqual(last_calls, mypb.calls)
447
618
def test_elapsed_time_with_benchmarking(self):
448
619
result = bzrlib.tests._MyResult(self._log_file,
469
640
# cheat. Yes, wash thy mouth out with soap.
470
641
self._benchtime = None
643
def test_assigned_benchmark_file_stores_date(self):
645
result = bzrlib.tests._MyResult(self._log_file,
650
output_string = output.getvalue()
651
# if you are wondering about the regexp please read the comment in
652
# test_bench_history (bzrlib.tests.test_selftest.TestRunner)
653
# XXX: what comment? -- Andrew Bennetts
654
self.assertContainsRe(output_string, "--date [0-9.]+")
656
def test_benchhistory_records_test_times(self):
657
result_stream = StringIO()
658
result = bzrlib.tests._MyResult(
662
bench_history=result_stream
665
# we want profile a call and check that its test duration is recorded
666
# make a new test instance that when run will generate a benchmark
667
example_test_case = TestTestResult("_time_hello_world_encoding")
668
# execute the test, which should succeed and record times
669
example_test_case.run(result)
670
lines = result_stream.getvalue().splitlines()
671
self.assertEqual(2, len(lines))
672
self.assertContainsRe(lines[1],
673
" *[0-9]+ms bzrlib.tests.test_selftest.TestTestResult"
674
"._time_hello_world_encoding")
472
676
def _time_hello_world_encoding(self):
473
677
"""Profile two sleep calls
564
768
result = self.run_test_runner(runner, test)
565
769
self.assertTrue(result.wasSuccessful())
771
def test_bench_history(self):
772
# tests that the running the benchmark produces a history file
773
# containing a timestamp and the revision id of the bzrlib source which
775
workingtree = _get_bzr_source_tree()
776
test = TestRunner('dummy_test')
778
runner = TextTestRunner(stream=self._log_file, bench_history=output)
779
result = self.run_test_runner(runner, test)
780
output_string = output.getvalue()
781
self.assertContainsRe(output_string, "--date [0-9.]+")
782
if workingtree is not None:
783
revision_id = workingtree.get_parent_ids()[0]
784
self.assertEndsWith(output_string.rstrip(), revision_id)
786
def test_success_log_deleted(self):
787
"""Successful tests have their log deleted"""
789
class LogTester(TestCase):
791
def test_success(self):
792
self.log('this will be removed\n')
794
sio = cStringIO.StringIO()
795
runner = TextTestRunner(stream=sio)
796
test = LogTester('test_success')
797
result = self.run_test_runner(runner, test)
799
log = test._get_log()
800
self.assertEqual("DELETED log file to reduce memory footprint", log)
801
self.assertEqual('', test._log_contents)
802
self.assertIs(None, test._log_file_name)
804
def test_fail_log_kept(self):
805
"""Failed tests have their log kept"""
807
class LogTester(TestCase):
810
self.log('this will be kept\n')
811
self.fail('this test fails')
813
sio = cStringIO.StringIO()
814
runner = TextTestRunner(stream=sio)
815
test = LogTester('test_fail')
816
result = self.run_test_runner(runner, test)
818
text = sio.getvalue()
819
self.assertContainsRe(text, 'this will be kept')
820
self.assertContainsRe(text, 'this test fails')
822
log = test._get_log()
823
self.assertContainsRe(log, 'this will be kept')
824
self.assertEqual(log, test._log_contents)
826
def test_error_log_kept(self):
827
"""Tests with errors have their log kept"""
829
class LogTester(TestCase):
831
def test_error(self):
832
self.log('this will be kept\n')
833
raise ValueError('random exception raised')
835
sio = cStringIO.StringIO()
836
runner = TextTestRunner(stream=sio)
837
test = LogTester('test_error')
838
result = self.run_test_runner(runner, test)
840
text = sio.getvalue()
841
self.assertContainsRe(text, 'this will be kept')
842
self.assertContainsRe(text, 'random exception raised')
844
log = test._get_log()
845
self.assertContainsRe(log, 'this will be kept')
846
self.assertEqual(log, test._log_contents)
568
849
class TestTestCase(TestCase):
569
850
"""Tests that test the core bzrlib TestCase."""
654
961
self.assertEndsWith('foo', 'oo')
655
962
self.assertRaises(AssertionError, self.assertEndsWith, 'o', 'oo')
964
def test_applyDeprecated_not_deprecated(self):
965
sample_object = ApplyDeprecatedHelper()
966
# calling an undeprecated callable raises an assertion
967
self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
968
sample_object.sample_normal_method)
969
self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
970
sample_undeprecated_function, "a param value")
971
# calling a deprecated callable (function or method) with the wrong
972
# expected deprecation fails.
973
self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
974
sample_object.sample_deprecated_method, "a param value")
975
self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
976
sample_deprecated_function)
977
# calling a deprecated callable (function or method) with the right
978
# expected deprecation returns the functions result.
979
self.assertEqual("a param value", self.applyDeprecated(zero_eleven,
980
sample_object.sample_deprecated_method, "a param value"))
981
self.assertEqual(2, self.applyDeprecated(zero_eleven,
982
sample_deprecated_function))
983
# calling a nested deprecation with the wrong deprecation version
984
# fails even if a deeper nested function was deprecated with the
986
self.assertRaises(AssertionError, self.applyDeprecated,
987
zero_eleven, sample_object.sample_nested_deprecation)
988
# calling a nested deprecation with the right deprecation value
989
# returns the calls result.
990
self.assertEqual(2, self.applyDeprecated(zero_ten,
991
sample_object.sample_nested_deprecation))
993
def test_callDeprecated(self):
994
def testfunc(be_deprecated, result=None):
995
if be_deprecated is True:
996
symbol_versioning.warn('i am deprecated', DeprecationWarning,
999
result = self.callDeprecated(['i am deprecated'], testfunc, True)
1000
self.assertIs(None, result)
1001
result = self.callDeprecated([], testfunc, False, 'result')
1002
self.assertEqual('result', result)
1003
self.callDeprecated(['i am deprecated'], testfunc, be_deprecated=True)
1004
self.callDeprecated([], testfunc, be_deprecated=False)
658
1007
class TestConvenienceMakers(TestCaseWithTransport):
659
1008
"""Test for the make_* convenience functions."""
681
1051
self.apply_redirected(out, err, None, bzrlib.tests.selftest,
682
1052
test_suite_factory=factory)
683
1053
self.assertEqual([True], factory_called)
685
def test_run_bzr_subprocess(self):
686
"""The run_bzr_helper_external comand behaves nicely."""
687
result = self.run_bzr_subprocess('--version')
688
result = self.run_bzr_subprocess('--version', retcode=None)
689
self.assertContainsRe(result[0], 'is free software')
690
self.assertRaises(AssertionError, self.run_bzr_subprocess,
692
result = self.run_bzr_subprocess('--versionn', retcode=3)
693
result = self.run_bzr_subprocess('--versionn', retcode=None)
694
self.assertContainsRe(result[1], 'unknown command')
695
err = self.run_bzr_subprocess('merge', '--merge-type', 'magic merge',
697
self.assertContainsRe(err, 'No known merge type magic merge')
699
def test_run_bzr_error(self):
700
out, err = self.run_bzr_error(['^$'], 'rocks', retcode=0)
701
self.assertEqual(out, 'it sure does!\n')
703
out, err = self.run_bzr_error(["'foobarbaz' is not a versioned file"],
704
'file-id', 'foobarbaz')