/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/test_selftest.py

  • Committer: Jelmer Vernooij
  • Date: 2017-05-22 00:56:52 UTC
  • mfrom: (6621.2.26 py3_pokes)
  • Revision ID: jelmer@jelmer.uk-20170522005652-yjahcr9hwmjkno7n
Merge Python3 porting work ('py3 pokes')

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2013, 2016 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
16
16
 
17
17
"""Tests for the test framework."""
18
18
 
19
 
from cStringIO import StringIO
20
 
from doctest import ELLIPSIS
 
19
import gc
 
20
import doctest
21
21
import os
22
22
import signal
23
23
import sys
 
24
import threading
24
25
import time
25
26
import unittest
26
27
import warnings
27
28
 
28
 
from testtools import MultiTestResult
 
29
from testtools import (
 
30
    ExtendedToOriginalDecorator,
 
31
    MultiTestResult,
 
32
    )
 
33
from testtools.content import Content
29
34
from testtools.content_type import ContentType
30
35
from testtools.matchers import (
31
36
    DocTestMatches,
32
37
    Equals,
33
38
    )
34
 
import testtools.tests.helpers
 
39
import testtools.testresult.doubles
35
40
 
36
 
import bzrlib
37
 
from bzrlib import (
 
41
import breezy
 
42
from .. import (
38
43
    branchbuilder,
39
44
    bzrdir,
40
 
    debug,
 
45
    controldir,
41
46
    errors,
 
47
    hooks,
42
48
    lockdir,
43
49
    memorytree,
44
50
    osutils,
45
 
    progress,
46
51
    remote,
47
52
    repository,
48
53
    symbol_versioning,
49
54
    tests,
50
55
    transport,
51
56
    workingtree,
 
57
    workingtree_3,
 
58
    workingtree_4,
52
59
    )
53
 
from bzrlib.repofmt import (
 
60
from ..repofmt import (
54
61
    groupcompress_repo,
55
 
    pack_repo,
56
 
    weaverepo,
57
 
    )
58
 
from bzrlib.symbol_versioning import (
 
62
    )
 
63
from ..sixish import (
 
64
    BytesIO,
 
65
    )
 
66
from ..symbol_versioning import (
59
67
    deprecated_function,
60
68
    deprecated_in,
61
69
    deprecated_method,
62
70
    )
63
 
from bzrlib.tests import (
 
71
from . import (
64
72
    features,
65
73
    test_lsprof,
66
74
    test_server,
67
 
    test_sftp_transport,
68
75
    TestUtil,
69
76
    )
70
 
from bzrlib.trace import note
71
 
from bzrlib.transport import memory
72
 
from bzrlib.version import _get_bzr_source_tree
 
77
from ..trace import note, mutter
 
78
from ..transport import memory
73
79
 
74
80
 
75
81
def _test_ids(test_suite):
77
83
    return [t.id() for t in tests.iter_suite_tests(test_suite)]
78
84
 
79
85
 
80
 
class SelftestTests(tests.TestCase):
81
 
 
82
 
    def test_import_tests(self):
83
 
        mod = TestUtil._load_module_by_name('bzrlib.tests.test_selftest')
84
 
        self.assertEqual(mod.SelftestTests, SelftestTests)
85
 
 
86
 
    def test_import_test_failure(self):
87
 
        self.assertRaises(ImportError,
88
 
                          TestUtil._load_module_by_name,
89
 
                          'bzrlib.no-name-yet')
90
 
 
91
 
 
92
86
class MetaTestLog(tests.TestCase):
93
87
 
94
88
    def test_logging(self):
100
94
            "text", "plain", {"charset": "utf8"})))
101
95
        self.assertThat(u"".join(log.iter_text()), Equals(self.get_log()))
102
96
        self.assertThat(self.get_log(),
103
 
            DocTestMatches(u"...a test message\n", ELLIPSIS))
104
 
 
105
 
 
106
 
class TestUnicodeFilename(tests.TestCase):
107
 
 
108
 
    def test_probe_passes(self):
109
 
        """UnicodeFilename._probe passes."""
110
 
        # We can't test much more than that because the behaviour depends
111
 
        # on the platform.
112
 
        tests.UnicodeFilename._probe()
 
97
            DocTestMatches(u"...a test message\n", doctest.ELLIPSIS))
113
98
 
114
99
 
115
100
class TestTreeShape(tests.TestCaseInTempDir):
116
101
 
117
102
    def test_unicode_paths(self):
118
 
        self.requireFeature(tests.UnicodeFilename)
 
103
        self.requireFeature(features.UnicodeFilenameFeature)
119
104
 
120
105
        filename = u'hell\u00d8'
121
106
        self.build_tree_contents([(filename, 'contents of hello')])
122
 
        self.failUnlessExists(filename)
 
107
        self.assertPathExists(filename)
 
108
 
 
109
 
 
110
class TestClassesAvailable(tests.TestCase):
 
111
    """As a convenience we expose Test* classes from breezy.tests"""
 
112
 
 
113
    def test_test_case(self):
 
114
        from . import TestCase
 
115
 
 
116
    def test_test_loader(self):
 
117
        from . import TestLoader
 
118
 
 
119
    def test_test_suite(self):
 
120
        from . import TestSuite
123
121
 
124
122
 
125
123
class TestTransportScenarios(tests.TestCase):
139
137
            def get_test_permutations(self):
140
138
                return sample_permutation
141
139
        sample_permutation = [(1,2), (3,4)]
142
 
        from bzrlib.tests.per_transport import get_transport_test_permutations
 
140
        from .per_transport import get_transport_test_permutations
143
141
        self.assertEqual(sample_permutation,
144
142
                         get_transport_test_permutations(MockModule()))
145
143
 
148
146
        # as there are in all the registered transport modules - we assume if
149
147
        # this matches its probably doing the right thing especially in
150
148
        # combination with the tests for setting the right classes below.
151
 
        from bzrlib.tests.per_transport import transport_test_permutations
152
 
        from bzrlib.transport import _get_transport_modules
 
149
        from .per_transport import transport_test_permutations
 
150
        from ..transport import _get_transport_modules
153
151
        modules = _get_transport_modules()
154
152
        permutation_count = 0
155
153
        for module in modules:
166
164
        # This test used to know about all the possible transports and the
167
165
        # order they were returned but that seems overly brittle (mbp
168
166
        # 20060307)
169
 
        from bzrlib.tests.per_transport import transport_test_permutations
 
167
        from .per_transport import transport_test_permutations
170
168
        scenarios = transport_test_permutations()
171
169
        # there are at least that many builtin transports
172
170
        self.assertTrue(len(scenarios) > 6)
173
171
        one_scenario = scenarios[0]
174
172
        self.assertIsInstance(one_scenario[0], str)
175
173
        self.assertTrue(issubclass(one_scenario[1]["transport_class"],
176
 
                                   bzrlib.transport.Transport))
 
174
                                   breezy.transport.Transport))
177
175
        self.assertTrue(issubclass(one_scenario[1]["transport_server"],
178
 
                                   bzrlib.transport.Server))
 
176
                                   breezy.transport.Server))
179
177
 
180
178
 
181
179
class TestBranchScenarios(tests.TestCase):
183
181
    def test_scenarios(self):
184
182
        # check that constructor parameters are passed through to the adapted
185
183
        # test.
186
 
        from bzrlib.tests.per_branch import make_scenarios
 
184
        from .per_branch import make_scenarios
187
185
        server1 = "a"
188
186
        server2 = "b"
189
187
        formats = [("c", "C"), ("d", "D")]
208
206
    def test_scenarios(self):
209
207
        # check that constructor parameters are passed through to the adapted
210
208
        # test.
211
 
        from bzrlib.tests.per_bzrdir import make_scenarios
 
209
        from .per_controldir import make_scenarios
212
210
        vfs_factory = "v"
213
211
        server1 = "a"
214
212
        server2 = "b"
231
229
class TestRepositoryScenarios(tests.TestCase):
232
230
 
233
231
    def test_formats_to_scenarios(self):
234
 
        from bzrlib.tests.per_repository import formats_to_scenarios
 
232
        from .per_repository import formats_to_scenarios
235
233
        formats = [("(c)", remote.RemoteRepositoryFormat()),
236
234
                   ("(d)", repository.format_registry.get(
237
235
                    'Bazaar repository format 2a (needs bzr 1.16 or later)\n'))]
272
270
    """Tests for the test adaption facilities."""
273
271
 
274
272
    def test_apply_scenario(self):
275
 
        from bzrlib.tests import apply_scenario
 
273
        from breezy.tests import apply_scenario
276
274
        input_test = TestTestScenarioApplication("test_apply_scenario")
277
275
        # setup two adapted tests
278
276
        adapted_test1 = apply_scenario(input_test,
294
292
        self.assertEqual("readonly-server",
295
293
            adapted_test1.transport_readonly_server)
296
294
        self.assertEqual(
297
 
            "bzrlib.tests.test_selftest.TestTestScenarioApplication."
 
295
            "breezy.tests.test_selftest.TestTestScenarioApplication."
298
296
            "test_apply_scenario(new id)",
299
297
            adapted_test1.id())
300
298
        self.assertEqual(None, adapted_test2.bzrdir_format)
301
299
        self.assertEqual(
302
 
            "bzrlib.tests.test_selftest.TestTestScenarioApplication."
 
300
            "breezy.tests.test_selftest.TestTestScenarioApplication."
303
301
            "test_apply_scenario(new id 2)",
304
302
            adapted_test2.id())
305
303
 
309
307
    def test_scenarios(self):
310
308
        # check that constructor parameters are passed through to the adapted
311
309
        # test.
312
 
        from bzrlib.tests.per_interrepository import make_scenarios
 
310
        from .per_interrepository import make_scenarios
313
311
        server1 = "a"
314
312
        server2 = "b"
315
 
        formats = [("C0", "C1", "C2"), ("D0", "D1", "D2")]
 
313
        formats = [("C0", "C1", "C2", "C3"), ("D0", "D1", "D2", "D3")]
316
314
        scenarios = make_scenarios(server1, server2, formats)
317
315
        self.assertEqual([
318
316
            ('C0,str,str',
319
317
             {'repository_format': 'C1',
320
318
              'repository_format_to': 'C2',
321
319
              'transport_readonly_server': 'b',
322
 
              'transport_server': 'a'}),
 
320
              'transport_server': 'a',
 
321
              'extra_setup': 'C3'}),
323
322
            ('D0,str,str',
324
323
             {'repository_format': 'D1',
325
324
              'repository_format_to': 'D2',
326
325
              'transport_readonly_server': 'b',
327
 
              'transport_server': 'a'})],
 
326
              'transport_server': 'a',
 
327
              'extra_setup': 'D3'})],
328
328
            scenarios)
329
329
 
330
330
 
333
333
    def test_scenarios(self):
334
334
        # check that constructor parameters are passed through to the adapted
335
335
        # test.
336
 
        from bzrlib.tests.per_workingtree import make_scenarios
 
336
        from .per_workingtree import make_scenarios
337
337
        server1 = "a"
338
338
        server2 = "b"
339
 
        formats = [workingtree.WorkingTreeFormat2(),
340
 
                   workingtree.WorkingTreeFormat3(),]
341
 
        scenarios = make_scenarios(server1, server2, formats)
 
339
        formats = [workingtree_4.WorkingTreeFormat4(),
 
340
                   workingtree_3.WorkingTreeFormat3(),
 
341
                   workingtree_4.WorkingTreeFormat6()]
 
342
        scenarios = make_scenarios(server1, server2, formats,
 
343
            remote_server='c', remote_readonly_server='d',
 
344
            remote_backing_server='e')
342
345
        self.assertEqual([
343
 
            ('WorkingTreeFormat2',
 
346
            ('WorkingTreeFormat4',
344
347
             {'bzrdir_format': formats[0]._matchingbzrdir,
345
348
              'transport_readonly_server': 'b',
346
349
              'transport_server': 'a',
349
352
             {'bzrdir_format': formats[1]._matchingbzrdir,
350
353
              'transport_readonly_server': 'b',
351
354
              'transport_server': 'a',
352
 
              'workingtree_format': formats[1]})],
353
 
            scenarios)
 
355
              'workingtree_format': formats[1]}),
 
356
            ('WorkingTreeFormat6',
 
357
             {'bzrdir_format': formats[2]._matchingbzrdir,
 
358
              'transport_readonly_server': 'b',
 
359
              'transport_server': 'a',
 
360
              'workingtree_format': formats[2]}),
 
361
            ('WorkingTreeFormat6,remote',
 
362
             {'bzrdir_format': formats[2]._matchingbzrdir,
 
363
              'repo_is_remote': True,
 
364
              'transport_readonly_server': 'd',
 
365
              'transport_server': 'c',
 
366
              'vfs_transport_factory': 'e',
 
367
              'workingtree_format': formats[2]}),
 
368
            ], scenarios)
354
369
 
355
370
 
356
371
class TestTreeScenarios(tests.TestCase):
357
372
 
358
373
    def test_scenarios(self):
359
374
        # the tree implementation scenario generator is meant to setup one
360
 
        # instance for each working tree format, and one additional instance
 
375
        # instance for each working tree format, one additional instance
361
376
        # that will use the default wt format, but create a revision tree for
362
 
        # the tests.  this means that the wt ones should have the
363
 
        # workingtree_to_test_tree attribute set to 'return_parameter' and the
364
 
        # revision one set to revision_tree_from_workingtree.
 
377
        # the tests, and one more that uses the default wt format as a
 
378
        # lightweight checkout of a remote repository.  This means that the wt
 
379
        # ones should have the workingtree_to_test_tree attribute set to
 
380
        # 'return_parameter' and the revision one set to
 
381
        # revision_tree_from_workingtree.
365
382
 
366
 
        from bzrlib.tests.per_tree import (
 
383
        from .per_tree import (
367
384
            _dirstate_tree_from_workingtree,
368
385
            make_scenarios,
369
386
            preview_tree_pre,
373
390
            )
374
391
        server1 = "a"
375
392
        server2 = "b"
376
 
        formats = [workingtree.WorkingTreeFormat2(),
377
 
                   workingtree.WorkingTreeFormat3(),]
 
393
        smart_server = test_server.SmartTCPServer_for_testing
 
394
        smart_readonly_server = test_server.ReadonlySmartTCPServer_for_testing
 
395
        mem_server = memory.MemoryServer
 
396
        formats = [workingtree_4.WorkingTreeFormat4(),
 
397
                   workingtree_3.WorkingTreeFormat3(),]
378
398
        scenarios = make_scenarios(server1, server2, formats)
379
 
        self.assertEqual(7, len(scenarios))
380
 
        default_wt_format = workingtree.WorkingTreeFormat4._default_format
381
 
        wt4_format = workingtree.WorkingTreeFormat4()
382
 
        wt5_format = workingtree.WorkingTreeFormat5()
 
399
        self.assertEqual(8, len(scenarios))
 
400
        default_wt_format = workingtree.format_registry.get_default()
 
401
        wt4_format = workingtree_4.WorkingTreeFormat4()
 
402
        wt5_format = workingtree_4.WorkingTreeFormat5()
 
403
        wt6_format = workingtree_4.WorkingTreeFormat6()
383
404
        expected_scenarios = [
384
 
            ('WorkingTreeFormat2',
 
405
            ('WorkingTreeFormat4',
385
406
             {'bzrdir_format': formats[0]._matchingbzrdir,
386
407
              'transport_readonly_server': 'b',
387
408
              'transport_server': 'a',
395
416
              'workingtree_format': formats[1],
396
417
              '_workingtree_to_test_tree': return_parameter,
397
418
             }),
 
419
            ('WorkingTreeFormat6,remote',
 
420
             {'bzrdir_format': wt6_format._matchingbzrdir,
 
421
              'repo_is_remote': True,
 
422
              'transport_readonly_server': smart_readonly_server,
 
423
              'transport_server': smart_server,
 
424
              'vfs_transport_factory': mem_server,
 
425
              'workingtree_format': wt6_format,
 
426
              '_workingtree_to_test_tree': return_parameter,
 
427
             }),
398
428
            ('RevisionTree',
399
429
             {'_workingtree_to_test_tree': revision_tree_from_workingtree,
400
430
              'bzrdir_format': default_wt_format._matchingbzrdir,
445
475
        # unlike the TestProviderAdapter we dont want to automatically add a
446
476
        # parameterized one for WorkingTree - the optimisers will tell us what
447
477
        # ones to add.
448
 
        from bzrlib.tests.per_tree import (
 
478
        from .per_tree import (
449
479
            return_parameter,
450
 
            revision_tree_from_workingtree
451
480
            )
452
 
        from bzrlib.tests.per_intertree import (
 
481
        from .per_intertree import (
453
482
            make_scenarios,
454
483
            )
455
 
        from bzrlib.workingtree import WorkingTreeFormat2, WorkingTreeFormat3
 
484
        from ..workingtree_3 import WorkingTreeFormat3
 
485
        from ..workingtree_4 import WorkingTreeFormat4
456
486
        input_test = TestInterTreeScenarios(
457
487
            "test_scenarios")
458
488
        server1 = "a"
459
489
        server2 = "b"
460
 
        format1 = WorkingTreeFormat2()
 
490
        format1 = WorkingTreeFormat4()
461
491
        format2 = WorkingTreeFormat3()
462
492
        formats = [("1", str, format1, format2, "converter1"),
463
493
            ("2", int, format2, format1, "converter2")]
497
527
        self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
498
528
 
499
529
    def test_assertEqualStat_equal(self):
500
 
        from bzrlib.tests.test_dirstate import _FakeStat
 
530
        from .test_dirstate import _FakeStat
501
531
        self.build_tree(["foo"])
502
532
        real = os.lstat("foo")
503
533
        fake = _FakeStat(real.st_size, real.st_mtime, real.st_ctime,
509
539
        self.assertRaises(AssertionError, self.assertEqualStat,
510
540
            os.lstat("foo"), os.lstat("longname"))
511
541
 
 
542
    def test_failUnlessExists(self):
 
543
        """Deprecated failUnlessExists and failIfExists"""
 
544
        self.applyDeprecated(
 
545
            deprecated_in((2, 4)),
 
546
            self.failUnlessExists, '.')
 
547
        self.build_tree(['foo/', 'foo/bar'])
 
548
        self.applyDeprecated(
 
549
            deprecated_in((2, 4)),
 
550
            self.failUnlessExists, 'foo/bar')
 
551
        self.applyDeprecated(
 
552
            deprecated_in((2, 4)),
 
553
            self.failIfExists, 'foo/foo')
 
554
 
 
555
    def test_assertPathExists(self):
 
556
        self.assertPathExists('.')
 
557
        self.build_tree(['foo/', 'foo/bar'])
 
558
        self.assertPathExists('foo/bar')
 
559
        self.assertPathDoesNotExist('foo/foo')
 
560
 
512
561
 
513
562
class TestTestCaseWithMemoryTransport(tests.TestCaseWithMemoryTransport):
514
563
 
516
565
        """The test_home_dir for TestCaseWithMemoryTransport is missing.
517
566
 
518
567
        This is because TestCaseWithMemoryTransport is for tests that do not
519
 
        need any disk resources: they should be hooked into bzrlib in such a
 
568
        need any disk resources: they should be hooked into breezy in such a
520
569
        way that no global settings are being changed by the test (only a
521
570
        few tests should need to do that), and having a missing dir as home is
522
571
        an effective way to ensure that this is the case.
531
580
        cwd = osutils.getcwd()
532
581
        self.assertIsSameRealPath(self.test_dir, cwd)
533
582
 
534
 
    def test_BZR_HOME_and_HOME_are_bytestrings(self):
535
 
        """The $BZR_HOME and $HOME environment variables should not be unicode.
 
583
    def test_BRZ_HOME_and_HOME_are_bytestrings(self):
 
584
        """The $BRZ_HOME and $HOME environment variables should not be unicode.
536
585
 
537
586
        See https://bugs.launchpad.net/bzr/+bug/464174
538
587
        """
539
 
        self.assertIsInstance(os.environ['BZR_HOME'], str)
 
588
        self.assertIsInstance(os.environ['BRZ_HOME'], str)
540
589
        self.assertIsInstance(os.environ['HOME'], str)
541
590
 
542
591
    def test_make_branch_and_memory_tree(self):
548
597
        tree = self.make_branch_and_memory_tree('dir')
549
598
        # Guard against regression into MemoryTransport leaking
550
599
        # files to disk instead of keeping them in memory.
551
 
        self.failIf(osutils.lexists('dir'))
 
600
        self.assertFalse(osutils.lexists('dir'))
552
601
        self.assertIsInstance(tree, memorytree.MemoryTree)
553
602
 
554
603
    def test_make_branch_and_memory_tree_with_format(self):
555
604
        """make_branch_and_memory_tree should accept a format option."""
556
605
        format = bzrdir.BzrDirMetaFormat1()
557
 
        format.repository_format = weaverepo.RepositoryFormat7()
 
606
        format.repository_format = repository.format_registry.get_default()
558
607
        tree = self.make_branch_and_memory_tree('dir', format=format)
559
608
        # Guard against regression into MemoryTransport leaking
560
609
        # files to disk instead of keeping them in memory.
561
 
        self.failIf(osutils.lexists('dir'))
 
610
        self.assertFalse(osutils.lexists('dir'))
562
611
        self.assertIsInstance(tree, memorytree.MemoryTree)
563
612
        self.assertEqual(format.repository_format.__class__,
564
613
            tree.branch.repository._format.__class__)
568
617
        self.assertIsInstance(builder, branchbuilder.BranchBuilder)
569
618
        # Guard against regression into MemoryTransport leaking
570
619
        # files to disk instead of keeping them in memory.
571
 
        self.failIf(osutils.lexists('dir'))
 
620
        self.assertFalse(osutils.lexists('dir'))
572
621
 
573
622
    def test_make_branch_builder_with_format(self):
574
623
        # Use a repo layout that doesn't conform to a 'named' layout, to ensure
575
624
        # that the format objects are used.
576
625
        format = bzrdir.BzrDirMetaFormat1()
577
 
        repo_format = weaverepo.RepositoryFormat7()
 
626
        repo_format = repository.format_registry.get_default()
578
627
        format.repository_format = repo_format
579
628
        builder = self.make_branch_builder('dir', format=format)
580
629
        the_branch = builder.get_branch()
581
630
        # Guard against regression into MemoryTransport leaking
582
631
        # files to disk instead of keeping them in memory.
583
 
        self.failIf(osutils.lexists('dir'))
 
632
        self.assertFalse(osutils.lexists('dir'))
584
633
        self.assertEqual(format.repository_format.__class__,
585
634
                         the_branch.repository._format.__class__)
586
635
        self.assertEqual(repo_format.get_format_string(),
592
641
        the_branch = builder.get_branch()
593
642
        # Guard against regression into MemoryTransport leaking
594
643
        # files to disk instead of keeping them in memory.
595
 
        self.failIf(osutils.lexists('dir'))
596
 
        dir_format = bzrdir.format_registry.make_bzrdir('knit')
 
644
        self.assertFalse(osutils.lexists('dir'))
 
645
        dir_format = controldir.format_registry.make_bzrdir('knit')
597
646
        self.assertEqual(dir_format.repository_format.__class__,
598
647
                         the_branch.repository._format.__class__)
599
648
        self.assertEqual('Bazaar-NG Knit Repository Format 1',
603
652
    def test_dangling_locks_cause_failures(self):
604
653
        class TestDanglingLock(tests.TestCaseWithMemoryTransport):
605
654
            def test_function(self):
606
 
                t = self.get_transport('.')
 
655
                t = self.get_transport_from_path('.')
607
656
                l = lockdir.LockDir(t, 'lock')
608
657
                l.create()
609
658
                l.attempt_lock()
610
659
        test = TestDanglingLock('test_function')
611
660
        result = test.run()
 
661
        total_failures = result.errors + result.failures
612
662
        if self._lock_check_thorough:
613
 
            self.assertEqual(1, len(result.errors))
 
663
            self.assertEqual(1, len(total_failures))
614
664
        else:
615
665
            # When _lock_check_thorough is disabled, then we don't trigger a
616
666
            # failure
617
 
            self.assertEqual(0, len(result.errors))
 
667
            self.assertEqual(0, len(total_failures))
618
668
 
619
669
 
620
670
class TestTestCaseWithTransport(tests.TestCaseWithTransport):
621
671
    """Tests for the convenience functions TestCaseWithTransport introduces."""
622
672
 
623
673
    def test_get_readonly_url_none(self):
624
 
        from bzrlib.transport import get_transport
625
 
        from bzrlib.transport.readonly import ReadonlyTransportDecorator
 
674
        from ..transport.readonly import ReadonlyTransportDecorator
626
675
        self.vfs_transport_factory = memory.MemoryServer
627
676
        self.transport_readonly_server = None
628
677
        # calling get_readonly_transport() constructs a decorator on the url
629
678
        # for the server
630
679
        url = self.get_readonly_url()
631
680
        url2 = self.get_readonly_url('foo/bar')
632
 
        t = get_transport(url)
633
 
        t2 = get_transport(url2)
634
 
        self.failUnless(isinstance(t, ReadonlyTransportDecorator))
635
 
        self.failUnless(isinstance(t2, ReadonlyTransportDecorator))
 
681
        t = transport.get_transport_from_url(url)
 
682
        t2 = transport.get_transport_from_url(url2)
 
683
        self.assertIsInstance(t, ReadonlyTransportDecorator)
 
684
        self.assertIsInstance(t2, ReadonlyTransportDecorator)
636
685
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
637
686
 
638
687
    def test_get_readonly_url_http(self):
639
 
        from bzrlib.tests.http_server import HttpServer
640
 
        from bzrlib.transport import get_transport
641
 
        from bzrlib.transport.http import HttpTransportBase
 
688
        from ..http_server import HttpServer
 
689
        from ..transport.http import HttpTransportBase
642
690
        self.transport_server = test_server.LocalURLServer
643
691
        self.transport_readonly_server = HttpServer
644
692
        # calling get_readonly_transport() gives us a HTTP server instance.
645
693
        url = self.get_readonly_url()
646
694
        url2 = self.get_readonly_url('foo/bar')
647
695
        # the transport returned may be any HttpTransportBase subclass
648
 
        t = get_transport(url)
649
 
        t2 = get_transport(url2)
650
 
        self.failUnless(isinstance(t, HttpTransportBase))
651
 
        self.failUnless(isinstance(t2, HttpTransportBase))
 
696
        t = transport.get_transport_from_url(url)
 
697
        t2 = transport.get_transport_from_url(url2)
 
698
        self.assertIsInstance(t, HttpTransportBase)
 
699
        self.assertIsInstance(t2, HttpTransportBase)
652
700
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
653
701
 
654
702
    def test_is_directory(self):
662
710
    def test_make_branch_builder(self):
663
711
        builder = self.make_branch_builder('dir')
664
712
        rev_id = builder.build_commit()
665
 
        self.failUnlessExists('dir')
666
 
        a_dir = bzrdir.BzrDir.open('dir')
 
713
        self.assertPathExists('dir')
 
714
        a_dir = controldir.ControlDir.open('dir')
667
715
        self.assertRaises(errors.NoWorkingTree, a_dir.open_workingtree)
668
716
        a_branch = a_dir.open_branch()
669
717
        builder_branch = builder.get_branch()
684
732
        self.assertIsInstance(result_bzrdir.transport,
685
733
                              memory.MemoryTransport)
686
734
        # should not be on disk, should only be in memory
687
 
        self.failIfExists('subdir')
 
735
        self.assertPathDoesNotExist('subdir')
688
736
 
689
737
 
690
738
class TestChrootedTest(tests.ChrootedTestCase):
691
739
 
692
740
    def test_root_is_root(self):
693
 
        from bzrlib.transport import get_transport
694
 
        t = get_transport(self.get_readonly_url())
 
741
        t = transport.get_transport_from_url(self.get_readonly_url())
695
742
        url = t.base
696
743
        self.assertEqual(url, t.clone('..').base)
697
744
 
699
746
class TestProfileResult(tests.TestCase):
700
747
 
701
748
    def test_profiles_tests(self):
702
 
        self.requireFeature(test_lsprof.LSProfFeature)
703
 
        terminal = testtools.tests.helpers.ExtendedTestResult()
 
749
        self.requireFeature(features.lsprof_feature)
 
750
        terminal = testtools.testresult.doubles.ExtendedTestResult()
704
751
        result = tests.ProfileResult(terminal)
705
752
        class Sample(tests.TestCase):
706
753
            def a(self):
719
766
class TestTestResult(tests.TestCase):
720
767
 
721
768
    def check_timing(self, test_case, expected_re):
722
 
        result = bzrlib.tests.TextTestResult(self._log_file,
 
769
        result = breezy.tests.TextTestResult(self._log_file,
723
770
                descriptions=0,
724
771
                verbosity=1,
725
772
                )
726
 
        capture = testtools.tests.helpers.ExtendedTestResult()
 
773
        capture = testtools.testresult.doubles.ExtendedTestResult()
727
774
        test_case.run(MultiTestResult(result, capture))
728
775
        run_case = capture._events[0][1]
729
776
        timed_string = result._testTimeString(run_case)
743
790
                          r"^ +[0-9]+ms\*$")
744
791
 
745
792
    def test_unittest_reporting_unittest_class(self):
746
 
        # getting the time from a non-bzrlib test works ok
 
793
        # getting the time from a non-breezy test works ok
747
794
        class ShortDelayTestCase(unittest.TestCase):
748
795
            def test_short_delay(self):
749
796
                time.sleep(0.003)
750
797
        self.check_timing(ShortDelayTestCase('test_short_delay'),
751
798
                          r"^ +[0-9]+ms$")
752
799
 
753
 
    def _patch_get_bzr_source_tree(self):
754
 
        # Reading from the actual source tree breaks isolation, but we don't
755
 
        # want to assume that thats *all* that would happen.
756
 
        self.overrideAttr(bzrlib.version, '_get_bzr_source_tree', lambda: None)
757
 
 
758
 
    def test_assigned_benchmark_file_stores_date(self):
759
 
        self._patch_get_bzr_source_tree()
760
 
        output = StringIO()
761
 
        result = bzrlib.tests.TextTestResult(self._log_file,
762
 
                                        descriptions=0,
763
 
                                        verbosity=1,
764
 
                                        bench_history=output
765
 
                                        )
766
 
        output_string = output.getvalue()
767
 
        # if you are wondering about the regexp please read the comment in
768
 
        # test_bench_history (bzrlib.tests.test_selftest.TestRunner)
769
 
        # XXX: what comment?  -- Andrew Bennetts
770
 
        self.assertContainsRe(output_string, "--date [0-9.]+")
771
 
 
772
 
    def test_benchhistory_records_test_times(self):
773
 
        self._patch_get_bzr_source_tree()
774
 
        result_stream = StringIO()
775
 
        result = bzrlib.tests.TextTestResult(
776
 
            self._log_file,
777
 
            descriptions=0,
778
 
            verbosity=1,
779
 
            bench_history=result_stream
780
 
            )
781
 
 
782
 
        # we want profile a call and check that its test duration is recorded
783
 
        # make a new test instance that when run will generate a benchmark
784
 
        example_test_case = TestTestResult("_time_hello_world_encoding")
785
 
        # execute the test, which should succeed and record times
786
 
        example_test_case.run(result)
787
 
        lines = result_stream.getvalue().splitlines()
788
 
        self.assertEqual(2, len(lines))
789
 
        self.assertContainsRe(lines[1],
790
 
            " *[0-9]+ms bzrlib.tests.test_selftest.TestTestResult"
791
 
            "._time_hello_world_encoding")
792
 
 
793
800
    def _time_hello_world_encoding(self):
794
801
        """Profile two sleep calls
795
802
 
800
807
 
801
808
    def test_lsprofiling(self):
802
809
        """Verbose test result prints lsprof statistics from test cases."""
803
 
        self.requireFeature(test_lsprof.LSProfFeature)
804
 
        result_stream = StringIO()
805
 
        result = bzrlib.tests.VerboseTestResult(
806
 
            unittest._WritelnDecorator(result_stream),
 
810
        self.requireFeature(features.lsprof_feature)
 
811
        result_stream = BytesIO()
 
812
        result = breezy.tests.VerboseTestResult(
 
813
            result_stream,
807
814
            descriptions=0,
808
815
            verbosity=2,
809
816
            )
835
842
        self.assertContainsRe(output,
836
843
            r"LSProf output for <type 'unicode'>\(\('world',\), {'errors': 'replace'}\)\n")
837
844
 
 
845
    def test_uses_time_from_testtools(self):
 
846
        """Test case timings in verbose results should use testtools times"""
 
847
        import datetime
 
848
        class TimeAddedVerboseTestResult(tests.VerboseTestResult):
 
849
            def startTest(self, test):
 
850
                self.time(datetime.datetime.utcfromtimestamp(1.145))
 
851
                super(TimeAddedVerboseTestResult, self).startTest(test)
 
852
            def addSuccess(self, test):
 
853
                self.time(datetime.datetime.utcfromtimestamp(51.147))
 
854
                super(TimeAddedVerboseTestResult, self).addSuccess(test)
 
855
            def report_tests_starting(self): pass
 
856
        sio = BytesIO()
 
857
        self.get_passing_test().run(TimeAddedVerboseTestResult(sio, 0, 2))
 
858
        self.assertEndsWith(sio.getvalue(), "OK    50002ms\n")
 
859
 
838
860
    def test_known_failure(self):
839
 
        """A KnownFailure being raised should trigger several result actions."""
 
861
        """Using knownFailure should trigger several result actions."""
840
862
        class InstrumentedTestResult(tests.ExtendedTestResult):
841
863
            def stopTestRun(self): pass
842
 
            def startTests(self): pass
843
 
            def report_test_start(self, test): pass
 
864
            def report_tests_starting(self): pass
844
865
            def report_known_failure(self, test, err=None, details=None):
845
866
                self._call = test, 'known failure'
846
867
        result = InstrumentedTestResult(None, None, None, None)
847
868
        class Test(tests.TestCase):
848
869
            def test_function(self):
849
 
                raise tests.KnownFailure('failed!')
 
870
                self.knownFailure('failed!')
850
871
        test = Test("test_function")
851
872
        test.run(result)
852
873
        # it should invoke 'report_known_failure'.
862
883
 
863
884
    def test_verbose_report_known_failure(self):
864
885
        # verbose test output formatting
865
 
        result_stream = StringIO()
866
 
        result = bzrlib.tests.VerboseTestResult(
867
 
            unittest._WritelnDecorator(result_stream),
 
886
        result_stream = BytesIO()
 
887
        result = breezy.tests.VerboseTestResult(
 
888
            result_stream,
868
889
            descriptions=0,
869
890
            verbosity=2,
870
891
            )
871
 
        test = self.get_passing_test()
872
 
        result.startTest(test)
873
 
        prefix = len(result_stream.getvalue())
874
 
        # the err parameter has the shape:
875
 
        # (class, exception object, traceback)
876
 
        # KnownFailures dont get their tracebacks shown though, so we
877
 
        # can skip that.
878
 
        err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
879
 
        result.report_known_failure(test, err)
880
 
        output = result_stream.getvalue()[prefix:]
881
 
        lines = output.splitlines()
882
 
        self.assertContainsRe(lines[0], r'XFAIL *\d+ms$')
883
 
        self.assertEqual(lines[1], '    foo')
884
 
        self.assertEqual(2, len(lines))
 
892
        _get_test("test_xfail").run(result)
 
893
        self.assertContainsRe(result_stream.getvalue(),
 
894
            "\n\\S+\\.test_xfail\\s+XFAIL\\s+\\d+ms\n"
 
895
            "\\s*(?:Text attachment: )?reason"
 
896
            "(?:\n-+\n|: {{{)"
 
897
            "this_fails"
 
898
            "(?:\n-+\n|}}}\n)")
885
899
 
886
900
    def get_passing_test(self):
887
901
        """Return a test object that can't be run usefully."""
893
907
        """Test the behaviour of invoking addNotSupported."""
894
908
        class InstrumentedTestResult(tests.ExtendedTestResult):
895
909
            def stopTestRun(self): pass
896
 
            def startTests(self): pass
897
 
            def report_test_start(self, test): pass
 
910
            def report_tests_starting(self): pass
898
911
            def report_unsupported(self, test, feature):
899
912
                self._call = test, feature
900
913
        result = InstrumentedTestResult(None, None, None, None)
901
914
        test = SampleTestCase('_test_pass')
902
 
        feature = tests.Feature()
 
915
        feature = features.Feature()
903
916
        result.startTest(test)
904
917
        result.addNotSupported(test, feature)
905
918
        # it should invoke 'report_unsupported'.
917
930
 
918
931
    def test_verbose_report_unsupported(self):
919
932
        # verbose test output formatting
920
 
        result_stream = StringIO()
921
 
        result = bzrlib.tests.VerboseTestResult(
922
 
            unittest._WritelnDecorator(result_stream),
 
933
        result_stream = BytesIO()
 
934
        result = breezy.tests.VerboseTestResult(
 
935
            result_stream,
923
936
            descriptions=0,
924
937
            verbosity=2,
925
938
            )
926
939
        test = self.get_passing_test()
927
 
        feature = tests.Feature()
 
940
        feature = features.Feature()
928
941
        result.startTest(test)
929
942
        prefix = len(result_stream.getvalue())
930
943
        result.report_unsupported(test, feature)
939
952
        """An UnavailableFeature being raised should invoke addNotSupported."""
940
953
        class InstrumentedTestResult(tests.ExtendedTestResult):
941
954
            def stopTestRun(self): pass
942
 
            def startTests(self): pass
943
 
            def report_test_start(self, test): pass
 
955
            def report_tests_starting(self): pass
944
956
            def addNotSupported(self, test, feature):
945
957
                self._call = test, feature
946
958
        result = InstrumentedTestResult(None, None, None, None)
947
 
        feature = tests.Feature()
 
959
        feature = features.Feature()
948
960
        class Test(tests.TestCase):
949
961
            def test_function(self):
950
962
                raise tests.UnavailableFeature(feature)
958
970
        self.assertEqual(0, result.error_count)
959
971
 
960
972
    def test_strict_with_unsupported_feature(self):
961
 
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
 
973
        result = breezy.tests.TextTestResult(self._log_file, descriptions=0,
962
974
                                             verbosity=1)
963
975
        test = self.get_passing_test()
964
976
        feature = "Unsupported Feature"
967
979
        self.assertEqual(None, result._extractBenchmarkTime(test))
968
980
 
969
981
    def test_strict_with_known_failure(self):
970
 
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
 
982
        result = breezy.tests.TextTestResult(self._log_file, descriptions=0,
971
983
                                             verbosity=1)
972
 
        test = self.get_passing_test()
973
 
        err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
974
 
        result.addExpectedFailure(test, err)
 
984
        test = _get_test("test_xfail")
 
985
        test.run(result)
975
986
        self.assertFalse(result.wasStrictlySuccessful())
976
987
        self.assertEqual(None, result._extractBenchmarkTime(test))
977
988
 
978
989
    def test_strict_with_success(self):
979
 
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
 
990
        result = breezy.tests.TextTestResult(self._log_file, descriptions=0,
980
991
                                             verbosity=1)
981
992
        test = self.get_passing_test()
982
993
        result.addSuccess(test)
988
999
        class InstrumentedTestResult(tests.ExtendedTestResult):
989
1000
            calls = 0
990
1001
            def startTests(self): self.calls += 1
991
 
            def report_test_start(self, test): pass
992
1002
        result = InstrumentedTestResult(None, None, None, None)
993
1003
        def test_function():
994
1004
            pass
995
1005
        test = unittest.FunctionTestCase(test_function)
996
1006
        test.run(result)
997
 
        self.assertEquals(1, result.calls)
998
 
 
999
 
 
1000
 
class TestUnicodeFilenameFeature(tests.TestCase):
1001
 
 
1002
 
    def test_probe_passes(self):
1003
 
        """UnicodeFilenameFeature._probe passes."""
1004
 
        # We can't test much more than that because the behaviour depends
1005
 
        # on the platform.
1006
 
        tests.UnicodeFilenameFeature._probe()
 
1007
        self.assertEqual(1, result.calls)
 
1008
 
 
1009
    def test_startTests_only_once(self):
 
1010
        """With multiple tests startTests should still only be called once"""
 
1011
        class InstrumentedTestResult(tests.ExtendedTestResult):
 
1012
            calls = 0
 
1013
            def startTests(self): self.calls += 1
 
1014
        result = InstrumentedTestResult(None, None, None, None)
 
1015
        suite = unittest.TestSuite([
 
1016
            unittest.FunctionTestCase(lambda: None),
 
1017
            unittest.FunctionTestCase(lambda: None)])
 
1018
        suite.run(result)
 
1019
        self.assertEqual(1, result.calls)
 
1020
        self.assertEqual(2, result.count)
1007
1021
 
1008
1022
 
1009
1023
class TestRunner(tests.TestCase):
1018
1032
        TestCaseInTempDir.TEST_ROOT
1019
1033
 
1020
1034
        There should be no tests in this file that use
1021
 
        bzrlib.tests.TextTestRunner without using this convenience method,
 
1035
        breezy.tests.TextTestRunner without using this convenience method,
1022
1036
        because of our use of global state.
1023
1037
        """
1024
1038
        old_root = tests.TestCaseInTempDir.TEST_ROOT
1025
 
        old_leak = tests.TestCase._first_thread_leaker_id
1026
1039
        try:
1027
1040
            tests.TestCaseInTempDir.TEST_ROOT = None
1028
 
            tests.TestCase._first_thread_leaker_id = None
1029
1041
            return testrunner.run(test)
1030
1042
        finally:
1031
1043
            tests.TestCaseInTempDir.TEST_ROOT = old_root
1032
 
            tests.TestCase._first_thread_leaker_id = old_leak
1033
1044
 
1034
1045
    def test_known_failure_failed_run(self):
1035
1046
        # run a test that generates a known failure which should be printed in
1040
1051
        test = unittest.TestSuite()
1041
1052
        test.addTest(Test("known_failure_test"))
1042
1053
        def failing_test():
1043
 
            self.fail('foo')
 
1054
            raise AssertionError('foo')
1044
1055
        test.addTest(unittest.FunctionTestCase(failing_test))
1045
 
        stream = StringIO()
 
1056
        stream = BytesIO()
1046
1057
        runner = tests.TextTestRunner(stream=stream)
1047
1058
        result = self.run_test_runner(runner, test)
1048
1059
        lines = stream.getvalue().splitlines()
1049
1060
        self.assertContainsRe(stream.getvalue(),
1050
 
            '(?sm)^bzr selftest.*$'
 
1061
            '(?sm)^brz selftest.*$'
1051
1062
            '.*'
1052
1063
            '^======================================================================\n'
1053
1064
            '^FAIL: failing_test\n'
1054
1065
            '^----------------------------------------------------------------------\n'
1055
1066
            'Traceback \\(most recent call last\\):\n'
1056
1067
            '  .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1057
 
            '    self.fail\\(\'foo\'\\)\n'
 
1068
            '    raise AssertionError\\(\'foo\'\\)\n'
1058
1069
            '.*'
1059
1070
            '^----------------------------------------------------------------------\n'
1060
1071
            '.*'
1066
1077
        # the final output.
1067
1078
        class Test(tests.TestCase):
1068
1079
            def known_failure_test(self):
1069
 
                self.expectFailure('failed', self.assertTrue, False)
 
1080
                self.knownFailure("Never works...")
1070
1081
        test = Test("known_failure_test")
1071
 
        stream = StringIO()
 
1082
        stream = BytesIO()
1072
1083
        runner = tests.TextTestRunner(stream=stream)
1073
1084
        result = self.run_test_runner(runner, test)
1074
1085
        self.assertContainsRe(stream.getvalue(),
1078
1089
            '\n'
1079
1090
            'OK \\(known_failures=1\\)\n')
1080
1091
 
 
1092
    def test_unexpected_success_bad(self):
 
1093
        class Test(tests.TestCase):
 
1094
            def test_truth(self):
 
1095
                self.expectFailure("No absolute truth", self.assertTrue, True)
 
1096
        runner = tests.TextTestRunner(stream=BytesIO())
 
1097
        result = self.run_test_runner(runner, Test("test_truth"))
 
1098
        self.assertContainsRe(runner.stream.getvalue(),
 
1099
            "=+\n"
 
1100
            "FAIL: \\S+\.test_truth\n"
 
1101
            "-+\n"
 
1102
            "(?:.*\n)*"
 
1103
            "\\s*(?:Text attachment: )?reason"
 
1104
            "(?:\n-+\n|: {{{)"
 
1105
            "No absolute truth"
 
1106
            "(?:\n-+\n|}}}\n)"
 
1107
            "(?:.*\n)*"
 
1108
            "-+\n"
 
1109
            "Ran 1 test in .*\n"
 
1110
            "\n"
 
1111
            "FAILED \\(failures=1\\)\n\\Z")
 
1112
 
1081
1113
    def test_result_decorator(self):
1082
1114
        # decorate results
1083
1115
        calls = []
1084
 
        class LoggingDecorator(tests.ForwardingResult):
 
1116
        class LoggingDecorator(ExtendedToOriginalDecorator):
1085
1117
            def startTest(self, test):
1086
 
                tests.ForwardingResult.startTest(self, test)
 
1118
                ExtendedToOriginalDecorator.startTest(self, test)
1087
1119
                calls.append('start')
1088
1120
        test = unittest.FunctionTestCase(lambda:None)
1089
 
        stream = StringIO()
 
1121
        stream = BytesIO()
1090
1122
        runner = tests.TextTestRunner(stream=stream,
1091
1123
            result_decorators=[LoggingDecorator])
1092
1124
        result = self.run_test_runner(runner, test)
1131
1163
        class SkippedTest(tests.TestCase):
1132
1164
 
1133
1165
            def setUp(self):
1134
 
                tests.TestCase.setUp(self)
 
1166
                super(SkippedTest, self).setUp()
1135
1167
                calls.append('setUp')
1136
1168
                self.addCleanup(self.cleanup)
1137
1169
 
1153
1185
        class Test(tests.TestCase):
1154
1186
            def not_applicable_test(self):
1155
1187
                raise tests.TestNotApplicable('this test never runs')
1156
 
        out = StringIO()
 
1188
        out = BytesIO()
1157
1189
        runner = tests.TextTestRunner(stream=out, verbosity=2)
1158
1190
        test = Test("not_applicable_test")
1159
1191
        result = self.run_test_runner(runner, test)
1167
1199
 
1168
1200
    def test_unsupported_features_listed(self):
1169
1201
        """When unsupported features are encountered they are detailed."""
1170
 
        class Feature1(tests.Feature):
 
1202
        class Feature1(features.Feature):
1171
1203
            def _probe(self): return False
1172
 
        class Feature2(tests.Feature):
 
1204
        class Feature2(features.Feature):
1173
1205
            def _probe(self): return False
1174
1206
        # create sample tests
1175
1207
        test1 = SampleTestCase('_test_pass')
1179
1211
        test = unittest.TestSuite()
1180
1212
        test.addTest(test1)
1181
1213
        test.addTest(test2)
1182
 
        stream = StringIO()
 
1214
        stream = BytesIO()
1183
1215
        runner = tests.TextTestRunner(stream=stream)
1184
1216
        result = self.run_test_runner(runner, test)
1185
1217
        lines = stream.getvalue().splitlines()
1190
1222
            ],
1191
1223
            lines[-3:])
1192
1224
 
1193
 
    def _patch_get_bzr_source_tree(self):
1194
 
        # Reading from the actual source tree breaks isolation, but we don't
1195
 
        # want to assume that thats *all* that would happen.
1196
 
        self._get_source_tree_calls = []
1197
 
        def new_get():
1198
 
            self._get_source_tree_calls.append("called")
1199
 
            return None
1200
 
        self.overrideAttr(bzrlib.version, '_get_bzr_source_tree',  new_get)
1201
 
 
1202
 
    def test_bench_history(self):
1203
 
        # tests that the running the benchmark passes bench_history into
1204
 
        # the test result object. We can tell that happens if
1205
 
        # _get_bzr_source_tree is called.
1206
 
        self._patch_get_bzr_source_tree()
1207
 
        test = TestRunner('dummy_test')
1208
 
        output = StringIO()
1209
 
        runner = tests.TextTestRunner(stream=self._log_file,
1210
 
                                      bench_history=output)
1211
 
        result = self.run_test_runner(runner, test)
1212
 
        output_string = output.getvalue()
1213
 
        self.assertContainsRe(output_string, "--date [0-9.]+")
1214
 
        self.assertLength(1, self._get_source_tree_calls)
 
1225
    def test_verbose_test_count(self):
 
1226
        """A verbose test run reports the right test count at the start"""
 
1227
        suite = TestUtil.TestSuite([
 
1228
            unittest.FunctionTestCase(lambda:None),
 
1229
            unittest.FunctionTestCase(lambda:None)])
 
1230
        self.assertEqual(suite.countTestCases(), 2)
 
1231
        stream = BytesIO()
 
1232
        runner = tests.TextTestRunner(stream=stream, verbosity=2)
 
1233
        # Need to use the CountingDecorator as that's what sets num_tests
 
1234
        result = self.run_test_runner(runner, tests.CountingDecorator(suite))
 
1235
        self.assertStartsWith(stream.getvalue(), "running 2 tests")
1215
1236
 
1216
1237
    def test_startTestRun(self):
1217
1238
        """run should call result.startTestRun()"""
1218
1239
        calls = []
1219
 
        class LoggingDecorator(tests.ForwardingResult):
 
1240
        class LoggingDecorator(ExtendedToOriginalDecorator):
1220
1241
            def startTestRun(self):
1221
 
                tests.ForwardingResult.startTestRun(self)
 
1242
                ExtendedToOriginalDecorator.startTestRun(self)
1222
1243
                calls.append('startTestRun')
1223
1244
        test = unittest.FunctionTestCase(lambda:None)
1224
 
        stream = StringIO()
 
1245
        stream = BytesIO()
1225
1246
        runner = tests.TextTestRunner(stream=stream,
1226
1247
            result_decorators=[LoggingDecorator])
1227
1248
        result = self.run_test_runner(runner, test)
1230
1251
    def test_stopTestRun(self):
1231
1252
        """run should call result.stopTestRun()"""
1232
1253
        calls = []
1233
 
        class LoggingDecorator(tests.ForwardingResult):
 
1254
        class LoggingDecorator(ExtendedToOriginalDecorator):
1234
1255
            def stopTestRun(self):
1235
 
                tests.ForwardingResult.stopTestRun(self)
 
1256
                ExtendedToOriginalDecorator.stopTestRun(self)
1236
1257
                calls.append('stopTestRun')
1237
1258
        test = unittest.FunctionTestCase(lambda:None)
1238
 
        stream = StringIO()
 
1259
        stream = BytesIO()
1239
1260
        runner = tests.TextTestRunner(stream=stream,
1240
1261
            result_decorators=[LoggingDecorator])
1241
1262
        result = self.run_test_runner(runner, test)
1242
1263
        self.assertLength(1, calls)
1243
1264
 
 
1265
    def test_unicode_test_output_on_ascii_stream(self):
 
1266
        """Showing results should always succeed even on an ascii console"""
 
1267
        class FailureWithUnicode(tests.TestCase):
 
1268
            def test_log_unicode(self):
 
1269
                self.log(u"\u2606")
 
1270
                self.fail("Now print that log!")
 
1271
        out = BytesIO()
 
1272
        self.overrideAttr(osutils, "get_terminal_encoding",
 
1273
            lambda trace=False: "ascii")
 
1274
        result = self.run_test_runner(tests.TextTestRunner(stream=out),
 
1275
            FailureWithUnicode("test_log_unicode"))
 
1276
        self.assertContainsRe(out.getvalue(),
 
1277
            "(?:Text attachment: )?log"
 
1278
            "(?:\n-+\n|: {{{)"
 
1279
            "\d+\.\d+  \\\\u2606"
 
1280
            "(?:\n-+\n|}}}\n)")
 
1281
 
1244
1282
 
1245
1283
class SampleTestCase(tests.TestCase):
1246
1284
 
1252
1290
 
1253
1291
 
1254
1292
class TestTestCase(tests.TestCase):
1255
 
    """Tests that test the core bzrlib TestCase."""
 
1293
    """Tests that test the core breezy TestCase."""
1256
1294
 
1257
1295
    def test_assertLength_matches_empty(self):
1258
1296
        a_list = []
1298
1336
        self.assertEqual(1, result.testsRun)
1299
1337
 
1300
1338
    def test_debug_flags_sanitised(self):
1301
 
        """The bzrlib debug flags should be sanitised by setUp."""
 
1339
        """The breezy debug flags should be sanitised by setUp."""
1302
1340
        if 'allow_debug' in tests.selftest_debug_flags:
1303
1341
            raise tests.TestNotApplicable(
1304
1342
                '-Eallow_debug option prevents debug flag sanitisation')
1308
1346
        flags = set()
1309
1347
        if self._lock_check_thorough:
1310
1348
            flags.add('strict_locks')
1311
 
        self.assertEqual(flags, bzrlib.debug.debug_flags)
 
1349
        self.assertEqual(flags, breezy.debug.debug_flags)
1312
1350
 
1313
1351
    def change_selftest_debug_flags(self, new_flags):
1314
1352
        self.overrideAttr(tests, 'selftest_debug_flags', set(new_flags))
1315
1353
 
1316
1354
    def test_allow_debug_flag(self):
1317
 
        """The -Eallow_debug flag prevents bzrlib.debug.debug_flags from being
 
1355
        """The -Eallow_debug flag prevents breezy.debug.debug_flags from being
1318
1356
        sanitised (i.e. cleared) before running a test.
1319
1357
        """
1320
 
        self.change_selftest_debug_flags(set(['allow_debug']))
1321
 
        bzrlib.debug.debug_flags = set(['a-flag'])
 
1358
        self.change_selftest_debug_flags({'allow_debug'})
 
1359
        breezy.debug.debug_flags = {'a-flag'}
1322
1360
        class TestThatRecordsFlags(tests.TestCase):
1323
1361
            def test_foo(nested_self):
1324
 
                self.flags = set(bzrlib.debug.debug_flags)
 
1362
                self.flags = set(breezy.debug.debug_flags)
1325
1363
        test = TestThatRecordsFlags('test_foo')
1326
1364
        test.run(self.make_test_result())
1327
 
        flags = set(['a-flag'])
 
1365
        flags = {'a-flag'}
1328
1366
        if 'disable_lock_checks' not in tests.selftest_debug_flags:
1329
1367
            flags.add('strict_locks')
1330
1368
        self.assertEqual(flags, self.flags)
1333
1371
        """The -Edisable_lock_checks flag disables thorough checks."""
1334
1372
        class TestThatRecordsFlags(tests.TestCase):
1335
1373
            def test_foo(nested_self):
1336
 
                self.flags = set(bzrlib.debug.debug_flags)
 
1374
                self.flags = set(breezy.debug.debug_flags)
1337
1375
                self.test_lock_check_thorough = nested_self._lock_check_thorough
1338
1376
        self.change_selftest_debug_flags(set())
1339
1377
        test = TestThatRecordsFlags('test_foo')
1341
1379
        # By default we do strict lock checking and thorough lock/unlock
1342
1380
        # tracking.
1343
1381
        self.assertTrue(self.test_lock_check_thorough)
1344
 
        self.assertEqual(set(['strict_locks']), self.flags)
 
1382
        self.assertEqual({'strict_locks'}, self.flags)
1345
1383
        # Now set the disable_lock_checks flag, and show that this changed.
1346
 
        self.change_selftest_debug_flags(set(['disable_lock_checks']))
 
1384
        self.change_selftest_debug_flags({'disable_lock_checks'})
1347
1385
        test = TestThatRecordsFlags('test_foo')
1348
1386
        test.run(self.make_test_result())
1349
1387
        self.assertFalse(self.test_lock_check_thorough)
1352
1390
    def test_this_fails_strict_lock_check(self):
1353
1391
        class TestThatRecordsFlags(tests.TestCase):
1354
1392
            def test_foo(nested_self):
1355
 
                self.flags1 = set(bzrlib.debug.debug_flags)
 
1393
                self.flags1 = set(breezy.debug.debug_flags)
1356
1394
                self.thisFailsStrictLockCheck()
1357
 
                self.flags2 = set(bzrlib.debug.debug_flags)
 
1395
                self.flags2 = set(breezy.debug.debug_flags)
1358
1396
        # Make sure lock checking is active
1359
1397
        self.change_selftest_debug_flags(set())
1360
1398
        test = TestThatRecordsFlags('test_foo')
1361
1399
        test.run(self.make_test_result())
1362
 
        self.assertEqual(set(['strict_locks']), self.flags1)
 
1400
        self.assertEqual({'strict_locks'}, self.flags1)
1363
1401
        self.assertEqual(set(), self.flags2)
1364
1402
 
1365
1403
    def test_debug_flags_restored(self):
1366
 
        """The bzrlib debug flags should be restored to their original state
 
1404
        """The breezy debug flags should be restored to their original state
1367
1405
        after the test was run, even if allow_debug is set.
1368
1406
        """
1369
 
        self.change_selftest_debug_flags(set(['allow_debug']))
 
1407
        self.change_selftest_debug_flags({'allow_debug'})
1370
1408
        # Now run a test that modifies debug.debug_flags.
1371
 
        bzrlib.debug.debug_flags = set(['original-state'])
 
1409
        breezy.debug.debug_flags = {'original-state'}
1372
1410
        class TestThatModifiesFlags(tests.TestCase):
1373
1411
            def test_foo(self):
1374
 
                bzrlib.debug.debug_flags = set(['modified'])
 
1412
                breezy.debug.debug_flags = {'modified'}
1375
1413
        test = TestThatModifiesFlags('test_foo')
1376
1414
        test.run(self.make_test_result())
1377
 
        self.assertEqual(set(['original-state']), bzrlib.debug.debug_flags)
 
1415
        self.assertEqual({'original-state'}, breezy.debug.debug_flags)
1378
1416
 
1379
1417
    def make_test_result(self):
1380
1418
        """Get a test result that writes to the test log file."""
1405
1443
        # one child, we should instead see the bad result inside our test with
1406
1444
        # the two children.
1407
1445
        # the outer child test
1408
 
        original_trace = bzrlib.trace._trace_file
 
1446
        original_trace = breezy.trace._trace_file
1409
1447
        outer_test = TestTestCase("outer_child")
1410
1448
        result = self.make_test_result()
1411
1449
        outer_test.run(result)
1412
 
        self.assertEqual(original_trace, bzrlib.trace._trace_file)
 
1450
        self.assertEqual(original_trace, breezy.trace._trace_file)
1413
1451
 
1414
1452
    def method_that_times_a_bit_twice(self):
1415
1453
        # call self.time twice to ensure it aggregates
1419
1457
    def test_time_creates_benchmark_in_result(self):
1420
1458
        """Test that the TestCase.time() method accumulates a benchmark time."""
1421
1459
        sample_test = TestTestCase("method_that_times_a_bit_twice")
1422
 
        output_stream = StringIO()
1423
 
        result = bzrlib.tests.VerboseTestResult(
1424
 
            unittest._WritelnDecorator(output_stream),
 
1460
        output_stream = BytesIO()
 
1461
        result = breezy.tests.VerboseTestResult(
 
1462
            output_stream,
1425
1463
            descriptions=0,
1426
1464
            verbosity=2)
1427
1465
        sample_test.run(result)
1430
1468
            r"\d+ms\*\n$")
1431
1469
 
1432
1470
    def test_hooks_sanitised(self):
1433
 
        """The bzrlib hooks should be sanitised by setUp."""
 
1471
        """The breezy hooks should be sanitised by setUp."""
1434
1472
        # Note this test won't fail with hooks that the core library doesn't
1435
1473
        # use - but it trigger with a plugin that adds hooks, so its still a
1436
1474
        # useful warning in that case.
1437
 
        self.assertEqual(bzrlib.branch.BranchHooks(),
1438
 
            bzrlib.branch.Branch.hooks)
1439
 
        self.assertEqual(bzrlib.smart.server.SmartServerHooks(),
1440
 
            bzrlib.smart.server.SmartTCPServer.hooks)
1441
 
        self.assertEqual(bzrlib.commands.CommandHooks(),
1442
 
            bzrlib.commands.Command.hooks)
 
1475
        self.assertEqual(breezy.branch.BranchHooks(), breezy.branch.Branch.hooks)
 
1476
        self.assertEqual(
 
1477
            breezy.smart.server.SmartServerHooks(),
 
1478
            breezy.smart.server.SmartTCPServer.hooks)
 
1479
        self.assertEqual(
 
1480
            breezy.commands.CommandHooks(), breezy.commands.Command.hooks)
1443
1481
 
1444
1482
    def test__gather_lsprof_in_benchmarks(self):
1445
1483
        """When _gather_lsprof_in_benchmarks is on, accumulate profile data.
1446
1484
 
1447
1485
        Each self.time() call is individually and separately profiled.
1448
1486
        """
1449
 
        self.requireFeature(test_lsprof.LSProfFeature)
 
1487
        self.requireFeature(features.lsprof_feature)
1450
1488
        # overrides the class member with an instance member so no cleanup
1451
1489
        # needed.
1452
1490
        self._gather_lsprof_in_benchmarks = True
1455
1493
        self.assertEqual(2, len(self._benchcalls))
1456
1494
        self.assertEqual((time.sleep, (0.000,), {}), self._benchcalls[0][0])
1457
1495
        self.assertEqual((time.sleep, (0.003,), {}), self._benchcalls[1][0])
1458
 
        self.assertIsInstance(self._benchcalls[0][1], bzrlib.lsprof.Stats)
1459
 
        self.assertIsInstance(self._benchcalls[1][1], bzrlib.lsprof.Stats)
 
1496
        self.assertIsInstance(self._benchcalls[0][1], breezy.lsprof.Stats)
 
1497
        self.assertIsInstance(self._benchcalls[1][1], breezy.lsprof.Stats)
1460
1498
        del self._benchcalls[:]
1461
1499
 
1462
1500
    def test_knownFailure(self):
1471
1509
        transport_server = memory.MemoryServer()
1472
1510
        transport_server.start_server()
1473
1511
        self.addCleanup(transport_server.stop_server)
1474
 
        t = transport.get_transport(transport_server.get_url())
1475
 
        bzrdir.BzrDir.create(t.base)
 
1512
        t = transport.get_transport_from_url(transport_server.get_url())
 
1513
        controldir.ControlDir.create(t.base)
1476
1514
        self.assertRaises(errors.BzrError,
1477
 
            bzrdir.BzrDir.open_from_transport, t)
 
1515
            controldir.ControlDir.open_from_transport, t)
1478
1516
        # But if we declare this as safe, we can open the bzrdir.
1479
1517
        self.permit_url(t.base)
1480
1518
        self._bzr_selftest_roots.append(t.base)
1481
 
        bzrdir.BzrDir.open_from_transport(t)
 
1519
        controldir.ControlDir.open_from_transport(t)
1482
1520
 
1483
1521
    def test_requireFeature_available(self):
1484
1522
        """self.requireFeature(available) is a no-op."""
1485
 
        class Available(tests.Feature):
 
1523
        class Available(features.Feature):
1486
1524
            def _probe(self):return True
1487
1525
        feature = Available()
1488
1526
        self.requireFeature(feature)
1489
1527
 
1490
1528
    def test_requireFeature_unavailable(self):
1491
1529
        """self.requireFeature(unavailable) raises UnavailableFeature."""
1492
 
        class Unavailable(tests.Feature):
 
1530
        class Unavailable(features.Feature):
1493
1531
            def _probe(self):return False
1494
1532
        feature = Unavailable()
1495
1533
        self.assertRaises(tests.UnavailableFeature,
1618
1656
        self.assertRaises(AssertionError,
1619
1657
            self.assertListRaises, _TestException, success_generator)
1620
1658
 
 
1659
    def _run_successful_test(self, test):
 
1660
        result = testtools.TestResult()
 
1661
        test.run(result)
 
1662
        self.assertTrue(result.wasSuccessful())
 
1663
        return result
 
1664
 
1621
1665
    def test_overrideAttr_without_value(self):
1622
1666
        self.test_attr = 'original' # Define a test attribute
1623
1667
        obj = self # Make 'obj' visible to the embedded test
1624
1668
        class Test(tests.TestCase):
1625
1669
 
1626
1670
            def setUp(self):
1627
 
                tests.TestCase.setUp(self)
 
1671
                super(Test, self).setUp()
1628
1672
                self.orig = self.overrideAttr(obj, 'test_attr')
1629
1673
 
1630
1674
            def test_value(self):
1633
1677
                obj.test_attr = 'modified'
1634
1678
                self.assertEqual('modified', obj.test_attr)
1635
1679
 
1636
 
        test = Test('test_value')
1637
 
        test.run(unittest.TestResult())
 
1680
        self._run_successful_test(Test('test_value'))
1638
1681
        self.assertEqual('original', obj.test_attr)
1639
1682
 
1640
1683
    def test_overrideAttr_with_value(self):
1643
1686
        class Test(tests.TestCase):
1644
1687
 
1645
1688
            def setUp(self):
1646
 
                tests.TestCase.setUp(self)
 
1689
                super(Test, self).setUp()
1647
1690
                self.orig = self.overrideAttr(obj, 'test_attr', new='modified')
1648
1691
 
1649
1692
            def test_value(self):
1650
1693
                self.assertEqual('original', self.orig)
1651
1694
                self.assertEqual('modified', obj.test_attr)
1652
1695
 
1653
 
        test = Test('test_value')
1654
 
        test.run(unittest.TestResult())
 
1696
        self._run_successful_test(Test('test_value'))
1655
1697
        self.assertEqual('original', obj.test_attr)
1656
1698
 
 
1699
    def test_overrideAttr_with_no_existing_value_and_value(self):
 
1700
        # Do not define the test_attribute
 
1701
        obj = self # Make 'obj' visible to the embedded test
 
1702
        class Test(tests.TestCase):
 
1703
 
 
1704
            def setUp(self):
 
1705
                tests.TestCase.setUp(self)
 
1706
                self.orig = self.overrideAttr(obj, 'test_attr', new='modified')
 
1707
 
 
1708
            def test_value(self):
 
1709
                self.assertEqual(tests._unitialized_attr, self.orig)
 
1710
                self.assertEqual('modified', obj.test_attr)
 
1711
 
 
1712
        self._run_successful_test(Test('test_value'))
 
1713
        self.assertRaises(AttributeError, getattr, obj, 'test_attr')
 
1714
 
 
1715
    def test_overrideAttr_with_no_existing_value_and_no_value(self):
 
1716
        # Do not define the test_attribute
 
1717
        obj = self # Make 'obj' visible to the embedded test
 
1718
        class Test(tests.TestCase):
 
1719
 
 
1720
            def setUp(self):
 
1721
                tests.TestCase.setUp(self)
 
1722
                self.orig = self.overrideAttr(obj, 'test_attr')
 
1723
 
 
1724
            def test_value(self):
 
1725
                self.assertEqual(tests._unitialized_attr, self.orig)
 
1726
                self.assertRaises(AttributeError, getattr, obj, 'test_attr')
 
1727
 
 
1728
        self._run_successful_test(Test('test_value'))
 
1729
        self.assertRaises(AttributeError, getattr, obj, 'test_attr')
 
1730
 
 
1731
    def test_recordCalls(self):
 
1732
        from breezy.tests import test_selftest
 
1733
        calls = self.recordCalls(
 
1734
            test_selftest, '_add_numbers')
 
1735
        self.assertEqual(test_selftest._add_numbers(2, 10),
 
1736
            12)
 
1737
        self.assertEqual(calls, [((2, 10), {})])
 
1738
 
 
1739
 
 
1740
def _add_numbers(a, b):
 
1741
    return a + b
 
1742
 
 
1743
 
 
1744
class _MissingFeature(features.Feature):
 
1745
    def _probe(self):
 
1746
        return False
 
1747
missing_feature = _MissingFeature()
 
1748
 
 
1749
 
 
1750
def _get_test(name):
 
1751
    """Get an instance of a specific example test.
 
1752
 
 
1753
    We protect this in a function so that they don't auto-run in the test
 
1754
    suite.
 
1755
    """
 
1756
 
 
1757
    class ExampleTests(tests.TestCase):
 
1758
 
 
1759
        def test_fail(self):
 
1760
            mutter('this was a failing test')
 
1761
            self.fail('this test will fail')
 
1762
 
 
1763
        def test_error(self):
 
1764
            mutter('this test errored')
 
1765
            raise RuntimeError('gotcha')
 
1766
 
 
1767
        def test_missing_feature(self):
 
1768
            mutter('missing the feature')
 
1769
            self.requireFeature(missing_feature)
 
1770
 
 
1771
        def test_skip(self):
 
1772
            mutter('this test will be skipped')
 
1773
            raise tests.TestSkipped('reason')
 
1774
 
 
1775
        def test_success(self):
 
1776
            mutter('this test succeeds')
 
1777
 
 
1778
        def test_xfail(self):
 
1779
            mutter('test with expected failure')
 
1780
            self.knownFailure('this_fails')
 
1781
 
 
1782
        def test_unexpected_success(self):
 
1783
            mutter('test with unexpected success')
 
1784
            self.expectFailure('should_fail', lambda: None)
 
1785
 
 
1786
    return ExampleTests(name)
 
1787
 
 
1788
 
 
1789
class TestTestCaseLogDetails(tests.TestCase):
 
1790
 
 
1791
    def _run_test(self, test_name):
 
1792
        test = _get_test(test_name)
 
1793
        result = testtools.TestResult()
 
1794
        test.run(result)
 
1795
        return result
 
1796
 
 
1797
    def test_fail_has_log(self):
 
1798
        result = self._run_test('test_fail')
 
1799
        self.assertEqual(1, len(result.failures))
 
1800
        result_content = result.failures[0][1]
 
1801
        self.assertContainsRe(result_content,
 
1802
            '(?m)^(?:Text attachment: )?log(?:$|: )')
 
1803
        self.assertContainsRe(result_content, 'this was a failing test')
 
1804
 
 
1805
    def test_error_has_log(self):
 
1806
        result = self._run_test('test_error')
 
1807
        self.assertEqual(1, len(result.errors))
 
1808
        result_content = result.errors[0][1]
 
1809
        self.assertContainsRe(result_content,
 
1810
            '(?m)^(?:Text attachment: )?log(?:$|: )')
 
1811
        self.assertContainsRe(result_content, 'this test errored')
 
1812
 
 
1813
    def test_skip_has_no_log(self):
 
1814
        result = self._run_test('test_skip')
 
1815
        self.assertEqual(['reason'], result.skip_reasons.keys())
 
1816
        skips = result.skip_reasons['reason']
 
1817
        self.assertEqual(1, len(skips))
 
1818
        test = skips[0]
 
1819
        self.assertFalse('log' in test.getDetails())
 
1820
 
 
1821
    def test_missing_feature_has_no_log(self):
 
1822
        # testtools doesn't know about addNotSupported, so it just gets
 
1823
        # considered as a skip
 
1824
        result = self._run_test('test_missing_feature')
 
1825
        self.assertEqual([missing_feature], result.skip_reasons.keys())
 
1826
        skips = result.skip_reasons[missing_feature]
 
1827
        self.assertEqual(1, len(skips))
 
1828
        test = skips[0]
 
1829
        self.assertFalse('log' in test.getDetails())
 
1830
 
 
1831
    def test_xfail_has_no_log(self):
 
1832
        result = self._run_test('test_xfail')
 
1833
        self.assertEqual(1, len(result.expectedFailures))
 
1834
        result_content = result.expectedFailures[0][1]
 
1835
        self.assertNotContainsRe(result_content,
 
1836
            '(?m)^(?:Text attachment: )?log(?:$|: )')
 
1837
        self.assertNotContainsRe(result_content, 'test with expected failure')
 
1838
 
 
1839
    def test_unexpected_success_has_log(self):
 
1840
        result = self._run_test('test_unexpected_success')
 
1841
        self.assertEqual(1, len(result.unexpectedSuccesses))
 
1842
        # Inconsistency, unexpectedSuccesses is a list of tests,
 
1843
        # expectedFailures is a list of reasons?
 
1844
        test = result.unexpectedSuccesses[0]
 
1845
        details = test.getDetails()
 
1846
        self.assertTrue('log' in details)
 
1847
 
 
1848
 
 
1849
class TestTestCloning(tests.TestCase):
 
1850
    """Tests that test cloning of TestCases (as used by multiply_tests)."""
 
1851
 
 
1852
    def test_cloned_testcase_does_not_share_details(self):
 
1853
        """A TestCase cloned with clone_test does not share mutable attributes
 
1854
        such as details or cleanups.
 
1855
        """
 
1856
        class Test(tests.TestCase):
 
1857
            def test_foo(self):
 
1858
                self.addDetail('foo', Content('text/plain', lambda: 'foo'))
 
1859
        orig_test = Test('test_foo')
 
1860
        cloned_test = tests.clone_test(orig_test, orig_test.id() + '(cloned)')
 
1861
        orig_test.run(unittest.TestResult())
 
1862
        self.assertEqual('foo', orig_test.getDetails()['foo'].iter_bytes())
 
1863
        self.assertEqual(None, cloned_test.getDetails().get('foo'))
 
1864
 
 
1865
    def test_double_apply_scenario_preserves_first_scenario(self):
 
1866
        """Applying two levels of scenarios to a test preserves the attributes
 
1867
        added by both scenarios.
 
1868
        """
 
1869
        class Test(tests.TestCase):
 
1870
            def test_foo(self):
 
1871
                pass
 
1872
        test = Test('test_foo')
 
1873
        scenarios_x = [('x=1', {'x': 1}), ('x=2', {'x': 2})]
 
1874
        scenarios_y = [('y=1', {'y': 1}), ('y=2', {'y': 2})]
 
1875
        suite = tests.multiply_tests(test, scenarios_x, unittest.TestSuite())
 
1876
        suite = tests.multiply_tests(suite, scenarios_y, unittest.TestSuite())
 
1877
        all_tests = list(tests.iter_suite_tests(suite))
 
1878
        self.assertLength(4, all_tests)
 
1879
        all_xys = sorted((t.x, t.y) for t in all_tests)
 
1880
        self.assertEqual([(1, 1), (1, 2), (2, 1), (2, 2)], all_xys)
 
1881
 
1657
1882
 
1658
1883
# NB: Don't delete this; it's not actually from 0.11!
1659
1884
@deprecated_function(deprecated_in((0, 11, 0)))
1683
1908
 
1684
1909
 
1685
1910
class TestExtraAssertions(tests.TestCase):
1686
 
    """Tests for new test assertions in bzrlib test suite"""
 
1911
    """Tests for new test assertions in breezy test suite"""
1687
1912
 
1688
1913
    def test_assert_isinstance(self):
1689
1914
        self.assertIsInstance(2, int)
1690
1915
        self.assertIsInstance(u'', basestring)
1691
1916
        e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1692
 
        self.assertEquals(str(e),
 
1917
        self.assertEqual(str(e),
1693
1918
            "None is an instance of <type 'NoneType'> rather than <type 'int'>")
1694
1919
        self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1695
1920
        e = self.assertRaises(AssertionError,
1696
1921
            self.assertIsInstance, None, int, "it's just not")
1697
 
        self.assertEquals(str(e),
 
1922
        self.assertEqual(str(e),
1698
1923
            "None is an instance of <type 'NoneType'> rather than <type 'int'>"
1699
1924
            ": it's just not")
1700
1925
 
1705
1930
    def test_assertEqualDiff(self):
1706
1931
        e = self.assertRaises(AssertionError,
1707
1932
                              self.assertEqualDiff, '', '\n')
1708
 
        self.assertEquals(str(e),
 
1933
        self.assertEqual(str(e),
1709
1934
                          # Don't blink ! The '+' applies to the second string
1710
1935
                          'first string is missing a final newline.\n+ \n')
1711
1936
        e = self.assertRaises(AssertionError,
1712
1937
                              self.assertEqualDiff, '\n', '')
1713
 
        self.assertEquals(str(e),
 
1938
        self.assertEqual(str(e),
1714
1939
                          # Don't blink ! The '-' applies to the second string
1715
1940
                          'second string is missing a final newline.\n- \n')
1716
1941
 
1773
1998
            warnings.warn("this is your last warning")
1774
1999
            return a + b
1775
2000
        wlist, result = self.callCatchWarnings(meth, 1, 2)
1776
 
        self.assertEquals(3, result)
 
2001
        self.assertEqual(3, result)
1777
2002
        # would like just to compare them, but UserWarning doesn't implement
1778
2003
        # eq well
1779
2004
        w0, = wlist
1780
2005
        self.assertIsInstance(w0, UserWarning)
1781
 
        self.assertEquals("this is your last warning", str(w0))
 
2006
        self.assertEqual("this is your last warning", str(w0))
1782
2007
 
1783
2008
 
1784
2009
class TestConvenienceMakers(tests.TestCaseWithTransport):
1786
2011
 
1787
2012
    def test_make_branch_and_tree_with_format(self):
1788
2013
        # we should be able to supply a format to make_branch_and_tree
1789
 
        self.make_branch_and_tree('a', format=bzrlib.bzrdir.BzrDirMetaFormat1())
1790
 
        self.make_branch_and_tree('b', format=bzrlib.bzrdir.BzrDirFormat6())
1791
 
        self.assertIsInstance(bzrlib.bzrdir.BzrDir.open('a')._format,
1792
 
                              bzrlib.bzrdir.BzrDirMetaFormat1)
1793
 
        self.assertIsInstance(bzrlib.bzrdir.BzrDir.open('b')._format,
1794
 
                              bzrlib.bzrdir.BzrDirFormat6)
 
2014
        self.make_branch_and_tree('a', format=breezy.bzrdir.BzrDirMetaFormat1())
 
2015
        self.assertIsInstance(breezy.controldir.ControlDir.open('a')._format,
 
2016
                              breezy.bzrdir.BzrDirMetaFormat1)
1795
2017
 
1796
2018
    def test_make_branch_and_memory_tree(self):
1797
2019
        # we should be able to get a new branch and a mutable tree from
1798
2020
        # TestCaseWithTransport
1799
2021
        tree = self.make_branch_and_memory_tree('a')
1800
 
        self.assertIsInstance(tree, bzrlib.memorytree.MemoryTree)
 
2022
        self.assertIsInstance(tree, breezy.memorytree.MemoryTree)
1801
2023
 
1802
2024
    def test_make_tree_for_local_vfs_backed_transport(self):
1803
2025
        # make_branch_and_tree has to use local branch and repositories
1808
2030
        tree = self.make_branch_and_tree('t1')
1809
2031
        base = tree.bzrdir.root_transport.base
1810
2032
        self.assertStartsWith(base, 'file://')
1811
 
        self.assertEquals(tree.bzrdir.root_transport,
 
2033
        self.assertEqual(tree.bzrdir.root_transport,
1812
2034
                tree.branch.bzrdir.root_transport)
1813
 
        self.assertEquals(tree.bzrdir.root_transport,
 
2035
        self.assertEqual(tree.bzrdir.root_transport,
1814
2036
                tree.branch.repository.bzrdir.root_transport)
1815
2037
 
1816
2038
 
1817
 
class SelfTestHelper:
 
2039
class SelfTestHelper(object):
1818
2040
 
1819
2041
    def run_selftest(self, **kwargs):
1820
2042
        """Run selftest returning its output."""
1821
 
        output = StringIO()
1822
 
        old_transport = bzrlib.tests.default_transport
 
2043
        output = BytesIO()
 
2044
        old_transport = breezy.tests.default_transport
1823
2045
        old_root = tests.TestCaseWithMemoryTransport.TEST_ROOT
1824
2046
        tests.TestCaseWithMemoryTransport.TEST_ROOT = None
1825
2047
        try:
1826
2048
            self.assertEqual(True, tests.selftest(stream=output, **kwargs))
1827
2049
        finally:
1828
 
            bzrlib.tests.default_transport = old_transport
 
2050
            breezy.tests.default_transport = old_transport
1829
2051
            tests.TestCaseWithMemoryTransport.TEST_ROOT = old_root
1830
2052
        output.seek(0)
1831
2053
        return output
1832
2054
 
1833
2055
 
1834
2056
class TestSelftest(tests.TestCase, SelfTestHelper):
1835
 
    """Tests of bzrlib.tests.selftest."""
 
2057
    """Tests of breezy.tests.selftest."""
1836
2058
 
1837
2059
    def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(self):
1838
2060
        factory_called = []
1839
2061
        def factory():
1840
2062
            factory_called.append(True)
1841
2063
            return TestUtil.TestSuite()
1842
 
        out = StringIO()
1843
 
        err = StringIO()
1844
 
        self.apply_redirected(out, err, None, bzrlib.tests.selftest,
 
2064
        out = BytesIO()
 
2065
        err = BytesIO()
 
2066
        self.apply_redirected(out, err, None, breezy.tests.selftest,
1845
2067
            test_suite_factory=factory)
1846
2068
        self.assertEqual([True], factory_called)
1847
2069
 
1874
2096
        self.assertLength(2, output.readlines())
1875
2097
 
1876
2098
    def test_lsprof_tests(self):
1877
 
        self.requireFeature(test_lsprof.LSProfFeature)
1878
 
        calls = []
 
2099
        self.requireFeature(features.lsprof_feature)
 
2100
        results = []
1879
2101
        class Test(object):
1880
2102
            def __call__(test, result):
1881
2103
                test.run(result)
1882
2104
            def run(test, result):
1883
 
                self.assertIsInstance(result, tests.ForwardingResult)
1884
 
                calls.append("called")
 
2105
                results.append(result)
1885
2106
            def countTestCases(self):
1886
2107
                return 1
1887
2108
        self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
1888
 
        self.assertLength(1, calls)
 
2109
        self.assertLength(1, results)
 
2110
        self.assertIsInstance(results.pop(), ExtendedToOriginalDecorator)
1889
2111
 
1890
2112
    def test_random(self):
1891
2113
        # test randomising by listing a number of tests.
1918
2140
 
1919
2141
    def test_starting_with_single_argument(self):
1920
2142
        output = self.run_selftest(test_suite_factory=self.factory,
1921
 
            starting_with=['bzrlib.tests.test_selftest.Test.a'],
 
2143
            starting_with=['breezy.tests.test_selftest.Test.a'],
1922
2144
            list_only=True)
1923
 
        self.assertEqual('bzrlib.tests.test_selftest.Test.a\n',
 
2145
        self.assertEqual('breezy.tests.test_selftest.Test.a\n',
1924
2146
            output.getvalue())
1925
2147
 
1926
2148
    def test_starting_with_multiple_argument(self):
1927
2149
        output = self.run_selftest(test_suite_factory=self.factory,
1928
 
            starting_with=['bzrlib.tests.test_selftest.Test.a',
1929
 
                'bzrlib.tests.test_selftest.Test.b'],
 
2150
            starting_with=['breezy.tests.test_selftest.Test.a',
 
2151
                'breezy.tests.test_selftest.Test.b'],
1930
2152
            list_only=True)
1931
 
        self.assertEqual('bzrlib.tests.test_selftest.Test.a\n'
1932
 
            'bzrlib.tests.test_selftest.Test.b\n',
 
2153
        self.assertEqual('breezy.tests.test_selftest.Test.a\n'
 
2154
            'breezy.tests.test_selftest.Test.b\n',
1933
2155
            output.getvalue())
1934
2156
 
1935
2157
    def check_transport_set(self, transport_server):
1938
2160
            captured_transport.append(a_transport)
1939
2161
        class Capture(tests.TestCase):
1940
2162
            def a(self):
1941
 
                seen_transport(bzrlib.tests.default_transport)
 
2163
                seen_transport(breezy.tests.default_transport)
1942
2164
        def factory():
1943
2165
            return TestUtil.TestSuite([Capture("a")])
1944
2166
        self.run_selftest(transport=transport_server, test_suite_factory=factory)
1946
2168
 
1947
2169
    def test_transport_sftp(self):
1948
2170
        self.requireFeature(features.paramiko)
1949
 
        from bzrlib.tests import stub_sftp
 
2171
        from breezy.tests import stub_sftp
1950
2172
        self.check_transport_set(stub_sftp.SFTPAbsoluteServer)
1951
2173
 
1952
2174
    def test_transport_memory(self):
1971
2193
            load_list='missing file name', list_only=True)
1972
2194
 
1973
2195
 
 
2196
class TestSubunitLogDetails(tests.TestCase, SelfTestHelper):
 
2197
 
 
2198
    _test_needs_features = [features.subunit]
 
2199
 
 
2200
    def run_subunit_stream(self, test_name):
 
2201
        from subunit import ProtocolTestCase
 
2202
        def factory():
 
2203
            return TestUtil.TestSuite([_get_test(test_name)])
 
2204
        stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
 
2205
            test_suite_factory=factory)
 
2206
        test = ProtocolTestCase(stream)
 
2207
        result = testtools.TestResult()
 
2208
        test.run(result)
 
2209
        content = stream.getvalue()
 
2210
        return content, result
 
2211
 
 
2212
    def test_fail_has_log(self):
 
2213
        content, result = self.run_subunit_stream('test_fail')
 
2214
        self.assertEqual(1, len(result.failures))
 
2215
        self.assertContainsRe(content, '(?m)^log$')
 
2216
        self.assertContainsRe(content, 'this test will fail')
 
2217
 
 
2218
    def test_error_has_log(self):
 
2219
        content, result = self.run_subunit_stream('test_error')
 
2220
        self.assertContainsRe(content, '(?m)^log$')
 
2221
        self.assertContainsRe(content, 'this test errored')
 
2222
 
 
2223
    def test_skip_has_no_log(self):
 
2224
        content, result = self.run_subunit_stream('test_skip')
 
2225
        self.assertNotContainsRe(content, '(?m)^log$')
 
2226
        self.assertNotContainsRe(content, 'this test will be skipped')
 
2227
        self.assertEqual(['reason'], result.skip_reasons.keys())
 
2228
        skips = result.skip_reasons['reason']
 
2229
        self.assertEqual(1, len(skips))
 
2230
        test = skips[0]
 
2231
        # RemotedTestCase doesn't preserve the "details"
 
2232
        ## self.assertFalse('log' in test.getDetails())
 
2233
 
 
2234
    def test_missing_feature_has_no_log(self):
 
2235
        content, result = self.run_subunit_stream('test_missing_feature')
 
2236
        self.assertNotContainsRe(content, '(?m)^log$')
 
2237
        self.assertNotContainsRe(content, 'missing the feature')
 
2238
        self.assertEqual(['_MissingFeature\n'], result.skip_reasons.keys())
 
2239
        skips = result.skip_reasons['_MissingFeature\n']
 
2240
        self.assertEqual(1, len(skips))
 
2241
        test = skips[0]
 
2242
        # RemotedTestCase doesn't preserve the "details"
 
2243
        ## self.assertFalse('log' in test.getDetails())
 
2244
 
 
2245
    def test_xfail_has_no_log(self):
 
2246
        content, result = self.run_subunit_stream('test_xfail')
 
2247
        self.assertNotContainsRe(content, '(?m)^log$')
 
2248
        self.assertNotContainsRe(content, 'test with expected failure')
 
2249
        self.assertEqual(1, len(result.expectedFailures))
 
2250
        result_content = result.expectedFailures[0][1]
 
2251
        self.assertNotContainsRe(result_content,
 
2252
            '(?m)^(?:Text attachment: )?log(?:$|: )')
 
2253
        self.assertNotContainsRe(result_content, 'test with expected failure')
 
2254
 
 
2255
    def test_unexpected_success_has_log(self):
 
2256
        content, result = self.run_subunit_stream('test_unexpected_success')
 
2257
        self.assertContainsRe(content, '(?m)^log$')
 
2258
        self.assertContainsRe(content, 'test with unexpected success')
 
2259
        # GZ 2011-05-18: Old versions of subunit treat unexpected success as a
 
2260
        #                success, if a min version check is added remove this
 
2261
        from subunit import TestProtocolClient as _Client
 
2262
        if _Client.addUnexpectedSuccess.__func__ is _Client.addSuccess.__func__:
 
2263
            self.expectFailure('subunit treats "unexpectedSuccess"'
 
2264
                               ' as a plain success',
 
2265
                self.assertEqual, 1, len(result.unexpectedSuccesses))
 
2266
        self.assertEqual(1, len(result.unexpectedSuccesses))
 
2267
        test = result.unexpectedSuccesses[0]
 
2268
        # RemotedTestCase doesn't preserve the "details"
 
2269
        ## self.assertTrue('log' in test.getDetails())
 
2270
 
 
2271
    def test_success_has_no_log(self):
 
2272
        content, result = self.run_subunit_stream('test_success')
 
2273
        self.assertEqual(1, result.testsRun)
 
2274
        self.assertNotContainsRe(content, '(?m)^log$')
 
2275
        self.assertNotContainsRe(content, 'this test succeeds')
 
2276
 
 
2277
 
1974
2278
class TestRunBzr(tests.TestCase):
1975
2279
 
1976
2280
    out = ''
1998
2302
        self.assertEqual(['rocks'], self.argv)
1999
2303
        self.assertEqual(34, self.retcode)
2000
2304
        self.assertEqual('It sure does!\n', out)
2001
 
        self.assertEquals(out, self.out)
 
2305
        self.assertEqual(out, self.out)
2002
2306
        self.assertEqual('', err)
2003
 
        self.assertEquals(err, self.err)
 
2307
        self.assertEqual(err, self.err)
2004
2308
 
2005
2309
    def test_run_bzr_error_regexes(self):
2006
2310
        self.out = ''
2073
2377
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
2074
2378
                         a_callable=None, *args, **kwargs):
2075
2379
        self.stdin = stdin
2076
 
        self.factory_stdin = getattr(bzrlib.ui.ui_factory, "stdin", None)
2077
 
        self.factory = bzrlib.ui.ui_factory
 
2380
        self.factory_stdin = getattr(breezy.ui.ui_factory, "stdin", None)
 
2381
        self.factory = breezy.ui.ui_factory
2078
2382
        self.working_dir = osutils.getcwd()
2079
2383
        stdout.write('foo\n')
2080
2384
        stderr.write('bar\n')
2082
2386
 
2083
2387
    def test_stdin(self):
2084
2388
        # test that the stdin keyword to _run_bzr_core is passed through to
2085
 
        # apply_redirected as a StringIO. We do this by overriding
 
2389
        # apply_redirected as a BytesIO. We do this by overriding
2086
2390
        # apply_redirected in this class, and then calling _run_bzr_core,
2087
2391
        # which calls apply_redirected.
2088
2392
        self.run_bzr(['foo', 'bar'], stdin='gam')
2097
2401
        # own UI factory, which is an instance of TestUIFactory,
2098
2402
        # with stdin, stdout and stderr attached to the stdin,
2099
2403
        # stdout and stderr of the invoked run_bzr
2100
 
        current_factory = bzrlib.ui.ui_factory
 
2404
        current_factory = breezy.ui.ui_factory
2101
2405
        self.run_bzr(['foo'])
2102
 
        self.failIf(current_factory is self.factory)
 
2406
        self.assertFalse(current_factory is self.factory)
2103
2407
        self.assertNotEqual(sys.stdout, self.factory.stdout)
2104
2408
        self.assertNotEqual(sys.stderr, self.factory.stderr)
2105
2409
        self.assertEqual('foo\n', self.factory.stdout.getvalue())
2146
2450
    """Base class for tests testing how we might run bzr."""
2147
2451
 
2148
2452
    def setUp(self):
2149
 
        tests.TestCaseWithTransport.setUp(self)
 
2453
        super(TestWithFakedStartBzrSubprocess, self).setUp()
2150
2454
        self.subprocess_calls = []
2151
2455
 
2152
2456
    def start_bzr_subprocess(self, process_args, env_changes=None,
2262
2566
 
2263
2567
 
2264
2568
class TestStartBzrSubProcess(tests.TestCase):
 
2569
    """Stub test start_bzr_subprocess."""
2265
2570
 
2266
 
    def check_popen_state(self):
2267
 
        """Replace to make assertions when popen is called."""
 
2571
    def _subprocess_log_cleanup(self):
 
2572
        """Inhibits the base version as we don't produce a log file."""
2268
2573
 
2269
2574
    def _popen(self, *args, **kwargs):
2270
 
        """Record the command that is run, so that we can ensure it is correct"""
 
2575
        """Override the base version to record the command that is run.
 
2576
 
 
2577
        From there we can ensure it is correct without spawning a real process.
 
2578
        """
2271
2579
        self.check_popen_state()
2272
2580
        self._popen_args = args
2273
2581
        self._popen_kwargs = kwargs
2274
2582
        raise _DontSpawnProcess()
2275
2583
 
 
2584
    def check_popen_state(self):
 
2585
        """Replace to make assertions when popen is called."""
 
2586
 
2276
2587
    def test_run_bzr_subprocess_no_plugins(self):
2277
2588
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [])
2278
2589
        command = self._popen_args[0]
2279
2590
        self.assertEqual(sys.executable, command[0])
2280
 
        self.assertEqual(self.get_bzr_path(), command[1])
 
2591
        self.assertEqual(self.get_brz_path(), command[1])
2281
2592
        self.assertEqual(['--no-plugins'], command[2:])
2282
2593
 
2283
2594
    def test_allow_plugins(self):
2284
2595
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2285
 
            allow_plugins=True)
 
2596
                          allow_plugins=True)
2286
2597
        command = self._popen_args[0]
2287
2598
        self.assertEqual([], command[2:])
2288
2599
 
2289
2600
    def test_set_env(self):
2290
 
        self.failIf('EXISTANT_ENV_VAR' in os.environ)
 
2601
        self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2291
2602
        # set in the child
2292
2603
        def check_environment():
2293
2604
            self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2294
2605
        self.check_popen_state = check_environment
2295
2606
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2296
 
            env_changes={'EXISTANT_ENV_VAR':'set variable'})
 
2607
                          env_changes={'EXISTANT_ENV_VAR':'set variable'})
2297
2608
        # not set in theparent
2298
2609
        self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2299
2610
 
2300
2611
    def test_run_bzr_subprocess_env_del(self):
2301
2612
        """run_bzr_subprocess can remove environment variables too."""
2302
 
        self.failIf('EXISTANT_ENV_VAR' in os.environ)
 
2613
        self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2303
2614
        def check_environment():
2304
2615
            self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2305
2616
        os.environ['EXISTANT_ENV_VAR'] = 'set variable'
2306
2617
        self.check_popen_state = check_environment
2307
2618
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2308
 
            env_changes={'EXISTANT_ENV_VAR':None})
 
2619
                          env_changes={'EXISTANT_ENV_VAR':None})
2309
2620
        # Still set in parent
2310
2621
        self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2311
2622
        del os.environ['EXISTANT_ENV_VAR']
2312
2623
 
2313
2624
    def test_env_del_missing(self):
2314
 
        self.failIf('NON_EXISTANT_ENV_VAR' in os.environ)
 
2625
        self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2315
2626
        def check_environment():
2316
2627
            self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2317
2628
        self.check_popen_state = check_environment
2318
2629
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2319
 
            env_changes={'NON_EXISTANT_ENV_VAR':None})
 
2630
                          env_changes={'NON_EXISTANT_ENV_VAR':None})
2320
2631
 
2321
2632
    def test_working_dir(self):
2322
2633
        """Test that we can specify the working dir for the child"""
2325
2636
        chdirs = []
2326
2637
        def chdir(path):
2327
2638
            chdirs.append(path)
2328
 
        os.chdir = chdir
2329
 
        try:
2330
 
            def getcwd():
2331
 
                return 'current'
2332
 
            osutils.getcwd = getcwd
2333
 
            try:
2334
 
                self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2335
 
                    working_dir='foo')
2336
 
            finally:
2337
 
                osutils.getcwd = orig_getcwd
2338
 
        finally:
2339
 
            os.chdir = orig_chdir
 
2639
        self.overrideAttr(os, 'chdir', chdir)
 
2640
        def getcwd():
 
2641
            return 'current'
 
2642
        self.overrideAttr(osutils, 'getcwd', getcwd)
 
2643
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
 
2644
                          working_dir='foo')
2340
2645
        self.assertEqual(['foo', 'current'], chdirs)
2341
2646
 
 
2647
    def test_get_brz_path_with_cwd_breezy(self):
 
2648
        self.get_source_path = lambda: ""
 
2649
        self.overrideAttr(os.path, "isfile", lambda path: True)
 
2650
        self.assertEqual(self.get_brz_path(), "brz")
 
2651
 
2342
2652
 
2343
2653
class TestActuallyStartBzrSubprocess(tests.TestCaseWithTransport):
2344
2654
    """Tests that really need to do things with an external bzr."""
2354
2664
        result = self.finish_bzr_subprocess(process, send_signal=signal.SIGINT,
2355
2665
                                            retcode=3)
2356
2666
        self.assertEqual('', result[0])
2357
 
        self.assertEqual('bzr: interrupted\n', result[1])
2358
 
 
2359
 
 
2360
 
class TestFeature(tests.TestCase):
2361
 
 
2362
 
    def test_caching(self):
2363
 
        """Feature._probe is called by the feature at most once."""
2364
 
        class InstrumentedFeature(tests.Feature):
2365
 
            def __init__(self):
2366
 
                super(InstrumentedFeature, self).__init__()
2367
 
                self.calls = []
2368
 
            def _probe(self):
2369
 
                self.calls.append('_probe')
2370
 
                return False
2371
 
        feature = InstrumentedFeature()
2372
 
        feature.available()
2373
 
        self.assertEqual(['_probe'], feature.calls)
2374
 
        feature.available()
2375
 
        self.assertEqual(['_probe'], feature.calls)
2376
 
 
2377
 
    def test_named_str(self):
2378
 
        """Feature.__str__ should thunk to feature_name()."""
2379
 
        class NamedFeature(tests.Feature):
2380
 
            def feature_name(self):
2381
 
                return 'symlinks'
2382
 
        feature = NamedFeature()
2383
 
        self.assertEqual('symlinks', str(feature))
2384
 
 
2385
 
    def test_default_str(self):
2386
 
        """Feature.__str__ should default to __class__.__name__."""
2387
 
        class NamedFeature(tests.Feature):
2388
 
            pass
2389
 
        feature = NamedFeature()
2390
 
        self.assertEqual('NamedFeature', str(feature))
2391
 
 
2392
 
 
2393
 
class TestUnavailableFeature(tests.TestCase):
2394
 
 
2395
 
    def test_access_feature(self):
2396
 
        feature = tests.Feature()
2397
 
        exception = tests.UnavailableFeature(feature)
2398
 
        self.assertIs(feature, exception.args[0])
2399
 
 
2400
 
 
2401
 
simple_thunk_feature = tests._CompatabilityThunkFeature(
2402
 
    deprecated_in((2, 1, 0)),
2403
 
    'bzrlib.tests.test_selftest',
2404
 
    'simple_thunk_feature','UnicodeFilename',
2405
 
    replacement_module='bzrlib.tests'
2406
 
    )
2407
 
 
2408
 
class Test_CompatibilityFeature(tests.TestCase):
2409
 
 
2410
 
    def test_does_thunk(self):
2411
 
        res = self.callDeprecated(
2412
 
            ['bzrlib.tests.test_selftest.simple_thunk_feature was deprecated'
2413
 
             ' in version 2.1.0. Use bzrlib.tests.UnicodeFilename instead.'],
2414
 
            simple_thunk_feature.available)
2415
 
        self.assertEqual(tests.UnicodeFilename.available(), res)
2416
 
 
2417
 
 
2418
 
class TestModuleAvailableFeature(tests.TestCase):
2419
 
 
2420
 
    def test_available_module(self):
2421
 
        feature = tests.ModuleAvailableFeature('bzrlib.tests')
2422
 
        self.assertEqual('bzrlib.tests', feature.module_name)
2423
 
        self.assertEqual('bzrlib.tests', str(feature))
2424
 
        self.assertTrue(feature.available())
2425
 
        self.assertIs(tests, feature.module)
2426
 
 
2427
 
    def test_unavailable_module(self):
2428
 
        feature = tests.ModuleAvailableFeature('bzrlib.no_such_module_exists')
2429
 
        self.assertEqual('bzrlib.no_such_module_exists', str(feature))
2430
 
        self.assertFalse(feature.available())
2431
 
        self.assertIs(None, feature.module)
 
2667
        self.assertEqual('brz: interrupted\n', result[1])
2432
2668
 
2433
2669
 
2434
2670
class TestSelftestFiltering(tests.TestCase):
2435
2671
 
2436
2672
    def setUp(self):
2437
 
        tests.TestCase.setUp(self)
 
2673
        super(TestSelftestFiltering, self).setUp()
2438
2674
        self.suite = TestUtil.TestSuite()
2439
2675
        self.loader = TestUtil.TestLoader()
2440
2676
        self.suite.addTest(self.loader.loadTestsFromModule(
2441
 
            sys.modules['bzrlib.tests.test_selftest']))
 
2677
            sys.modules['breezy.tests.test_selftest']))
2442
2678
        self.all_names = _test_ids(self.suite)
2443
2679
 
2444
2680
    def test_condition_id_re(self):
2445
 
        test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2681
        test_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2446
2682
            'test_condition_id_re')
2447
2683
        filtered_suite = tests.filter_suite_by_condition(
2448
2684
            self.suite, tests.condition_id_re('test_condition_id_re'))
2449
2685
        self.assertEqual([test_name], _test_ids(filtered_suite))
2450
2686
 
2451
2687
    def test_condition_id_in_list(self):
2452
 
        test_names = ['bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2688
        test_names = ['breezy.tests.test_selftest.TestSelftestFiltering.'
2453
2689
                      'test_condition_id_in_list']
2454
2690
        id_list = tests.TestIdList(test_names)
2455
2691
        filtered_suite = tests.filter_suite_by_condition(
2459
2695
        self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
2460
2696
 
2461
2697
    def test_condition_id_startswith(self):
2462
 
        klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2698
        klass = 'breezy.tests.test_selftest.TestSelftestFiltering.'
2463
2699
        start1 = klass + 'test_condition_id_starts'
2464
2700
        start2 = klass + 'test_condition_id_in'
2465
2701
        test_names = [ klass + 'test_condition_id_in_list',
2472
2708
    def test_condition_isinstance(self):
2473
2709
        filtered_suite = tests.filter_suite_by_condition(
2474
2710
            self.suite, tests.condition_isinstance(self.__class__))
2475
 
        class_pattern = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2711
        class_pattern = 'breezy.tests.test_selftest.TestSelftestFiltering.'
2476
2712
        re_filtered = tests.filter_suite_by_re(self.suite, class_pattern)
2477
2713
        self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
2478
2714
 
2479
2715
    def test_exclude_tests_by_condition(self):
2480
 
        excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2716
        excluded_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2481
2717
            'test_exclude_tests_by_condition')
2482
2718
        filtered_suite = tests.exclude_tests_by_condition(self.suite,
2483
2719
            lambda x:x.id() == excluded_name)
2492
2728
        self.all_names = _test_ids(self.suite)
2493
2729
        filtered_suite = tests.exclude_tests_by_re(self.suite,
2494
2730
                                                   'exclude_tests_by_re')
2495
 
        excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2731
        excluded_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2496
2732
            'test_exclude_tests_by_re')
2497
2733
        self.assertEqual(len(self.all_names) - 1,
2498
2734
            filtered_suite.countTestCases())
2502
2738
        self.assertEqual(remaining_names, _test_ids(filtered_suite))
2503
2739
 
2504
2740
    def test_filter_suite_by_condition(self):
2505
 
        test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2741
        test_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2506
2742
            'test_filter_suite_by_condition')
2507
2743
        filtered_suite = tests.filter_suite_by_condition(self.suite,
2508
2744
            lambda x:x.id() == test_name)
2512
2748
        filtered_suite = tests.filter_suite_by_re(self.suite,
2513
2749
                                                  'test_filter_suite_by_r')
2514
2750
        filtered_names = _test_ids(filtered_suite)
2515
 
        self.assertEqual(filtered_names, ['bzrlib.tests.test_selftest.'
 
2751
        self.assertEqual(filtered_names, ['breezy.tests.test_selftest.'
2516
2752
            'TestSelftestFiltering.test_filter_suite_by_re'])
2517
2753
 
2518
2754
    def test_filter_suite_by_id_list(self):
2519
 
        test_list = ['bzrlib.tests.test_selftest.'
 
2755
        test_list = ['breezy.tests.test_selftest.'
2520
2756
                     'TestSelftestFiltering.test_filter_suite_by_id_list']
2521
2757
        filtered_suite = tests.filter_suite_by_id_list(
2522
2758
            self.suite, tests.TestIdList(test_list))
2523
2759
        filtered_names = _test_ids(filtered_suite)
2524
2760
        self.assertEqual(
2525
2761
            filtered_names,
2526
 
            ['bzrlib.tests.test_selftest.'
 
2762
            ['breezy.tests.test_selftest.'
2527
2763
             'TestSelftestFiltering.test_filter_suite_by_id_list'])
2528
2764
 
2529
2765
    def test_filter_suite_by_id_startswith(self):
2530
2766
        # By design this test may fail if another test is added whose name also
2531
2767
        # begins with one of the start value used.
2532
 
        klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2768
        klass = 'breezy.tests.test_selftest.TestSelftestFiltering.'
2533
2769
        start1 = klass + 'test_filter_suite_by_id_starts'
2534
2770
        start2 = klass + 'test_filter_suite_by_id_li'
2535
2771
        test_list = [klass + 'test_filter_suite_by_id_list',
2566
2802
        self.all_names = _test_ids(self.suite)
2567
2803
        condition = tests.condition_id_re('test_filter_suite_by_r')
2568
2804
        split_suite = tests.split_suite_by_condition(self.suite, condition)
2569
 
        filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2805
        filtered_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2570
2806
            'test_filter_suite_by_re')
2571
2807
        self.assertEqual([filtered_name], _test_ids(split_suite[0]))
2572
2808
        self.assertFalse(filtered_name in _test_ids(split_suite[1]))
2578
2814
        self.all_names = _test_ids(self.suite)
2579
2815
        split_suite = tests.split_suite_by_re(self.suite,
2580
2816
                                              'test_filter_suite_by_r')
2581
 
        filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
2817
        filtered_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2582
2818
            'test_filter_suite_by_re')
2583
2819
        self.assertEqual([filtered_name], _test_ids(split_suite[0]))
2584
2820
        self.assertFalse(filtered_name in _test_ids(split_suite[1]))
2587
2823
        self.assertEqual(remaining_names, _test_ids(split_suite[1]))
2588
2824
 
2589
2825
 
2590
 
class TestCheckInventoryShape(tests.TestCaseWithTransport):
 
2826
class TestCheckTreeShape(tests.TestCaseWithTransport):
2591
2827
 
2592
 
    def test_check_inventory_shape(self):
 
2828
    def test_check_tree_shape(self):
2593
2829
        files = ['a', 'b/', 'b/c']
2594
2830
        tree = self.make_branch_and_tree('.')
2595
2831
        self.build_tree(files)
2596
2832
        tree.add(files)
2597
2833
        tree.lock_read()
2598
2834
        try:
2599
 
            self.check_inventory_shape(tree.inventory, files)
 
2835
            self.check_tree_shape(tree, files)
2600
2836
        finally:
2601
2837
            tree.unlock()
2602
2838
 
2613
2849
            self.run_bzr, ['assert-fail'])
2614
2850
        # make sure we got the real thing, not an error from somewhere else in
2615
2851
        # the test framework
2616
 
        self.assertEquals('always fails', str(e))
 
2852
        self.assertEqual('always fails', str(e))
2617
2853
        # check that there's no traceback in the test log
2618
2854
        self.assertNotContainsRe(self.get_log(), r'Traceback')
2619
2855
 
2629
2865
        out, err = self.run_bzr(["log", "%s/nonexistantpath" % url], retcode=3)
2630
2866
        self.assertEqual(out, '')
2631
2867
        self.assertContainsRe(err,
2632
 
            'bzr: ERROR: Not a branch: ".*nonexistantpath/".\n')
 
2868
            'brz: ERROR: Not a branch: ".*nonexistantpath/".\n')
2633
2869
 
2634
2870
 
2635
2871
class TestTestLoader(tests.TestCase):
2667
2903
 
2668
2904
    def test_load_tests_from_module_name_smoke_test(self):
2669
2905
        loader = TestUtil.TestLoader()
2670
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2671
 
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
 
2906
        suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
 
2907
        self.assertEqual(['breezy.tests.test_sampler.DemoTest.test_nothing'],
2672
2908
                          _test_ids(suite))
2673
2909
 
2674
2910
    def test_load_tests_from_module_name_with_bogus_module_name(self):
2703
2939
 
2704
2940
    def test_empty_list(self):
2705
2941
        id_list = self._create_id_list([])
2706
 
        self.assertEquals({}, id_list.tests)
2707
 
        self.assertEquals({}, id_list.modules)
 
2942
        self.assertEqual({}, id_list.tests)
 
2943
        self.assertEqual({}, id_list.modules)
2708
2944
 
2709
2945
    def test_valid_list(self):
2710
2946
        id_list = self._create_id_list(
2733
2969
 
2734
2970
    def test_test_suite_matches_id_list_with_unknown(self):
2735
2971
        loader = TestUtil.TestLoader()
2736
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2737
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',
 
2972
        suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
 
2973
        test_list = ['breezy.tests.test_sampler.DemoTest.test_nothing',
2738
2974
                     'bogus']
2739
2975
        not_found, duplicates = tests.suite_matches_id_list(suite, test_list)
2740
 
        self.assertEquals(['bogus'], not_found)
2741
 
        self.assertEquals([], duplicates)
 
2976
        self.assertEqual(['bogus'], not_found)
 
2977
        self.assertEqual([], duplicates)
2742
2978
 
2743
2979
    def test_suite_matches_id_list_with_duplicates(self):
2744
2980
        loader = TestUtil.TestLoader()
2745
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
 
2981
        suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
2746
2982
        dupes = loader.suiteClass()
2747
2983
        for test in tests.iter_suite_tests(suite):
2748
2984
            dupes.addTest(test)
2749
2985
            dupes.addTest(test) # Add it again
2750
2986
 
2751
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',]
 
2987
        test_list = ['breezy.tests.test_sampler.DemoTest.test_nothing',]
2752
2988
        not_found, duplicates = tests.suite_matches_id_list(
2753
2989
            dupes, test_list)
2754
 
        self.assertEquals([], not_found)
2755
 
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
 
2990
        self.assertEqual([], not_found)
 
2991
        self.assertEqual(['breezy.tests.test_sampler.DemoTest.test_nothing'],
2756
2992
                          duplicates)
2757
2993
 
2758
2994
 
2763
2999
        # by _test_suite_testmod_names.
2764
3000
        test_list = tests._test_suite_testmod_names()
2765
3001
        self.assertSubset([
2766
 
            'bzrlib.tests.blackbox',
2767
 
            'bzrlib.tests.per_transport',
2768
 
            'bzrlib.tests.test_selftest',
 
3002
            'breezy.tests.blackbox',
 
3003
            'breezy.tests.per_transport',
 
3004
            'breezy.tests.test_selftest',
2769
3005
            ],
2770
3006
            test_list)
2771
3007
 
2778
3014
            self.assertEqual([], test_list)
2779
3015
            return
2780
3016
        self.assertSubset([
2781
 
            'bzrlib.timestamp',
 
3017
            'breezy.timestamp',
2782
3018
            ],
2783
3019
            test_list)
2784
3020
 
2792
3028
        def testmod_names():
2793
3029
            calls.append("testmod_names")
2794
3030
            return [
2795
 
                'bzrlib.tests.blackbox.test_branch',
2796
 
                'bzrlib.tests.per_transport',
2797
 
                'bzrlib.tests.test_selftest',
 
3031
                'breezy.tests.blackbox.test_branch',
 
3032
                'breezy.tests.per_transport',
 
3033
                'breezy.tests.test_selftest',
2798
3034
                ]
2799
3035
        self.overrideAttr(tests, '_test_suite_testmod_names', testmod_names)
2800
3036
        def doctests():
2801
3037
            calls.append("modules_to_doctest")
2802
3038
            if __doc__ is None:
2803
3039
                return []
2804
 
            return ['bzrlib.timestamp']
 
3040
            return ['breezy.timestamp']
2805
3041
        self.overrideAttr(tests, '_test_suite_modules_to_doctest', doctests)
2806
3042
        expected_test_list = [
2807
3043
            # testmod_names
2808
 
            'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
2809
 
            ('bzrlib.tests.per_transport.TransportTests'
 
3044
            'breezy.tests.blackbox.test_branch.TestBranch.test_branch',
 
3045
            ('breezy.tests.per_transport.TransportTests'
2810
3046
             '.test_abspath(LocalTransport,LocalURLServer)'),
2811
 
            'bzrlib.tests.test_selftest.TestTestSuite.test_test_suite',
 
3047
            'breezy.tests.test_selftest.TestTestSuite.test_test_suite',
2812
3048
            # plugins can't be tested that way since selftest may be run with
2813
3049
            # --no-plugins
2814
3050
            ]
2815
3051
        if __doc__ is not None:
2816
3052
            expected_test_list.extend([
2817
3053
                # modules_to_doctest
2818
 
                'bzrlib.timestamp.format_highres_date',
 
3054
                'breezy.timestamp.format_highres_date',
2819
3055
                ])
2820
3056
        suite = tests.test_suite()
2821
 
        self.assertEqual(set(["testmod_names", "modules_to_doctest"]),
 
3057
        self.assertEqual({"testmod_names", "modules_to_doctest"},
2822
3058
            set(calls))
2823
3059
        self.assertSubset(expected_test_list, _test_ids(suite))
2824
3060
 
2827
3063
        # to know that starting_with == None works. So a second load is
2828
3064
        # incurred - note that the starting_with parameter causes a partial load
2829
3065
        # rather than a full load so this test should be pretty quick.
2830
 
        test_list = ['bzrlib.tests.test_selftest.TestTestSuite.test_test_suite']
 
3066
        test_list = ['breezy.tests.test_selftest.TestTestSuite.test_test_suite']
2831
3067
        suite = tests.test_suite(test_list,
2832
 
                                 ['bzrlib.tests.test_selftest.TestTestSuite'])
 
3068
                                 ['breezy.tests.test_selftest.TestTestSuite'])
2833
3069
        # test_test_suite_list_and_start is not included 
2834
 
        self.assertEquals(test_list, _test_ids(suite))
 
3070
        self.assertEqual(test_list, _test_ids(suite))
2835
3071
 
2836
3072
 
2837
3073
class TestLoadTestIdList(tests.TestCaseInTempDir):
2850
3086
        self._create_test_list_file(test_list_fname,
2851
3087
                                    'mod1.cl1.meth1\nmod2.cl2.meth2\n')
2852
3088
        tlist = tests.load_test_id_list(test_list_fname)
2853
 
        self.assertEquals(2, len(tlist))
2854
 
        self.assertEquals('mod1.cl1.meth1', tlist[0])
2855
 
        self.assertEquals('mod2.cl2.meth2', tlist[1])
 
3089
        self.assertEqual(2, len(tlist))
 
3090
        self.assertEqual('mod1.cl1.meth1', tlist[0])
 
3091
        self.assertEqual('mod2.cl2.meth2', tlist[1])
2856
3092
 
2857
3093
    def test_load_dirty_file(self):
2858
3094
        test_list_fname = 'test.list'
2860
3096
                                    '  mod1.cl1.meth1\n\nmod2.cl2.meth2  \n'
2861
3097
                                    'bar baz\n')
2862
3098
        tlist = tests.load_test_id_list(test_list_fname)
2863
 
        self.assertEquals(4, len(tlist))
2864
 
        self.assertEquals('mod1.cl1.meth1', tlist[0])
2865
 
        self.assertEquals('', tlist[1])
2866
 
        self.assertEquals('mod2.cl2.meth2', tlist[2])
2867
 
        self.assertEquals('bar baz', tlist[3])
 
3099
        self.assertEqual(4, len(tlist))
 
3100
        self.assertEqual('mod1.cl1.meth1', tlist[0])
 
3101
        self.assertEqual('', tlist[1])
 
3102
        self.assertEqual('mod2.cl2.meth2', tlist[2])
 
3103
        self.assertEqual('bar baz', tlist[3])
2868
3104
 
2869
3105
 
2870
3106
class TestFilteredByModuleTestLoader(tests.TestCase):
2875
3111
        return loader
2876
3112
 
2877
3113
    def test_load_tests(self):
2878
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
 
3114
        test_list = ['breezy.tests.test_sampler.DemoTest.test_nothing']
2879
3115
        loader = self._create_loader(test_list)
2880
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2881
 
        self.assertEquals(test_list, _test_ids(suite))
 
3116
        suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
 
3117
        self.assertEqual(test_list, _test_ids(suite))
2882
3118
 
2883
3119
    def test_exclude_tests(self):
2884
3120
        test_list = ['bogus']
2885
3121
        loader = self._create_loader(test_list)
2886
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2887
 
        self.assertEquals([], _test_ids(suite))
 
3122
        suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
 
3123
        self.assertEqual([], _test_ids(suite))
2888
3124
 
2889
3125
 
2890
3126
class TestFilteredByNameStartTestLoader(tests.TestCase):
2896
3132
        return loader
2897
3133
 
2898
3134
    def test_load_tests(self):
2899
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
2900
 
        loader = self._create_loader('bzrlib.tests.test_samp')
 
3135
        test_list = ['breezy.tests.test_sampler.DemoTest.test_nothing']
 
3136
        loader = self._create_loader('breezy.tests.test_samp')
2901
3137
 
2902
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2903
 
        self.assertEquals(test_list, _test_ids(suite))
 
3138
        suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
 
3139
        self.assertEqual(test_list, _test_ids(suite))
2904
3140
 
2905
3141
    def test_load_tests_inside_module(self):
2906
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
2907
 
        loader = self._create_loader('bzrlib.tests.test_sampler.Demo')
 
3142
        test_list = ['breezy.tests.test_sampler.DemoTest.test_nothing']
 
3143
        loader = self._create_loader('breezy.tests.test_sampler.Demo')
2908
3144
 
2909
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2910
 
        self.assertEquals(test_list, _test_ids(suite))
 
3145
        suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
 
3146
        self.assertEqual(test_list, _test_ids(suite))
2911
3147
 
2912
3148
    def test_exclude_tests(self):
2913
3149
        test_list = ['bogus']
2914
3150
        loader = self._create_loader('bogus')
2915
3151
 
2916
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2917
 
        self.assertEquals([], _test_ids(suite))
 
3152
        suite = loader.loadTestsFromModuleName('breezy.tests.test_sampler')
 
3153
        self.assertEqual([], _test_ids(suite))
2918
3154
 
2919
3155
 
2920
3156
class TestTestPrefixRegistry(tests.TestCase):
2926
3162
    def test_register_new_prefix(self):
2927
3163
        tpr = self._get_registry()
2928
3164
        tpr.register('foo', 'fff.ooo.ooo')
2929
 
        self.assertEquals('fff.ooo.ooo', tpr.get('foo'))
 
3165
        self.assertEqual('fff.ooo.ooo', tpr.get('foo'))
2930
3166
 
2931
3167
    def test_register_existing_prefix(self):
2932
3168
        tpr = self._get_registry()
2933
3169
        tpr.register('bar', 'bbb.aaa.rrr')
2934
3170
        tpr.register('bar', 'bBB.aAA.rRR')
2935
 
        self.assertEquals('bbb.aaa.rrr', tpr.get('bar'))
 
3171
        self.assertEqual('bbb.aaa.rrr', tpr.get('bar'))
2936
3172
        self.assertThat(self.get_log(),
2937
 
            DocTestMatches("...bar...bbb.aaa.rrr...BB.aAA.rRR", ELLIPSIS))
 
3173
            DocTestMatches("...bar...bbb.aaa.rrr...BB.aAA.rRR",
 
3174
                           doctest.ELLIPSIS))
2938
3175
 
2939
3176
    def test_get_unknown_prefix(self):
2940
3177
        tpr = self._get_registry()
2943
3180
    def test_resolve_prefix(self):
2944
3181
        tpr = self._get_registry()
2945
3182
        tpr.register('bar', 'bb.aa.rr')
2946
 
        self.assertEquals('bb.aa.rr', tpr.resolve_alias('bar'))
 
3183
        self.assertEqual('bb.aa.rr', tpr.resolve_alias('bar'))
2947
3184
 
2948
3185
    def test_resolve_unknown_alias(self):
2949
3186
        tpr = self._get_registry()
2952
3189
 
2953
3190
    def test_predefined_prefixes(self):
2954
3191
        tpr = tests.test_prefix_alias_registry
2955
 
        self.assertEquals('bzrlib', tpr.resolve_alias('bzrlib'))
2956
 
        self.assertEquals('bzrlib.doc', tpr.resolve_alias('bd'))
2957
 
        self.assertEquals('bzrlib.utils', tpr.resolve_alias('bu'))
2958
 
        self.assertEquals('bzrlib.tests', tpr.resolve_alias('bt'))
2959
 
        self.assertEquals('bzrlib.tests.blackbox', tpr.resolve_alias('bb'))
2960
 
        self.assertEquals('bzrlib.plugins', tpr.resolve_alias('bp'))
 
3192
        self.assertEqual('breezy', tpr.resolve_alias('breezy'))
 
3193
        self.assertEqual('breezy.doc', tpr.resolve_alias('bd'))
 
3194
        self.assertEqual('breezy.utils', tpr.resolve_alias('bu'))
 
3195
        self.assertEqual('breezy.tests', tpr.resolve_alias('bt'))
 
3196
        self.assertEqual('breezy.tests.blackbox', tpr.resolve_alias('bb'))
 
3197
        self.assertEqual('breezy.plugins', tpr.resolve_alias('bp'))
 
3198
 
 
3199
 
 
3200
class TestThreadLeakDetection(tests.TestCase):
 
3201
    """Ensure when tests leak threads we detect and report it"""
 
3202
 
 
3203
    class LeakRecordingResult(tests.ExtendedTestResult):
 
3204
        def __init__(self):
 
3205
            tests.ExtendedTestResult.__init__(self, BytesIO(), 0, 1)
 
3206
            self.leaks = []
 
3207
        def _report_thread_leak(self, test, leaks, alive):
 
3208
            self.leaks.append((test, leaks))
 
3209
 
 
3210
    def test_testcase_without_addCleanups(self):
 
3211
        """Check old TestCase instances don't break with leak detection"""
 
3212
        class Test(unittest.TestCase):
 
3213
            def runTest(self):
 
3214
                pass
 
3215
        result = self.LeakRecordingResult()
 
3216
        test = Test()
 
3217
        result.startTestRun()
 
3218
        test.run(result)
 
3219
        result.stopTestRun()
 
3220
        self.assertEqual(result._tests_leaking_threads_count, 0)
 
3221
        self.assertEqual(result.leaks, [])
 
3222
        
 
3223
    def test_thread_leak(self):
 
3224
        """Ensure a thread that outlives the running of a test is reported
 
3225
 
 
3226
        Uses a thread that blocks on an event, and is started by the inner
 
3227
        test case. As the thread outlives the inner case's run, it should be
 
3228
        detected as a leak, but the event is then set so that the thread can
 
3229
        be safely joined in cleanup so it's not leaked for real.
 
3230
        """
 
3231
        event = threading.Event()
 
3232
        thread = threading.Thread(name="Leaker", target=event.wait)
 
3233
        class Test(tests.TestCase):
 
3234
            def test_leak(self):
 
3235
                thread.start()
 
3236
        result = self.LeakRecordingResult()
 
3237
        test = Test("test_leak")
 
3238
        self.addCleanup(thread.join)
 
3239
        self.addCleanup(event.set)
 
3240
        result.startTestRun()
 
3241
        test.run(result)
 
3242
        result.stopTestRun()
 
3243
        self.assertEqual(result._tests_leaking_threads_count, 1)
 
3244
        self.assertEqual(result._first_thread_leaker_id, test.id())
 
3245
        self.assertEqual(result.leaks, [(test, {thread})])
 
3246
        self.assertContainsString(result.stream.getvalue(), "leaking threads")
 
3247
 
 
3248
    def test_multiple_leaks(self):
 
3249
        """Check multiple leaks are blamed on the test cases at fault
 
3250
 
 
3251
        Same concept as the previous test, but has one inner test method that
 
3252
        leaks two threads, and one that doesn't leak at all.
 
3253
        """
 
3254
        event = threading.Event()
 
3255
        thread_a = threading.Thread(name="LeakerA", target=event.wait)
 
3256
        thread_b = threading.Thread(name="LeakerB", target=event.wait)
 
3257
        thread_c = threading.Thread(name="LeakerC", target=event.wait)
 
3258
        class Test(tests.TestCase):
 
3259
            def test_first_leak(self):
 
3260
                thread_b.start()
 
3261
            def test_second_no_leak(self):
 
3262
                pass
 
3263
            def test_third_leak(self):
 
3264
                thread_c.start()
 
3265
                thread_a.start()
 
3266
        result = self.LeakRecordingResult()
 
3267
        first_test = Test("test_first_leak")
 
3268
        third_test = Test("test_third_leak")
 
3269
        self.addCleanup(thread_a.join)
 
3270
        self.addCleanup(thread_b.join)
 
3271
        self.addCleanup(thread_c.join)
 
3272
        self.addCleanup(event.set)
 
3273
        result.startTestRun()
 
3274
        unittest.TestSuite(
 
3275
            [first_test, Test("test_second_no_leak"), third_test]
 
3276
            ).run(result)
 
3277
        result.stopTestRun()
 
3278
        self.assertEqual(result._tests_leaking_threads_count, 2)
 
3279
        self.assertEqual(result._first_thread_leaker_id, first_test.id())
 
3280
        self.assertEqual(result.leaks, [
 
3281
            (first_test, {thread_b}),
 
3282
            (third_test, {thread_a, thread_c})])
 
3283
        self.assertContainsString(result.stream.getvalue(), "leaking threads")
 
3284
 
 
3285
 
 
3286
class TestPostMortemDebugging(tests.TestCase):
 
3287
    """Check post mortem debugging works when tests fail or error"""
 
3288
 
 
3289
    class TracebackRecordingResult(tests.ExtendedTestResult):
 
3290
        def __init__(self):
 
3291
            tests.ExtendedTestResult.__init__(self, BytesIO(), 0, 1)
 
3292
            self.postcode = None
 
3293
        def _post_mortem(self, tb=None):
 
3294
            """Record the code object at the end of the current traceback"""
 
3295
            tb = tb or sys.exc_info()[2]
 
3296
            if tb is not None:
 
3297
                next = tb.tb_next
 
3298
                while next is not None:
 
3299
                    tb = next
 
3300
                    next = next.tb_next
 
3301
                self.postcode = tb.tb_frame.f_code
 
3302
        def report_error(self, test, err):
 
3303
            pass
 
3304
        def report_failure(self, test, err):
 
3305
            pass
 
3306
 
 
3307
    def test_location_unittest_error(self):
 
3308
        """Needs right post mortem traceback with erroring unittest case"""
 
3309
        class Test(unittest.TestCase):
 
3310
            def runTest(self):
 
3311
                raise RuntimeError
 
3312
        result = self.TracebackRecordingResult()
 
3313
        Test().run(result)
 
3314
        self.assertEqual(result.postcode, Test.runTest.__code__)
 
3315
 
 
3316
    def test_location_unittest_failure(self):
 
3317
        """Needs right post mortem traceback with failing unittest case"""
 
3318
        class Test(unittest.TestCase):
 
3319
            def runTest(self):
 
3320
                raise self.failureException
 
3321
        result = self.TracebackRecordingResult()
 
3322
        Test().run(result)
 
3323
        self.assertEqual(result.postcode, Test.runTest.__code__)
 
3324
 
 
3325
    def test_location_bt_error(self):
 
3326
        """Needs right post mortem traceback with erroring breezy.tests case"""
 
3327
        class Test(tests.TestCase):
 
3328
            def test_error(self):
 
3329
                raise RuntimeError
 
3330
        result = self.TracebackRecordingResult()
 
3331
        Test("test_error").run(result)
 
3332
        self.assertEqual(result.postcode, Test.test_error.__code__)
 
3333
 
 
3334
    def test_location_bt_failure(self):
 
3335
        """Needs right post mortem traceback with failing breezy.tests case"""
 
3336
        class Test(tests.TestCase):
 
3337
            def test_failure(self):
 
3338
                raise self.failureException
 
3339
        result = self.TracebackRecordingResult()
 
3340
        Test("test_failure").run(result)
 
3341
        self.assertEqual(result.postcode, Test.test_failure.__code__)
 
3342
 
 
3343
    def test_env_var_triggers_post_mortem(self):
 
3344
        """Check pdb.post_mortem is called iff BRZ_TEST_PDB is set"""
 
3345
        import pdb
 
3346
        result = tests.ExtendedTestResult(BytesIO(), 0, 1)
 
3347
        post_mortem_calls = []
 
3348
        self.overrideAttr(pdb, "post_mortem", post_mortem_calls.append)
 
3349
        self.overrideEnv('BRZ_TEST_PDB', None)
 
3350
        result._post_mortem(1)
 
3351
        self.overrideEnv('BRZ_TEST_PDB', 'on')
 
3352
        result._post_mortem(2)
 
3353
        self.assertEqual([2], post_mortem_calls)
2961
3354
 
2962
3355
 
2963
3356
class TestRunSuite(tests.TestCase):
2974
3367
                calls.append(test)
2975
3368
                return tests.ExtendedTestResult(self.stream, self.descriptions,
2976
3369
                                                self.verbosity)
2977
 
        tests.run_suite(suite, runner_class=MyRunner, stream=StringIO())
 
3370
        tests.run_suite(suite, runner_class=MyRunner, stream=BytesIO())
2978
3371
        self.assertLength(1, calls)
 
3372
 
 
3373
 
 
3374
class _Selftest(object):
 
3375
    """Mixin for tests needing full selftest output"""
 
3376
 
 
3377
    def _inject_stream_into_subunit(self, stream):
 
3378
        """To be overridden by subclasses that run tests out of process"""
 
3379
 
 
3380
    def _run_selftest(self, **kwargs):
 
3381
        sio = BytesIO()
 
3382
        self._inject_stream_into_subunit(sio)
 
3383
        tests.selftest(stream=sio, stop_on_failure=False, **kwargs)
 
3384
        return sio.getvalue()
 
3385
 
 
3386
 
 
3387
class _ForkedSelftest(_Selftest):
 
3388
    """Mixin for tests needing full selftest output with forked children"""
 
3389
 
 
3390
    _test_needs_features = [features.subunit]
 
3391
 
 
3392
    def _inject_stream_into_subunit(self, stream):
 
3393
        """Monkey-patch subunit so the extra output goes to stream not stdout
 
3394
 
 
3395
        Some APIs need rewriting so this kind of bogus hackery can be replaced
 
3396
        by passing the stream param from run_tests down into ProtocolTestCase.
 
3397
        """
 
3398
        from subunit import ProtocolTestCase
 
3399
        _original_init = ProtocolTestCase.__init__
 
3400
        def _init_with_passthrough(self, *args, **kwargs):
 
3401
            _original_init(self, *args, **kwargs)
 
3402
            self._passthrough = stream
 
3403
        self.overrideAttr(ProtocolTestCase, "__init__", _init_with_passthrough)
 
3404
 
 
3405
    def _run_selftest(self, **kwargs):
 
3406
        # GZ 2011-05-26: Add a PosixSystem feature so this check can go away
 
3407
        if getattr(os, "fork", None) is None:
 
3408
            raise tests.TestNotApplicable("Platform doesn't support forking")
 
3409
        # Make sure the fork code is actually invoked by claiming two cores
 
3410
        self.overrideAttr(osutils, "local_concurrency", lambda: 2)
 
3411
        kwargs.setdefault("suite_decorators", []).append(tests.fork_decorator)
 
3412
        return super(_ForkedSelftest, self)._run_selftest(**kwargs)
 
3413
 
 
3414
 
 
3415
class TestParallelFork(_ForkedSelftest, tests.TestCase):
 
3416
    """Check operation of --parallel=fork selftest option"""
 
3417
 
 
3418
    def test_error_in_child_during_fork(self):
 
3419
        """Error in a forked child during test setup should get reported"""
 
3420
        class Test(tests.TestCase):
 
3421
            def testMethod(self):
 
3422
                pass
 
3423
        # We don't care what, just break something that a child will run
 
3424
        self.overrideAttr(tests, "workaround_zealous_crypto_random", None)
 
3425
        out = self._run_selftest(test_suite_factory=Test)
 
3426
        # Lines from the tracebacks of the two child processes may be mixed
 
3427
        # together due to the way subunit parses and forwards the streams,
 
3428
        # so permit extra lines between each part of the error output.
 
3429
        self.assertContainsRe(out,
 
3430
            "Traceback.*:\n"
 
3431
            "(?:.*\n)*"
 
3432
            ".+ in fork_for_tests\n"
 
3433
            "(?:.*\n)*"
 
3434
            "\s*workaround_zealous_crypto_random\(\)\n"
 
3435
            "(?:.*\n)*"
 
3436
            "TypeError:")
 
3437
 
 
3438
 
 
3439
class TestUncollectedWarnings(_Selftest, tests.TestCase):
 
3440
    """Check a test case still alive after being run emits a warning"""
 
3441
 
 
3442
    class Test(tests.TestCase):
 
3443
        def test_pass(self):
 
3444
            pass
 
3445
        def test_self_ref(self):
 
3446
            self.also_self = self.test_self_ref
 
3447
        def test_skip(self):
 
3448
            self.skipTest("Don't need")
 
3449
 
 
3450
    def _get_suite(self):
 
3451
        return TestUtil.TestSuite([
 
3452
            self.Test("test_pass"),
 
3453
            self.Test("test_self_ref"),
 
3454
            self.Test("test_skip"),
 
3455
            ])
 
3456
 
 
3457
    def _run_selftest_with_suite(self, **kwargs):
 
3458
        old_flags = tests.selftest_debug_flags
 
3459
        tests.selftest_debug_flags = old_flags.union(["uncollected_cases"])
 
3460
        gc_on = gc.isenabled()
 
3461
        if gc_on:
 
3462
            gc.disable()
 
3463
        try:
 
3464
            output = self._run_selftest(test_suite_factory=self._get_suite,
 
3465
                **kwargs)
 
3466
        finally:
 
3467
            if gc_on:
 
3468
                gc.enable()
 
3469
            tests.selftest_debug_flags = old_flags
 
3470
        self.assertNotContainsRe(output, "Uncollected test case.*test_pass")
 
3471
        self.assertContainsRe(output, "Uncollected test case.*test_self_ref")
 
3472
        return output
 
3473
 
 
3474
    def test_testsuite(self):
 
3475
        self._run_selftest_with_suite()
 
3476
 
 
3477
    def test_pattern(self):
 
3478
        out = self._run_selftest_with_suite(pattern="test_(?:pass|self_ref)$")
 
3479
        self.assertNotContainsRe(out, "test_skip")
 
3480
 
 
3481
    def test_exclude_pattern(self):
 
3482
        out = self._run_selftest_with_suite(exclude_pattern="test_skip$")
 
3483
        self.assertNotContainsRe(out, "test_skip")
 
3484
 
 
3485
    def test_random_seed(self):
 
3486
        self._run_selftest_with_suite(random_seed="now")
 
3487
 
 
3488
    def test_matching_tests_first(self):
 
3489
        self._run_selftest_with_suite(matching_tests_first=True,
 
3490
            pattern="test_self_ref$")
 
3491
 
 
3492
    def test_starting_with_and_exclude(self):
 
3493
        out = self._run_selftest_with_suite(starting_with=["bt."],
 
3494
            exclude_pattern="test_skip$")
 
3495
        self.assertNotContainsRe(out, "test_skip")
 
3496
 
 
3497
    def test_additonal_decorator(self):
 
3498
        out = self._run_selftest_with_suite(
 
3499
            suite_decorators=[tests.TestDecorator])
 
3500
 
 
3501
 
 
3502
class TestUncollectedWarningsSubunit(TestUncollectedWarnings):
 
3503
    """Check warnings from tests staying alive are emitted with subunit"""
 
3504
 
 
3505
    _test_needs_features = [features.subunit]
 
3506
 
 
3507
    def _run_selftest_with_suite(self, **kwargs):
 
3508
        return TestUncollectedWarnings._run_selftest_with_suite(self,
 
3509
            runner_class=tests.SubUnitBzrRunner, **kwargs)
 
3510
 
 
3511
 
 
3512
class TestUncollectedWarningsForked(_ForkedSelftest, TestUncollectedWarnings):
 
3513
    """Check warnings from tests staying alive are emitted when forking"""
 
3514
 
 
3515
 
 
3516
class TestEnvironHandling(tests.TestCase):
 
3517
 
 
3518
    def test_overrideEnv_None_called_twice_doesnt_leak(self):
 
3519
        self.assertFalse('MYVAR' in os.environ)
 
3520
        self.overrideEnv('MYVAR', '42')
 
3521
        # We use an embedded test to make sure we fix the _captureVar bug
 
3522
        class Test(tests.TestCase):
 
3523
            def test_me(self):
 
3524
                # The first call save the 42 value
 
3525
                self.overrideEnv('MYVAR', None)
 
3526
                self.assertEqual(None, os.environ.get('MYVAR'))
 
3527
                # Make sure we can call it twice
 
3528
                self.overrideEnv('MYVAR', None)
 
3529
                self.assertEqual(None, os.environ.get('MYVAR'))
 
3530
        output = BytesIO()
 
3531
        result = tests.TextTestResult(output, 0, 1)
 
3532
        Test('test_me').run(result)
 
3533
        if not result.wasStrictlySuccessful():
 
3534
            self.fail(output.getvalue())
 
3535
        # We get our value back
 
3536
        self.assertEqual('42', os.environ.get('MYVAR'))
 
3537
 
 
3538
 
 
3539
class TestIsolatedEnv(tests.TestCase):
 
3540
    """Test isolating tests from os.environ.
 
3541
 
 
3542
    Since we use tests that are already isolated from os.environ a bit of care
 
3543
    should be taken when designing the tests to avoid bootstrap side-effects.
 
3544
    The tests start an already clean os.environ which allow doing valid
 
3545
    assertions about which variables are present or not and design tests around
 
3546
    these assertions.
 
3547
    """
 
3548
 
 
3549
    class ScratchMonkey(tests.TestCase):
 
3550
 
 
3551
        def test_me(self):
 
3552
            pass
 
3553
 
 
3554
    def test_basics(self):
 
3555
        # Make sure we know the definition of BRZ_HOME: not part of os.environ
 
3556
        # for tests.TestCase.
 
3557
        self.assertTrue('BRZ_HOME' in tests.isolated_environ)
 
3558
        self.assertEqual(None, tests.isolated_environ['BRZ_HOME'])
 
3559
        # Being part of isolated_environ, BRZ_HOME should not appear here
 
3560
        self.assertFalse('BRZ_HOME' in os.environ)
 
3561
        # Make sure we know the definition of LINES: part of os.environ for
 
3562
        # tests.TestCase
 
3563
        self.assertTrue('LINES' in tests.isolated_environ)
 
3564
        self.assertEqual('25', tests.isolated_environ['LINES'])
 
3565
        self.assertEqual('25', os.environ['LINES'])
 
3566
 
 
3567
    def test_injecting_unknown_variable(self):
 
3568
        # BRZ_HOME is known to be absent from os.environ
 
3569
        test = self.ScratchMonkey('test_me')
 
3570
        tests.override_os_environ(test, {'BRZ_HOME': 'foo'})
 
3571
        self.assertEqual('foo', os.environ['BRZ_HOME'])
 
3572
        tests.restore_os_environ(test)
 
3573
        self.assertFalse('BRZ_HOME' in os.environ)
 
3574
 
 
3575
    def test_injecting_known_variable(self):
 
3576
        test = self.ScratchMonkey('test_me')
 
3577
        # LINES is known to be present in os.environ
 
3578
        tests.override_os_environ(test, {'LINES': '42'})
 
3579
        self.assertEqual('42', os.environ['LINES'])
 
3580
        tests.restore_os_environ(test)
 
3581
        self.assertEqual('25', os.environ['LINES'])
 
3582
 
 
3583
    def test_deleting_variable(self):
 
3584
        test = self.ScratchMonkey('test_me')
 
3585
        # LINES is known to be present in os.environ
 
3586
        tests.override_os_environ(test, {'LINES': None})
 
3587
        self.assertTrue('LINES' not in os.environ)
 
3588
        tests.restore_os_environ(test)
 
3589
        self.assertEqual('25', os.environ['LINES'])
 
3590
 
 
3591
 
 
3592
class TestDocTestSuiteIsolation(tests.TestCase):
 
3593
    """Test that `tests.DocTestSuite` isolates doc tests from os.environ.
 
3594
 
 
3595
    Since tests.TestCase alreay provides an isolation from os.environ, we use
 
3596
    the clean environment as a base for testing. To precisely capture the
 
3597
    isolation provided by tests.DocTestSuite, we use doctest.DocTestSuite to
 
3598
    compare against.
 
3599
 
 
3600
    We want to make sure `tests.DocTestSuite` respect `tests.isolated_environ`,
 
3601
    not `os.environ` so each test overrides it to suit its needs.
 
3602
 
 
3603
    """
 
3604
 
 
3605
    def get_doctest_suite_for_string(self, klass, string):
 
3606
        class Finder(doctest.DocTestFinder):
 
3607
 
 
3608
            def find(*args, **kwargs):
 
3609
                test = doctest.DocTestParser().get_doctest(
 
3610
                    string, {}, 'foo', 'foo.py', 0)
 
3611
                return [test]
 
3612
 
 
3613
        suite = klass(test_finder=Finder())
 
3614
        return suite
 
3615
 
 
3616
    def run_doctest_suite_for_string(self, klass, string):
 
3617
        suite = self.get_doctest_suite_for_string(klass, string)
 
3618
        output = BytesIO()
 
3619
        result = tests.TextTestResult(output, 0, 1)
 
3620
        suite.run(result)
 
3621
        return result, output
 
3622
 
 
3623
    def assertDocTestStringSucceds(self, klass, string):
 
3624
        result, output = self.run_doctest_suite_for_string(klass, string)
 
3625
        if not result.wasStrictlySuccessful():
 
3626
            self.fail(output.getvalue())
 
3627
 
 
3628
    def assertDocTestStringFails(self, klass, string):
 
3629
        result, output = self.run_doctest_suite_for_string(klass, string)
 
3630
        if result.wasStrictlySuccessful():
 
3631
            self.fail(output.getvalue())
 
3632
 
 
3633
    def test_injected_variable(self):
 
3634
        self.overrideAttr(tests, 'isolated_environ', {'LINES': '42'})
 
3635
        test = """
 
3636
            >>> import os
 
3637
            >>> os.environ['LINES']
 
3638
            '42'
 
3639
            """
 
3640
        # doctest.DocTestSuite fails as it sees '25'
 
3641
        self.assertDocTestStringFails(doctest.DocTestSuite, test)
 
3642
        # tests.DocTestSuite sees '42'
 
3643
        self.assertDocTestStringSucceds(tests.IsolatedDocTestSuite, test)
 
3644
 
 
3645
    def test_deleted_variable(self):
 
3646
        self.overrideAttr(tests, 'isolated_environ', {'LINES': None})
 
3647
        test = """
 
3648
            >>> import os
 
3649
            >>> os.environ.get('LINES')
 
3650
            """
 
3651
        # doctest.DocTestSuite fails as it sees '25'
 
3652
        self.assertDocTestStringFails(doctest.DocTestSuite, test)
 
3653
        # tests.DocTestSuite sees None
 
3654
        self.assertDocTestStringSucceds(tests.IsolatedDocTestSuite, test)
 
3655
 
 
3656
 
 
3657
class TestSelftestExcludePatterns(tests.TestCase):
 
3658
 
 
3659
    def setUp(self):
 
3660
        super(TestSelftestExcludePatterns, self).setUp()
 
3661
        self.overrideAttr(tests, 'test_suite', self.suite_factory)
 
3662
 
 
3663
    def suite_factory(self, keep_only=None, starting_with=None):
 
3664
        """A test suite factory with only a few tests."""
 
3665
        class Test(tests.TestCase):
 
3666
            def id(self):
 
3667
                # We don't need the full class path
 
3668
                return self._testMethodName
 
3669
            def a(self):
 
3670
                pass
 
3671
            def b(self):
 
3672
                pass
 
3673
            def c(self):
 
3674
                pass
 
3675
        return TestUtil.TestSuite([Test("a"), Test("b"), Test("c")])
 
3676
 
 
3677
    def assertTestList(self, expected, *selftest_args):
 
3678
        # We rely on setUp installing the right test suite factory so we can
 
3679
        # test at the command level without loading the whole test suite
 
3680
        out, err = self.run_bzr(('selftest', '--list') + selftest_args)
 
3681
        actual = out.splitlines()
 
3682
        self.assertEqual(expected, actual)
 
3683
 
 
3684
    def test_full_list(self):
 
3685
        self.assertTestList(['a', 'b', 'c'])
 
3686
 
 
3687
    def test_single_exclude(self):
 
3688
        self.assertTestList(['b', 'c'], '-x', 'a')
 
3689
 
 
3690
    def test_mutiple_excludes(self):
 
3691
        self.assertTestList(['c'], '-x', 'a', '-x', 'b')
 
3692
 
 
3693
 
 
3694
class TestCounterHooks(tests.TestCase, SelfTestHelper):
 
3695
 
 
3696
    _test_needs_features = [features.subunit]
 
3697
 
 
3698
    def setUp(self):
 
3699
        super(TestCounterHooks, self).setUp()
 
3700
        class Test(tests.TestCase):
 
3701
 
 
3702
            def setUp(self):
 
3703
                super(Test, self).setUp()
 
3704
                self.hooks = hooks.Hooks()
 
3705
                self.hooks.add_hook('myhook', 'Foo bar blah', (2,4))
 
3706
                self.install_counter_hook(self.hooks, 'myhook')
 
3707
 
 
3708
            def no_hook(self):
 
3709
                pass
 
3710
 
 
3711
            def run_hook_once(self):
 
3712
                for hook in self.hooks['myhook']:
 
3713
                    hook(self)
 
3714
 
 
3715
        self.test_class = Test
 
3716
 
 
3717
    def assertHookCalls(self, expected_calls, test_name):
 
3718
        test = self.test_class(test_name)
 
3719
        result = unittest.TestResult()
 
3720
        test.run(result)
 
3721
        self.assertTrue(hasattr(test, '_counters'))
 
3722
        self.assertTrue('myhook' in test._counters)
 
3723
        self.assertEqual(expected_calls, test._counters['myhook'])
 
3724
 
 
3725
    def test_no_hook(self):
 
3726
        self.assertHookCalls(0, 'no_hook')
 
3727
 
 
3728
    def test_run_hook_once(self):
 
3729
        tt = features.testtools
 
3730
        if tt.module.__version__ < (0, 9, 8):
 
3731
            raise tests.TestSkipped('testtools-0.9.8 required for addDetail')
 
3732
        self.assertHookCalls(1, 'run_hook_once')