~bzr-pqm/bzr/bzr.dev

6614.1.1 by Vincent Ladeuil
Fix assert_ being deprecated by using assertTrue.
1
# Copyright (C) 2006-2012, 2016 Canonical Ltd
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
2
#
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
7
#
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
12
#
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
16
17
"""Tests for the Branch facility that are not interface  tests.
18
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
19
For interface tests see `tests/per_branch/*.py`.
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
20
21
For concrete class tests see this file, and for meta-branch tests
22
also see this file.
23
"""
24
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
25
from cStringIO import StringIO
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
26
2230.3.3 by Aaron Bentley
Add more config testing
27
from bzrlib import (
28
    branch as _mod_branch,
2230.3.44 by Aaron Bentley
Change asserts to specific errors for left-hand history violations
29
    bzrdir,
1551.15.35 by Aaron Bentley
Warn when setting config values that will be masked (#122286)
30
    config,
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
31
    controldir,
2230.3.44 by Aaron Bentley
Change asserts to specific errors for left-hand history violations
32
    errors,
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
33
    tests,
1551.15.35 by Aaron Bentley
Warn when setting config values that will be masked (#122286)
34
    trace,
2230.3.3 by Aaron Bentley
Add more config testing
35
    urlutils,
36
    )
6517.1.6 by Jelmer Vernooij
Fix remaining tests.
37
from bzrlib.branchfmt.fullhistory import (
38
    BzrBranch5,
39
    BzrBranchFormat5,
40
    )
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
41
3445.2.1 by John Arbash Meinel
Add tests for Branch.missing_revisions and deprecate it.
42
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
43
class TestDefaultFormat(tests.TestCase):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
44
2696.3.1 by Martin Pool
(broken) start switching format to dirstate-tags
45
    def test_default_format(self):
46
        # update this if you change the default branch format
6213.1.16 by Jelmer Vernooij
Feature support in repository.
47
        self.assertIsInstance(_mod_branch.format_registry.get_default(),
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
48
                _mod_branch.BzrBranchFormat7)
2696.3.1 by Martin Pool
(broken) start switching format to dirstate-tags
49
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
50
    def test_default_format_is_same_as_bzrdir_default(self):
51
        # XXX: it might be nice if there was only one place the default was
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
52
        # set, but at the moment that's not true -- mbp 20070814 --
2696.3.8 by Martin Pool
doc
53
        # https://bugs.launchpad.net/bzr/+bug/132376
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
54
        self.assertEqual(
5662.2.2 by Jelmer Vernooij
Move most format registration functions to BranchFormatRegistry.
55
            _mod_branch.format_registry.get_default(),
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
56
            bzrdir.BzrDirFormat.get_default_format().get_branch_format())
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
57
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
58
    def test_get_set_default_format(self):
2696.3.1 by Martin Pool
(broken) start switching format to dirstate-tags
59
        # set the format and then set it back again
5662.2.2 by Jelmer Vernooij
Move most format registration functions to BranchFormatRegistry.
60
        old_format = _mod_branch.format_registry.get_default()
5662.2.6 by Jelmer Vernooij
add more tests.
61
        _mod_branch.format_registry.set_default(SampleBranchFormat())
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
62
        try:
63
            # the default branch format is used by the meta dir format
64
            # which is not the default bzrdir format at this point
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
65
            dir = bzrdir.BzrDirMetaFormat1().initialize('memory:///')
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
66
            result = dir.create_branch()
67
            self.assertEqual(result, 'A branch')
68
        finally:
5662.2.6 by Jelmer Vernooij
add more tests.
69
            _mod_branch.format_registry.set_default(old_format)
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
70
        self.assertEqual(old_format,
5662.2.2 by Jelmer Vernooij
Move most format registration functions to BranchFormatRegistry.
71
                         _mod_branch.format_registry.get_default())
1508.1.25 by Robert Collins
Update per review comments.
72
73
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
74
class TestBranchFormat5(tests.TestCaseWithTransport):
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
75
    """Tests specific to branch format 5"""
76
77
    def test_branch_format_5_uses_lockdir(self):
78
        url = self.get_url()
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
79
        bdir = bzrdir.BzrDirMetaFormat1().initialize(url)
80
        bdir.create_repository()
6517.1.6 by Jelmer Vernooij
Fix remaining tests.
81
        branch = BzrBranchFormat5().initialize(bdir)
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
82
        t = self.get_transport()
83
        self.log("branch instance is %r" % branch)
6614.1.1 by Vincent Ladeuil
Fix assert_ being deprecated by using assertTrue.
84
        self.assertTrue(isinstance(branch, BzrBranch5))
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
85
        self.assertIsDirectory('.', t)
86
        self.assertIsDirectory('.bzr/branch', t)
87
        self.assertIsDirectory('.bzr/branch/lock', t)
1553.5.73 by Martin Pool
Additional test that Branch5 uses lockdir properly
88
        branch.lock_write()
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
89
        self.addCleanup(branch.unlock)
90
        self.assertIsDirectory('.bzr/branch/lock/held', t)
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
91
2230.3.3 by Aaron Bentley
Add more config testing
92
    def test_set_push_location(self):
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
93
        conf = config.LocationConfig.from_string('# comment\n', '.', save=True)
2839.3.1 by Alexander Belchenko
provide non-empty locations.conf for test_branch.TestBranchFormat5.test_set_push_location
94
2230.3.3 by Aaron Bentley
Add more config testing
95
        branch = self.make_branch('.', format='knit')
96
        branch.set_push_location('foo')
97
        local_path = urlutils.local_path_from_url(branch.base[:-1])
2839.3.1 by Alexander Belchenko
provide non-empty locations.conf for test_branch.TestBranchFormat5.test_set_push_location
98
        self.assertFileEqual("# comment\n"
99
                             "[%s]\n"
2230.3.3 by Aaron Bentley
Add more config testing
100
                             "push_location = foo\n"
3221.7.1 by Matt Nordhoff
Upgrade ConfigObj to version 4.5.1.
101
                             "push_location:policy = norecurse\n" % local_path,
5345.1.11 by Vincent Ladeuil
Cleanup bt.test_branch.
102
                             config.locations_config_filename())
2230.3.3 by Aaron Bentley
Add more config testing
103
2230.3.12 by Aaron Bentley
Clean up trailing whitespace
104
    # TODO RBC 20051029 test getting a push location from a branch in a
2230.3.3 by Aaron Bentley
Add more config testing
105
    # recursive section - that is, it appends the branch name.
106
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
107
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
108
class SampleBranchFormat(_mod_branch.BranchFormatMetadir):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
109
    """A sample format
110
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
111
    this format is initializable, unsupported to aid in testing the
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
112
    open and open_downlevel routines.
113
    """
114
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
115
    @classmethod
116
    def get_format_string(cls):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
117
        """See BzrBranchFormat.get_format_string()."""
118
        return "Sample branch format."
119
6123.9.15 by Jelmer Vernooij
More test fixes.
120
    def initialize(self, a_bzrdir, name=None, repository=None,
121
                   append_revisions_only=None):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
122
        """Format 4 branches cannot be created."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
123
        t = a_bzrdir.get_branch_transport(self, name=name)
1955.3.9 by John Arbash Meinel
Find more occurrances of put() and replace with put_file or put_bytes
124
        t.put_bytes('format', self.get_format_string())
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
125
        return 'A branch'
126
127
    def is_supported(self):
128
        return False
129
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
130
    def open(self, transport, name=None, _found=False, ignore_fallbacks=False,
131
             possible_transports=None):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
132
        return "opened branch."
133
134
5305.1.2 by Robert Collins
More clarity about how to use the lazy registration feature.
135
# Demonstrating how lazy loading is often implemented:
136
# A constant string is created.
137
SampleSupportedBranchFormatString = "Sample supported branch format."
138
139
# And the format class can then reference the constant to avoid skew.
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
140
class SampleSupportedBranchFormat(_mod_branch.BranchFormatMetadir):
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
141
    """A sample supported format."""
142
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
143
    @classmethod
144
    def get_format_string(cls):
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
145
        """See BzrBranchFormat.get_format_string()."""
5305.1.2 by Robert Collins
More clarity about how to use the lazy registration feature.
146
        return SampleSupportedBranchFormatString
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
147
6123.9.15 by Jelmer Vernooij
More test fixes.
148
    def initialize(self, a_bzrdir, name=None, append_revisions_only=None):
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
149
        t = a_bzrdir.get_branch_transport(self, name=name)
150
        t.put_bytes('format', self.get_format_string())
151
        return 'A branch'
152
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
153
    def open(self, transport, name=None, _found=False, ignore_fallbacks=False,
154
             possible_transports=None):
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
155
        return "opened supported branch."
156
157
5642.2.1 by Jelmer Vernooij
Allow the registration of non-metadir branch formats.
158
class SampleExtraBranchFormat(_mod_branch.BranchFormat):
159
    """A sample format that is not usable in a metadir."""
160
161
    def get_format_string(self):
162
        # This format is not usable in a metadir.
163
        return None
164
165
    def network_name(self):
166
        # Network name always has to be provided.
167
        return "extra"
168
169
    def initialize(self, a_bzrdir, name=None):
170
        raise NotImplementedError(self.initialize)
171
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
172
    def open(self, transport, name=None, _found=False, ignore_fallbacks=False,
173
             possible_transports=None):
5642.2.1 by Jelmer Vernooij
Allow the registration of non-metadir branch formats.
174
        raise NotImplementedError(self.open)
175
176
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
177
class TestBzrBranchFormat(tests.TestCaseWithTransport):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
178
    """Tests for the BzrBranchFormat facility."""
179
180
    def test_find_format(self):
181
        # is the right format object found for a branch?
182
        # create a branch with a few known format objects.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
183
        # this is not quite the same as
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
184
        self.build_tree(["foo/", "bar/"])
185
        def check_format(format, url):
186
            dir = format._matchingbzrdir.initialize(url)
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
187
            dir.create_repository()
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
188
            format.initialize(dir)
6213.1.13 by Jelmer Vernooij
make some methods class methods.
189
            found_format = _mod_branch.BranchFormatMetadir.find_format(dir)
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
190
            self.assertIsInstance(found_format, format.__class__)
6517.1.6 by Jelmer Vernooij
Fix remaining tests.
191
        check_format(BzrBranchFormat5(), "bar")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
192
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
193
    def test_find_format_factory(self):
194
        dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
195
        SampleSupportedBranchFormat().initialize(dir)
196
        factory = _mod_branch.MetaDirBranchFormatFactory(
5305.1.2 by Robert Collins
More clarity about how to use the lazy registration feature.
197
            SampleSupportedBranchFormatString,
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
198
            "bzrlib.tests.test_branch", "SampleSupportedBranchFormat")
5662.2.6 by Jelmer Vernooij
add more tests.
199
        _mod_branch.format_registry.register(factory)
200
        self.addCleanup(_mod_branch.format_registry.remove, factory)
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
201
        b = _mod_branch.Branch.open(self.get_url())
202
        self.assertEqual(b, "opened supported branch.")
203
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
204
    def test_from_string(self):
205
        self.assertIsInstance(
206
            SampleBranchFormat.from_string("Sample branch format."),
207
            SampleBranchFormat)
6213.1.54 by Jelmer Vernooij
Fix tests.
208
        self.assertRaises(AssertionError,
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
209
            SampleBranchFormat.from_string, "Different branch format.")
210
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
211
    def test_find_format_not_branch(self):
212
        dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
213
        self.assertRaises(errors.NotBranchError,
6213.1.13 by Jelmer Vernooij
make some methods class methods.
214
                          _mod_branch.BranchFormatMetadir.find_format,
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
215
                          dir)
216
217
    def test_find_format_unknown_format(self):
218
        dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
219
        SampleBranchFormat().initialize(dir)
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
220
        self.assertRaises(errors.UnknownFormatError,
6213.1.13 by Jelmer Vernooij
make some methods class methods.
221
                          _mod_branch.BranchFormatMetadir.find_format,
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
222
                          dir)
223
6213.1.13 by Jelmer Vernooij
make some methods class methods.
224
    def test_find_format_with_features(self):
225
        tree = self.make_branch_and_tree('.', format='2a')
6213.1.57 by Jelmer Vernooij
Add Branch.update_features.
226
        tree.branch.update_feature_flags({"name": "optional"})
6213.1.15 by Jelmer Vernooij
Fix format feature tests.
227
        found_format = _mod_branch.BranchFormatMetadir.find_format(tree.bzrdir)
6213.1.13 by Jelmer Vernooij
make some methods class methods.
228
        self.assertIsInstance(found_format, _mod_branch.BranchFormatMetadir)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
229
        self.assertEqual(found_format.features.get("name"), "optional")
6213.1.57 by Jelmer Vernooij
Add Branch.update_features.
230
        tree.branch.update_feature_flags({"name": None})
231
        branch = _mod_branch.Branch.open('.')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
232
        self.assertEqual(branch._format.features, {})
6213.1.13 by Jelmer Vernooij
make some methods class methods.
233
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
234
5662.2.6 by Jelmer Vernooij
add more tests.
235
class TestBranchFormatRegistry(tests.TestCase):
236
237
    def setUp(self):
238
        super(TestBranchFormatRegistry, self).setUp()
239
        self.registry = _mod_branch.BranchFormatRegistry()
240
241
    def test_default(self):
242
        self.assertIs(None, self.registry.get_default())
243
        format = SampleBranchFormat()
244
        self.registry.set_default(format)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
245
        self.assertEqual(format, self.registry.get_default())
5662.2.6 by Jelmer Vernooij
add more tests.
246
247
    def test_register_unregister_format(self):
248
        format = SampleBranchFormat()
249
        self.registry.register(format)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
250
        self.assertEqual(format,
5662.2.6 by Jelmer Vernooij
add more tests.
251
            self.registry.get("Sample branch format."))
252
        self.registry.remove(format)
253
        self.assertRaises(KeyError, self.registry.get,
254
            "Sample branch format.")
255
256
    def test_get_all(self):
257
        format = SampleBranchFormat()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
258
        self.assertEqual([], self.registry._get_all())
5662.2.6 by Jelmer Vernooij
add more tests.
259
        self.registry.register(format)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
260
        self.assertEqual([format], self.registry._get_all())
5662.2.6 by Jelmer Vernooij
add more tests.
261
262
    def test_register_extra(self):
263
        format = SampleExtraBranchFormat()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
264
        self.assertEqual([], self.registry._get_all())
5662.2.6 by Jelmer Vernooij
add more tests.
265
        self.registry.register_extra(format)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
266
        self.assertEqual([format], self.registry._get_all())
5662.2.6 by Jelmer Vernooij
add more tests.
267
268
    def test_register_extra_lazy(self):
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
269
        self.assertEqual([], self.registry._get_all())
5662.2.6 by Jelmer Vernooij
add more tests.
270
        self.registry.register_extra_lazy("bzrlib.tests.test_branch",
271
            "SampleExtraBranchFormat")
272
        formats = self.registry._get_all()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
273
        self.assertEqual(1, len(formats))
5662.2.6 by Jelmer Vernooij
add more tests.
274
        self.assertIsInstance(formats[0], SampleExtraBranchFormat)
275
276
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
277
#Used by TestMetaDirBranchFormatFactory 
278
FakeLazyFormat = None
279
280
281
class TestMetaDirBranchFormatFactory(tests.TestCase):
282
283
    def test_get_format_string_does_not_load(self):
284
        """Formats have a static format string."""
285
        factory = _mod_branch.MetaDirBranchFormatFactory("yo", None, None)
286
        self.assertEqual("yo", factory.get_format_string())
287
288
    def test_call_loads(self):
289
        # __call__ is used by the network_format_registry interface to get a
290
        # Format.
291
        global FakeLazyFormat
292
        del FakeLazyFormat
293
        factory = _mod_branch.MetaDirBranchFormatFactory(None,
294
            "bzrlib.tests.test_branch", "FakeLazyFormat")
295
        self.assertRaises(AttributeError, factory)
296
297
    def test_call_returns_call_of_referenced_object(self):
298
        global FakeLazyFormat
299
        FakeLazyFormat = lambda:'called'
300
        factory = _mod_branch.MetaDirBranchFormatFactory(None,
301
            "bzrlib.tests.test_branch", "FakeLazyFormat")
302
        self.assertEqual('called', factory())
303
304
3221.11.2 by Robert Collins
Create basic stackable branch facility.
305
class TestBranch67(object):
306
    """Common tests for both branch 6 and 7 which are mostly the same."""
307
308
    def get_format_name(self):
309
        raise NotImplementedError(self.get_format_name)
310
311
    def get_format_name_subtree(self):
312
        raise NotImplementedError(self.get_format_name)
313
314
    def get_class(self):
315
        raise NotImplementedError(self.get_class)
2230.3.1 by Aaron Bentley
Get branch6 creation working
316
317
    def test_creation(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
318
        format = bzrdir.BzrDirMetaFormat1()
2230.3.55 by Aaron Bentley
Updates from review
319
        format.set_branch_format(_mod_branch.BzrBranchFormat6())
2230.3.1 by Aaron Bentley
Get branch6 creation working
320
        branch = self.make_branch('a', format=format)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
321
        self.assertIsInstance(branch, self.get_class())
322
        branch = self.make_branch('b', format=self.get_format_name())
323
        self.assertIsInstance(branch, self.get_class())
2230.3.1 by Aaron Bentley
Get branch6 creation working
324
        branch = _mod_branch.Branch.open('a')
3221.11.2 by Robert Collins
Create basic stackable branch facility.
325
        self.assertIsInstance(branch, self.get_class())
2230.3.1 by Aaron Bentley
Get branch6 creation working
326
327
    def test_layout(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
328
        branch = self.make_branch('a', format=self.get_format_name())
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
329
        self.assertPathExists('a/.bzr/branch/last-revision')
330
        self.assertPathDoesNotExist('a/.bzr/branch/revision-history')
331
        self.assertPathDoesNotExist('a/.bzr/branch/references')
2230.3.1 by Aaron Bentley
Get branch6 creation working
332
2230.3.3 by Aaron Bentley
Add more config testing
333
    def test_config(self):
334
        """Ensure that all configuration data is stored in the branch"""
3221.11.2 by Robert Collins
Create basic stackable branch facility.
335
        branch = self.make_branch('a', format=self.get_format_name())
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
336
        branch.set_parent('http://example.com')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
337
        self.assertPathDoesNotExist('a/.bzr/branch/parent')
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
338
        self.assertEqual('http://example.com', branch.get_parent())
339
        branch.set_push_location('sftp://example.com')
6404.6.1 by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made.
340
        conf = branch.get_config_stack()
341
        self.assertEqual('sftp://example.com', conf.get('push_location'))
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
342
        branch.set_bound_location('ftp://example.com')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
343
        self.assertPathDoesNotExist('a/.bzr/branch/bound')
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
344
        self.assertEqual('ftp://example.com', branch.get_bound_location())
2230.3.3 by Aaron Bentley
Add more config testing
345
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
346
    def do_checkout_test(self, lightweight=False):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
347
        tree = self.make_branch_and_tree('source',
348
            format=self.get_format_name_subtree())
2255.2.194 by Robert Collins
[BROKEN] Many updates to stop using experimental formats in tests.
349
        subtree = self.make_branch_and_tree('source/subtree',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
350
            format=self.get_format_name_subtree())
2100.3.25 by Aaron Bentley
add subsubtree to test
351
        subsubtree = self.make_branch_and_tree('source/subtree/subsubtree',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
352
            format=self.get_format_name_subtree())
2100.3.25 by Aaron Bentley
add subsubtree to test
353
        self.build_tree(['source/subtree/file',
354
                         'source/subtree/subsubtree/file'])
355
        subsubtree.add('file')
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
356
        subtree.add('file')
2100.3.25 by Aaron Bentley
add subsubtree to test
357
        subtree.add_reference(subsubtree)
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
358
        tree.add_reference(subtree)
359
        tree.commit('a revision')
2100.3.23 by Aaron Bentley
Nested checkouts kinda work
360
        subtree.commit('a subtree file')
2100.3.25 by Aaron Bentley
add subsubtree to test
361
        subsubtree.commit('a subsubtree file')
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
362
        tree.branch.create_checkout('target', lightweight=lightweight)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
363
        self.assertPathExists('target')
364
        self.assertPathExists('target/subtree')
365
        self.assertPathExists('target/subtree/file')
366
        self.assertPathExists('target/subtree/subsubtree/file')
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
367
        subbranch = _mod_branch.Branch.open('target/subtree/subsubtree')
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
368
        if lightweight:
369
            self.assertEndsWith(subbranch.base, 'source/subtree/subsubtree/')
370
        else:
371
            self.assertEndsWith(subbranch.base, 'target/subtree/subsubtree/')
372
373
    def test_checkout_with_references(self):
374
        self.do_checkout_test()
375
376
    def test_light_checkout_with_references(self):
377
        self.do_checkout_test(lightweight=True)
2230.3.51 by Aaron Bentley
Store revno for Branch6, set_last_revision -> set_last_revision_info
378
3445.2.1 by John Arbash Meinel
Add tests for Branch.missing_revisions and deprecate it.
379
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
380
class TestBranch6(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
381
382
    def get_class(self):
383
        return _mod_branch.BzrBranch6
384
385
    def get_format_name(self):
386
        return "dirstate-tags"
387
388
    def get_format_name_subtree(self):
389
        return "dirstate-with-subtree"
390
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
391
    def test_set_stacked_on_url_errors(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
392
        branch = self.make_branch('a', format=self.get_format_name())
393
        self.assertRaises(errors.UnstackableBranchFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
394
            branch.set_stacked_on_url, None)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
395
396
    def test_default_stacked_location(self):
397
        branch = self.make_branch('a', format=self.get_format_name())
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
398
        self.assertRaises(errors.UnstackableBranchFormat, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
399
400
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
401
class TestBranch7(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
402
403
    def get_class(self):
404
        return _mod_branch.BzrBranch7
405
406
    def get_format_name(self):
4241.6.8 by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)
407
        return "1.9"
3221.11.2 by Robert Collins
Create basic stackable branch facility.
408
409
    def get_format_name_subtree(self):
410
        return "development-subtree"
411
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
412
    def test_set_stacked_on_url_unstackable_repo(self):
3221.11.6 by Robert Collins
Stackable branch fixes.
413
        repo = self.make_repository('a', format='dirstate-tags')
414
        control = repo.bzrdir
415
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
416
        target = self.make_branch('b')
417
        self.assertRaises(errors.UnstackableRepositoryFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
418
            branch.set_stacked_on_url, target.base)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
419
3242.3.21 by Jonathan Lange
Preserve stacking in clone
420
    def test_clone_stacked_on_unstackable_repo(self):
421
        repo = self.make_repository('a', format='dirstate-tags')
422
        control = repo.bzrdir
423
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
424
        # Calling clone should not raise UnstackableRepositoryFormat.
425
        cloned_bzrdir = control.clone('cloned')
426
3221.11.2 by Robert Collins
Create basic stackable branch facility.
427
    def _test_default_stacked_location(self):
428
        branch = self.make_branch('a', format=self.get_format_name())
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
429
        self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
430
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
431
    def test_stack_and_unstack(self):
432
        branch = self.make_branch('a', format=self.get_format_name())
3221.11.10 by Robert Collins
Extend set_stacked_on to update the repository with the right external references.
433
        target = self.make_branch_and_tree('b', format=self.get_format_name())
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
434
        branch.set_stacked_on_url(target.branch.base)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
435
        self.assertEqual(target.branch.base, branch.get_stacked_on_url())
3221.11.10 by Robert Collins
Extend set_stacked_on to update the repository with the right external references.
436
        revid = target.commit('foo')
437
        self.assertTrue(branch.repository.has_revision(revid))
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
438
        branch.set_stacked_on_url(None)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
439
        self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
3221.11.10 by Robert Collins
Extend set_stacked_on to update the repository with the right external references.
440
        self.assertFalse(branch.repository.has_revision(revid))
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
441
3221.11.11 by Robert Collins
Ensure opening a stacked branch gives a ready to use repository.
442
    def test_open_opens_stacked_reference(self):
443
        branch = self.make_branch('a', format=self.get_format_name())
444
        target = self.make_branch_and_tree('b', format=self.get_format_name())
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
445
        branch.set_stacked_on_url(target.branch.base)
3221.11.11 by Robert Collins
Ensure opening a stacked branch gives a ready to use repository.
446
        branch = branch.bzrdir.open_branch()
447
        revid = target.commit('foo')
448
        self.assertTrue(branch.repository.has_revision(revid))
449
3221.11.2 by Robert Collins
Create basic stackable branch facility.
450
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
451
class BzrBranch8(tests.TestCaseWithTransport):
4273.1.15 by Aaron Bentley
Add reference_info caching.
452
453
    def make_branch(self, location, format=None):
454
        if format is None:
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
455
            format = controldir.format_registry.make_bzrdir('1.9')
4273.1.15 by Aaron Bentley
Add reference_info caching.
456
            format.set_branch_format(_mod_branch.BzrBranchFormat8())
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
457
        return tests.TestCaseWithTransport.make_branch(
458
            self, location, format=format)
4273.1.15 by Aaron Bentley
Add reference_info caching.
459
460
    def create_branch_with_reference(self):
461
        branch = self.make_branch('branch')
462
        branch._set_all_reference_info({'file-id': ('path', 'location')})
463
        return branch
464
465
    @staticmethod
466
    def instrument_branch(branch, gets):
467
        old_get = branch._transport.get
468
        def get(*args, **kwargs):
469
            gets.append((args, kwargs))
470
            return old_get(*args, **kwargs)
471
        branch._transport.get = get
472
473
    def test_reference_info_caching_read_locked(self):
474
        gets = []
475
        branch = self.create_branch_with_reference()
476
        branch.lock_read()
477
        self.addCleanup(branch.unlock)
478
        self.instrument_branch(branch, gets)
479
        branch.get_reference_info('file-id')
480
        branch.get_reference_info('file-id')
481
        self.assertEqual(1, len(gets))
482
483
    def test_reference_info_caching_read_unlocked(self):
484
        gets = []
485
        branch = self.create_branch_with_reference()
486
        self.instrument_branch(branch, gets)
487
        branch.get_reference_info('file-id')
488
        branch.get_reference_info('file-id')
489
        self.assertEqual(2, len(gets))
490
491
    def test_reference_info_caching_write_locked(self):
492
        gets = []
493
        branch = self.make_branch('branch')
494
        branch.lock_write()
495
        self.instrument_branch(branch, gets)
496
        self.addCleanup(branch.unlock)
497
        branch._set_all_reference_info({'file-id': ('path2', 'location2')})
498
        path, location = branch.get_reference_info('file-id')
499
        self.assertEqual(0, len(gets))
500
        self.assertEqual('path2', path)
501
        self.assertEqual('location2', location)
502
503
    def test_reference_info_caches_cleared(self):
504
        branch = self.make_branch('branch')
505
        branch.lock_write()
506
        branch.set_reference_info('file-id', 'path2', 'location2')
507
        branch.unlock()
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
508
        doppelganger = _mod_branch.Branch.open('branch')
4273.1.15 by Aaron Bentley
Add reference_info caching.
509
        doppelganger.set_reference_info('file-id', 'path3', 'location3')
510
        self.assertEqual(('path3', 'location3'),
511
                         branch.get_reference_info('file-id'))
512
6165.4.11 by Jelmer Vernooij
More test fixes.
513
    def _recordParentMapCalls(self, repo):
514
        self._parent_map_calls = []
515
        orig_get_parent_map = repo.revisions.get_parent_map
516
        def get_parent_map(q):
517
            q = list(q)
518
            self._parent_map_calls.extend([e[0] for e in q])
519
            return orig_get_parent_map(q)
520
        repo.revisions.get_parent_map = get_parent_map
521
522
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
523
class TestBranchReference(tests.TestCaseWithTransport):
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
524
    """Tests for the branch reference facility."""
525
526
    def test_create_open_reference(self):
527
        bzrdirformat = bzrdir.BzrDirMetaFormat1()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
528
        t = self.get_transport()
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
529
        t.mkdir('repo')
530
        dir = bzrdirformat.initialize(self.get_url('repo'))
531
        dir.create_repository()
532
        target_branch = dir.create_branch()
533
        t.mkdir('branch')
534
        branch_dir = bzrdirformat.initialize(self.get_url('branch'))
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
535
        made_branch = _mod_branch.BranchReferenceFormat().initialize(
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
536
            branch_dir, target_branch=target_branch)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
537
        self.assertEqual(made_branch.base, target_branch.base)
538
        opened_branch = branch_dir.open_branch()
539
        self.assertEqual(opened_branch.base, target_branch.base)
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
540
541
    def test_get_reference(self):
6437.7.3 by Jelmer Vernooij
Use ControlDir.set_branch_reference.
542
        """For a BranchReference, get_reference should return the location."""
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
543
        branch = self.make_branch('target')
544
        checkout = branch.create_checkout('checkout', lightweight=True)
545
        reference_url = branch.bzrdir.root_transport.abspath('') + '/'
546
        # if the api for create_checkout changes to return different checkout types
547
        # then this file read will fail.
548
        self.assertFileEqual(reference_url, 'checkout/.bzr/branch/location')
549
        self.assertEqual(reference_url,
2018.5.97 by Andrew Bennetts
Fix more tests.
550
            _mod_branch.BranchReferenceFormat().get_reference(checkout.bzrdir))
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
551
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
552
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
553
class TestHooks(tests.TestCaseWithTransport):
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
554
2245.1.2 by Robert Collins
Remove the static DefaultHooks method from Branch, replacing it with a derived dict BranchHooks object, which is easier to use and provides a place to put the policy-checking add method discussed on list.
555
    def test_constructor(self):
556
        """Check that creating a BranchHooks instance has the right defaults."""
5622.3.15 by Jelmer Vernooij
Fix branch hooks constructor test.
557
        hooks = _mod_branch.BranchHooks()
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
558
        self.assertTrue("post_push" in hooks, "post_push not in %s" % hooks)
559
        self.assertTrue("post_commit" in hooks, "post_commit not in %s" % hooks)
2659.3.1 by NamNguyen
``Branch.hooks`` now supports ``pre_commit`` hook.
560
        self.assertTrue("pre_commit" in hooks, "pre_commit not in %s" % hooks)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
561
        self.assertTrue("post_pull" in hooks, "post_pull not in %s" % hooks)
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
562
        self.assertTrue("post_uncommit" in hooks,
563
                        "post_uncommit not in %s" % hooks)
3331.1.4 by James Henstridge
Adjust my tests to pass with Ian's API.
564
        self.assertTrue("post_change_branch_tip" in hooks,
565
                        "post_change_branch_tip not in %s" % hooks)
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
566
        self.assertTrue("post_branch_init" in hooks,
567
                        "post_branch_init not in %s" % hooks)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
568
        self.assertTrue("post_switch" in hooks,
569
                        "post_switch not in %s" % hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
570
2245.1.2 by Robert Collins
Remove the static DefaultHooks method from Branch, replacing it with a derived dict BranchHooks object, which is easier to use and provides a place to put the policy-checking add method discussed on list.
571
    def test_installed_hooks_are_BranchHooks(self):
572
        """The installed hooks object should be a BranchHooks."""
573
        # the installed hooks are saved in self._preserved_hooks.
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
574
        self.assertIsInstance(self._preserved_hooks[_mod_branch.Branch][1],
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
575
                              _mod_branch.BranchHooks)
2245.1.3 by Robert Collins
Add install_hook to the BranchHooks class as the official means for installing a hook.
576
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
577
    def test_post_branch_init_hook(self):
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
578
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
579
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
580
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
581
        self.assertLength(0, calls)
582
        branch = self.make_branch('a')
583
        self.assertLength(1, calls)
584
        params = calls[0]
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
585
        self.assertIsInstance(params, _mod_branch.BranchInitHookParams)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
586
        self.assertTrue(hasattr(params, 'bzrdir'))
587
        self.assertTrue(hasattr(params, 'branch'))
588
5050.21.1 by Andrew Bennetts
Remove broken and apparently unused code path from BranchInitHookParams.__repr__.
589
    def test_post_branch_init_hook_repr(self):
590
        param_reprs = []
591
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
592
            lambda params: param_reprs.append(repr(params)), None)
593
        branch = self.make_branch('a')
594
        self.assertLength(1, param_reprs)
595
        param_repr = param_reprs[0]
596
        self.assertStartsWith(param_repr, '<BranchInitHookParams of ')
597
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
598
    def test_post_switch_hook(self):
599
        from bzrlib import switch
600
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
601
        _mod_branch.Branch.hooks.install_named_hook('post_switch',
602
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
603
        tree = self.make_branch_and_tree('branch-1')
604
        self.build_tree(['branch-1/file-1'])
605
        tree.add('file-1')
606
        tree.commit('rev1')
607
        to_branch = tree.bzrdir.sprout('branch-2').open_branch()
608
        self.build_tree(['branch-1/file-2'])
609
        tree.add('file-2')
610
        tree.remove('file-1')
611
        tree.commit('rev2')
612
        checkout = tree.branch.create_checkout('checkout')
613
        self.assertLength(0, calls)
614
        switch.switch(checkout.bzrdir, to_branch)
615
        self.assertLength(1, calls)
616
        params = calls[0]
617
        self.assertIsInstance(params, _mod_branch.SwitchHookParams)
618
        self.assertTrue(hasattr(params, 'to_branch'))
619
        self.assertTrue(hasattr(params, 'revision_id'))
2297.1.3 by Martin Pool
PullResult can pretend to be an int for api compatibility with old .pull()
620
5176.1.1 by Vincent Ladeuil
Warn if a config variable can't be interpreted as a boolean
621
622
class TestBranchOptions(tests.TestCaseWithTransport):
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
623
4989.2.5 by Vincent Ladeuil
Clarify tests.
624
    def setUp(self):
625
        super(TestBranchOptions, self).setUp()
626
        self.branch = self.make_branch('.')
6372.4.1 by Jelmer Vernooij
Convert 'append_revisions_only' over to config stacks.
627
        self.config_stack = self.branch.get_config_stack()
4989.2.5 by Vincent Ladeuil
Clarify tests.
628
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
629
    def check_append_revisions_only(self, expected_value, value=None):
630
        """Set append_revisions_only in config and check its interpretation."""
4989.2.5 by Vincent Ladeuil
Clarify tests.
631
        if value is not None:
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
632
            self.config_stack.set('append_revisions_only', value)
4989.2.5 by Vincent Ladeuil
Clarify tests.
633
        self.assertEqual(expected_value,
6123.9.11 by Jelmer Vernooij
Make get_append_revisions_only public.
634
                         self.branch.get_append_revisions_only())
4989.2.5 by Vincent Ladeuil
Clarify tests.
635
636
    def test_valid_append_revisions_only(self):
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
637
        self.assertEqual(None,
6372.4.2 by Jelmer Vernooij
Fix remaining tests.
638
                          self.config_stack.get('append_revisions_only'))
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
639
        self.check_append_revisions_only(None)
640
        self.check_append_revisions_only(False, 'False')
641
        self.check_append_revisions_only(True, 'True')
4989.2.13 by Vincent Ladeuil
append_revisions_only accept all valid booleans, update doc to
642
        # The following values will cause compatibility problems on projects
643
        # using older bzr versions (<2.2) but are accepted
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
644
        self.check_append_revisions_only(False, 'false')
645
        self.check_append_revisions_only(True, 'true')
4989.2.5 by Vincent Ladeuil
Clarify tests.
646
647
    def test_invalid_append_revisions_only(self):
4989.2.9 by Brian de Alwis
Revert append_revisions_only to only allow 'True' and 'False' to
648
        """Ensure warning is noted on invalid settings"""
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
649
        self.warnings = []
650
        def warning(*args):
651
            self.warnings.append(args[0] % args[1:])
652
        self.overrideAttr(trace, 'warning', warning)
653
        self.check_append_revisions_only(None, 'not-a-bool')
654
        self.assertLength(1, self.warnings)
655
        self.assertEqual(
6372.4.2 by Jelmer Vernooij
Fix remaining tests.
656
            'Value "not-a-bool" is not valid for "append_revisions_only"',
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
657
            self.warnings[0])
4989.2.5 by Vincent Ladeuil
Clarify tests.
658
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
659
    def test_use_fresh_values(self):
660
        copy = _mod_branch.Branch.open(self.branch.base)
661
        copy.lock_write()
662
        try:
663
            copy.get_config_stack().set('foo', 'bar')
664
        finally:
665
            copy.unlock()
666
        self.assertFalse(self.branch.is_locked())
6499.2.1 by Vincent Ladeuil
Save branch config options only during the final unlock
667
        # Since the branch is locked, the option value won't be saved on disk
668
        # so trying to access the config of locked branch via another older
669
        # non-locked branch object pointing to the same branch is not supported
670
        self.assertEqual(None, self.branch.get_config_stack().get('foo'))
671
        # Using a newly created branch object works as expected
672
        fresh = _mod_branch.Branch.open(self.branch.base)
673
        self.assertEqual('bar', fresh.get_config_stack().get('foo'))
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
674
675
    def test_set_from_config_get_from_config_stack(self):
676
        self.branch.lock_write()
677
        self.addCleanup(self.branch.unlock)
678
        self.branch.get_config().set_user_option('foo', 'bar')
6480.1.2 by Aaron Bentley
Updates from review.
679
        result = self.branch.get_config_stack().get('foo')
6480.1.3 by Aaron Bentley
Mention bugs in comments.
680
        # https://bugs.launchpad.net/bzr/+bug/948344
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
681
        self.expectFailure('BranchStack uses cache after set_user_option',
6480.1.2 by Aaron Bentley
Updates from review.
682
                           self.assertEqual, 'bar', result)
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
683
684
    def test_set_from_config_stack_get_from_config(self):
685
        self.branch.lock_write()
686
        self.addCleanup(self.branch.unlock)
687
        self.branch.get_config_stack().set('foo', 'bar')
6499.2.1 by Vincent Ladeuil
Save branch config options only during the final unlock
688
        # Since the branch is locked, the option value won't be saved on disk
689
        # so mixing get() and get_user_option() is broken by design.
690
        self.assertEqual(None,
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
691
                         self.branch.get_config().get_user_option('foo'))
692
6499.2.1 by Vincent Ladeuil
Save branch config options only during the final unlock
693
    def test_set_delays_write_when_branch_is_locked(self):
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
694
        self.branch.lock_write()
695
        self.addCleanup(self.branch.unlock)
696
        self.branch.get_config_stack().set('foo', 'bar')
697
        copy = _mod_branch.Branch.open(self.branch.base)
6480.1.2 by Aaron Bentley
Updates from review.
698
        result = copy.get_config_stack().get('foo')
6499.2.1 by Vincent Ladeuil
Save branch config options only during the final unlock
699
        # Accessing from a different branch object is like accessing from a
700
        # different process: the option has not been saved yet and the new
701
        # value cannot be seen.
702
        self.assertIs(None, result)
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
703
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
704
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
705
class TestPullResult(tests.TestCase):
2297.1.3 by Martin Pool
PullResult can pretend to be an int for api compatibility with old .pull()
706
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
707
    def test_report_changed(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
708
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
709
        r.old_revid = "old-revid"
710
        r.old_revno = 10
711
        r.new_revid = "new-revid"
712
        r.new_revno = 20
713
        f = StringIO()
714
        r.report(f)
715
        self.assertEqual("Now on revision 20.\n", f.getvalue())
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
716
        self.assertEqual("Now on revision 20.\n", f.getvalue())
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
717
718
    def test_report_unchanged(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
719
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
720
        r.old_revid = "same-revid"
721
        r.new_revid = "same-revid"
722
        f = StringIO()
723
        r.report(f)
6112.4.7 by Jelmer Vernooij
Fix tests.
724
        self.assertEqual("No revisions or tags to pull.\n", f.getvalue())