~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_selftest.py

  • Committer: Alexander Belchenko
  • Date: 2006-07-30 16:43:12 UTC
  • mto: (1711.2.111 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1906.
  • Revision ID: bialix@ukr.net-20060730164312-b025fd3ff0cee59e
rename  gpl.txt => COPYING.txt

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 by Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
 
4
# it under the terms of the GNU General Public License version 2 as published by
 
5
# the Free Software Foundation.
7
6
#
8
7
# This program is distributed in the hope that it will be useful,
9
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
15
 
17
16
"""Tests for the test framework."""
18
17
 
19
 
import cStringIO
20
18
import os
21
19
from StringIO import StringIO
22
20
import sys
24
22
import unittest
25
23
import warnings
26
24
 
 
25
from bzrlib import osutils
27
26
import bzrlib
28
 
from bzrlib import (
29
 
    bzrdir,
30
 
    errors,
31
 
    memorytree,
32
 
    osutils,
33
 
    repository,
34
 
    symbol_versioning,
35
 
    )
36
27
from bzrlib.progress import _BaseProgressBar
37
 
from bzrlib.repofmt import weaverepo
38
 
from bzrlib.symbol_versioning import zero_ten, zero_eleven
39
28
from bzrlib.tests import (
40
29
                          ChrootedTestCase,
41
 
                          ExtendedTestResult,
42
 
                          Feature,
43
 
                          KnownFailure,
44
30
                          TestCase,
45
31
                          TestCaseInTempDir,
46
 
                          TestCaseWithMemoryTransport,
47
32
                          TestCaseWithTransport,
48
33
                          TestSkipped,
49
34
                          TestSuite,
50
 
                          TestUtil,
51
35
                          TextTestRunner,
52
 
                          UnavailableFeature,
53
 
                          clean_selftest_output,
54
 
                          iter_suite_tests,
55
 
                          filter_suite_by_re,
56
 
                          sort_suite_by_re,
57
 
                          test_suite
58
36
                          )
59
 
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
60
37
from bzrlib.tests.TestUtil import _load_module_by_name
 
38
import bzrlib.errors as errors
61
39
from bzrlib.trace import note
62
 
from bzrlib.transport.memory import MemoryServer, MemoryTransport
63
 
from bzrlib.version import _get_bzr_source_tree
64
40
 
65
41
 
66
42
class SelftestTests(TestCase):
74
50
                          _load_module_by_name,
75
51
                          'bzrlib.no-name-yet')
76
52
 
 
53
 
77
54
class MetaTestLog(TestCase):
78
55
 
79
56
    def test_logging(self):
80
57
        """Test logs are captured when a test fails."""
81
58
        self.log('a test message')
82
59
        self._log_file.flush()
83
 
        self.assertContainsRe(self._get_log(keep_log_file=True),
84
 
                              'a test message\n')
 
60
        self.assertContainsRe(self._get_log(), 'a test message\n')
85
61
 
86
62
 
87
63
class TestTreeShape(TestCaseInTempDir):
198
174
        from bzrlib.bzrdir import BzrDirTestProviderAdapter
199
175
        input_test = TestBzrDirProviderAdapter(
200
176
            "test_adapted_tests")
201
 
        vfs_factory = "v"
202
177
        server1 = "a"
203
178
        server2 = "b"
204
179
        formats = ["c", "d"]
205
 
        adapter = BzrDirTestProviderAdapter(vfs_factory,
206
 
            server1, server2, formats)
 
180
        adapter = BzrDirTestProviderAdapter(server1, server2, formats)
207
181
        suite = adapter.adapt(input_test)
208
182
        tests = list(iter(suite))
209
183
        self.assertEqual(2, len(tests))
210
184
        self.assertEqual(tests[0].bzrdir_format, formats[0])
211
 
        self.assertEqual(tests[0].vfs_transport_factory, vfs_factory)
212
185
        self.assertEqual(tests[0].transport_server, server1)
213
186
        self.assertEqual(tests[0].transport_readonly_server, server2)
214
187
        self.assertEqual(tests[1].bzrdir_format, formats[1])
215
 
        self.assertEqual(tests[1].vfs_transport_factory, vfs_factory)
216
188
        self.assertEqual(tests[1].transport_server, server1)
217
189
        self.assertEqual(tests[1].transport_readonly_server, server2)
218
190
 
242
214
        self.assertEqual(tests[1].transport_server, server1)
243
215
        self.assertEqual(tests[1].transport_readonly_server, server2)
244
216
 
245
 
    def test_setting_vfs_transport(self):
246
 
        """The vfs_transport_factory can be set optionally."""
247
 
        from bzrlib.repository import RepositoryTestProviderAdapter
248
 
        input_test = TestRepositoryProviderAdapter(
249
 
            "test_adapted_tests")
250
 
        formats = [("c", "C")]
251
 
        adapter = RepositoryTestProviderAdapter(None, None, formats,
252
 
            vfs_transport_factory="vfs")
253
 
        suite = adapter.adapt(input_test)
254
 
        tests = list(iter(suite))
255
 
        self.assertEqual(1, len(tests))
256
 
        self.assertEqual(tests[0].vfs_transport_factory, "vfs")
257
 
 
258
217
 
259
218
class TestInterRepositoryProviderAdapter(TestCase):
260
219
    """A group of tests that test the InterRepository test adapter."""
381
340
            return_parameter,
382
341
            revision_tree_from_workingtree
383
342
            )
384
 
        from bzrlib.workingtree import WorkingTreeFormat, WorkingTreeFormat3
 
343
        from bzrlib.workingtree import WorkingTreeFormat
385
344
        input_test = TestTreeProviderAdapter(
386
345
            "test_adapted_tests")
387
346
        server1 = "a"
390
349
        adapter = TreeTestProviderAdapter(server1, server2, formats)
391
350
        suite = adapter.adapt(input_test)
392
351
        tests = list(iter(suite))
393
 
        self.assertEqual(4, len(tests))
394
 
        # this must match the default format setp up in
395
 
        # TreeTestProviderAdapter.adapt
396
 
        default_format = WorkingTreeFormat3
 
352
        self.assertEqual(3, len(tests))
 
353
        default_format = WorkingTreeFormat.get_default_format()
397
354
        self.assertEqual(tests[0].workingtree_format, formats[0][0])
398
355
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
399
356
        self.assertEqual(tests[0].transport_server, server1)
404
361
        self.assertEqual(tests[1].transport_server, server1)
405
362
        self.assertEqual(tests[1].transport_readonly_server, server2)
406
363
        self.assertEqual(tests[1].workingtree_to_test_tree, return_parameter)
407
 
        self.assertIsInstance(tests[2].workingtree_format, default_format)
408
 
        #self.assertEqual(tests[2].bzrdir_format,
409
 
        #                 default_format._matchingbzrdir)
 
364
        self.assertEqual(tests[2].workingtree_format, default_format)
 
365
        self.assertEqual(tests[2].bzrdir_format, default_format._matchingbzrdir)
410
366
        self.assertEqual(tests[2].transport_server, server1)
411
367
        self.assertEqual(tests[2].transport_readonly_server, server2)
412
368
        self.assertEqual(tests[2].workingtree_to_test_tree,
440
396
        server2 = "b"
441
397
        format1 = WorkingTreeFormat2()
442
398
        format2 = WorkingTreeFormat3()
443
 
        formats = [(str, format1, format2, "converter1"),
444
 
            (int, format2, format1, "converter2")]
 
399
        formats = [(str, format1, format2, False, True),
 
400
            (int, format2, format1, False, True)]
445
401
        adapter = InterTreeTestProviderAdapter(server1, server2, formats)
446
402
        suite = adapter.adapt(input_test)
447
403
        tests = list(iter(suite))
448
404
        self.assertEqual(2, len(tests))
449
405
        self.assertEqual(tests[0].intertree_class, formats[0][0])
450
406
        self.assertEqual(tests[0].workingtree_format, formats[0][1])
451
 
        self.assertEqual(tests[0].workingtree_format_to, formats[0][2])
452
 
        self.assertEqual(tests[0].mutable_trees_to_test_trees, formats[0][3])
453
 
        self.assertEqual(tests[0].workingtree_to_test_tree, return_parameter)
 
407
        self.assertEqual(tests[0].workingtree_to_test_tree, formats[0][2])
 
408
        self.assertEqual(tests[0].workingtree_format_to, formats[0][3])
 
409
        self.assertEqual(tests[0].workingtree_to_test_tree_to, formats[0][4])
454
410
        self.assertEqual(tests[0].transport_server, server1)
455
411
        self.assertEqual(tests[0].transport_readonly_server, server2)
456
412
        self.assertEqual(tests[1].intertree_class, formats[1][0])
457
413
        self.assertEqual(tests[1].workingtree_format, formats[1][1])
458
 
        self.assertEqual(tests[1].workingtree_format_to, formats[1][2])
459
 
        self.assertEqual(tests[1].mutable_trees_to_test_trees, formats[1][3])
460
 
        self.assertEqual(tests[1].workingtree_to_test_tree, return_parameter)
 
414
        self.assertEqual(tests[1].workingtree_to_test_tree, formats[1][2])
 
415
        self.assertEqual(tests[1].workingtree_format_to, formats[1][3])
 
416
        self.assertEqual(tests[1].workingtree_to_test_tree_to, formats[1][4])
461
417
        self.assertEqual(tests[1].transport_server, server1)
462
418
        self.assertEqual(tests[1].transport_readonly_server, server2)
463
419
 
464
 
 
465
 
class TestTestCaseInTempDir(TestCaseInTempDir):
466
 
 
467
 
    def test_home_is_not_working(self):
468
 
        self.assertNotEqual(self.test_dir, self.test_home_dir)
469
 
        cwd = osutils.getcwd()
470
 
        self.assertEqual(self.test_dir, cwd)
471
 
        self.assertEqual(self.test_home_dir, os.environ['HOME'])
472
 
 
473
 
 
474
 
class TestTestCaseWithMemoryTransport(TestCaseWithMemoryTransport):
475
 
 
476
 
    def test_home_is_non_existant_dir_under_root(self):
477
 
        """The test_home_dir for TestCaseWithMemoryTransport is missing.
478
 
 
479
 
        This is because TestCaseWithMemoryTransport is for tests that do not
480
 
        need any disk resources: they should be hooked into bzrlib in such a 
481
 
        way that no global settings are being changed by the test (only a 
482
 
        few tests should need to do that), and having a missing dir as home is
483
 
        an effective way to ensure that this is the case.
484
 
        """
485
 
        self.assertEqual(self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
486
 
            self.test_home_dir)
487
 
        self.assertEqual(self.test_home_dir, os.environ['HOME'])
488
 
        
489
 
    def test_cwd_is_TEST_ROOT(self):
490
 
        self.assertEqual(self.test_dir, self.TEST_ROOT)
491
 
        cwd = osutils.getcwd()
492
 
        self.assertEqual(self.test_dir, cwd)
493
 
 
494
 
    def test_make_branch_and_memory_tree(self):
495
 
        """In TestCaseWithMemoryTransport we should not make the branch on disk.
496
 
 
497
 
        This is hard to comprehensively robustly test, so we settle for making
498
 
        a branch and checking no directory was created at its relpath.
499
 
        """
500
 
        tree = self.make_branch_and_memory_tree('dir')
501
 
        # Guard against regression into MemoryTransport leaking
502
 
        # files to disk instead of keeping them in memory.
503
 
        self.failIf(osutils.lexists('dir'))
504
 
        self.assertIsInstance(tree, memorytree.MemoryTree)
505
 
 
506
 
    def test_make_branch_and_memory_tree_with_format(self):
507
 
        """make_branch_and_memory_tree should accept a format option."""
508
 
        format = bzrdir.BzrDirMetaFormat1()
509
 
        format.repository_format = weaverepo.RepositoryFormat7()
510
 
        tree = self.make_branch_and_memory_tree('dir', format=format)
511
 
        # Guard against regression into MemoryTransport leaking
512
 
        # files to disk instead of keeping them in memory.
513
 
        self.failIf(osutils.lexists('dir'))
514
 
        self.assertIsInstance(tree, memorytree.MemoryTree)
515
 
        self.assertEqual(format.repository_format.__class__,
516
 
            tree.branch.repository._format.__class__)
517
 
 
518
 
 
519
420
class TestTestCaseWithTransport(TestCaseWithTransport):
520
421
    """Tests for the convenience functions TestCaseWithTransport introduces."""
521
422
 
523
424
        from bzrlib.transport import get_transport
524
425
        from bzrlib.transport.memory import MemoryServer
525
426
        from bzrlib.transport.readonly import ReadonlyTransportDecorator
526
 
        self.vfs_transport_factory = MemoryServer
 
427
        self.transport_server = MemoryServer
527
428
        self.transport_readonly_server = None
528
429
        # calling get_readonly_transport() constructs a decorator on the url
529
430
        # for the server
536
437
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
537
438
 
538
439
    def test_get_readonly_url_http(self):
539
 
        from bzrlib.tests.HttpServer import HttpServer
540
440
        from bzrlib.transport import get_transport
541
 
        from bzrlib.transport.local import LocalURLServer
542
 
        from bzrlib.transport.http import HttpTransportBase
543
 
        self.transport_server = LocalURLServer
 
441
        from bzrlib.transport.local import LocalRelpathServer
 
442
        from bzrlib.transport.http import HttpServer, HttpTransportBase
 
443
        self.transport_server = LocalRelpathServer
544
444
        self.transport_readonly_server = HttpServer
545
445
        # calling get_readonly_transport() gives us a HTTP server instance.
546
446
        url = self.get_readonly_url()
561
461
        self.assertRaises(AssertionError, self.assertIsDirectory, 'not_here', t)
562
462
 
563
463
 
564
 
class TestTestCaseTransports(TestCaseWithTransport):
565
 
 
566
 
    def setUp(self):
567
 
        super(TestTestCaseTransports, self).setUp()
568
 
        self.vfs_transport_factory = MemoryServer
569
 
 
570
 
    def test_make_bzrdir_preserves_transport(self):
571
 
        t = self.get_transport()
572
 
        result_bzrdir = self.make_bzrdir('subdir')
573
 
        self.assertIsInstance(result_bzrdir.transport, 
574
 
                              MemoryTransport)
575
 
        # should not be on disk, should only be in memory
576
 
        self.failIfExists('subdir')
577
 
 
578
 
 
579
464
class TestChrootedTest(ChrootedTestCase):
580
465
 
581
466
    def test_root_is_root(self):
610
495
 
611
496
class TestTestResult(TestCase):
612
497
 
 
498
    def test_progress_bar_style_quiet(self):
 
499
        # test using a progress bar.
 
500
        dummy_test = TestTestResult('test_progress_bar_style_quiet')
 
501
        dummy_error = (Exception, None, [])
 
502
        mypb = MockProgress()
 
503
        mypb.update('Running tests', 0, 4)
 
504
        last_calls = mypb.calls[:]
 
505
 
 
506
        result = bzrlib.tests._MyResult(self._log_file,
 
507
                                        descriptions=0,
 
508
                                        verbosity=1,
 
509
                                        pb=mypb)
 
510
        self.assertEqual(last_calls, mypb.calls)
 
511
 
 
512
        def shorten(s):
 
513
            """Shorten a string based on the terminal width"""
 
514
            return result._ellipsise_unimportant_words(s,
 
515
                                 osutils.terminal_width())
 
516
 
 
517
        # an error 
 
518
        result.startTest(dummy_test)
 
519
        # starting a test prints the test name
 
520
        last_calls += [('update', '...tyle_quiet', 0, None)]
 
521
        self.assertEqual(last_calls, mypb.calls)
 
522
        result.addError(dummy_test, dummy_error)
 
523
        last_calls += [('update', 'ERROR        ', 1, None),
 
524
                       ('note', shorten(dummy_test.id() + ': ERROR'), ())
 
525
                      ]
 
526
        self.assertEqual(last_calls, mypb.calls)
 
527
 
 
528
        # a failure
 
529
        result.startTest(dummy_test)
 
530
        last_calls += [('update', '...tyle_quiet', 1, None)]
 
531
        self.assertEqual(last_calls, mypb.calls)
 
532
        last_calls += [('update', 'FAIL         ', 2, None),
 
533
                       ('note', shorten(dummy_test.id() + ': FAIL'), ())
 
534
                      ]
 
535
        result.addFailure(dummy_test, dummy_error)
 
536
        self.assertEqual(last_calls, mypb.calls)
 
537
 
 
538
        # a success
 
539
        result.startTest(dummy_test)
 
540
        last_calls += [('update', '...tyle_quiet', 2, None)]
 
541
        self.assertEqual(last_calls, mypb.calls)
 
542
        result.addSuccess(dummy_test)
 
543
        last_calls += [('update', 'OK           ', 3, None)]
 
544
        self.assertEqual(last_calls, mypb.calls)
 
545
 
 
546
        # a skip
 
547
        result.startTest(dummy_test)
 
548
        last_calls += [('update', '...tyle_quiet', 3, None)]
 
549
        self.assertEqual(last_calls, mypb.calls)
 
550
        result.addSkipped(dummy_test, dummy_error)
 
551
        last_calls += [('update', 'SKIP         ', 4, None)]
 
552
        self.assertEqual(last_calls, mypb.calls)
 
553
 
613
554
    def test_elapsed_time_with_benchmarking(self):
614
 
        result = bzrlib.tests.TextTestResult(self._log_file,
 
555
        result = bzrlib.tests._MyResult(self._log_file,
615
556
                                        descriptions=0,
616
557
                                        verbosity=1,
617
558
                                        )
620
561
        result.extractBenchmarkTime(self)
621
562
        timed_string = result._testTimeString()
622
563
        # without explicit benchmarking, we should get a simple time.
623
 
        self.assertContainsRe(timed_string, "^ *[ 1-9][0-9]ms$")
 
564
        self.assertContainsRe(timed_string, "^         [ 1-9][0-9]ms$")
624
565
        # if a benchmark time is given, we want a x of y style result.
625
566
        self.time(time.sleep, 0.001)
626
567
        result.extractBenchmarkTime(self)
627
568
        timed_string = result._testTimeString()
628
 
        self.assertContainsRe(timed_string, "^ *[ 1-9][0-9]ms/ *[ 1-9][0-9]ms$")
 
569
        self.assertContainsRe(timed_string, "^   [ 1-9][0-9]ms/   [ 1-9][0-9]ms$")
629
570
        # extracting the time from a non-bzrlib testcase sets to None
630
571
        result._recordTestStartTime()
631
572
        result.extractBenchmarkTime(
632
573
            unittest.FunctionTestCase(self.test_elapsed_time_with_benchmarking))
633
574
        timed_string = result._testTimeString()
634
 
        self.assertContainsRe(timed_string, "^ *[ 1-9][0-9]ms$")
 
575
        self.assertContainsRe(timed_string, "^         [ 1-9][0-9]ms$")
635
576
        # cheat. Yes, wash thy mouth out with soap.
636
577
        self._benchtime = None
637
578
 
638
 
    def test_assigned_benchmark_file_stores_date(self):
639
 
        output = StringIO()
640
 
        result = bzrlib.tests.TextTestResult(self._log_file,
641
 
                                        descriptions=0,
642
 
                                        verbosity=1,
643
 
                                        bench_history=output
644
 
                                        )
645
 
        output_string = output.getvalue()
646
 
        
647
 
        # if you are wondering about the regexp please read the comment in
648
 
        # test_bench_history (bzrlib.tests.test_selftest.TestRunner)
649
 
        # XXX: what comment?  -- Andrew Bennetts
650
 
        self.assertContainsRe(output_string, "--date [0-9.]+")
651
 
 
652
 
    def test_benchhistory_records_test_times(self):
653
 
        result_stream = StringIO()
654
 
        result = bzrlib.tests.TextTestResult(
655
 
            self._log_file,
656
 
            descriptions=0,
657
 
            verbosity=1,
658
 
            bench_history=result_stream
659
 
            )
660
 
 
661
 
        # we want profile a call and check that its test duration is recorded
662
 
        # make a new test instance that when run will generate a benchmark
663
 
        example_test_case = TestTestResult("_time_hello_world_encoding")
664
 
        # execute the test, which should succeed and record times
665
 
        example_test_case.run(result)
666
 
        lines = result_stream.getvalue().splitlines()
667
 
        self.assertEqual(2, len(lines))
668
 
        self.assertContainsRe(lines[1],
669
 
            " *[0-9]+ms bzrlib.tests.test_selftest.TestTestResult"
670
 
            "._time_hello_world_encoding")
671
 
 
672
579
    def _time_hello_world_encoding(self):
673
580
        """Profile two sleep calls
674
581
        
684
591
        except ImportError:
685
592
            raise TestSkipped("lsprof not installed.")
686
593
        result_stream = StringIO()
687
 
        result = bzrlib.tests.VerboseTestResult(
 
594
        result = bzrlib.tests._MyResult(
688
595
            unittest._WritelnDecorator(result_stream),
689
596
            descriptions=0,
690
597
            verbosity=2,
717
624
        self.assertContainsRe(output,
718
625
            r"LSProf output for <type 'unicode'>\(\('world',\), {'errors': 'replace'}\)\n")
719
626
 
720
 
    def test_known_failure(self):
721
 
        """A KnownFailure being raised should trigger several result actions."""
722
 
        class InstrumentedTestResult(ExtendedTestResult):
723
 
 
724
 
            def report_test_start(self, test): pass
725
 
            def report_known_failure(self, test, err):
726
 
                self._call = test, err
727
 
        result = InstrumentedTestResult(None, None, None, None)
728
 
        def test_function():
729
 
            raise KnownFailure('failed!')
730
 
        test = unittest.FunctionTestCase(test_function)
731
 
        test.run(result)
732
 
        # it should invoke 'report_known_failure'.
733
 
        self.assertEqual(2, len(result._call))
734
 
        self.assertEqual(test, result._call[0])
735
 
        self.assertEqual(KnownFailure, result._call[1][0])
736
 
        self.assertIsInstance(result._call[1][1], KnownFailure)
737
 
        # we dont introspec the traceback, if the rest is ok, it would be
738
 
        # exceptional for it not to be.
739
 
        # it should update the known_failure_count on the object.
740
 
        self.assertEqual(1, result.known_failure_count)
741
 
        # the result should be successful.
742
 
        self.assertTrue(result.wasSuccessful())
743
 
 
744
 
    def test_verbose_report_known_failure(self):
745
 
        # verbose test output formatting
746
 
        result_stream = StringIO()
747
 
        result = bzrlib.tests.VerboseTestResult(
748
 
            unittest._WritelnDecorator(result_stream),
749
 
            descriptions=0,
750
 
            verbosity=2,
751
 
            )
752
 
        test = self.get_passing_test()
753
 
        result.startTest(test)
754
 
        result.extractBenchmarkTime(test)
755
 
        prefix = len(result_stream.getvalue())
756
 
        # the err parameter has the shape:
757
 
        # (class, exception object, traceback)
758
 
        # KnownFailures dont get their tracebacks shown though, so we
759
 
        # can skip that.
760
 
        err = (KnownFailure, KnownFailure('foo'), None)
761
 
        result.report_known_failure(test, err)
762
 
        output = result_stream.getvalue()[prefix:]
763
 
        lines = output.splitlines()
764
 
        self.assertContainsRe(lines[0], r'XFAIL *\d+ms$')
765
 
        self.assertEqual(lines[1], '    foo')
766
 
        self.assertEqual(2, len(lines))
767
 
 
768
 
    def test_text_report_known_failure(self):
769
 
        # text test output formatting
770
 
        pb = MockProgress()
771
 
        result = bzrlib.tests.TextTestResult(
772
 
            None,
773
 
            descriptions=0,
774
 
            verbosity=1,
775
 
            pb=pb,
776
 
            )
777
 
        test = self.get_passing_test()
778
 
        # this seeds the state to handle reporting the test.
779
 
        result.startTest(test)
780
 
        result.extractBenchmarkTime(test)
781
 
        # the err parameter has the shape:
782
 
        # (class, exception object, traceback)
783
 
        # KnownFailures dont get their tracebacks shown though, so we
784
 
        # can skip that.
785
 
        err = (KnownFailure, KnownFailure('foo'), None)
786
 
        result.report_known_failure(test, err)
787
 
        self.assertEqual(
788
 
            [
789
 
            ('update', '[1 in 0s] passing_test', None, None),
790
 
            ('note', 'XFAIL: %s\n%s\n', ('passing_test', err[1]))
791
 
            ],
792
 
            pb.calls)
793
 
        # known_failures should be printed in the summary, so if we run a test
794
 
        # after there are some known failures, the update prefix should match
795
 
        # this.
796
 
        result.known_failure_count = 3
797
 
        test.run(result)
798
 
        self.assertEqual(
799
 
            [
800
 
            ('update', '[2 in 0s, 3 known failures] passing_test', None, None),
801
 
            ],
802
 
            pb.calls[2:])
803
 
 
804
 
    def get_passing_test(self):
805
 
        """Return a test object that can't be run usefully."""
806
 
        def passing_test():
807
 
            pass
808
 
        return unittest.FunctionTestCase(passing_test)
809
 
 
810
 
    def test_add_not_supported(self):
811
 
        """Test the behaviour of invoking addNotSupported."""
812
 
        class InstrumentedTestResult(ExtendedTestResult):
813
 
            def report_test_start(self, test): pass
814
 
            def report_unsupported(self, test, feature):
815
 
                self._call = test, feature
816
 
        result = InstrumentedTestResult(None, None, None, None)
817
 
        test = SampleTestCase('_test_pass')
818
 
        feature = Feature()
819
 
        result.startTest(test)
820
 
        result.addNotSupported(test, feature)
821
 
        # it should invoke 'report_unsupported'.
822
 
        self.assertEqual(2, len(result._call))
823
 
        self.assertEqual(test, result._call[0])
824
 
        self.assertEqual(feature, result._call[1])
825
 
        # the result should be successful.
826
 
        self.assertTrue(result.wasSuccessful())
827
 
        # it should record the test against a count of tests not run due to
828
 
        # this feature.
829
 
        self.assertEqual(1, result.unsupported['Feature'])
830
 
        # and invoking it again should increment that counter
831
 
        result.addNotSupported(test, feature)
832
 
        self.assertEqual(2, result.unsupported['Feature'])
833
 
 
834
 
    def test_verbose_report_unsupported(self):
835
 
        # verbose test output formatting
836
 
        result_stream = StringIO()
837
 
        result = bzrlib.tests.VerboseTestResult(
838
 
            unittest._WritelnDecorator(result_stream),
839
 
            descriptions=0,
840
 
            verbosity=2,
841
 
            )
842
 
        test = self.get_passing_test()
843
 
        feature = Feature()
844
 
        result.startTest(test)
845
 
        result.extractBenchmarkTime(test)
846
 
        prefix = len(result_stream.getvalue())
847
 
        result.report_unsupported(test, feature)
848
 
        output = result_stream.getvalue()[prefix:]
849
 
        lines = output.splitlines()
850
 
        self.assertEqual(lines, ['NODEP                   0ms', "    The feature 'Feature' is not available."])
851
 
    
852
 
    def test_text_report_unsupported(self):
853
 
        # text test output formatting
854
 
        pb = MockProgress()
855
 
        result = bzrlib.tests.TextTestResult(
856
 
            None,
857
 
            descriptions=0,
858
 
            verbosity=1,
859
 
            pb=pb,
860
 
            )
861
 
        test = self.get_passing_test()
862
 
        feature = Feature()
863
 
        # this seeds the state to handle reporting the test.
864
 
        result.startTest(test)
865
 
        result.extractBenchmarkTime(test)
866
 
        result.report_unsupported(test, feature)
867
 
        # no output on unsupported features
868
 
        self.assertEqual(
869
 
            [('update', '[1 in 0s] passing_test', None, None)
870
 
            ],
871
 
            pb.calls)
872
 
        # the number of missing features should be printed in the progress
873
 
        # summary, so check for that.
874
 
        result.unsupported = {'foo':0, 'bar':0}
875
 
        test.run(result)
876
 
        self.assertEqual(
877
 
            [
878
 
            ('update', '[2 in 0s, 2 missing features] passing_test', None, None),
879
 
            ],
880
 
            pb.calls[1:])
881
 
    
882
 
    def test_unavailable_exception(self):
883
 
        """An UnavailableFeature being raised should invoke addNotSupported."""
884
 
        class InstrumentedTestResult(ExtendedTestResult):
885
 
 
886
 
            def report_test_start(self, test): pass
887
 
            def addNotSupported(self, test, feature):
888
 
                self._call = test, feature
889
 
        result = InstrumentedTestResult(None, None, None, None)
890
 
        feature = Feature()
891
 
        def test_function():
892
 
            raise UnavailableFeature(feature)
893
 
        test = unittest.FunctionTestCase(test_function)
894
 
        test.run(result)
895
 
        # it should invoke 'addNotSupported'.
896
 
        self.assertEqual(2, len(result._call))
897
 
        self.assertEqual(test, result._call[0])
898
 
        self.assertEqual(feature, result._call[1])
899
 
        # and not count as an error
900
 
        self.assertEqual(0, result.error_count)
901
 
 
902
627
 
903
628
class TestRunner(TestCase):
904
629
 
921
646
        finally:
922
647
            TestCaseInTempDir.TEST_ROOT = old_root
923
648
 
924
 
    def test_known_failure_failed_run(self):
925
 
        # run a test that generates a known failure which should be printed in
926
 
        # the final output when real failures occur.
927
 
        def known_failure_test():
928
 
            raise KnownFailure('failed')
929
 
        test = unittest.TestSuite()
930
 
        test.addTest(unittest.FunctionTestCase(known_failure_test))
931
 
        def failing_test():
932
 
            raise AssertionError('foo')
933
 
        test.addTest(unittest.FunctionTestCase(failing_test))
934
 
        stream = StringIO()
935
 
        runner = TextTestRunner(stream=stream)
936
 
        result = self.run_test_runner(runner, test)
937
 
        lines = stream.getvalue().splitlines()
938
 
        self.assertEqual([
939
 
            '',
940
 
            '======================================================================',
941
 
            'FAIL: unittest.FunctionTestCase (failing_test)',
942
 
            '----------------------------------------------------------------------',
943
 
            'Traceback (most recent call last):',
944
 
            '    raise AssertionError(\'foo\')',
945
 
            'AssertionError: foo',
946
 
            '',
947
 
            '----------------------------------------------------------------------',
948
 
            '',
949
 
            'FAILED (failures=1, known_failure_count=1)'],
950
 
            lines[0:5] + lines[6:10] + lines[11:])
951
 
 
952
 
    def test_known_failure_ok_run(self):
953
 
        # run a test that generates a known failure which should be printed in the final output.
954
 
        def known_failure_test():
955
 
            raise KnownFailure('failed')
956
 
        test = unittest.FunctionTestCase(known_failure_test)
957
 
        stream = StringIO()
958
 
        runner = TextTestRunner(stream=stream)
959
 
        result = self.run_test_runner(runner, test)
960
 
        self.assertContainsRe(stream.getvalue(),
961
 
            '\n'
962
 
            '-*\n'
963
 
            'Ran 1 test in .*\n'
964
 
            '\n'
965
 
            'OK \\(known_failures=1\\)\n')
 
649
    def test_accepts_and_uses_pb_parameter(self):
 
650
        test = TestRunner('dummy_test')
 
651
        mypb = MockProgress()
 
652
        self.assertEqual([], mypb.calls)
 
653
        runner = TextTestRunner(stream=self._log_file, pb=mypb)
 
654
        result = self.run_test_runner(runner, test)
 
655
        self.assertEqual(1, result.testsRun)
 
656
        self.assertEqual(('update', 'Running tests', 0, 1), mypb.calls[0])
 
657
        self.assertEqual(('update', '...dummy_test', 0, None), mypb.calls[1])
 
658
        self.assertEqual(('update', 'OK           ', 1, None), mypb.calls[2])
 
659
        self.assertEqual(('update', 'Cleaning up', 0, 1), mypb.calls[3])
 
660
        self.assertEqual(('clear',), mypb.calls[4])
 
661
        self.assertEqual(5, len(mypb.calls))
966
662
 
967
663
    def test_skipped_test(self):
968
664
        # run a test that is skipped, and check the suite as a whole still
970
666
        # skipping_test must be hidden in here so it's not run as a real test
971
667
        def skipping_test():
972
668
            raise TestSkipped('test intentionally skipped')
973
 
 
974
669
        runner = TextTestRunner(stream=self._log_file, keep_output=True)
975
670
        test = unittest.FunctionTestCase(skipping_test)
976
671
        result = self.run_test_runner(runner, test)
977
672
        self.assertTrue(result.wasSuccessful())
978
673
 
979
 
    def test_skipped_from_setup(self):
980
 
        class SkippedSetupTest(TestCase):
981
 
 
982
 
            def setUp(self):
983
 
                self.counter = 1
984
 
                self.addCleanup(self.cleanup)
985
 
                raise TestSkipped('skipped setup')
986
 
 
987
 
            def test_skip(self):
988
 
                self.fail('test reached')
989
 
 
990
 
            def cleanup(self):
991
 
                self.counter -= 1
992
 
 
993
 
        runner = TextTestRunner(stream=self._log_file, keep_output=True)
994
 
        test = SkippedSetupTest('test_skip')
995
 
        result = self.run_test_runner(runner, test)
996
 
        self.assertTrue(result.wasSuccessful())
997
 
        # Check if cleanup was called the right number of times.
998
 
        self.assertEqual(0, test.counter)
999
 
 
1000
 
    def test_skipped_from_test(self):
1001
 
        class SkippedTest(TestCase):
1002
 
 
1003
 
            def setUp(self):
1004
 
                self.counter = 1
1005
 
                self.addCleanup(self.cleanup)
1006
 
 
1007
 
            def test_skip(self):
1008
 
                raise TestSkipped('skipped test')
1009
 
 
1010
 
            def cleanup(self):
1011
 
                self.counter -= 1
1012
 
 
1013
 
        runner = TextTestRunner(stream=self._log_file, keep_output=True)
1014
 
        test = SkippedTest('test_skip')
1015
 
        result = self.run_test_runner(runner, test)
1016
 
        self.assertTrue(result.wasSuccessful())
1017
 
        # Check if cleanup was called the right number of times.
1018
 
        self.assertEqual(0, test.counter)
1019
 
 
1020
 
    def test_unsupported_features_listed(self):
1021
 
        """When unsupported features are encountered they are detailed."""
1022
 
        class Feature1(Feature):
1023
 
            def _probe(self): return False
1024
 
        class Feature2(Feature):
1025
 
            def _probe(self): return False
1026
 
        # create sample tests
1027
 
        test1 = SampleTestCase('_test_pass')
1028
 
        test1._test_needs_features = [Feature1()]
1029
 
        test2 = SampleTestCase('_test_pass')
1030
 
        test2._test_needs_features = [Feature2()]
1031
 
        test = unittest.TestSuite()
1032
 
        test.addTest(test1)
1033
 
        test.addTest(test2)
1034
 
        stream = StringIO()
1035
 
        runner = TextTestRunner(stream=stream)
1036
 
        result = self.run_test_runner(runner, test)
1037
 
        lines = stream.getvalue().splitlines()
1038
 
        self.assertEqual([
1039
 
            'OK',
1040
 
            "Missing feature 'Feature1' skipped 1 tests.",
1041
 
            "Missing feature 'Feature2' skipped 1 tests.",
1042
 
            ],
1043
 
            lines[-3:])
1044
 
 
1045
 
    def test_bench_history(self):
1046
 
        # tests that the running the benchmark produces a history file
1047
 
        # containing a timestamp and the revision id of the bzrlib source which
1048
 
        # was tested.
1049
 
        workingtree = _get_bzr_source_tree()
1050
 
        test = TestRunner('dummy_test')
1051
 
        output = StringIO()
1052
 
        runner = TextTestRunner(stream=self._log_file, bench_history=output)
1053
 
        result = self.run_test_runner(runner, test)
1054
 
        output_string = output.getvalue()
1055
 
        self.assertContainsRe(output_string, "--date [0-9.]+")
1056
 
        if workingtree is not None:
1057
 
            revision_id = workingtree.get_parent_ids()[0]
1058
 
            self.assertEndsWith(output_string.rstrip(), revision_id)
1059
 
 
1060
 
    def test_success_log_deleted(self):
1061
 
        """Successful tests have their log deleted"""
1062
 
 
1063
 
        class LogTester(TestCase):
1064
 
 
1065
 
            def test_success(self):
1066
 
                self.log('this will be removed\n')
1067
 
 
1068
 
        sio = cStringIO.StringIO()
1069
 
        runner = TextTestRunner(stream=sio)
1070
 
        test = LogTester('test_success')
1071
 
        result = self.run_test_runner(runner, test)
1072
 
 
1073
 
        log = test._get_log()
1074
 
        self.assertEqual("DELETED log file to reduce memory footprint", log)
1075
 
        self.assertEqual('', test._log_contents)
1076
 
        self.assertIs(None, test._log_file_name)
1077
 
 
1078
 
    def test_fail_log_kept(self):
1079
 
        """Failed tests have their log kept"""
1080
 
 
1081
 
        class LogTester(TestCase):
1082
 
 
1083
 
            def test_fail(self):
1084
 
                self.log('this will be kept\n')
1085
 
                self.fail('this test fails')
1086
 
 
1087
 
        sio = cStringIO.StringIO()
1088
 
        runner = TextTestRunner(stream=sio)
1089
 
        test = LogTester('test_fail')
1090
 
        result = self.run_test_runner(runner, test)
1091
 
 
1092
 
        text = sio.getvalue()
1093
 
        self.assertContainsRe(text, 'this will be kept')
1094
 
        self.assertContainsRe(text, 'this test fails')
1095
 
 
1096
 
        log = test._get_log()
1097
 
        self.assertContainsRe(log, 'this will be kept')
1098
 
        self.assertEqual(log, test._log_contents)
1099
 
 
1100
 
    def test_error_log_kept(self):
1101
 
        """Tests with errors have their log kept"""
1102
 
 
1103
 
        class LogTester(TestCase):
1104
 
 
1105
 
            def test_error(self):
1106
 
                self.log('this will be kept\n')
1107
 
                raise ValueError('random exception raised')
1108
 
 
1109
 
        sio = cStringIO.StringIO()
1110
 
        runner = TextTestRunner(stream=sio)
1111
 
        test = LogTester('test_error')
1112
 
        result = self.run_test_runner(runner, test)
1113
 
 
1114
 
        text = sio.getvalue()
1115
 
        self.assertContainsRe(text, 'this will be kept')
1116
 
        self.assertContainsRe(text, 'random exception raised')
1117
 
 
1118
 
        log = test._get_log()
1119
 
        self.assertContainsRe(log, 'this will be kept')
1120
 
        self.assertEqual(log, test._log_contents)
1121
 
 
1122
 
 
1123
 
class SampleTestCase(TestCase):
1124
 
 
1125
 
    def _test_pass(self):
1126
 
        pass
1127
 
 
1128
674
 
1129
675
class TestTestCase(TestCase):
1130
676
    """Tests that test the core bzrlib TestCase."""
1137
683
        # the outer child test
1138
684
        note("outer_start")
1139
685
        self.inner_test = TestTestCase("inner_child")
1140
 
        result = bzrlib.tests.TextTestResult(self._log_file,
 
686
        result = bzrlib.tests._MyResult(self._log_file,
1141
687
                                        descriptions=0,
1142
688
                                        verbosity=1)
1143
689
        self.inner_test.run(result)
1157
703
        # the outer child test
1158
704
        original_trace = bzrlib.trace._trace_file
1159
705
        outer_test = TestTestCase("outer_child")
1160
 
        result = bzrlib.tests.TextTestResult(self._log_file,
 
706
        result = bzrlib.tests._MyResult(self._log_file,
1161
707
                                        descriptions=0,
1162
708
                                        verbosity=1)
1163
709
        outer_test.run(result)
1172
718
        """Test that the TestCase.time() method accumulates a benchmark time."""
1173
719
        sample_test = TestTestCase("method_that_times_a_bit_twice")
1174
720
        output_stream = StringIO()
1175
 
        result = bzrlib.tests.VerboseTestResult(
 
721
        result = bzrlib.tests._MyResult(
1176
722
            unittest._WritelnDecorator(output_stream),
1177
723
            descriptions=0,
1178
 
            verbosity=2,
1179
 
            num_tests=sample_test.countTestCases())
 
724
            verbosity=2)
1180
725
        sample_test.run(result)
1181
726
        self.assertContainsRe(
1182
727
            output_stream.getvalue(),
1183
 
            r"\d+ms/ +\d+ms\n$")
1184
 
 
1185
 
    def test_hooks_sanitised(self):
1186
 
        """The bzrlib hooks should be sanitised by setUp."""
1187
 
        self.assertEqual(bzrlib.branch.BranchHooks(),
1188
 
            bzrlib.branch.Branch.hooks)
1189
 
        self.assertEqual(bzrlib.smart.server.SmartServerHooks(),
1190
 
            bzrlib.smart.server.SmartTCPServer.hooks)
1191
 
 
 
728
            "[1-9][0-9]ms/   [1-9][0-9]ms\n$")
 
729
        
1192
730
    def test__gather_lsprof_in_benchmarks(self):
1193
731
        """When _gather_lsprof_in_benchmarks is on, accumulate profile data.
1194
732
        
1209
747
        self.assertIsInstance(self._benchcalls[0][1], bzrlib.lsprof.Stats)
1210
748
        self.assertIsInstance(self._benchcalls[1][1], bzrlib.lsprof.Stats)
1211
749
 
1212
 
    def test_knownFailure(self):
1213
 
        """Self.knownFailure() should raise a KnownFailure exception."""
1214
 
        self.assertRaises(KnownFailure, self.knownFailure, "A Failure")
1215
 
 
1216
 
    def test_requireFeature_available(self):
1217
 
        """self.requireFeature(available) is a no-op."""
1218
 
        class Available(Feature):
1219
 
            def _probe(self):return True
1220
 
        feature = Available()
1221
 
        self.requireFeature(feature)
1222
 
 
1223
 
    def test_requireFeature_unavailable(self):
1224
 
        """self.requireFeature(unavailable) raises UnavailableFeature."""
1225
 
        class Unavailable(Feature):
1226
 
            def _probe(self):return False
1227
 
        feature = Unavailable()
1228
 
        self.assertRaises(UnavailableFeature, self.requireFeature, feature)
1229
 
 
1230
 
    def test_run_no_parameters(self):
1231
 
        test = SampleTestCase('_test_pass')
1232
 
        test.run()
1233
 
    
1234
 
    def test_run_enabled_unittest_result(self):
1235
 
        """Test we revert to regular behaviour when the test is enabled."""
1236
 
        test = SampleTestCase('_test_pass')
1237
 
        class EnabledFeature(object):
1238
 
            def available(self):
1239
 
                return True
1240
 
        test._test_needs_features = [EnabledFeature()]
1241
 
        result = unittest.TestResult()
1242
 
        test.run(result)
1243
 
        self.assertEqual(1, result.testsRun)
1244
 
        self.assertEqual([], result.errors)
1245
 
        self.assertEqual([], result.failures)
1246
 
 
1247
 
    def test_run_disabled_unittest_result(self):
1248
 
        """Test our compatability for disabled tests with unittest results."""
1249
 
        test = SampleTestCase('_test_pass')
1250
 
        class DisabledFeature(object):
1251
 
            def available(self):
1252
 
                return False
1253
 
        test._test_needs_features = [DisabledFeature()]
1254
 
        result = unittest.TestResult()
1255
 
        test.run(result)
1256
 
        self.assertEqual(1, result.testsRun)
1257
 
        self.assertEqual([], result.errors)
1258
 
        self.assertEqual([], result.failures)
1259
 
 
1260
 
    def test_run_disabled_supporting_result(self):
1261
 
        """Test disabled tests behaviour with support aware results."""
1262
 
        test = SampleTestCase('_test_pass')
1263
 
        class DisabledFeature(object):
1264
 
            def available(self):
1265
 
                return False
1266
 
        the_feature = DisabledFeature()
1267
 
        test._test_needs_features = [the_feature]
1268
 
        class InstrumentedTestResult(unittest.TestResult):
1269
 
            def __init__(self):
1270
 
                unittest.TestResult.__init__(self)
1271
 
                self.calls = []
1272
 
            def startTest(self, test):
1273
 
                self.calls.append(('startTest', test))
1274
 
            def stopTest(self, test):
1275
 
                self.calls.append(('stopTest', test))
1276
 
            def addNotSupported(self, test, feature):
1277
 
                self.calls.append(('addNotSupported', test, feature))
1278
 
        result = InstrumentedTestResult()
1279
 
        test.run(result)
1280
 
        self.assertEqual([
1281
 
            ('startTest', test),
1282
 
            ('addNotSupported', test, the_feature),
1283
 
            ('stopTest', test),
1284
 
            ],
1285
 
            result.calls)
1286
 
 
1287
 
 
1288
 
@symbol_versioning.deprecated_function(zero_eleven)
1289
 
def sample_deprecated_function():
1290
 
    """A deprecated function to test applyDeprecated with."""
1291
 
    return 2
1292
 
 
1293
 
 
1294
 
def sample_undeprecated_function(a_param):
1295
 
    """A undeprecated function to test applyDeprecated with."""
1296
 
 
1297
 
 
1298
 
class ApplyDeprecatedHelper(object):
1299
 
    """A helper class for ApplyDeprecated tests."""
1300
 
 
1301
 
    @symbol_versioning.deprecated_method(zero_eleven)
1302
 
    def sample_deprecated_method(self, param_one):
1303
 
        """A deprecated method for testing with."""
1304
 
        return param_one
1305
 
 
1306
 
    def sample_normal_method(self):
1307
 
        """A undeprecated method."""
1308
 
 
1309
 
    @symbol_versioning.deprecated_method(zero_ten)
1310
 
    def sample_nested_deprecation(self):
1311
 
        return sample_deprecated_function()
1312
 
 
1313
750
 
1314
751
class TestExtraAssertions(TestCase):
1315
752
    """Tests for new test assertions in bzrlib test suite"""
1324
761
        self.assertEndsWith('foo', 'oo')
1325
762
        self.assertRaises(AssertionError, self.assertEndsWith, 'o', 'oo')
1326
763
 
1327
 
    def test_applyDeprecated_not_deprecated(self):
1328
 
        sample_object = ApplyDeprecatedHelper()
1329
 
        # calling an undeprecated callable raises an assertion
1330
 
        self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
1331
 
            sample_object.sample_normal_method)
1332
 
        self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
1333
 
            sample_undeprecated_function, "a param value")
1334
 
        # calling a deprecated callable (function or method) with the wrong
1335
 
        # expected deprecation fails.
1336
 
        self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
1337
 
            sample_object.sample_deprecated_method, "a param value")
1338
 
        self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
1339
 
            sample_deprecated_function)
1340
 
        # calling a deprecated callable (function or method) with the right
1341
 
        # expected deprecation returns the functions result.
1342
 
        self.assertEqual("a param value", self.applyDeprecated(zero_eleven,
1343
 
            sample_object.sample_deprecated_method, "a param value"))
1344
 
        self.assertEqual(2, self.applyDeprecated(zero_eleven,
1345
 
            sample_deprecated_function))
1346
 
        # calling a nested deprecation with the wrong deprecation version
1347
 
        # fails even if a deeper nested function was deprecated with the 
1348
 
        # supplied version.
1349
 
        self.assertRaises(AssertionError, self.applyDeprecated,
1350
 
            zero_eleven, sample_object.sample_nested_deprecation)
1351
 
        # calling a nested deprecation with the right deprecation value
1352
 
        # returns the calls result.
1353
 
        self.assertEqual(2, self.applyDeprecated(zero_ten,
1354
 
            sample_object.sample_nested_deprecation))
1355
 
 
1356
 
    def test_callDeprecated(self):
1357
 
        def testfunc(be_deprecated, result=None):
1358
 
            if be_deprecated is True:
1359
 
                symbol_versioning.warn('i am deprecated', DeprecationWarning, 
1360
 
                                       stacklevel=1)
1361
 
            return result
1362
 
        result = self.callDeprecated(['i am deprecated'], testfunc, True)
1363
 
        self.assertIs(None, result)
1364
 
        result = self.callDeprecated([], testfunc, False, 'result')
1365
 
        self.assertEqual('result', result)
1366
 
        self.callDeprecated(['i am deprecated'], testfunc, be_deprecated=True)
1367
 
        self.callDeprecated([], testfunc, be_deprecated=False)
1368
 
 
1369
764
 
1370
765
class TestConvenienceMakers(TestCaseWithTransport):
1371
766
    """Test for the make_* convenience functions."""
1379
774
        self.assertIsInstance(bzrlib.bzrdir.BzrDir.open('b')._format,
1380
775
                              bzrlib.bzrdir.BzrDirFormat6)
1381
776
 
1382
 
    def test_make_branch_and_memory_tree(self):
1383
 
        # we should be able to get a new branch and a mutable tree from
1384
 
        # TestCaseWithTransport
1385
 
        tree = self.make_branch_and_memory_tree('a')
1386
 
        self.assertIsInstance(tree, bzrlib.memorytree.MemoryTree)
1387
 
 
1388
 
 
1389
 
class TestSFTPMakeBranchAndTree(TestCaseWithSFTPServer):
1390
 
 
1391
 
    def test_make_tree_for_sftp_branch(self):
1392
 
        """Transports backed by local directories create local trees."""
1393
 
 
1394
 
        tree = self.make_branch_and_tree('t1')
1395
 
        base = tree.bzrdir.root_transport.base
1396
 
        self.failIf(base.startswith('sftp'),
1397
 
                'base %r is on sftp but should be local' % base)
1398
 
        self.assertEquals(tree.bzrdir.root_transport,
1399
 
                tree.branch.bzrdir.root_transport)
1400
 
        self.assertEquals(tree.bzrdir.root_transport,
1401
 
                tree.branch.repository.bzrdir.root_transport)
1402
 
 
1403
777
 
1404
778
class TestSelftest(TestCase):
1405
779
    """Tests of bzrlib.tests.selftest."""
1414
788
        self.apply_redirected(out, err, None, bzrlib.tests.selftest, 
1415
789
            test_suite_factory=factory)
1416
790
        self.assertEqual([True], factory_called)
1417
 
 
1418
 
 
1419
 
class TestSelftestCleanOutput(TestCaseInTempDir):
1420
 
 
1421
 
    def test_clean_output(self):
1422
 
        # test functionality of clean_selftest_output()
1423
 
        self.build_tree(['test0000.tmp/', 'test0001.tmp/',
1424
 
                         'bzrlib/', 'tests/',
1425
 
                         'bzr', 'setup.py', 'test9999.tmp'])
1426
 
 
1427
 
        root = os.getcwdu()
1428
 
        before = os.listdir(root)
1429
 
        before.sort()
1430
 
        self.assertEquals(['bzr','bzrlib','setup.py',
1431
 
                           'test0000.tmp','test0001.tmp',
1432
 
                           'test9999.tmp','tests'],
1433
 
                           before)
1434
 
        clean_selftest_output(root, quiet=True)
1435
 
        after = os.listdir(root)
1436
 
        after.sort()
1437
 
        self.assertEquals(['bzr','bzrlib','setup.py',
1438
 
                           'test9999.tmp','tests'],
1439
 
                           after)
1440
 
 
1441
 
    def test_clean_readonly(self):
1442
 
        # test for delete read-only files
1443
 
        self.build_tree(['test0000.tmp/', 'test0000.tmp/foo'])
1444
 
        osutils.make_readonly('test0000.tmp/foo')
1445
 
        root = os.getcwdu()
1446
 
        before = os.listdir(root);  before.sort()
1447
 
        self.assertEquals(['test0000.tmp'], before)
1448
 
        clean_selftest_output(root, quiet=True)
1449
 
        after = os.listdir(root);   after.sort()
1450
 
        self.assertEquals([], after)
1451
 
 
1452
 
 
1453
 
class TestKnownFailure(TestCase):
1454
 
 
1455
 
    def test_known_failure(self):
1456
 
        """Check that KnownFailure is defined appropriately."""
1457
 
        # a KnownFailure is an assertion error for compatability with unaware
1458
 
        # runners.
1459
 
        self.assertIsInstance(KnownFailure(""), AssertionError)
1460
 
 
1461
 
    def test_expect_failure(self):
1462
 
        try:
1463
 
            self.expectFailure("Doomed to failure", self.assertTrue, False)
1464
 
        except KnownFailure, e:
1465
 
            self.assertEqual('Doomed to failure', e.args[0])
1466
 
        try:
1467
 
            self.expectFailure("Doomed to failure", self.assertTrue, True)
1468
 
        except AssertionError, e:
1469
 
            self.assertEqual('Unexpected success.  Should have failed:'
1470
 
                             ' Doomed to failure', e.args[0])
1471
 
        else:
1472
 
            self.fail('Assertion not raised')
1473
 
 
1474
 
 
1475
 
class TestFeature(TestCase):
1476
 
 
1477
 
    def test_caching(self):
1478
 
        """Feature._probe is called by the feature at most once."""
1479
 
        class InstrumentedFeature(Feature):
1480
 
            def __init__(self):
1481
 
                Feature.__init__(self)
1482
 
                self.calls = []
1483
 
            def _probe(self):
1484
 
                self.calls.append('_probe')
1485
 
                return False
1486
 
        feature = InstrumentedFeature()
1487
 
        feature.available()
1488
 
        self.assertEqual(['_probe'], feature.calls)
1489
 
        feature.available()
1490
 
        self.assertEqual(['_probe'], feature.calls)
1491
 
 
1492
 
    def test_named_str(self):
1493
 
        """Feature.__str__ should thunk to feature_name()."""
1494
 
        class NamedFeature(Feature):
1495
 
            def feature_name(self):
1496
 
                return 'symlinks'
1497
 
        feature = NamedFeature()
1498
 
        self.assertEqual('symlinks', str(feature))
1499
 
 
1500
 
    def test_default_str(self):
1501
 
        """Feature.__str__ should default to __class__.__name__."""
1502
 
        class NamedFeature(Feature):
1503
 
            pass
1504
 
        feature = NamedFeature()
1505
 
        self.assertEqual('NamedFeature', str(feature))
1506
 
 
1507
 
 
1508
 
class TestUnavailableFeature(TestCase):
1509
 
 
1510
 
    def test_access_feature(self):
1511
 
        feature = Feature()
1512
 
        exception = UnavailableFeature(feature)
1513
 
        self.assertIs(feature, exception.args[0])
1514
 
 
1515
 
 
1516
 
class TestSelftestFiltering(TestCase):
1517
 
 
1518
 
    def setUp(self):
1519
 
        self.suite = TestUtil.TestSuite()
1520
 
        self.loader = TestUtil.TestLoader()
1521
 
        self.suite.addTest(self.loader.loadTestsFromModuleNames([
1522
 
            'bzrlib.tests.test_selftest']))
1523
 
        self.all_names = [t.id() for t in iter_suite_tests(self.suite)]
1524
 
 
1525
 
    def test_filter_suite_by_re(self):
1526
 
        filtered_suite = filter_suite_by_re(self.suite, 'test_filter')
1527
 
        filtered_names = [t.id() for t in iter_suite_tests(filtered_suite)]
1528
 
        self.assertEqual(filtered_names, ['bzrlib.tests.test_selftest.'
1529
 
            'TestSelftestFiltering.test_filter_suite_by_re'])
1530
 
            
1531
 
    def test_sort_suite_by_re(self):
1532
 
        sorted_suite = sort_suite_by_re(self.suite, 'test_filter')
1533
 
        sorted_names = [t.id() for t in iter_suite_tests(sorted_suite)]
1534
 
        self.assertEqual(sorted_names[0], 'bzrlib.tests.test_selftest.'
1535
 
            'TestSelftestFiltering.test_filter_suite_by_re')
1536
 
        self.assertEquals(sorted(self.all_names), sorted(sorted_names))
1537