/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2006-2012, 2016 Canonical Ltd
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
2
#
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.
7
#
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.
12
#
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
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
16
2748.4.1 by Andrew Bennetts
Implement a ChunkedBodyDecoder.
17
"""Tests for the smart wire/domain protocol.
18
19
This module contains tests for the domain-level smart requests and responses,
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
20
such as the 'Branch.lock_write' request. Many of these use specific disk
21
formats to exercise calls that only make sense for formats with specific
22
properties.
2748.4.1 by Andrew Bennetts
Implement a ChunkedBodyDecoder.
23
24
Tests for low-level protocol encoding are found in test_smart_transport.
25
"""
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
26
3211.5.2 by Robert Collins
Change RemoteRepository.get_parent_map to use bz2 not gzip for compression.
27
import bz2
6968.5.6 by Jelmer Vernooij
Add test.
28
from io import BytesIO
29
import tarfile
6280.9.4 by Jelmer Vernooij
use zlib instead.
30
import zlib
2018.18.2 by Martin Pool
smart method Repository.tarball actually returns the tarball
31
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
32
from breezy import (
6436.3.2 by Jelmer Vernooij
Add HPSS call for BzrDir.get_branches.
33
    bencode,
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
34
    branch as _mod_branch,
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
35
    controldir,
2692.1.2 by Andrew Bennetts
Merge from bzr.dev.
36
    errors,
6263.3.2 by Jelmer Vernooij
Add new HPSS call 'Repository.get_revision_signature_text'.
37
    gpg,
2692.1.2 by Andrew Bennetts
Merge from bzr.dev.
38
    tests,
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
39
    transport,
2692.1.2 by Andrew Bennetts
Merge from bzr.dev.
40
    urlutils,
6670.4.1 by Jelmer Vernooij
Update imports.
41
    )
42
from breezy.bzr import (
43
    branch as _mod_bzrbranch,
44
    inventory_delta,
4634.19.1 by Robert Collins
Combine adjacent substreams of the same type in bzrlib.smart.repository._byte_stream_to_stream.
45
    versionedfile,
2692.1.2 by Andrew Bennetts
Merge from bzr.dev.
46
    )
6670.4.16 by Jelmer Vernooij
Move smart to breezy.bzr.
47
from breezy.bzr.smart import (
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
48
    branch as smart_branch,
49
    bzrdir as smart_dir,
50
    repository as smart_repo,
51
    packrepository as smart_packrepo,
52
    request as smart_req,
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
53
    server,
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
54
    vfs,
55
    )
7206.4.1 by Jelmer Vernooij
Move breezy.testament to breezy.bzr.testament.
56
from breezy.bzr.testament import Testament
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
57
from breezy.tests import test_server
58
from breezy.transport import (
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
59
    chroot,
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
60
    memory,
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
61
    )
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
62
63
6625.1.5 by Martin
Drop custom load_tests implementation and use unittest signature
64
def load_tests(loader, standard_tests, pattern):
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
65
    """Multiply tests version and protocol consistency."""
66
    # FindRepository tests.
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
67
    scenarios = [
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
68
        ("find_repository", {
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
69
            "_request_class": smart_dir.SmartServerRequestFindRepositoryV1}),
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
70
        ("find_repositoryV2", {
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
71
            "_request_class": smart_dir.SmartServerRequestFindRepositoryV2}),
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
72
        ("find_repositoryV3", {
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
73
            "_request_class": smart_dir.SmartServerRequestFindRepositoryV3}),
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
74
        ]
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
75
    to_adapt, result = tests.split_suite_by_re(
76
        standard_tests, "TestSmartServerRequestFindRepository")
77
    v2_only, v1_and_2 = tests.split_suite_by_re(to_adapt, "_v2")
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
78
    tests.multiply_tests(v1_and_2, scenarios, result)
79
    # The first scenario is only applicable to v1 protocols, it is deleted
80
    # since.
81
    tests.multiply_tests(v2_only, scenarios[1:], result)
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
82
    return result
83
84
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
85
class TestCaseWithChrootedTransport(tests.TestCaseWithTransport):
86
87
    def setUp(self):
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
88
        self.vfs_transport_factory = memory.MemoryServer
6552.1.4 by Vincent Ladeuil
Remaining tests matching setup(self) that can be rewritten with super().
89
        super(TestCaseWithChrootedTransport, self).setUp()
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
90
        self._chroot_server = None
91
92
    def get_transport(self, relpath=None):
93
        if self._chroot_server is None:
94
            backing_transport = tests.TestCaseWithTransport.get_transport(self)
95
            self._chroot_server = chroot.ChrootServer(backing_transport)
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
96
            self.start_server(self._chroot_server)
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
97
        t = transport.get_transport_from_url(self._chroot_server.get_url())
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
98
        if relpath is not None:
99
            t = t.clone(relpath)
100
        return t
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
101
102
4634.47.4 by Andrew Bennetts
Make more of bzrlib/tests/test_smart.py use MemoryTransport.
103
class TestCaseWithSmartMedium(tests.TestCaseWithMemoryTransport):
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
104
105
    def setUp(self):
106
        super(TestCaseWithSmartMedium, self).setUp()
107
        # We're allowed to set  the transport class here, so that we don't use
108
        # the default or a parameterized class, but rather use the
109
        # TestCaseWithTransport infrastructure to set up a smart server and
110
        # transport.
5340.15.1 by John Arbash Meinel
supersede exc-info branch
111
        self.overrideAttr(self, "transport_server", self.make_transport_server)
3245.4.28 by Andrew Bennetts
Remove another XXX, and include test ID in smart server thread names.
112
113
    def make_transport_server(self):
5017.3.25 by Vincent Ladeuil
selftest -s bt.test_smart_transport passing
114
        return test_server.SmartTCPServer_for_testing('-' + self.id())
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
115
116
    def get_smart_medium(self):
117
        """Get a smart medium to use in tests."""
118
        return self.get_transport().get_smart_medium()
119
120
4634.19.1 by Robert Collins
Combine adjacent substreams of the same type in bzrlib.smart.repository._byte_stream_to_stream.
121
class TestByteStreamToStream(tests.TestCase):
122
123
    def test_repeated_substreams_same_kind_are_one_stream(self):
124
        # Make a stream - an iterable of bytestrings.
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
125
        stream = [
126
            ('text', [versionedfile.FulltextContentFactory((b'k1',), None,
127
             None, b'foo')]),
128
            ('text', [versionedfile.FulltextContentFactory((b'k2',), None,
129
             None, b'bar')])]
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
130
        fmt = controldir.format_registry.get('pack-0.92')().repository_format
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
131
        bytes = smart_repo._stream_to_byte_stream(stream, fmt)
4634.19.1 by Robert Collins
Combine adjacent substreams of the same type in bzrlib.smart.repository._byte_stream_to_stream.
132
        streams = []
133
        # Iterate the resulting iterable; checking that we get only one stream
134
        # out.
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
135
        fmt, stream = smart_repo._byte_stream_to_stream(bytes)
4634.19.1 by Robert Collins
Combine adjacent substreams of the same type in bzrlib.smart.repository._byte_stream_to_stream.
136
        for kind, substream in stream:
137
            streams.append((kind, list(substream)))
138
        self.assertLength(1, streams)
139
        self.assertLength(2, streams[0][1])
140
141
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
142
class TestSmartServerResponse(tests.TestCase):
143
144
    def test__eq__(self):
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
145
        self.assertEqual(smart_req.SmartServerResponse((b'ok', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
146
                         smart_req.SmartServerResponse((b'ok', )))
6973.5.2 by Jelmer Vernooij
Add more bees.
147
        self.assertEqual(smart_req.SmartServerResponse((b'ok', ), b'body'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
148
                         smart_req.SmartServerResponse((b'ok', ), b'body'))
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
149
        self.assertNotEqual(smart_req.SmartServerResponse((b'ok', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
150
                            smart_req.SmartServerResponse((b'notok', )))
6973.5.2 by Jelmer Vernooij
Add more bees.
151
        self.assertNotEqual(smart_req.SmartServerResponse((b'ok', ), b'body'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
152
                            smart_req.SmartServerResponse((b'ok', )))
2018.5.41 by Robert Collins
Fix SmartServerResponse.__eq__ to handle None.
153
        self.assertNotEqual(None,
7143.15.2 by Jelmer Vernooij
Run autopep8.
154
                            smart_req.SmartServerResponse((b'ok', )))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
155
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
156
    def test__str__(self):
157
        """SmartServerResponses can be stringified."""
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
158
        self.assertIn(
159
            str(smart_req.SuccessfulSmartServerResponse((b'args',), b'body')),
160
            ("<SuccessfulSmartServerResponse args=(b'args',) body=b'body'>",
161
             "<SuccessfulSmartServerResponse args=('args',) body='body'>"))
162
        self.assertIn(
163
            str(smart_req.FailedSmartServerResponse((b'args',), b'body')),
164
            ("<FailedSmartServerResponse args=(b'args',) body=b'body'>",
165
             "<FailedSmartServerResponse args=('args',) body='body'>"))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
166
167
168
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
169
170
    def test_translate_client_path(self):
171
        transport = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
172
        request = smart_req.SmartServerRequest(transport, 'foo/')
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
173
        self.assertEqual('./', request.translate_client_path(b'foo/'))
174
        self.assertRaises(
175
            urlutils.InvalidURLJoin, request.translate_client_path, b'foo/..')
176
        self.assertRaises(
177
            errors.PathNotChild, request.translate_client_path, b'/')
178
        self.assertRaises(
179
            errors.PathNotChild, request.translate_client_path, b'bar/')
180
        self.assertEqual('./baz', request.translate_client_path(b'foo/baz'))
6973.6.1 by Jelmer Vernooij
More bees.
181
        e_acute = u'\N{LATIN SMALL LETTER E WITH ACUTE}'
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
182
        self.assertEqual(
183
            u'./' + urlutils.escape(e_acute),
184
            request.translate_client_path(b'foo/' + e_acute.encode('utf-8')))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
185
4760.2.5 by Andrew Bennetts
Add some more tests.
186
    def test_translate_client_path_vfs(self):
187
        """VfsRequests receive escaped paths rather than raw UTF-8."""
188
        transport = self.get_transport()
7045.4.30 by Jelmer Vernooij
Fix some more tests.
189
        request = vfs.VfsRequest(transport, 'foo/')
6973.6.1 by Jelmer Vernooij
More bees.
190
        e_acute = u'\N{LATIN SMALL LETTER E WITH ACUTE}'
191
        escaped = urlutils.escape(u'foo/' + e_acute)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
192
        self.assertEqual(
193
            './' + urlutils.escape(e_acute),
194
            request.translate_client_path(escaped.encode('ascii')))
4760.2.5 by Andrew Bennetts
Add some more tests.
195
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
196
    def test_transport_from_client_path(self):
197
        transport = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
198
        request = smart_req.SmartServerRequest(transport, 'foo/')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
199
        self.assertEqual(
200
            transport.base,
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
201
            request.transport_from_client_path(b'foo/').base)
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
202
203
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
204
class TestSmartServerBzrDirRequestCloningMetaDir(
7143.15.2 by Jelmer Vernooij
Run autopep8.
205
        tests.TestCaseWithMemoryTransport):
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
206
    """Tests for BzrDir.cloning_metadir."""
207
208
    def test_cloning_metadir(self):
209
        """When there is a bzrdir present, the call succeeds."""
210
        backing = self.get_transport()
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
211
        dir = self.make_controldir('.')
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
212
        local_result = dir.cloning_metadir()
213
        request_class = smart_dir.SmartServerBzrDirRequestCloningMetaDir
214
        request = request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
215
        expected = smart_req.SuccessfulSmartServerResponse(
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
216
            (local_result.network_name(),
7143.15.2 by Jelmer Vernooij
Run autopep8.
217
             local_result.repository_format.network_name(),
218
             (b'branch', local_result.get_branch_format().network_name())))
6973.5.2 by Jelmer Vernooij
Add more bees.
219
        self.assertEqual(expected, request.execute(b'', b'False'))
4070.7.4 by Andrew Bennetts
Deal with branch references better in BzrDir.cloning_metadir RPC (changes protocol).
220
221
    def test_cloning_metadir_reference(self):
4160.2.9 by Andrew Bennetts
Fix BzrDir.cloning_metadir RPC to fail on branch references, and make
222
        """The request fails when bzrdir contains a branch reference."""
4070.7.4 by Andrew Bennetts
Deal with branch references better in BzrDir.cloning_metadir RPC (changes protocol).
223
        backing = self.get_transport()
224
        referenced_branch = self.make_branch('referenced')
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
225
        dir = self.make_controldir('.')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
226
        dir.cloning_metadir()
227
        _mod_bzrbranch.BranchReferenceFormat().initialize(
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
228
            dir, target_branch=referenced_branch)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
229
        _mod_bzrbranch.BranchReferenceFormat().get_reference(dir)
4070.7.4 by Andrew Bennetts
Deal with branch references better in BzrDir.cloning_metadir RPC (changes protocol).
230
        # The server shouldn't try to follow the branch reference, so it's fine
231
        # if the referenced branch isn't reachable.
232
        backing.rename('referenced', 'moved')
233
        request_class = smart_dir.SmartServerBzrDirRequestCloningMetaDir
234
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
235
        expected = smart_req.FailedSmartServerResponse((b'BranchReference',))
6973.5.2 by Jelmer Vernooij
Add more bees.
236
        self.assertEqual(expected, request.execute(b'', b'False'))
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
237
238
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
239
class TestSmartServerBzrDirRequestCheckoutMetaDir(
7143.15.2 by Jelmer Vernooij
Run autopep8.
240
        tests.TestCaseWithMemoryTransport):
6305.5.11 by Jelmer Vernooij
Fix smart server tests.
241
    """Tests for BzrDir.checkout_metadir."""
242
243
    def test_checkout_metadir(self):
244
        backing = self.get_transport()
245
        request = smart_dir.SmartServerBzrDirRequestCheckoutMetaDir(
246
            backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
247
        self.make_branch('.', format='2a')
6973.5.2 by Jelmer Vernooij
Add more bees.
248
        response = request.execute(b'')
6305.5.11 by Jelmer Vernooij
Fix smart server tests.
249
        self.assertEqual(
250
            smart_req.SmartServerResponse(
6973.5.2 by Jelmer Vernooij
Add more bees.
251
                (b'Bazaar-NG meta directory, format 1\n',
252
                 b'Bazaar repository format 2a (needs bzr 1.16 or later)\n',
253
                 b'Bazaar Branch Format 7 (needs bzr 1.6)\n')),
6305.5.11 by Jelmer Vernooij
Fix smart server tests.
254
            response)
255
256
6266.4.1 by Jelmer Vernooij
HPSS call 'BzrDir.destroy_branch'.
257
class TestSmartServerBzrDirRequestDestroyBranch(
7143.15.2 by Jelmer Vernooij
Run autopep8.
258
        tests.TestCaseWithMemoryTransport):
6266.4.1 by Jelmer Vernooij
HPSS call 'BzrDir.destroy_branch'.
259
    """Tests for BzrDir.destroy_branch."""
260
261
    def test_destroy_branch_default(self):
262
        """The default branch can be removed."""
263
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
264
        self.make_branch('.')
6266.4.1 by Jelmer Vernooij
HPSS call 'BzrDir.destroy_branch'.
265
        request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
266
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
267
        expected = smart_req.SuccessfulSmartServerResponse((b'ok',))
6973.5.2 by Jelmer Vernooij
Add more bees.
268
        self.assertEqual(expected, request.execute(b'', None))
6266.4.1 by Jelmer Vernooij
HPSS call 'BzrDir.destroy_branch'.
269
270
    def test_destroy_branch_named(self):
271
        """A named branch can be removed."""
272
        backing = self.get_transport()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
273
        dir = self.make_repository('.', format="development-colo").controldir
6266.4.1 by Jelmer Vernooij
HPSS call 'BzrDir.destroy_branch'.
274
        dir.create_branch(name="branchname")
275
        request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
276
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
277
        expected = smart_req.SuccessfulSmartServerResponse((b'ok',))
7045.4.30 by Jelmer Vernooij
Fix some more tests.
278
        self.assertEqual(expected, request.execute(b'', b"branchname"))
6266.4.1 by Jelmer Vernooij
HPSS call 'BzrDir.destroy_branch'.
279
280
    def test_destroy_branch_missing(self):
281
        """An error is raised if the branch didn't exist."""
282
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
283
        self.make_controldir('.', format="development-colo")
6266.4.1 by Jelmer Vernooij
HPSS call 'BzrDir.destroy_branch'.
284
        request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
285
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
286
        expected = smart_req.FailedSmartServerResponse((b'nobranch',), None)
6973.5.2 by Jelmer Vernooij
Add more bees.
287
        self.assertEqual(expected, request.execute(b'', b"branchname"))
6266.4.1 by Jelmer Vernooij
HPSS call 'BzrDir.destroy_branch'.
288
289
6266.3.1 by Jelmer Vernooij
Add HPSS call for BzrDir.has_workingtree.
290
class TestSmartServerBzrDirRequestHasWorkingTree(
7143.15.2 by Jelmer Vernooij
Run autopep8.
291
        tests.TestCaseWithTransport):
6266.3.1 by Jelmer Vernooij
Add HPSS call for BzrDir.has_workingtree.
292
    """Tests for BzrDir.has_workingtree."""
293
294
    def test_has_workingtree_yes(self):
295
        """A working tree is present."""
296
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
297
        self.make_branch_and_tree('.')
6266.3.1 by Jelmer Vernooij
Add HPSS call for BzrDir.has_workingtree.
298
        request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
299
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
300
        expected = smart_req.SuccessfulSmartServerResponse((b'yes',))
301
        self.assertEqual(expected, request.execute(b''))
6266.3.1 by Jelmer Vernooij
Add HPSS call for BzrDir.has_workingtree.
302
303
    def test_has_workingtree_no(self):
304
        """A working tree is missing."""
305
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
306
        self.make_controldir('.')
6266.3.1 by Jelmer Vernooij
Add HPSS call for BzrDir.has_workingtree.
307
        request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
308
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
309
        expected = smart_req.SuccessfulSmartServerResponse((b'no',))
310
        self.assertEqual(expected, request.execute(b''))
6266.3.1 by Jelmer Vernooij
Add HPSS call for BzrDir.has_workingtree.
311
312
6266.2.1 by Jelmer Vernooij
New HPSS call BzrDir.destroy_repository.
313
class TestSmartServerBzrDirRequestDestroyRepository(
7143.15.2 by Jelmer Vernooij
Run autopep8.
314
        tests.TestCaseWithMemoryTransport):
6266.2.1 by Jelmer Vernooij
New HPSS call BzrDir.destroy_repository.
315
    """Tests for BzrDir.destroy_repository."""
316
317
    def test_destroy_repository_default(self):
318
        """The repository can be removed."""
319
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
320
        self.make_repository('.')
6266.2.2 by Jelmer Vernooij
Fix tests.
321
        request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
6266.2.1 by Jelmer Vernooij
New HPSS call BzrDir.destroy_repository.
322
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
323
        expected = smart_req.SuccessfulSmartServerResponse((b'ok',))
6973.5.2 by Jelmer Vernooij
Add more bees.
324
        self.assertEqual(expected, request.execute(b''))
6266.2.1 by Jelmer Vernooij
New HPSS call BzrDir.destroy_repository.
325
326
    def test_destroy_repository_missing(self):
327
        """An error is raised if the repository didn't exist."""
328
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
329
        self.make_controldir('.')
6266.2.2 by Jelmer Vernooij
Fix tests.
330
        request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
6266.2.1 by Jelmer Vernooij
New HPSS call BzrDir.destroy_repository.
331
        request = request_class(backing)
6266.2.2 by Jelmer Vernooij
Fix tests.
332
        expected = smart_req.FailedSmartServerResponse(
6973.5.2 by Jelmer Vernooij
Add more bees.
333
            (b'norepository',), None)
334
        self.assertEqual(expected, request.execute(b''))
6266.2.1 by Jelmer Vernooij
New HPSS call BzrDir.destroy_repository.
335
336
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
337
class TestSmartServerRequestCreateRepository(
338
        tests.TestCaseWithMemoryTransport):
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
339
    """Tests for BzrDir.create_repository."""
340
341
    def test_makes_repository(self):
342
        """When there is a bzrdir present, the call succeeds."""
343
        backing = self.get_transport()
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
344
        self.make_controldir('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
345
        request_class = smart_dir.SmartServerRequestCreateRepository
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
346
        request = request_class(backing)
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
347
        reference_bzrdir_format = controldir.format_registry.get('pack-0.92')()
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
348
        reference_format = reference_bzrdir_format.repository_format
349
        network_name = reference_format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
350
        expected = smart_req.SuccessfulSmartServerResponse(
6973.5.2 by Jelmer Vernooij
Add more bees.
351
            (b'ok', b'no', b'no', b'no', network_name))
352
        self.assertEqual(expected, request.execute(b'', network_name, b'True'))
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
353
354
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
355
class TestSmartServerRequestFindRepository(tests.TestCaseWithMemoryTransport):
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
356
    """Tests for BzrDir.find_repository."""
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
357
358
    def test_no_repository(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
359
        """If no repository is found, ('norepository', ) is returned."""
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
360
        backing = self.get_transport()
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
361
        request = self._request_class(backing)
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
362
        self.make_controldir('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
363
        self.assertEqual(smart_req.SmartServerResponse((b'norepository', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
364
                         request.execute(b''))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
365
366
    def test_nonshared_repository(self):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
367
        # nonshared repositorys only allow 'find' to return a handle when the
368
        # path the repository is being searched on is the same as that that
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
369
        # the repository is at.
370
        backing = self.get_transport()
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
371
        request = self._request_class(backing)
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
372
        result = self._make_repository_and_result()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
373
        self.assertEqual(result, request.execute(b''))
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
374
        self.make_controldir('subdir')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
375
        self.assertEqual(smart_req.SmartServerResponse((b'norepository', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
376
                         request.execute(b'subdir'))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
377
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
378
    def _make_repository_and_result(self, shared=False, format=None):
379
        """Convenience function to setup a repository.
380
381
        :result: The SmartServerResponse to expect when opening it.
382
        """
383
        repo = self.make_repository('.', shared=shared, format=format)
384
        if repo.supports_rich_root():
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
385
            rich_root = b'yes'
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
386
        else:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
387
            rich_root = b'no'
2018.5.138 by Robert Collins
Merge bzr.dev.
388
        if repo._format.supports_tree_reference:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
389
            subtrees = b'yes'
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
390
        else:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
391
            subtrees = b'no'
4606.3.1 by Robert Collins
Make test_smart tests more stable when the default format changes.
392
        if repo._format.supports_external_lookups:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
393
            external = b'yes'
4606.3.1 by Robert Collins
Make test_smart tests more stable when the default format changes.
394
        else:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
395
            external = b'no'
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
396
        if (smart_dir.SmartServerRequestFindRepositoryV3 ==
7143.15.2 by Jelmer Vernooij
Run autopep8.
397
                self._request_class):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
398
            return smart_req.SuccessfulSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
399
                (b'ok', b'', rich_root, subtrees, external,
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
400
                 repo._format.network_name()))
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
401
        elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
7143.15.2 by Jelmer Vernooij
Run autopep8.
402
              self._request_class):
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
403
            # All tests so far are on formats, and for non-external
404
            # repositories.
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
405
            return smart_req.SuccessfulSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
406
                (b'ok', b'', rich_root, subtrees, external))
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
407
        else:
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
408
            return smart_req.SuccessfulSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
409
                (b'ok', b'', rich_root, subtrees))
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
410
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
411
    def test_shared_repository(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
412
        """for a shared repository, we get 'ok', 'relpath-to-repo'."""
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
413
        backing = self.get_transport()
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
414
        request = self._request_class(backing)
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
415
        result = self._make_repository_and_result(shared=True)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
416
        self.assertEqual(result, request.execute(b''))
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
417
        self.make_controldir('subdir')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
418
        result2 = smart_req.SmartServerResponse(
6973.5.2 by Jelmer Vernooij
Add more bees.
419
            result.args[0:1] + (b'..', ) + result.args[2:])
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
420
        self.assertEqual(result2,
7143.15.2 by Jelmer Vernooij
Run autopep8.
421
                         request.execute(b'subdir'))
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
422
        self.make_controldir('subdir/deeper')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
423
        result3 = smart_req.SmartServerResponse(
6973.5.2 by Jelmer Vernooij
Add more bees.
424
            result.args[0:1] + (b'../..', ) + result.args[2:])
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
425
        self.assertEqual(result3,
7143.15.2 by Jelmer Vernooij
Run autopep8.
426
                         request.execute(b'subdir/deeper'))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
427
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
428
    def test_rich_root_and_subtree_encoding(self):
429
        """Test for the format attributes for rich root and subtree support."""
430
        backing = self.get_transport()
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
431
        request = self._request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
432
        result = self._make_repository_and_result(
6437.14.2 by Jelmer Vernooij
Run subtree tests with development-subtree rather than deprecated dirstate-with-subtree.
433
            format='development-subtree')
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
434
        # check the test will be valid
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
435
        self.assertEqual(b'yes', result.args[2])
436
        self.assertEqual(b'yes', result.args[3])
437
        self.assertEqual(result, request.execute(b''))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
438
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
439
    def test_supports_external_lookups_no_v2(self):
440
        """Test for the supports_external_lookups attribute."""
441
        backing = self.get_transport()
442
        request = self._request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
443
        result = self._make_repository_and_result(
6437.14.2 by Jelmer Vernooij
Run subtree tests with development-subtree rather than deprecated dirstate-with-subtree.
444
            format='development-subtree')
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
445
        # check the test will be valid
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
446
        self.assertEqual(b'yes', result.args[4])
447
        self.assertEqual(result, request.execute(b''))
2692.1.24 by Andrew Bennetts
Merge from bzr.dev.
448
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
449
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
450
class TestSmartServerBzrDirRequestGetConfigFile(
7143.15.2 by Jelmer Vernooij
Run autopep8.
451
        tests.TestCaseWithMemoryTransport):
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
452
    """Tests for BzrDir.get_config_file."""
453
454
    def test_present(self):
455
        backing = self.get_transport()
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
456
        dir = self.make_controldir('.')
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
457
        dir.get_config().set_default_stack_on("/")
458
        local_result = dir._get_config()._get_config_file().read()
459
        request_class = smart_dir.SmartServerBzrDirRequestConfigFile
460
        request = request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
461
        expected = smart_req.SuccessfulSmartServerResponse((), local_result)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
462
        self.assertEqual(expected, request.execute(b''))
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
463
464
    def test_missing(self):
465
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
466
        self.make_controldir('.')
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
467
        request_class = smart_dir.SmartServerBzrDirRequestConfigFile
468
        request = request_class(backing)
6973.5.2 by Jelmer Vernooij
Add more bees.
469
        expected = smart_req.SuccessfulSmartServerResponse((), b'')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
470
        self.assertEqual(expected, request.execute(b''))
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
471
472
6436.3.2 by Jelmer Vernooij
Add HPSS call for BzrDir.get_branches.
473
class TestSmartServerBzrDirRequestGetBranches(
7143.15.2 by Jelmer Vernooij
Run autopep8.
474
        tests.TestCaseWithMemoryTransport):
6436.3.2 by Jelmer Vernooij
Add HPSS call for BzrDir.get_branches.
475
    """Tests for BzrDir.get_branches."""
476
477
    def test_simple(self):
478
        backing = self.get_transport()
479
        branch = self.make_branch('.')
480
        request_class = smart_dir.SmartServerBzrDirRequestGetBranches
481
        request = request_class(backing)
482
        local_result = bencode.bencode(
6973.5.2 by Jelmer Vernooij
Add more bees.
483
            {b"": (b"branch", branch._format.network_name())})
6436.3.2 by Jelmer Vernooij
Add HPSS call for BzrDir.get_branches.
484
        expected = smart_req.SuccessfulSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
485
            (b"success", ), local_result)
486
        self.assertEqual(expected, request.execute(b''))
6436.3.2 by Jelmer Vernooij
Add HPSS call for BzrDir.get_branches.
487
488
    def test_empty(self):
489
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
490
        self.make_controldir('.')
6436.3.2 by Jelmer Vernooij
Add HPSS call for BzrDir.get_branches.
491
        request_class = smart_dir.SmartServerBzrDirRequestGetBranches
492
        request = request_class(backing)
493
        local_result = bencode.bencode({})
494
        expected = smart_req.SuccessfulSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
495
            (b'success',), local_result)
496
        self.assertEqual(expected, request.execute(b''))
6436.3.2 by Jelmer Vernooij
Add HPSS call for BzrDir.get_branches.
497
498
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
499
class TestSmartServerRequestInitializeBzrDir(
500
        tests.TestCaseWithMemoryTransport):
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
501
502
    def test_empty_dir(self):
503
        """Initializing an empty dir should succeed and do it."""
504
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
505
        request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
506
        self.assertEqual(smart_req.SmartServerResponse((b'ok', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
507
                         request.execute(b''))
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
508
        made_dir = controldir.ControlDir.open_from_transport(backing)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
509
        # no branch, tree or repository is expected with the current
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
510
        # default formart.
511
        self.assertRaises(errors.NoWorkingTree, made_dir.open_workingtree)
512
        self.assertRaises(errors.NotBranchError, made_dir.open_branch)
513
        self.assertRaises(errors.NoRepositoryPresent, made_dir.open_repository)
514
515
    def test_missing_dir(self):
516
        """Initializing a missing directory should fail like the bzrdir api."""
517
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
518
        request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
519
        self.assertRaises(errors.NoSuchFile,
7143.15.2 by Jelmer Vernooij
Run autopep8.
520
                          request.execute, b'subdir')
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
521
522
    def test_initialized_dir(self):
523
        """Initializing an extant bzrdir should fail like the bzrdir api."""
524
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
525
        request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
526
        self.make_controldir('subdir')
6437.10.6 by Jelmer Vernooij
Fix test.
527
        self.assertRaises(errors.AlreadyControlDirError,
7143.15.2 by Jelmer Vernooij
Run autopep8.
528
                          request.execute, b'subdir')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
529
530
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
531
class TestSmartServerRequestBzrDirInitializeEx(
7143.15.2 by Jelmer Vernooij
Run autopep8.
532
        tests.TestCaseWithMemoryTransport):
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
533
    """Basic tests for BzrDir.initialize_ex_1.16 in the smart server.
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
534
4294.2.10 by Robert Collins
Review feedback.
535
    The main unit tests in test_bzrdir exercise the API comprehensively.
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
536
    """
537
538
    def test_empty_dir(self):
539
        """Initializing an empty dir should succeed and do it."""
540
        backing = self.get_transport()
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
541
        name = self.make_controldir('reference')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
542
        request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
543
        self.assertEqual(
6973.5.2 by Jelmer Vernooij
Add more bees.
544
            smart_req.SmartServerResponse((b'', b'', b'', b'', b'', b'', name,
545
                                           b'False', b'', b'', b'')),
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
546
            request.execute(name, b'', b'True', b'False', b'False', b'', b'',
547
                            b'', b'', b'False'))
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
548
        made_dir = controldir.ControlDir.open_from_transport(backing)
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
549
        # no branch, tree or repository is expected with the current
4294.2.10 by Robert Collins
Review feedback.
550
        # default format.
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
551
        self.assertRaises(errors.NoWorkingTree, made_dir.open_workingtree)
552
        self.assertRaises(errors.NotBranchError, made_dir.open_branch)
553
        self.assertRaises(errors.NoRepositoryPresent, made_dir.open_repository)
554
555
    def test_missing_dir(self):
556
        """Initializing a missing directory should fail like the bzrdir api."""
557
        backing = self.get_transport()
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
558
        name = self.make_controldir('reference')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
559
        request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
560
        self.assertRaises(errors.NoSuchFile, request.execute, name,
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
561
                          b'subdir/dir', b'False', b'False', b'False', b'',
562
                          b'', b'', b'', b'False')
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
563
564
    def test_initialized_dir(self):
4416.3.4 by Jonathan Lange
Fix a typo.
565
        """Initializing an extant directory should fail like the bzrdir api."""
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
566
        backing = self.get_transport()
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
567
        name = self.make_controldir('reference')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
568
        request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
569
        self.make_controldir('subdir')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
570
        self.assertRaises(errors.FileExists, request.execute, name, b'subdir',
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
571
                          b'False', b'False', b'False', b'', b'', b'', b'',
572
                          b'False')
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
573
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
574
575
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
576
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
577
    def test_no_directory(self):
578
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
579
        request = smart_dir.SmartServerRequestOpenBzrDir(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
580
        self.assertEqual(smart_req.SmartServerResponse((b'no', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
581
                         request.execute(b'does-not-exist'))
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
582
583
    def test_empty_directory(self):
584
        backing = self.get_transport()
585
        backing.mkdir('empty')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
586
        request = smart_dir.SmartServerRequestOpenBzrDir(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
587
        self.assertEqual(smart_req.SmartServerResponse((b'no', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
588
                         request.execute(b'empty'))
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
589
590
    def test_outside_root_client_path(self):
591
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
592
        request = smart_dir.SmartServerRequestOpenBzrDir(
593
            backing, root_client_path='root')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
594
        self.assertEqual(smart_req.SmartServerResponse((b'no', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
595
                         request.execute(b'not-root'))
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
596
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
597
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
598
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
599
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
600
    def test_no_directory(self):
601
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
602
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
603
        self.assertEqual(smart_req.SmartServerResponse((b'no', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
604
                         request.execute(b'does-not-exist'))
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
605
606
    def test_empty_directory(self):
607
        backing = self.get_transport()
608
        backing.mkdir('empty')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
609
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
610
        self.assertEqual(smart_req.SmartServerResponse((b'no', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
611
                         request.execute(b'empty'))
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
612
613
    def test_present_without_workingtree(self):
614
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
615
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
616
        self.make_controldir('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
617
        self.assertEqual(smart_req.SmartServerResponse((b'yes', b'no')),
7143.15.2 by Jelmer Vernooij
Run autopep8.
618
                         request.execute(b''))
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
619
4634.47.6 by Andrew Bennetts
Give 'no' response for paths outside the root_client_path.
620
    def test_outside_root_client_path(self):
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
621
        backing = self.get_transport()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
622
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(
623
            backing, root_client_path='root')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
624
        self.assertEqual(smart_req.SmartServerResponse((b'no',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
625
                         request.execute(b'not-root'))
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
626
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
627
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
628
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
629
630
    def test_present_with_workingtree(self):
5017.3.26 by Vincent Ladeuil
./bzr selftest -s bt.test_smart passing
631
        self.vfs_transport_factory = test_server.LocalURLServer
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
632
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
633
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
634
        bd = self.make_controldir('.')
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
635
        bd.create_repository()
636
        bd.create_branch()
637
        bd.create_workingtree()
6973.5.2 by Jelmer Vernooij
Add more bees.
638
        self.assertEqual(smart_req.SmartServerResponse((b'yes', b'yes')),
7143.15.2 by Jelmer Vernooij
Run autopep8.
639
                         request.execute(b''))
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
640
641
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
642
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
643
644
    def test_no_branch(self):
645
        """When there is no branch, ('nobranch', ) is returned."""
646
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
647
        request = smart_dir.SmartServerRequestOpenBranch(backing)
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
648
        self.make_controldir('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
649
        self.assertEqual(smart_req.SmartServerResponse((b'nobranch', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
650
                         request.execute(b''))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
651
652
    def test_branch(self):
653
        """When there is a branch, 'ok' is returned."""
654
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
655
        request = smart_dir.SmartServerRequestOpenBranch(backing)
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
656
        self.make_branch('.')
6973.5.2 by Jelmer Vernooij
Add more bees.
657
        self.assertEqual(smart_req.SmartServerResponse((b'ok', b'')),
7143.15.2 by Jelmer Vernooij
Run autopep8.
658
                         request.execute(b''))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
659
660
    def test_branch_reference(self):
661
        """When there is a branch reference, the reference URL is returned."""
5017.3.26 by Vincent Ladeuil
./bzr selftest -s bt.test_smart passing
662
        self.vfs_transport_factory = test_server.LocalURLServer
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
663
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
664
        request = smart_dir.SmartServerRequestOpenBranch(backing)
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
665
        branch = self.make_branch('branch')
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
666
        checkout = branch.create_checkout('reference', lightweight=True)
6653.1.6 by Jelmer Vernooij
Fix some more imports.
667
        reference_url = _mod_bzrbranch.BranchReferenceFormat().get_reference(
6973.7.8 by Jelmer Vernooij
Fix more tests.
668
            checkout.controldir).encode('utf-8')
669
        self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
670
        self.assertEqual(smart_req.SmartServerResponse((b'ok', reference_url)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
671
                         request.execute(b'reference'))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
672
4734.4.5 by Brian de Alwis
Address comments from Aaron Bentley
673
    def test_notification_on_branch_from_repository(self):
4734.4.4 by Brian de Alwis
Added tests to ensure branching-from-repository error returns detail
674
        """When there is a repository, the error should return details."""
675
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
676
        request = smart_dir.SmartServerRequestOpenBranch(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
677
        self.make_repository('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
678
        self.assertEqual(smart_req.SmartServerResponse((b'nobranch',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
679
                         request.execute(b''))
4734.4.4 by Brian de Alwis
Added tests to ensure branching-from-repository error returns detail
680
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
681
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
682
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
683
684
    def test_no_branch(self):
685
        """When there is no branch, ('nobranch', ) is returned."""
686
        backing = self.get_transport()
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
687
        self.make_controldir('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
688
        request = smart_dir.SmartServerRequestOpenBranchV2(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
689
        self.assertEqual(smart_req.SmartServerResponse((b'nobranch', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
690
                         request.execute(b''))
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
691
692
    def test_branch(self):
693
        """When there is a branch, 'ok' is returned."""
694
        backing = self.get_transport()
695
        expected = self.make_branch('.')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
696
        request = smart_dir.SmartServerRequestOpenBranchV2(backing)
697
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
7143.15.2 by Jelmer Vernooij
Run autopep8.
698
            (b'branch', expected)),
699
            request.execute(b''))
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
700
701
    def test_branch_reference(self):
702
        """When there is a branch reference, the reference URL is returned."""
5017.3.26 by Vincent Ladeuil
./bzr selftest -s bt.test_smart passing
703
        self.vfs_transport_factory = test_server.LocalURLServer
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
704
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
705
        request = smart_dir.SmartServerRequestOpenBranchV2(backing)
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
706
        branch = self.make_branch('branch')
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
707
        checkout = branch.create_checkout('reference', lightweight=True)
6653.1.6 by Jelmer Vernooij
Fix some more imports.
708
        reference_url = _mod_bzrbranch.BranchReferenceFormat().get_reference(
6973.7.8 by Jelmer Vernooij
Fix more tests.
709
            checkout.controldir).encode('utf-8')
710
        self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
711
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
7143.15.2 by Jelmer Vernooij
Run autopep8.
712
            (b'ref', reference_url)),
713
            request.execute(b'reference'))
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
714
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
715
    def test_stacked_branch(self):
716
        """Opening a stacked branch does not open the stacked-on branch."""
717
        trunk = self.make_branch('trunk')
4599.4.30 by Robert Collins
Remove hard coded format in test_smart's test_stacked_branch now the default format stacks.
718
        feature = self.make_branch('feature')
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
719
        feature.set_stacked_on_url(trunk.base)
720
        opened_branches = []
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
721
        _mod_branch.Branch.hooks.install_named_hook(
722
            'open', opened_branches.append, None)
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
723
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
724
        request = smart_dir.SmartServerRequestOpenBranchV2(backing)
4160.2.4 by Andrew Bennetts
Use BzrDir pre_open hook to jail request code from accessing transports other than the backing transport.
725
        request.setup_jail()
726
        try:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
727
            response = request.execute(b'feature')
4160.2.4 by Andrew Bennetts
Use BzrDir pre_open hook to jail request code from accessing transports other than the backing transport.
728
        finally:
729
            request.teardown_jail()
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
730
        expected_format = feature._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
731
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
7143.15.2 by Jelmer Vernooij
Run autopep8.
732
            (b'branch', expected_format)),
733
            response)
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
734
        self.assertLength(1, opened_branches)
735
4734.4.5 by Brian de Alwis
Address comments from Aaron Bentley
736
    def test_notification_on_branch_from_repository(self):
4734.4.4 by Brian de Alwis
Added tests to ensure branching-from-repository error returns detail
737
        """When there is a repository, the error should return details."""
738
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
739
        request = smart_dir.SmartServerRequestOpenBranchV2(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
740
        self.make_repository('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
741
        self.assertEqual(smart_req.SmartServerResponse((b'nobranch',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
742
                         request.execute(b''))
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
743
744
745
class TestSmartServerRequestOpenBranchV3(TestCaseWithChrootedTransport):
746
747
    def test_no_branch(self):
748
        """When there is no branch, ('nobranch', ) is returned."""
749
        backing = self.get_transport()
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
750
        self.make_controldir('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
751
        request = smart_dir.SmartServerRequestOpenBranchV3(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
752
        self.assertEqual(smart_req.SmartServerResponse((b'nobranch',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
753
                         request.execute(b''))
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
754
755
    def test_branch(self):
756
        """When there is a branch, 'ok' is returned."""
757
        backing = self.get_transport()
758
        expected = self.make_branch('.')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
759
        request = smart_dir.SmartServerRequestOpenBranchV3(backing)
760
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
7143.15.2 by Jelmer Vernooij
Run autopep8.
761
            (b'branch', expected)),
762
            request.execute(b''))
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
763
764
    def test_branch_reference(self):
765
        """When there is a branch reference, the reference URL is returned."""
5017.3.26 by Vincent Ladeuil
./bzr selftest -s bt.test_smart passing
766
        self.vfs_transport_factory = test_server.LocalURLServer
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
767
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
768
        request = smart_dir.SmartServerRequestOpenBranchV3(backing)
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
769
        branch = self.make_branch('branch')
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
770
        checkout = branch.create_checkout('reference', lightweight=True)
6653.1.6 by Jelmer Vernooij
Fix some more imports.
771
        reference_url = _mod_bzrbranch.BranchReferenceFormat().get_reference(
6973.7.8 by Jelmer Vernooij
Fix more tests.
772
            checkout.controldir).encode('utf-8')
773
        self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
774
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
7143.15.2 by Jelmer Vernooij
Run autopep8.
775
            (b'ref', reference_url)),
776
            request.execute(b'reference'))
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
777
778
    def test_stacked_branch(self):
779
        """Opening a stacked branch does not open the stacked-on branch."""
780
        trunk = self.make_branch('trunk')
781
        feature = self.make_branch('feature')
782
        feature.set_stacked_on_url(trunk.base)
783
        opened_branches = []
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
784
        _mod_branch.Branch.hooks.install_named_hook(
785
            'open', opened_branches.append, None)
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
786
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
787
        request = smart_dir.SmartServerRequestOpenBranchV3(backing)
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
788
        request.setup_jail()
789
        try:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
790
            response = request.execute(b'feature')
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
791
        finally:
792
            request.teardown_jail()
793
        expected_format = feature._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
794
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
7143.15.2 by Jelmer Vernooij
Run autopep8.
795
            (b'branch', expected_format)),
796
            response)
4734.4.8 by Andrew Bennetts
Fix HPSS tests; pass 'location is a repository' message via smart server when possible (adds BzrDir.open_branchV3 verb).
797
        self.assertLength(1, opened_branches)
798
799
    def test_notification_on_branch_from_repository(self):
800
        """When there is a repository, the error should return details."""
801
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
802
        request = smart_dir.SmartServerRequestOpenBranchV3(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
803
        self.make_repository('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
804
        self.assertEqual(smart_req.SmartServerResponse(
7143.15.2 by Jelmer Vernooij
Run autopep8.
805
            (b'nobranch', b'location is a repository')),
806
            request.execute(b''))
4734.4.4 by Brian de Alwis
Added tests to ensure branching-from-repository error returns detail
807
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
808
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
809
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
810
811
    def test_empty(self):
812
        """For an empty branch, the body is empty."""
813
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
814
        request = smart_branch.SmartServerRequestRevisionHistory(backing)
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
815
        self.make_branch('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
816
        self.assertEqual(smart_req.SmartServerResponse((b'ok', ), b''),
7143.15.2 by Jelmer Vernooij
Run autopep8.
817
                         request.execute(b''))
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
818
819
    def test_not_empty(self):
820
        """For a non-empty branch, the body is empty."""
821
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
822
        request = smart_branch.SmartServerRequestRevisionHistory(backing)
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
823
        tree = self.make_branch_and_memory_tree('.')
824
        tree.lock_write()
825
        tree.add('')
826
        r1 = tree.commit('1st commit')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
827
        r2 = tree.commit('2nd commit', rev_id=u'\xc8'.encode('utf-8'))
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
828
        tree.unlock()
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
829
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
830
            smart_req.SmartServerResponse((b'ok', ), (b'\x00'.join([r1, r2]))),
831
            request.execute(b''))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
832
833
834
class TestSmartServerBranchRequest(tests.TestCaseWithMemoryTransport):
2018.5.49 by Wouter van Heyst
Refactor SmartServerBranchRequest out from SmartServerRequestRevisionHistory to
835
836
    def test_no_branch(self):
837
        """When there is a bzrdir and no branch, NotBranchError is raised."""
838
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
839
        request = smart_branch.SmartServerBranchRequest(backing)
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
840
        self.make_controldir('.')
2018.5.49 by Wouter van Heyst
Refactor SmartServerBranchRequest out from SmartServerRequestRevisionHistory to
841
        self.assertRaises(errors.NotBranchError,
7143.15.2 by Jelmer Vernooij
Run autopep8.
842
                          request.execute, b'')
2018.5.49 by Wouter van Heyst
Refactor SmartServerBranchRequest out from SmartServerRequestRevisionHistory to
843
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
844
    def test_branch_reference(self):
845
        """When there is a branch reference, NotBranchError is raised."""
846
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
847
        request = smart_branch.SmartServerBranchRequest(backing)
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
848
        branch = self.make_branch('branch')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
849
        branch.create_checkout('reference', lightweight=True)
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
850
        self.assertRaises(errors.NotBranchError,
7143.15.2 by Jelmer Vernooij
Run autopep8.
851
                          request.execute, b'checkout')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
852
853
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
854
class TestSmartServerBranchRequestLastRevisionInfo(
7143.15.2 by Jelmer Vernooij
Run autopep8.
855
        tests.TestCaseWithMemoryTransport):
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
856
857
    def test_empty(self):
6973.14.6 by Jelmer Vernooij
Fix some more tests.
858
        """For an empty branch, the result is ('ok', '0', b'null:')."""
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
859
        backing = self.get_transport()
7143.15.2 by Jelmer Vernooij
Run autopep8.
860
        request = smart_branch.SmartServerBranchRequestLastRevisionInfo(
861
            backing)
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
862
        self.make_branch('.')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
863
        self.assertEqual(
864
            smart_req.SmartServerResponse((b'ok', b'0', b'null:')),
865
            request.execute(b''))
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
866
6969.1.1 by Jelmer Vernooij
Handle GhostRevisionsHaveNoRevno in hpss.
867
    def test_ghost(self):
6973.14.6 by Jelmer Vernooij
Fix some more tests.
868
        """For an empty branch, the result is ('ok', '0', b'null:')."""
6969.1.1 by Jelmer Vernooij
Handle GhostRevisionsHaveNoRevno in hpss.
869
        backing = self.get_transport()
7143.15.2 by Jelmer Vernooij
Run autopep8.
870
        request = smart_branch.SmartServerBranchRequestLastRevisionInfo(
871
            backing)
6969.1.1 by Jelmer Vernooij
Handle GhostRevisionsHaveNoRevno in hpss.
872
        branch = self.make_branch('.')
7143.15.2 by Jelmer Vernooij
Run autopep8.
873
6969.1.1 by Jelmer Vernooij
Handle GhostRevisionsHaveNoRevno in hpss.
874
        def last_revision_info():
6973.5.2 by Jelmer Vernooij
Add more bees.
875
            raise errors.GhostRevisionsHaveNoRevno(b'revid1', b'revid2')
6969.1.1 by Jelmer Vernooij
Handle GhostRevisionsHaveNoRevno in hpss.
876
        self.overrideAttr(branch, 'last_revision_info', last_revision_info)
877
        self.assertRaises(errors.GhostRevisionsHaveNoRevno,
7143.15.2 by Jelmer Vernooij
Run autopep8.
878
                          request.do_with_branch, branch)
6969.1.1 by Jelmer Vernooij
Handle GhostRevisionsHaveNoRevno in hpss.
879
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
880
    def test_not_empty(self):
881
        """For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
882
        backing = self.get_transport()
7143.15.2 by Jelmer Vernooij
Run autopep8.
883
        request = smart_branch.SmartServerBranchRequestLastRevisionInfo(
884
            backing)
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
885
        tree = self.make_branch_and_memory_tree('.')
886
        tree.lock_write()
887
        tree.add('')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
888
        rev_id_utf8 = u'\xc8'.encode('utf-8')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
889
        tree.commit('1st commit')
890
        tree.commit('2nd commit', rev_id=rev_id_utf8)
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
891
        tree.unlock()
892
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
893
            smart_req.SmartServerResponse((b'ok', b'2', rev_id_utf8)),
894
            request.execute(b''))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
895
896
6263.1.2 by Jelmer Vernooij
Add ``Branch.revision_id_to_revno`` smart verb.
897
class TestSmartServerBranchRequestRevisionIdToRevno(
7143.15.2 by Jelmer Vernooij
Run autopep8.
898
        tests.TestCaseWithMemoryTransport):
6263.1.2 by Jelmer Vernooij
Add ``Branch.revision_id_to_revno`` smart verb.
899
900
    def test_null(self):
901
        backing = self.get_transport()
902
        request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
903
            backing)
904
        self.make_branch('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
905
        self.assertEqual(smart_req.SmartServerResponse((b'ok', b'0')),
7143.15.2 by Jelmer Vernooij
Run autopep8.
906
                         request.execute(b'', b'null:'))
6263.1.2 by Jelmer Vernooij
Add ``Branch.revision_id_to_revno`` smart verb.
907
908
    def test_simple(self):
909
        backing = self.get_transport()
910
        request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
911
            backing)
912
        tree = self.make_branch_and_memory_tree('.')
913
        tree.lock_write()
914
        tree.add('')
915
        r1 = tree.commit('1st commit')
916
        tree.unlock()
917
        self.assertEqual(
6973.5.2 by Jelmer Vernooij
Add more bees.
918
            smart_req.SmartServerResponse((b'ok', b'1')),
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
919
            request.execute(b'', r1))
6263.1.2 by Jelmer Vernooij
Add ``Branch.revision_id_to_revno`` smart verb.
920
921
    def test_not_found(self):
922
        backing = self.get_transport()
923
        request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
924
            backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
925
        self.make_branch('.')
6263.1.2 by Jelmer Vernooij
Add ``Branch.revision_id_to_revno`` smart verb.
926
        self.assertEqual(
927
            smart_req.FailedSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
928
                (b'NoSuchRevision', b'idontexist')),
929
            request.execute(b'', b'idontexist'))
6263.1.2 by Jelmer Vernooij
Add ``Branch.revision_id_to_revno`` smart verb.
930
931
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
932
class TestSmartServerBranchRequestGetConfigFile(
7143.15.2 by Jelmer Vernooij
Run autopep8.
933
        tests.TestCaseWithMemoryTransport):
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
934
935
    def test_default(self):
936
        """With no file, we get empty content."""
937
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
938
        request = smart_branch.SmartServerBranchGetConfigFile(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
939
        self.make_branch('.')
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
940
        # there should be no file by default
6973.6.1 by Jelmer Vernooij
More bees.
941
        content = b''
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
942
        self.assertEqual(smart_req.SmartServerResponse((b'ok', ), content),
7143.15.2 by Jelmer Vernooij
Run autopep8.
943
                         request.execute(b''))
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
944
945
    def test_with_content(self):
946
        # SmartServerBranchGetConfigFile should return the content from
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
947
        # branch.control_files.get('branch.conf') for now - in the future it
948
        # may perform more complex processing.
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
949
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
950
        request = smart_branch.SmartServerBranchGetConfigFile(backing)
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
951
        branch = self.make_branch('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
952
        branch._transport.put_bytes('branch.conf', b'foo bar baz')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
953
        self.assertEqual(
954
            smart_req.SmartServerResponse((b'ok', ), b'foo bar baz'),
955
            request.execute(b''))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
956
957
4226.2.1 by Robert Collins
Set branch config options via a smart method.
958
class TestLockedBranch(tests.TestCaseWithMemoryTransport):
959
960
    def get_lock_tokens(self, branch):
6754.8.4 by Jelmer Vernooij
Use new context stuff.
961
        branch_token = branch.lock_write().token
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
962
        repo_token = branch.repository.lock_write().repository_token
4226.2.1 by Robert Collins
Set branch config options via a smart method.
963
        branch.repository.unlock()
964
        return branch_token, repo_token
965
966
6270.1.17 by Jelmer Vernooij
s/set_config_file/put_config_file.
967
class TestSmartServerBranchRequestPutConfigFile(TestLockedBranch):
6270.1.9 by Jelmer Vernooij
add Branch.set_config_file.
968
969
    def test_with_content(self):
970
        backing = self.get_transport()
6270.1.17 by Jelmer Vernooij
s/set_config_file/put_config_file.
971
        request = smart_branch.SmartServerBranchPutConfigFile(backing)
6270.1.9 by Jelmer Vernooij
add Branch.set_config_file.
972
        branch = self.make_branch('.')
973
        branch_token, repo_token = self.get_lock_tokens(branch)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
974
        self.assertIs(None, request.execute(b'', branch_token, repo_token))
975
        self.assertEqual(
976
            smart_req.SmartServerResponse((b'ok', )),
977
            request.do_body(b'foo bar baz'))
978
        self.assertEqual(
7045.3.1 by Jelmer Vernooij
Fix another ~500 tests.
979
            branch.control_transport.get_bytes('branch.conf'),
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
980
            b'foo bar baz')
6270.1.9 by Jelmer Vernooij
add Branch.set_config_file.
981
        branch.unlock()
982
983
4226.2.1 by Robert Collins
Set branch config options via a smart method.
984
class TestSmartServerBranchRequestSetConfigOption(TestLockedBranch):
985
986
    def test_value_name(self):
987
        branch = self.make_branch('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
988
        request = smart_branch.SmartServerBranchRequestSetConfigOption(
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
989
            branch.controldir.root_transport)
4226.2.1 by Robert Collins
Set branch config options via a smart method.
990
        branch_token, repo_token = self.get_lock_tokens(branch)
991
        config = branch._get_config()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
992
        result = request.execute(b'', branch_token, repo_token, b'bar', b'foo',
7143.15.2 by Jelmer Vernooij
Run autopep8.
993
                                 b'')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
994
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
4226.2.1 by Robert Collins
Set branch config options via a smart method.
995
        self.assertEqual('bar', config.get_option('foo'))
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
996
        # Cleanup
997
        branch.unlock()
4226.2.1 by Robert Collins
Set branch config options via a smart method.
998
999
    def test_value_name_section(self):
1000
        branch = self.make_branch('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1001
        request = smart_branch.SmartServerBranchRequestSetConfigOption(
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1002
            branch.controldir.root_transport)
4226.2.1 by Robert Collins
Set branch config options via a smart method.
1003
        branch_token, repo_token = self.get_lock_tokens(branch)
1004
        config = branch._get_config()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1005
        result = request.execute(b'', branch_token, repo_token, b'bar', b'foo',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1006
                                 b'gam')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1007
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
4226.2.1 by Robert Collins
Set branch config options via a smart method.
1008
        self.assertEqual('bar', config.get_option('foo', 'gam'))
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1009
        # Cleanup
1010
        branch.unlock()
4226.2.1 by Robert Collins
Set branch config options via a smart method.
1011
1012
5227.1.2 by Andrew Bennetts
Add Branch.set_config_option_dict RPC (and VFS fallback), fixes #430382.
1013
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
1014
1015
    def setUp(self):
1016
        TestLockedBranch.setUp(self)
1017
        # A dict with non-ascii keys and values to exercise unicode
1018
        # roundtripping.
1019
        self.encoded_value_dict = (
6973.7.8 by Jelmer Vernooij
Fix more tests.
1020
            b'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
5227.1.2 by Andrew Bennetts
Add Branch.set_config_option_dict RPC (and VFS fallback), fixes #430382.
1021
        self.value_dict = {
1022
            'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
1023
1024
    def test_value_name(self):
1025
        branch = self.make_branch('.')
1026
        request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1027
            branch.controldir.root_transport)
5227.1.2 by Andrew Bennetts
Add Branch.set_config_option_dict RPC (and VFS fallback), fixes #430382.
1028
        branch_token, repo_token = self.get_lock_tokens(branch)
1029
        config = branch._get_config()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1030
        result = request.execute(b'', branch_token, repo_token,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1031
                                 self.encoded_value_dict, b'foo', b'')
5227.1.2 by Andrew Bennetts
Add Branch.set_config_option_dict RPC (and VFS fallback), fixes #430382.
1032
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
1033
        self.assertEqual(self.value_dict, config.get_option('foo'))
1034
        # Cleanup
1035
        branch.unlock()
1036
1037
    def test_value_name_section(self):
1038
        branch = self.make_branch('.')
1039
        request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1040
            branch.controldir.root_transport)
5227.1.2 by Andrew Bennetts
Add Branch.set_config_option_dict RPC (and VFS fallback), fixes #430382.
1041
        branch_token, repo_token = self.get_lock_tokens(branch)
1042
        config = branch._get_config()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1043
        result = request.execute(b'', branch_token, repo_token,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1044
                                 self.encoded_value_dict, b'foo', b'gam')
5227.1.2 by Andrew Bennetts
Add Branch.set_config_option_dict RPC (and VFS fallback), fixes #430382.
1045
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
1046
        self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
1047
        # Cleanup
1048
        branch.unlock()
1049
1050
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
1051
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
1052
    # Only called when the branch format and tags match [yay factory
1053
    # methods] so only need to test straight forward cases.
1054
1055
    def test_set_bytes(self):
1056
        base_branch = self.make_branch('base')
1057
        tag_bytes = base_branch._get_tags_bytes()
1058
        # get_lock_tokens takes out a lock.
1059
        branch_token, repo_token = self.get_lock_tokens(base_branch)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1060
        request = smart_branch.SmartServerBranchSetTagsBytes(
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
1061
            self.get_transport())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1062
        response = request.execute(b'base', branch_token, repo_token)
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
1063
        self.assertEqual(None, response)
1064
        response = request.do_chunk(tag_bytes)
1065
        self.assertEqual(None, response)
1066
        response = request.do_end()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1067
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1068
            smart_req.SuccessfulSmartServerResponse(()), response)
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
1069
        base_branch.unlock()
1070
1071
    def test_lock_failed(self):
1072
        base_branch = self.make_branch('base')
1073
        base_branch.lock_write()
1074
        tag_bytes = base_branch._get_tags_bytes()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1075
        request = smart_branch.SmartServerBranchSetTagsBytes(
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
1076
            self.get_transport())
1077
        self.assertRaises(errors.TokenMismatch, request.execute,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1078
                          b'base', b'wrong token', b'wrong token')
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
1079
        # The request handler will keep processing the message parts, so even
1080
        # if the request fails immediately do_chunk and do_end are still
1081
        # called.
1082
        request.do_chunk(tag_bytes)
1083
        request.do_end()
1084
        base_branch.unlock()
1085
1086
4226.2.1 by Robert Collins
Set branch config options via a smart method.
1087
class SetLastRevisionTestBase(TestLockedBranch):
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1088
    """Base test case for verbs that implement set_last_revision."""
1089
1090
    def setUp(self):
6552.1.4 by Vincent Ladeuil
Remaining tests matching setup(self) that can be rewritten with super().
1091
        super(SetLastRevisionTestBase, self).setUp()
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1092
        backing_transport = self.get_transport()
1093
        self.request = self.request_class(backing_transport)
1094
        self.tree = self.make_branch_and_memory_tree('.')
1095
1096
    def lock_branch(self):
4226.2.1 by Robert Collins
Set branch config options via a smart method.
1097
        return self.get_lock_tokens(self.tree.branch)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1098
1099
    def unlock_branch(self):
1100
        self.tree.branch.unlock()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1101
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1102
    def set_last_revision(self, revision_id, revno):
1103
        branch_token, repo_token = self.lock_branch()
1104
        response = self._set_last_revision(
1105
            revision_id, revno, branch_token, repo_token)
1106
        self.unlock_branch()
1107
        return response
1108
1109
    def assertRequestSucceeds(self, revision_id, revno):
1110
        response = self.set_last_revision(revision_id, revno)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1111
        self.assertEqual(smart_req.SuccessfulSmartServerResponse((b'ok',)),
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1112
                         response)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1113
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1114
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1115
class TestSetLastRevisionVerbMixin(object):
1116
    """Mixin test case for verbs that implement set_last_revision."""
1117
1118
    def test_set_null_to_null(self):
6973.14.6 by Jelmer Vernooij
Fix some more tests.
1119
        """An empty branch can have its last revision set to b'null:'."""
6973.6.1 by Jelmer Vernooij
More bees.
1120
        self.assertRequestSucceeds(b'null:', 0)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1121
1122
    def test_NoSuchRevision(self):
1123
        """If the revision_id is not present, the verb returns NoSuchRevision.
1124
        """
6973.13.2 by Jelmer Vernooij
Fix some more tests.
1125
        revision_id = b'non-existent revision'
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1126
        self.assertEqual(
1127
            smart_req.FailedSmartServerResponse(
1128
                (b'NoSuchRevision', revision_id)),
1129
            self.set_last_revision(revision_id, 1))
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1130
1131
    def make_tree_with_two_commits(self):
1132
        self.tree.lock_write()
1133
        self.tree.add('')
1134
        rev_id_utf8 = u'\xc8'.encode('utf-8')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1135
        self.tree.commit('1st commit', rev_id=rev_id_utf8)
1136
        self.tree.commit('2nd commit', rev_id=b'rev-2')
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1137
        self.tree.unlock()
1138
1139
    def test_branch_last_revision_info_is_updated(self):
1140
        """A branch's tip can be set to a revision that is present in its
1141
        repository.
1142
        """
1143
        # Make a branch with an empty revision history, but two revisions in
1144
        # its repository.
1145
        self.make_tree_with_two_commits()
1146
        rev_id_utf8 = u'\xc8'.encode('utf-8')
6973.5.2 by Jelmer Vernooij
Add more bees.
1147
        self.tree.branch.set_last_revision_info(0, b'null:')
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1148
        self.assertEqual(
6973.5.2 by Jelmer Vernooij
Add more bees.
1149
            (0, b'null:'), self.tree.branch.last_revision_info())
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1150
        # We can update the branch to a revision that is present in the
1151
        # repository.
1152
        self.assertRequestSucceeds(rev_id_utf8, 1)
1153
        self.assertEqual(
1154
            (1, rev_id_utf8), self.tree.branch.last_revision_info())
1155
1156
    def test_branch_last_revision_info_rewind(self):
1157
        """A branch's tip can be set to a revision that is an ancestor of the
1158
        current tip.
1159
        """
1160
        self.make_tree_with_two_commits()
1161
        rev_id_utf8 = u'\xc8'.encode('utf-8')
1162
        self.assertEqual(
6973.5.2 by Jelmer Vernooij
Add more bees.
1163
            (2, b'rev-2'), self.tree.branch.last_revision_info())
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1164
        self.assertRequestSucceeds(rev_id_utf8, 1)
1165
        self.assertEqual(
1166
            (1, rev_id_utf8), self.tree.branch.last_revision_info())
1167
3577.1.1 by Andrew Bennetts
Cherry-pick TipChangeRejected changes from pre-branch-tip-changed-hook loom.
1168
    def test_TipChangeRejected(self):
1169
        """If a pre_change_branch_tip hook raises TipChangeRejected, the verb
1170
        returns TipChangeRejected.
1171
        """
1172
        rejection_message = u'rejection message\N{INTERROBANG}'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1173
3577.1.1 by Andrew Bennetts
Cherry-pick TipChangeRejected changes from pre-branch-tip-changed-hook loom.
1174
        def hook_that_rejects(params):
1175
            raise errors.TipChangeRejected(rejection_message)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1176
        _mod_branch.Branch.hooks.install_named_hook(
3577.1.1 by Andrew Bennetts
Cherry-pick TipChangeRejected changes from pre-branch-tip-changed-hook loom.
1177
            'pre_change_branch_tip', hook_that_rejects, None)
1178
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1179
            smart_req.FailedSmartServerResponse(
6973.5.2 by Jelmer Vernooij
Add more bees.
1180
                (b'TipChangeRejected', rejection_message.encode('utf-8'))),
1181
            self.set_last_revision(b'null:', 0))
3577.1.1 by Andrew Bennetts
Cherry-pick TipChangeRejected changes from pre-branch-tip-changed-hook loom.
1182
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1183
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1184
class TestSmartServerBranchRequestSetLastRevision(
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1185
        SetLastRevisionTestBase, TestSetLastRevisionVerbMixin):
1186
    """Tests for Branch.set_last_revision verb."""
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1187
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1188
    request_class = smart_branch.SmartServerBranchRequestSetLastRevision
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1189
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1190
    def _set_last_revision(self, revision_id, revno, branch_token, repo_token):
1191
        return self.request.execute(
6973.5.2 by Jelmer Vernooij
Add more bees.
1192
            b'', branch_token, repo_token, revision_id)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1193
1194
1195
class TestSmartServerBranchRequestSetLastRevisionInfo(
1196
        SetLastRevisionTestBase, TestSetLastRevisionVerbMixin):
1197
    """Tests for Branch.set_last_revision_info verb."""
1198
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1199
    request_class = smart_branch.SmartServerBranchRequestSetLastRevisionInfo
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1200
1201
    def _set_last_revision(self, revision_id, revno, branch_token, repo_token):
1202
        return self.request.execute(
6973.5.2 by Jelmer Vernooij
Add more bees.
1203
            b'', branch_token, repo_token, revno, revision_id)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1204
1205
    def test_NoSuchRevision(self):
1206
        """Branch.set_last_revision_info does not have to return
1207
        NoSuchRevision if the revision_id is absent.
1208
        """
1209
        raise tests.TestNotApplicable()
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1210
1211
3441.5.25 by Andrew Bennetts
Rename Branch.set_last_revision_descendant verb to Branch.set_last_revision_ex. It's a cop out, but at least it's not misleading.
1212
class TestSmartServerBranchRequestSetLastRevisionEx(
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1213
        SetLastRevisionTestBase, TestSetLastRevisionVerbMixin):
1214
    """Tests for Branch.set_last_revision_ex verb."""
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1215
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1216
    request_class = smart_branch.SmartServerBranchRequestSetLastRevisionEx
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1217
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1218
    def _set_last_revision(self, revision_id, revno, branch_token, repo_token):
1219
        return self.request.execute(
6973.5.2 by Jelmer Vernooij
Add more bees.
1220
            b'', branch_token, repo_token, revision_id, 0, 0)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1221
1222
    def assertRequestSucceeds(self, revision_id, revno):
1223
        response = self.set_last_revision(revision_id, revno)
1224
        self.assertEqual(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1225
            smart_req.SuccessfulSmartServerResponse(
1226
                (b'ok', revno, revision_id)),
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1227
            response)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1228
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1229
    def test_branch_last_revision_info_rewind(self):
1230
        """A branch's tip can be set to a revision that is an ancestor of the
1231
        current tip, but only if allow_overwrite_descendant is passed.
1232
        """
1233
        self.make_tree_with_two_commits()
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1234
        rev_id_utf8 = u'\xc8'.encode('utf-8')
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1235
        self.assertEqual(
6973.5.2 by Jelmer Vernooij
Add more bees.
1236
            (2, b'rev-2'), self.tree.branch.last_revision_info())
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1237
        # If allow_overwrite_descendant flag is 0, then trying to set the tip
1238
        # to an older revision ID has no effect.
1239
        branch_token, repo_token = self.lock_branch()
1240
        response = self.request.execute(
6973.5.2 by Jelmer Vernooij
Add more bees.
1241
            b'', branch_token, repo_token, rev_id_utf8, 0, 0)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1242
        self.assertEqual(
6973.5.2 by Jelmer Vernooij
Add more bees.
1243
            smart_req.SuccessfulSmartServerResponse((b'ok', 2, b'rev-2')),
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1244
            response)
1245
        self.assertEqual(
6973.5.2 by Jelmer Vernooij
Add more bees.
1246
            (2, b'rev-2'), self.tree.branch.last_revision_info())
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1247
1248
        # If allow_overwrite_descendant flag is 1, then setting the tip to an
1249
        # ancestor works.
1250
        response = self.request.execute(
6973.5.2 by Jelmer Vernooij
Add more bees.
1251
            b'', branch_token, repo_token, rev_id_utf8, 0, 1)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1252
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1253
            smart_req.SuccessfulSmartServerResponse((b'ok', 1, rev_id_utf8)),
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1254
            response)
1255
        self.unlock_branch()
1256
        self.assertEqual(
1257
            (1, rev_id_utf8), self.tree.branch.last_revision_info())
1258
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1259
    def make_branch_with_divergent_history(self):
1260
        """Make a branch with divergent history in its repo.
1261
1262
        The branch's tip will be 'child-2', and the repo will also contain
1263
        'child-1', which diverges from a common base revision.
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1264
        """
1265
        self.tree.lock_write()
1266
        self.tree.add('')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1267
        self.tree.commit('1st commit')
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1268
        revno_1, revid_1 = self.tree.branch.last_revision_info()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1269
        self.tree.commit('2nd commit', rev_id=b'child-1')
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1270
        # Undo the second commit
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1271
        self.tree.branch.set_last_revision_info(revno_1, revid_1)
1272
        self.tree.set_parent_ids([revid_1])
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1273
        # Make a new second commit, child-2.  child-2 has diverged from
1274
        # child-1.
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1275
        self.tree.commit('2nd commit', rev_id=b'child-2')
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1276
        self.tree.unlock()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1277
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1278
    def test_not_allow_diverged(self):
1279
        """If allow_diverged is not passed, then setting a divergent history
1280
        returns a Diverged error.
1281
        """
1282
        self.make_branch_with_divergent_history()
3297.4.3 by Andrew Bennetts
Add more tests, handle NoSuchRevision in case the remote branch's format can raise it.
1283
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1284
            smart_req.FailedSmartServerResponse((b'Diverged',)),
6973.10.6 by Jelmer Vernooij
Fix tests.
1285
            self.set_last_revision(b'child-1', 2))
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1286
        # The branch tip was not changed.
6973.6.1 by Jelmer Vernooij
More bees.
1287
        self.assertEqual(b'child-2', self.tree.branch.last_revision())
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
1288
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1289
    def test_allow_diverged(self):
1290
        """If allow_diverged is passed, then setting a divergent history
1291
        succeeds.
1292
        """
1293
        self.make_branch_with_divergent_history()
1294
        branch_token, repo_token = self.lock_branch()
1295
        response = self.request.execute(
6973.5.2 by Jelmer Vernooij
Add more bees.
1296
            b'', branch_token, repo_token, b'child-1', 1, 0)
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1297
        self.assertEqual(
6973.5.2 by Jelmer Vernooij
Add more bees.
1298
            smart_req.SuccessfulSmartServerResponse((b'ok', 2, b'child-1')),
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1299
            response)
1300
        self.unlock_branch()
1301
        # The branch tip was changed.
6973.5.2 by Jelmer Vernooij
Add more bees.
1302
        self.assertEqual(b'child-1', self.tree.branch.last_revision())
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1303
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
1304
6280.4.4 by Jelmer Vernooij
Add Branch.break_lock.
1305
class TestSmartServerBranchBreakLock(tests.TestCaseWithMemoryTransport):
1306
1307
    def test_lock_to_break(self):
1308
        base_branch = self.make_branch('base')
1309
        request = smart_branch.SmartServerBranchBreakLock(
1310
            self.get_transport())
1311
        base_branch.lock_write()
1312
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1313
            smart_req.SuccessfulSmartServerResponse((b'ok', ), None),
1314
            request.execute(b'base'))
6280.4.4 by Jelmer Vernooij
Add Branch.break_lock.
1315
1316
    def test_nothing_to_break(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1317
        self.make_branch('base')
6280.4.4 by Jelmer Vernooij
Add Branch.break_lock.
1318
        request = smart_branch.SmartServerBranchBreakLock(
1319
            self.get_transport())
1320
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1321
            smart_req.SuccessfulSmartServerResponse((b'ok', ), None),
1322
            request.execute(b'base'))
6280.4.4 by Jelmer Vernooij
Add Branch.break_lock.
1323
1324
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
1325
class TestSmartServerBranchRequestGetParent(tests.TestCaseWithMemoryTransport):
1326
1327
    def test_get_parent_none(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1328
        self.make_branch('base')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1329
        request = smart_branch.SmartServerBranchGetParent(self.get_transport())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1330
        response = request.execute(b'base')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1331
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1332
            smart_req.SuccessfulSmartServerResponse((b'',)), response)
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
1333
1334
    def test_get_parent_something(self):
1335
        base_branch = self.make_branch('base')
1336
        base_branch.set_parent(self.get_url('foo'))
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1337
        request = smart_branch.SmartServerBranchGetParent(self.get_transport())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1338
        response = request.execute(b'base')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1339
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1340
            smart_req.SuccessfulSmartServerResponse((b"../foo",)),
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
1341
            response)
1342
1343
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1344
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1345
1346
    def test_set_parent_none(self):
1347
        branch = self.make_branch('base', format="1.9")
4288.1.9 by Robert Collins
Fix up test usable of _set_parent_location on unlocked branches.
1348
        branch.lock_write()
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1349
        branch._set_parent_location('foo')
4288.1.9 by Robert Collins
Fix up test usable of _set_parent_location on unlocked branches.
1350
        branch.unlock()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1351
        request = smart_branch.SmartServerBranchRequestSetParentLocation(
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1352
            self.get_transport())
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1353
        branch_token, repo_token = self.get_lock_tokens(branch)
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1354
        try:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1355
            response = request.execute(b'base', branch_token, repo_token, b'')
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1356
        finally:
1357
            branch.unlock()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1358
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
6404.6.6 by Vincent Ladeuil
Use idioms coherently and add comments to make their purpose clearer.
1359
        # Refresh branch as SetParentLocation modified it
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1360
        branch = branch.controldir.open_branch()
6404.6.6 by Vincent Ladeuil
Use idioms coherently and add comments to make their purpose clearer.
1361
        self.assertEqual(None, branch.get_parent())
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1362
1363
    def test_set_parent_something(self):
1364
        branch = self.make_branch('base', format="1.9")
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1365
        request = smart_branch.SmartServerBranchRequestSetParentLocation(
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1366
            self.get_transport())
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1367
        branch_token, repo_token = self.get_lock_tokens(branch)
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1368
        try:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1369
            response = request.execute(b'base', branch_token, repo_token,
1370
                                       b'http://bar/')
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1371
        finally:
1372
            branch.unlock()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1373
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
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.
1374
        refreshed = _mod_branch.Branch.open(branch.base)
1375
        self.assertEqual('http://bar/', refreshed.get_parent())
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1376
1377
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1378
class TestSmartServerBranchRequestGetTagsBytes(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1379
        tests.TestCaseWithMemoryTransport):
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
1380
    # Only called when the branch format and tags match [yay factory
1381
    # methods] so only need to test straight forward cases.
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1382
1383
    def test_get_bytes(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1384
        self.make_branch('base')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1385
        request = smart_branch.SmartServerBranchGetTagsBytes(
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1386
            self.get_transport())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1387
        response = request.execute(b'base')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1388
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1389
            smart_req.SuccessfulSmartServerResponse((b'',)), response)
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1390
1391
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1392
class TestSmartServerBranchRequestGetStackedOnURL(
1393
        tests.TestCaseWithMemoryTransport):
3691.2.5 by Martin Pool
Add Branch.get_stacked_on_url rpc and tests for same
1394
1395
    def test_get_stacked_on_url(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1396
        self.make_branch('base', format='1.6')
3691.2.5 by Martin Pool
Add Branch.get_stacked_on_url rpc and tests for same
1397
        stacked_branch = self.make_branch('stacked', format='1.6')
1398
        # typically should be relative
1399
        stacked_branch.set_stacked_on_url('../base')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1400
        request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
3691.2.5 by Martin Pool
Add Branch.get_stacked_on_url rpc and tests for same
1401
            self.get_transport())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1402
        response = request.execute(b'stacked')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1403
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1404
            smart_req.SmartServerResponse((b'ok', b'../base')),
3691.2.5 by Martin Pool
Add Branch.get_stacked_on_url rpc and tests for same
1405
            response)
1406
1407
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1408
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1409
1410
    def test_lock_write_on_unlocked_branch(self):
1411
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1412
        request = smart_branch.SmartServerBranchRequestLockWrite(backing)
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
1413
        branch = self.make_branch('.', format='knit')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1414
        repository = branch.repository
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1415
        response = request.execute(b'')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1416
        branch_nonce = branch.control_files._lock.peek().get('nonce')
1417
        repository_nonce = repository.control_files._lock.peek().get('nonce')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1418
        self.assertEqual(smart_req.SmartServerResponse(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1419
            (b'ok', branch_nonce, repository_nonce)),
1420
            response)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1421
        # The branch (and associated repository) is now locked.  Verify that
1422
        # with a new branch object.
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1423
        new_branch = repository.controldir.open_branch()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1424
        self.assertRaises(errors.LockContention, new_branch.lock_write)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1425
        # Cleanup
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1426
        request = smart_branch.SmartServerBranchRequestUnlock(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1427
        response = request.execute(b'', branch_nonce, repository_nonce)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1428
1429
    def test_lock_write_on_locked_branch(self):
1430
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1431
        request = smart_branch.SmartServerBranchRequestLockWrite(backing)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1432
        branch = self.make_branch('.')
6754.8.4 by Jelmer Vernooij
Use new context stuff.
1433
        branch_token = branch.lock_write().token
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1434
        branch.leave_lock_in_place()
1435
        branch.unlock()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1436
        response = request.execute(b'')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1437
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1438
            smart_req.SmartServerResponse((b'LockContention',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1439
        # Cleanup
1440
        branch.lock_write(branch_token)
1441
        branch.dont_leave_lock_in_place()
1442
        branch.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1443
1444
    def test_lock_write_with_tokens_on_locked_branch(self):
1445
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1446
        request = smart_branch.SmartServerBranchRequestLockWrite(backing)
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
1447
        branch = self.make_branch('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1448
        branch_token, repo_token = self.get_lock_tokens(branch)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1449
        branch.leave_lock_in_place()
1450
        branch.repository.leave_lock_in_place()
1451
        branch.unlock()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1452
        response = request.execute(b'',
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1453
                                   branch_token, repo_token)
1454
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1455
            smart_req.SmartServerResponse((b'ok', branch_token, repo_token)),
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1456
            response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1457
        # Cleanup
1458
        branch.repository.lock_write(repo_token)
1459
        branch.repository.dont_leave_lock_in_place()
1460
        branch.repository.unlock()
1461
        branch.lock_write(branch_token)
1462
        branch.dont_leave_lock_in_place()
1463
        branch.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1464
1465
    def test_lock_write_with_mismatched_tokens_on_locked_branch(self):
1466
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1467
        request = smart_branch.SmartServerBranchRequestLockWrite(backing)
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
1468
        branch = self.make_branch('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1469
        branch_token, repo_token = self.get_lock_tokens(branch)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1470
        branch.leave_lock_in_place()
1471
        branch.repository.leave_lock_in_place()
1472
        branch.unlock()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1473
        response = request.execute(b'',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1474
                                   branch_token + b'xxx', repo_token)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1475
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1476
            smart_req.SmartServerResponse((b'TokenMismatch',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1477
        # Cleanup
1478
        branch.repository.lock_write(repo_token)
1479
        branch.repository.dont_leave_lock_in_place()
1480
        branch.repository.unlock()
1481
        branch.lock_write(branch_token)
1482
        branch.dont_leave_lock_in_place()
1483
        branch.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1484
1485
    def test_lock_write_on_locked_repo(self):
1486
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1487
        request = smart_branch.SmartServerBranchRequestLockWrite(backing)
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
1488
        branch = self.make_branch('.', format='knit')
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1489
        repo = branch.repository
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1490
        repo_token = repo.lock_write().repository_token
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1491
        repo.leave_lock_in_place()
1492
        repo.unlock()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1493
        response = request.execute(b'')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1494
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1495
            smart_req.SmartServerResponse((b'LockContention',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1496
        # Cleanup
1497
        repo.lock_write(repo_token)
1498
        repo.dont_leave_lock_in_place()
1499
        repo.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1500
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
1501
    def test_lock_write_on_readonly_transport(self):
1502
        backing = self.get_readonly_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1503
        request = smart_branch.SmartServerBranchRequestLockWrite(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1504
        self.make_branch('.')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1505
        root = self.get_transport().clone('/')
1506
        path = urlutils.relative_url(root.base, self.get_transport().base)
6973.6.1 by Jelmer Vernooij
More bees.
1507
        response = request.execute(path.encode('utf-8'))
2872.5.3 by Martin Pool
Pass back LockFailed from smart server lock methods
1508
        error_name, lock_str, why_str = response.args
1509
        self.assertFalse(response.is_successful())
6973.6.1 by Jelmer Vernooij
More bees.
1510
        self.assertEqual(b'LockFailed', error_name)
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
1511
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1512
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
1513
class TestSmartServerBranchRequestGetPhysicalLockStatus(TestLockedBranch):
1514
1515
    def test_true(self):
1516
        backing = self.get_transport()
1517
        request = smart_branch.SmartServerBranchRequestGetPhysicalLockStatus(
1518
            backing)
1519
        branch = self.make_branch('.')
1520
        branch_token, repo_token = self.get_lock_tokens(branch)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1521
        self.assertEqual(True, branch.get_physical_lock_status())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1522
        response = request.execute(b'')
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
1523
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1524
            smart_req.SmartServerResponse((b'yes',)), response)
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
1525
        branch.unlock()
1526
1527
    def test_false(self):
1528
        backing = self.get_transport()
1529
        request = smart_branch.SmartServerBranchRequestGetPhysicalLockStatus(
1530
            backing)
1531
        branch = self.make_branch('.')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1532
        self.assertEqual(False, branch.get_physical_lock_status())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1533
        response = request.execute(b'')
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
1534
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1535
            smart_req.SmartServerResponse((b'no',)), response)
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
1536
1537
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1538
class TestSmartServerBranchRequestUnlock(TestLockedBranch):
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1539
1540
    def test_unlock_on_locked_branch_and_repo(self):
1541
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1542
        request = smart_branch.SmartServerBranchRequestUnlock(backing)
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
1543
        branch = self.make_branch('.', format='knit')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1544
        # Lock the branch
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1545
        branch_token, repo_token = self.get_lock_tokens(branch)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1546
        # Unlock the branch (and repo) object, leaving the physical locks
1547
        # in place.
1548
        branch.leave_lock_in_place()
1549
        branch.repository.leave_lock_in_place()
1550
        branch.unlock()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1551
        response = request.execute(b'',
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1552
                                   branch_token, repo_token)
1553
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1554
            smart_req.SmartServerResponse((b'ok',)), response)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1555
        # The branch is now unlocked.  Verify that with a new branch
1556
        # object.
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1557
        new_branch = branch.controldir.open_branch()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1558
        new_branch.lock_write()
1559
        new_branch.unlock()
1560
1561
    def test_unlock_on_unlocked_branch_unlocked_repo(self):
1562
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1563
        request = smart_branch.SmartServerBranchRequestUnlock(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1564
        self.make_branch('.', format='knit')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1565
        response = request.execute(
6973.5.2 by Jelmer Vernooij
Add more bees.
1566
            b'', b'branch token', b'repo token')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1567
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1568
            smart_req.SmartServerResponse((b'TokenMismatch',)), response)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1569
1570
    def test_unlock_on_unlocked_branch_locked_repo(self):
1571
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1572
        request = smart_branch.SmartServerBranchRequestUnlock(backing)
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
1573
        branch = self.make_branch('.', format='knit')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1574
        # Lock the repository.
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1575
        repo_token = branch.repository.lock_write().repository_token
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1576
        branch.repository.leave_lock_in_place()
1577
        branch.repository.unlock()
1578
        # Issue branch lock_write request on the unlocked branch (with locked
1579
        # repo).
6973.5.2 by Jelmer Vernooij
Add more bees.
1580
        response = request.execute(b'', b'branch token', repo_token)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1581
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1582
            smart_req.SmartServerResponse((b'TokenMismatch',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1583
        # Cleanup
1584
        branch.repository.lock_write(repo_token)
1585
        branch.repository.dont_leave_lock_in_place()
1586
        branch.repository.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1587
1588
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1589
class TestSmartServerRepositoryRequest(tests.TestCaseWithMemoryTransport):
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1590
1591
    def test_no_repository(self):
1592
        """Raise NoRepositoryPresent when there is a bzrdir and no repo."""
1593
        # we test this using a shared repository above the named path,
1594
        # thus checking the right search logic is used - that is, that
1595
        # its the exact path being looked at and the server is not
1596
        # searching.
1597
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1598
        request = smart_repo.SmartServerRepositoryRequest(backing)
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1599
        self.make_repository('.', shared=True)
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
1600
        self.make_controldir('subdir')
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1601
        self.assertRaises(errors.NoRepositoryPresent,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1602
                          request.execute, b'subdir')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1603
1604
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1605
class TestSmartServerRepositoryAddSignatureText(
1606
        tests.TestCaseWithMemoryTransport):
6268.1.2 by Jelmer Vernooij
Initial work on Repository.add_signature_text.
1607
1608
    def test_add_text(self):
1609
        backing = self.get_transport()
1610
        request = smart_repo.SmartServerRepositoryAddSignatureText(backing)
1611
        tree = self.make_branch_and_memory_tree('.')
6268.1.6 by Jelmer Vernooij
Fix add_signature_text.
1612
        write_token = tree.lock_write()
1613
        self.addCleanup(tree.unlock)
1614
        tree.add('')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1615
        tree.commit("Message", rev_id=b'rev1')
6268.1.2 by Jelmer Vernooij
Initial work on Repository.add_signature_text.
1616
        tree.branch.repository.start_write_group()
6268.1.6 by Jelmer Vernooij
Fix add_signature_text.
1617
        write_group_tokens = tree.branch.repository.suspend_write_group()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1618
        self.assertEqual(
1619
            None, request.execute(
1620
                b'', write_token, b'rev1',
1621
                *[token.encode('utf-8') for token in write_group_tokens]))
6973.6.1 by Jelmer Vernooij
More bees.
1622
        response = request.do_body(b'somesignature')
6268.1.6 by Jelmer Vernooij
Fix add_signature_text.
1623
        self.assertTrue(response.is_successful())
6973.5.2 by Jelmer Vernooij
Add more bees.
1624
        self.assertEqual(response.args[0], b'ok')
7143.15.2 by Jelmer Vernooij
Run autopep8.
1625
        write_group_tokens = [token.decode('utf-8')
1626
                              for token in response.args[1:]]
6268.1.6 by Jelmer Vernooij
Fix add_signature_text.
1627
        tree.branch.repository.resume_write_group(write_group_tokens)
1628
        tree.branch.repository.commit_write_group()
1629
        tree.unlock()
6973.6.1 by Jelmer Vernooij
More bees.
1630
        self.assertEqual(b"somesignature",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1631
                         tree.branch.repository.get_signature_text(b"rev1"))
6268.1.2 by Jelmer Vernooij
Initial work on Repository.add_signature_text.
1632
1633
6280.3.2 by Jelmer Vernooij
Add smart side of RemoteRepository.all_revision_ids().
1634
class TestSmartServerRepositoryAllRevisionIds(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1635
        tests.TestCaseWithMemoryTransport):
6280.3.2 by Jelmer Vernooij
Add smart side of RemoteRepository.all_revision_ids().
1636
1637
    def test_empty(self):
1638
        """An empty body should be returned for an empty repository."""
1639
        backing = self.get_transport()
1640
        request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1641
        self.make_repository('.')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1642
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1643
            smart_req.SuccessfulSmartServerResponse((b"ok", ), b""),
1644
            request.execute(b''))
6280.3.2 by Jelmer Vernooij
Add smart side of RemoteRepository.all_revision_ids().
1645
1646
    def test_some_revisions(self):
1647
        """An empty body should be returned for an empty repository."""
1648
        backing = self.get_transport()
1649
        request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1650
        tree = self.make_branch_and_memory_tree('.')
1651
        tree.lock_write()
1652
        tree.add('')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1653
        tree.commit(rev_id=b'origineel', message="message")
1654
        tree.commit(rev_id=b'nog-een-revisie', message="message")
6280.3.2 by Jelmer Vernooij
Add smart side of RemoteRepository.all_revision_ids().
1655
        tree.unlock()
6973.7.8 by Jelmer Vernooij
Fix more tests.
1656
        self.assertIn(
1657
            request.execute(b''),
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1658
            [smart_req.SuccessfulSmartServerResponse(
1659
                (b"ok", ), b"origineel\nnog-een-revisie"),
1660
             smart_req.SuccessfulSmartServerResponse(
1661
                 (b"ok", ), b"nog-een-revisie\norigineel")])
6280.3.2 by Jelmer Vernooij
Add smart side of RemoteRepository.all_revision_ids().
1662
1663
6280.4.2 by Jelmer Vernooij
Provide server side of Repository.break_lock HPSS call.
1664
class TestSmartServerRepositoryBreakLock(tests.TestCaseWithMemoryTransport):
1665
1666
    def test_lock_to_break(self):
1667
        backing = self.get_transport()
1668
        request = smart_repo.SmartServerRepositoryBreakLock(backing)
1669
        tree = self.make_branch_and_memory_tree('.')
1670
        tree.branch.repository.lock_write()
1671
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1672
            smart_req.SuccessfulSmartServerResponse((b'ok', ), None),
1673
            request.execute(b''))
6280.4.2 by Jelmer Vernooij
Provide server side of Repository.break_lock HPSS call.
1674
1675
    def test_nothing_to_break(self):
1676
        backing = self.get_transport()
1677
        request = smart_repo.SmartServerRepositoryBreakLock(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1678
        self.make_branch_and_memory_tree('.')
6280.4.2 by Jelmer Vernooij
Provide server side of Repository.break_lock HPSS call.
1679
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1680
            smart_req.SuccessfulSmartServerResponse((b'ok', ), None),
1681
            request.execute(b''))
6280.4.2 by Jelmer Vernooij
Provide server side of Repository.break_lock HPSS call.
1682
1683
3441.5.4 by Andrew Bennetts
Fix test failures, and add some tests for the remote graph heads RPC.
1684
class TestSmartServerRepositoryGetParentMap(tests.TestCaseWithMemoryTransport):
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1685
3211.5.3 by Robert Collins
Adjust size of batch and change gzip comments to bzip2.
1686
    def test_trivial_bzipped(self):
1687
        # This tests that the wire encoding is actually bzipped
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1688
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1689
        request = smart_repo.SmartServerRepositoryGetParentMap(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1690
        self.make_branch_and_memory_tree('.')
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1691
1692
        self.assertEqual(None,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1693
                         request.execute(b'', b'missing-id'))
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1694
        # Note that it returns a body that is bzipped.
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1695
        self.assertEqual(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1696
            smart_req.SuccessfulSmartServerResponse(
1697
                (b'ok', ), bz2.compress(b'')),
6973.6.1 by Jelmer Vernooij
More bees.
1698
            request.do_body(b'\n\n0\n'))
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1699
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1700
    def test_trivial_include_missing(self):
1701
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1702
        request = smart_repo.SmartServerRepositoryGetParentMap(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1703
        self.make_branch_and_memory_tree('.')
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1704
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1705
        self.assertEqual(
1706
            None, request.execute(b'', b'missing-id', b'include-missing:'))
1707
        self.assertEqual(
1708
            smart_req.SuccessfulSmartServerResponse(
1709
                (b'ok', ), bz2.compress(b'missing:missing-id')),
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1710
            request.do_body(b'\n\n0\n'))
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1711
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1712
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1713
class TestSmartServerRepositoryGetRevisionGraph(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1714
        tests.TestCaseWithMemoryTransport):
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1715
1716
    def test_none_argument(self):
1717
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1718
        request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1719
        tree = self.make_branch_and_memory_tree('.')
1720
        tree.lock_write()
1721
        tree.add('')
1722
        r1 = tree.commit('1st commit')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1723
        r2 = tree.commit('2nd commit', rev_id=u'\xc8'.encode('utf-8'))
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1724
        tree.unlock()
1725
1726
        # the lines of revision_id->revision_parent_list has no guaranteed
1727
        # order coming out of a dict, so sort both our test and response
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1728
        lines = sorted([b' '.join([r2, r1]), r1])
1729
        response = request.execute(b'', b'')
6973.6.1 by Jelmer Vernooij
More bees.
1730
        response.body = b'\n'.join(sorted(response.body.split(b'\n')))
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1731
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
1732
        self.assertEqual(
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1733
            smart_req.SmartServerResponse((b'ok', ), b'\n'.join(lines)),
1734
            response)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1735
1736
    def test_specific_revision_argument(self):
1737
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1738
        request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1739
        tree = self.make_branch_and_memory_tree('.')
1740
        tree.lock_write()
1741
        tree.add('')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1742
        rev_id_utf8 = u'\xc9'.encode('utf-8')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1743
        tree.commit('1st commit', rev_id=rev_id_utf8)
1744
        tree.commit('2nd commit', rev_id=u'\xc8'.encode('utf-8'))
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1745
        tree.unlock()
1746
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1747
        self.assertEqual(smart_req.SmartServerResponse((b'ok', ), rev_id_utf8),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1748
                         request.execute(b'', rev_id_utf8))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1749
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1750
    def test_no_such_revision(self):
1751
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1752
        request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1753
        tree = self.make_branch_and_memory_tree('.')
1754
        tree.lock_write()
1755
        tree.add('')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1756
        tree.commit('1st commit')
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1757
        tree.unlock()
1758
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1759
        # Note that it still returns body (of zero bytes).
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1760
        self.assertEqual(smart_req.SmartServerResponse(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1761
            (b'nosuchrevision', b'missingrevision', ), b''),
1762
            request.execute(b'', b'missingrevision'))
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1763
1764
1765
class TestSmartServerRepositoryGetRevIdForRevno(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1766
        tests.TestCaseWithMemoryTransport):
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1767
1768
    def test_revno_found(self):
1769
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1770
        request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1771
        tree = self.make_branch_and_memory_tree('.')
1772
        tree.lock_write()
1773
        tree.add('')
1774
        rev1_id_utf8 = u'\xc8'.encode('utf-8')
1775
        rev2_id_utf8 = u'\xc9'.encode('utf-8')
1776
        tree.commit('1st commit', rev_id=rev1_id_utf8)
1777
        tree.commit('2nd commit', rev_id=rev2_id_utf8)
1778
        tree.unlock()
1779
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1780
        self.assertEqual(smart_req.SmartServerResponse((b'ok', rev1_id_utf8)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1781
                         request.execute(b'', 1, (2, rev2_id_utf8)))
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1782
1783
    def test_known_revid_missing(self):
1784
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1785
        request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1786
        self.make_repository('.')
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1787
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1788
            smart_req.FailedSmartServerResponse((b'nosuchrevision', b'ghost')),
1789
            request.execute(b'', 1, (2, b'ghost')))
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1790
1791
    def test_history_incomplete(self):
1792
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1793
        request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1794
        parent = self.make_branch_and_memory_tree('parent', format='1.9')
4526.9.21 by Robert Collins
Fix test_smart's test_history_incomplete to generate a good tree before committing.
1795
        parent.lock_write()
6973.7.8 by Jelmer Vernooij
Fix more tests.
1796
        parent.add([''], [b'TREE_ROOT'])
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1797
        parent.commit(message='first commit')
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1798
        r2 = parent.commit(message='second commit')
4526.9.21 by Robert Collins
Fix test_smart's test_history_incomplete to generate a good tree before committing.
1799
        parent.unlock()
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1800
        local = self.make_branch_and_memory_tree('local', format='1.9')
1801
        local.branch.pull(parent.branch)
1802
        local.set_parent_ids([r2])
1803
        r3 = local.commit(message='local commit')
1804
        local.branch.create_clone_on_transport(
1805
            self.get_transport('stacked'), stacked_on=self.get_url('parent'))
1806
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1807
            smart_req.SmartServerResponse((b'history-incomplete', 2, r2)),
1808
            request.execute(b'stacked', 1, (3, r3)))
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1809
4476.3.68 by Andrew Bennetts
Review comments from John.
1810
6280.9.2 by Jelmer Vernooij
Add smart side.
1811
class TestSmartServerRepositoryIterRevisions(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1812
        tests.TestCaseWithMemoryTransport):
6280.9.2 by Jelmer Vernooij
Add smart side.
1813
1814
    def test_basic(self):
1815
        backing = self.get_transport()
1816
        request = smart_repo.SmartServerRepositoryIterRevisions(backing)
1817
        tree = self.make_branch_and_memory_tree('.', format='2a')
1818
        tree.lock_write()
1819
        tree.add('')
6973.6.1 by Jelmer Vernooij
More bees.
1820
        tree.commit('1st commit', rev_id=b"rev1")
1821
        tree.commit('2nd commit', rev_id=b"rev2")
6280.9.2 by Jelmer Vernooij
Add smart side.
1822
        tree.unlock()
1823
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1824
        self.assertIs(None, request.execute(b''))
6973.6.1 by Jelmer Vernooij
More bees.
1825
        response = request.do_body(b"rev1\nrev2")
6280.9.2 by Jelmer Vernooij
Add smart side.
1826
        self.assertTrue(response.is_successful())
1827
        # Format 2a uses serializer format 10
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1828
        self.assertEqual(response.args, (b"ok", b"10"))
6280.9.2 by Jelmer Vernooij
Add smart side.
1829
6280.9.4 by Jelmer Vernooij
use zlib instead.
1830
        self.addCleanup(tree.branch.lock_read().unlock)
1831
        entries = [zlib.compress(record.get_bytes_as("fulltext")) for record in
7143.15.2 by Jelmer Vernooij
Run autopep8.
1832
                   tree.branch.repository.revisions.get_record_stream(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1833
            [(b"rev1", ), (b"rev2", )], "unordered", True)]
6280.9.2 by Jelmer Vernooij
Add smart side.
1834
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1835
        contents = b"".join(response.body_stream)
6280.9.4 by Jelmer Vernooij
use zlib instead.
1836
        self.assertTrue(contents in (
6973.6.1 by Jelmer Vernooij
More bees.
1837
            b"".join([entries[0], entries[1]]),
1838
            b"".join([entries[1], entries[0]])))
6280.9.2 by Jelmer Vernooij
Add smart side.
1839
1840
    def test_missing(self):
1841
        backing = self.get_transport()
1842
        request = smart_repo.SmartServerRepositoryIterRevisions(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1843
        self.make_branch_and_memory_tree('.', format='2a')
6280.9.2 by Jelmer Vernooij
Add smart side.
1844
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1845
        self.assertIs(None, request.execute(b''))
1846
        response = request.do_body(b"rev1\nrev2")
6280.9.2 by Jelmer Vernooij
Add smart side.
1847
        self.assertTrue(response.is_successful())
1848
        # Format 2a uses serializer format 10
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1849
        self.assertEqual(response.args, (b"ok", b"10"))
6280.9.2 by Jelmer Vernooij
Add smart side.
1850
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1851
        contents = b"".join(response.body_stream)
1852
        self.assertEqual(contents, b"")
6280.9.2 by Jelmer Vernooij
Add smart side.
1853
1854
5539.2.4 by Andrew Bennetts
Add some basic tests for the new verb, fix some shallow bugs.
1855
class GetStreamTestBase(tests.TestCaseWithMemoryTransport):
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1856
1857
    def make_two_commit_repo(self):
1858
        tree = self.make_branch_and_memory_tree('.')
1859
        tree.lock_write()
1860
        tree.add('')
1861
        r1 = tree.commit('1st commit')
1862
        r2 = tree.commit('2nd commit', rev_id=u'\xc8'.encode('utf-8'))
1863
        tree.unlock()
1864
        repo = tree.branch.repository
1865
        return repo, r1, r2
1866
5539.2.4 by Andrew Bennetts
Add some basic tests for the new verb, fix some shallow bugs.
1867
1868
class TestSmartServerRepositoryGetStream(GetStreamTestBase):
1869
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1870
    def test_ancestry_of(self):
1871
        """The search argument may be a 'ancestry-of' some heads'."""
1872
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1873
        request = smart_repo.SmartServerRepositoryGetStream(backing)
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1874
        repo, r1, r2 = self.make_two_commit_repo()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1875
        fetch_spec = [b'ancestry-of', r2]
1876
        lines = b'\n'.join(fetch_spec)
1877
        request.execute(b'', repo._format.network_name())
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1878
        response = request.do_body(lines)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1879
        self.assertEqual((b'ok',), response.args)
1880
        stream_bytes = b''.join(response.body_stream)
1881
        self.assertStartsWith(stream_bytes, b'Bazaar pack format 1')
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1882
1883
    def test_search(self):
1884
        """The search argument may be a 'search' of some explicit keys."""
1885
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1886
        request = smart_repo.SmartServerRepositoryGetStream(backing)
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1887
        repo, r1, r2 = self.make_two_commit_repo()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1888
        fetch_spec = [b'search', r1 + b' ' + r2, b'null:', b'2']
1889
        lines = b'\n'.join(fetch_spec)
1890
        request.execute(b'', repo._format.network_name())
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1891
        response = request.do_body(lines)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1892
        self.assertEqual((b'ok',), response.args)
1893
        stream_bytes = b''.join(response.body_stream)
1894
        self.assertStartsWith(stream_bytes, b'Bazaar pack format 1')
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1895
5539.2.4 by Andrew Bennetts
Add some basic tests for the new verb, fix some shallow bugs.
1896
    def test_search_everything(self):
1897
        """A search of 'everything' returns a stream."""
1898
        backing = self.get_transport()
5539.2.14 by Andrew Bennetts
Don't add a new verb; instead just teach the client to fallback if it gets a BadSearch error.
1899
        request = smart_repo.SmartServerRepositoryGetStream_1_19(backing)
5539.2.4 by Andrew Bennetts
Add some basic tests for the new verb, fix some shallow bugs.
1900
        repo, r1, r2 = self.make_two_commit_repo()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1901
        serialised_fetch_spec = b'everything'
1902
        request.execute(b'', repo._format.network_name())
5539.2.4 by Andrew Bennetts
Add some basic tests for the new verb, fix some shallow bugs.
1903
        response = request.do_body(serialised_fetch_spec)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1904
        self.assertEqual((b'ok',), response.args)
1905
        stream_bytes = b''.join(response.body_stream)
1906
        self.assertStartsWith(stream_bytes, b'Bazaar pack format 1')
5539.2.4 by Andrew Bennetts
Add some basic tests for the new verb, fix some shallow bugs.
1907
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1908
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1909
class TestSmartServerRequestHasRevision(tests.TestCaseWithMemoryTransport):
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1910
1911
    def test_missing_revision(self):
1912
        """For a missing revision, ('no', ) is returned."""
1913
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1914
        request = smart_repo.SmartServerRequestHasRevision(backing)
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1915
        self.make_repository('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1916
        self.assertEqual(smart_req.SmartServerResponse((b'no', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1917
                         request.execute(b'', b'revid'))
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1918
1919
    def test_present_revision(self):
2018.5.158 by Andrew Bennetts
Return 'yes'/'no' rather than 'ok'/'no' from the Repository.has_revision smart command.
1920
        """For a present revision, ('yes', ) is returned."""
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1921
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1922
        request = smart_repo.SmartServerRequestHasRevision(backing)
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1923
        tree = self.make_branch_and_memory_tree('.')
1924
        tree.lock_write()
1925
        tree.add('')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1926
        rev_id_utf8 = u'\xc8abc'.encode('utf-8')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1927
        tree.commit('a commit', rev_id=rev_id_utf8)
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1928
        tree.unlock()
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1929
        self.assertTrue(tree.branch.repository.has_revision(rev_id_utf8))
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1930
        self.assertEqual(smart_req.SmartServerResponse((b'yes', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1931
                         request.execute(b'', rev_id_utf8))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1932
1933
6280.10.20 by Jelmer Vernooij
Convert smart to zlib.
1934
class TestSmartServerRepositoryIterFilesBytes(tests.TestCaseWithTransport):
6280.10.6 by Jelmer Vernooij
Convert to iter_files_bytes_bz2.
1935
1936
    def test_single(self):
1937
        backing = self.get_transport()
6280.10.20 by Jelmer Vernooij
Convert smart to zlib.
1938
        request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
6280.10.6 by Jelmer Vernooij
Convert to iter_files_bytes_bz2.
1939
        t = self.make_branch_and_tree('.')
1940
        self.addCleanup(t.lock_write().unlock)
6855.4.1 by Jelmer Vernooij
Yet more bees.
1941
        self.build_tree_contents([("file", b"somecontents")])
1942
        t.add(["file"], [b"thefileid"])
1943
        t.commit(rev_id=b'somerev', message="add file")
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1944
        self.assertIs(None, request.execute(b''))
1945
        response = request.do_body(b"thefileid\0somerev\n")
6280.10.5 by Jelmer Vernooij
Support bz2 compression.
1946
        self.assertTrue(response.is_successful())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1947
        self.assertEqual(response.args, (b"ok", ))
1948
        self.assertEqual(b"".join(response.body_stream),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1949
                         b"ok\x000\n" + zlib.compress(b"somecontents"))
6280.10.5 by Jelmer Vernooij
Support bz2 compression.
1950
6280.10.3 by Jelmer Vernooij
Fix iter_file_bytes.
1951
    def test_missing(self):
1952
        backing = self.get_transport()
6280.10.20 by Jelmer Vernooij
Convert smart to zlib.
1953
        request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
6280.10.3 by Jelmer Vernooij
Fix iter_file_bytes.
1954
        t = self.make_branch_and_tree('.')
1955
        self.addCleanup(t.lock_write().unlock)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1956
        self.assertIs(None, request.execute(b''))
1957
        response = request.do_body(b"thefileid\0revision\n")
6280.10.6 by Jelmer Vernooij
Convert to iter_files_bytes_bz2.
1958
        self.assertTrue(response.is_successful())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1959
        self.assertEqual(response.args, (b"ok", ))
1960
        self.assertEqual(b"".join(response.body_stream),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1961
                         b"absent\x00thefileid\x00revision\x000\n")
6280.10.3 by Jelmer Vernooij
Fix iter_file_bytes.
1962
6280.10.2 by Jelmer Vernooij
Add Repository.iter_file_bytes.
1963
6265.1.1 by Jelmer Vernooij
Add new HPSS call ``Repository.has_signature_for_revision_id``.
1964
class TestSmartServerRequestHasSignatureForRevisionId(
1965
        tests.TestCaseWithMemoryTransport):
1966
1967
    def test_missing_revision(self):
1968
        """For a missing revision, NoSuchRevision is returned."""
1969
        backing = self.get_transport()
1970
        request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1971
            backing)
1972
        self.make_repository('.')
1973
        self.assertEqual(
1974
            smart_req.FailedSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1975
                (b'nosuchrevision', b'revid'), None),
1976
            request.execute(b'', b'revid'))
6265.1.1 by Jelmer Vernooij
Add new HPSS call ``Repository.has_signature_for_revision_id``.
1977
1978
    def test_missing_signature(self):
1979
        """For a missing signature, ('no', ) is returned."""
1980
        backing = self.get_transport()
1981
        request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1982
            backing)
1983
        tree = self.make_branch_and_memory_tree('.')
1984
        tree.lock_write()
1985
        tree.add('')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1986
        tree.commit('a commit', rev_id=b'A')
6265.1.1 by Jelmer Vernooij
Add new HPSS call ``Repository.has_signature_for_revision_id``.
1987
        tree.unlock()
6973.5.2 by Jelmer Vernooij
Add more bees.
1988
        self.assertTrue(tree.branch.repository.has_revision(b'A'))
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
1989
        self.assertEqual(smart_req.SmartServerResponse((b'no', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1990
                         request.execute(b'', b'A'))
6265.1.1 by Jelmer Vernooij
Add new HPSS call ``Repository.has_signature_for_revision_id``.
1991
1992
    def test_present_signature(self):
1993
        """For a present signature, ('yes', ) is returned."""
1994
        backing = self.get_transport()
1995
        request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1996
            backing)
1997
        strategy = gpg.LoopbackGPGStrategy(None)
1998
        tree = self.make_branch_and_memory_tree('.')
1999
        tree.lock_write()
2000
        tree.add('')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2001
        tree.commit('a commit', rev_id=b'A')
6265.1.1 by Jelmer Vernooij
Add new HPSS call ``Repository.has_signature_for_revision_id``.
2002
        tree.branch.repository.start_write_group()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2003
        tree.branch.repository.sign_revision(b'A', strategy)
6265.1.1 by Jelmer Vernooij
Add new HPSS call ``Repository.has_signature_for_revision_id``.
2004
        tree.branch.repository.commit_write_group()
2005
        tree.unlock()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2006
        self.assertTrue(tree.branch.repository.has_revision(b'A'))
2007
        self.assertEqual(smart_req.SmartServerResponse((b'yes', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2008
                         request.execute(b'', b'A'))
6265.1.1 by Jelmer Vernooij
Add new HPSS call ``Repository.has_signature_for_revision_id``.
2009
2010
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
2011
class TestSmartServerRepositoryGatherStats(tests.TestCaseWithMemoryTransport):
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2012
2013
    def test_empty_revid(self):
2014
        """With an empty revid, we get only size an number and revisions"""
2015
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2016
        request = smart_repo.SmartServerRepositoryGatherStats(backing)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2017
        repository = self.make_repository('.')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2018
        repository.gather_stats()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2019
        expected_body = b'revisions: 0\n'
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2020
        self.assertEqual(
2021
            smart_req.SmartServerResponse((b'ok', ), expected_body),
2022
            request.execute(b'', b'', b'no'))
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2023
2024
    def test_revid_with_committers(self):
2025
        """For a revid we get more infos."""
2026
        backing = self.get_transport()
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
2027
        rev_id_utf8 = u'\xc8abc'.encode('utf-8')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2028
        request = smart_repo.SmartServerRepositoryGatherStats(backing)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2029
        tree = self.make_branch_and_memory_tree('.')
2030
        tree.lock_write()
2031
        tree.add('')
2032
        # Let's build a predictable result
2033
        tree.commit('a commit', timestamp=123456.2, timezone=3600)
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
2034
        tree.commit('a commit', timestamp=654321.4, timezone=0,
2035
                    rev_id=rev_id_utf8)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2036
        tree.unlock()
2037
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2038
        tree.branch.repository.gather_stats()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2039
        expected_body = (b'firstrev: 123456.200 3600\n'
2040
                         b'latestrev: 654321.400 0\n'
2041
                         b'revisions: 2\n')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2042
        self.assertEqual(
2043
            smart_req.SmartServerResponse((b'ok', ), expected_body),
2044
            request.execute(b'', rev_id_utf8, b'no'))
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2045
2046
    def test_not_empty_repository_with_committers(self):
2047
        """For a revid and requesting committers we get the whole thing."""
2048
        backing = self.get_transport()
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
2049
        rev_id_utf8 = u'\xc8abc'.encode('utf-8')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2050
        request = smart_repo.SmartServerRepositoryGatherStats(backing)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2051
        tree = self.make_branch_and_memory_tree('.')
2052
        tree.lock_write()
2053
        tree.add('')
2054
        # Let's build a predictable result
2055
        tree.commit('a commit', timestamp=123456.2, timezone=3600,
2056
                    committer='foo')
2057
        tree.commit('a commit', timestamp=654321.4, timezone=0,
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
2058
                    committer='bar', rev_id=rev_id_utf8)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2059
        tree.unlock()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2060
        tree.branch.repository.gather_stats()
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2061
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2062
        expected_body = (b'committers: 2\n'
2063
                         b'firstrev: 123456.200 3600\n'
2064
                         b'latestrev: 654321.400 0\n'
2065
                         b'revisions: 2\n')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2066
        self.assertEqual(
2067
            smart_req.SmartServerResponse((b'ok', ), expected_body),
2068
            request.execute(b'', rev_id_utf8, b'yes'))
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2069
6291.1.1 by Jelmer Vernooij
Cope with missing revision ids being specified to
2070
    def test_unknown_revid(self):
2071
        """An unknown revision id causes a 'nosuchrevision' error."""
2072
        backing = self.get_transport()
2073
        request = smart_repo.SmartServerRepositoryGatherStats(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2074
        self.make_repository('.')
6291.1.1 by Jelmer Vernooij
Cope with missing revision ids being specified to
2075
        self.assertEqual(
2076
            smart_req.FailedSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2077
                (b'nosuchrevision', b'mia'), None),
2078
            request.execute(b'', b'mia', b'yes'))
6291.1.1 by Jelmer Vernooij
Cope with missing revision ids being specified to
2079
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
2080
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
2081
class TestSmartServerRepositoryIsShared(tests.TestCaseWithMemoryTransport):
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
2082
2083
    def test_is_shared(self):
2084
        """For a shared repository, ('yes', ) is returned."""
2085
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2086
        request = smart_repo.SmartServerRepositoryIsShared(backing)
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
2087
        self.make_repository('.', shared=True)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2088
        self.assertEqual(smart_req.SmartServerResponse((b'yes', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2089
                         request.execute(b'', ))
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
2090
2091
    def test_is_not_shared(self):
2018.5.58 by Wouter van Heyst
Small test fixes to reflect naming and documentation
2092
        """For a shared repository, ('no', ) is returned."""
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
2093
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2094
        request = smart_repo.SmartServerRepositoryIsShared(backing)
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
2095
        self.make_repository('.', shared=False)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2096
        self.assertEqual(smart_req.SmartServerResponse((b'no', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2097
                         request.execute(b'', ))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
2098
2099
6263.3.2 by Jelmer Vernooij
Add new HPSS call 'Repository.get_revision_signature_text'.
2100
class TestSmartServerRepositoryGetRevisionSignatureText(
2101
        tests.TestCaseWithMemoryTransport):
2102
2103
    def test_get_signature(self):
2104
        backing = self.get_transport()
2105
        request = smart_repo.SmartServerRepositoryGetRevisionSignatureText(
2106
            backing)
2107
        bb = self.make_branch_builder('.')
6855.4.1 by Jelmer Vernooij
Yet more bees.
2108
        bb.build_commit(rev_id=b'A')
6263.3.2 by Jelmer Vernooij
Add new HPSS call 'Repository.get_revision_signature_text'.
2109
        repo = bb.get_branch().repository
2110
        strategy = gpg.LoopbackGPGStrategy(None)
2111
        self.addCleanup(repo.lock_write().unlock)
2112
        repo.start_write_group()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2113
        repo.sign_revision(b'A', strategy)
6263.3.2 by Jelmer Vernooij
Add new HPSS call 'Repository.get_revision_signature_text'.
2114
        repo.commit_write_group()
2115
        expected_body = (
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2116
            b'-----BEGIN PSEUDO-SIGNED CONTENT-----\n' +
6973.5.2 by Jelmer Vernooij
Add more bees.
2117
            Testament.from_revision(repo, b'A').as_short_text() +
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2118
            b'-----END PSEUDO-SIGNED CONTENT-----\n')
6263.3.2 by Jelmer Vernooij
Add new HPSS call 'Repository.get_revision_signature_text'.
2119
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2120
            smart_req.SmartServerResponse((b'ok', ), expected_body),
2121
            request.execute(b'', b'A'))
6263.3.2 by Jelmer Vernooij
Add new HPSS call 'Repository.get_revision_signature_text'.
2122
2123
6263.2.1 by Jelmer Vernooij
Add hpss call ``Repository.make_working_trees``
2124
class TestSmartServerRepositoryMakeWorkingTrees(
2125
        tests.TestCaseWithMemoryTransport):
2126
2127
    def test_make_working_trees(self):
2128
        """For a repository with working trees, ('yes', ) is returned."""
2129
        backing = self.get_transport()
2130
        request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2131
        r = self.make_repository('.')
2132
        r.set_make_working_trees(True)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2133
        self.assertEqual(smart_req.SmartServerResponse((b'yes', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2134
                         request.execute(b'', ))
6263.2.1 by Jelmer Vernooij
Add hpss call ``Repository.make_working_trees``
2135
2136
    def test_is_not_shared(self):
2137
        """For a repository with working trees, ('no', ) is returned."""
2138
        backing = self.get_transport()
2139
        request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2140
        r = self.make_repository('.')
2141
        r.set_make_working_trees(False)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2142
        self.assertEqual(smart_req.SmartServerResponse((b'no', )),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2143
                         request.execute(b'', ))
6263.2.1 by Jelmer Vernooij
Add hpss call ``Repository.make_working_trees``
2144
2145
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
2146
class TestSmartServerRepositoryLockWrite(tests.TestCaseWithMemoryTransport):
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2147
2148
    def test_lock_write_on_unlocked_repo(self):
2149
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2150
        request = smart_repo.SmartServerRepositoryLockWrite(backing)
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
2151
        repository = self.make_repository('.', format='knit')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2152
        response = request.execute(b'')
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2153
        nonce = repository.control_files._lock.peek().get('nonce')
7143.15.2 by Jelmer Vernooij
Run autopep8.
2154
        self.assertEqual(smart_req.SmartServerResponse(
2155
            (b'ok', nonce)), response)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2156
        # The repository is now locked.  Verify that with a new repository
2157
        # object.
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
2158
        new_repo = repository.controldir.open_repository()
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2159
        self.assertRaises(errors.LockContention, new_repo.lock_write)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
2160
        # Cleanup
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2161
        request = smart_repo.SmartServerRepositoryUnlock(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2162
        response = request.execute(b'', nonce)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2163
2164
    def test_lock_write_on_locked_repo(self):
2165
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2166
        request = smart_repo.SmartServerRepositoryLockWrite(backing)
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
2167
        repository = self.make_repository('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
2168
        repo_token = repository.lock_write().repository_token
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2169
        repository.leave_lock_in_place()
2170
        repository.unlock()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2171
        response = request.execute(b'')
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2172
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2173
            smart_req.SmartServerResponse((b'LockContention',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
2174
        # Cleanup
2175
        repository.lock_write(repo_token)
2176
        repository.dont_leave_lock_in_place()
2177
        repository.unlock()
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2178
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
2179
    def test_lock_write_on_readonly_transport(self):
2180
        backing = self.get_readonly_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2181
        request = smart_repo.SmartServerRepositoryLockWrite(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2182
        self.make_repository('.', format='knit')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2183
        response = request.execute(b'')
2872.5.3 by Martin Pool
Pass back LockFailed from smart server lock methods
2184
        self.assertFalse(response.is_successful())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2185
        self.assertEqual(b'LockFailed', response.args[0])
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
2186
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2187
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2188
class TestInsertStreamBase(tests.TestCaseWithMemoryTransport):
2189
2190
    def make_empty_byte_stream(self, repo):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2191
        byte_stream = smart_repo._stream_to_byte_stream([], repo._format)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2192
        return b''.join(byte_stream)
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2193
2194
2195
class TestSmartServerRepositoryInsertStream(TestInsertStreamBase):
2196
2197
    def test_insert_stream_empty(self):
2198
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2199
        request = smart_repo.SmartServerRepositoryInsertStream(backing)
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2200
        repository = self.make_repository('.')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2201
        response = request.execute(b'', b'')
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2202
        self.assertEqual(None, response)
2203
        response = request.do_chunk(self.make_empty_byte_stream(repository))
2204
        self.assertEqual(None, response)
2205
        response = request.do_end()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2206
        self.assertEqual(smart_req.SmartServerResponse((b'ok', )), response)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2207
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2208
2209
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
2210
2211
    def test_insert_stream_empty(self):
2212
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2213
        request = smart_repo.SmartServerRepositoryInsertStreamLocked(
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2214
            backing)
2215
        repository = self.make_repository('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
2216
        lock_token = repository.lock_write().repository_token
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2217
        response = request.execute(b'', b'', lock_token)
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2218
        self.assertEqual(None, response)
2219
        response = request.do_chunk(self.make_empty_byte_stream(repository))
2220
        self.assertEqual(None, response)
2221
        response = request.do_end()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2222
        self.assertEqual(smart_req.SmartServerResponse((b'ok', )), response)
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2223
        repository.unlock()
2224
2225
    def test_insert_stream_with_wrong_lock_token(self):
2226
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2227
        request = smart_repo.SmartServerRepositoryInsertStreamLocked(
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2228
            backing)
2229
        repository = self.make_repository('.', format='knit')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2230
        with repository.lock_write():
2231
            self.assertRaises(
2232
                errors.TokenMismatch, request.execute, b'', b'',
2233
                b'wrong-token')
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
2234
2235
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
2236
class TestSmartServerRepositoryUnlock(tests.TestCaseWithMemoryTransport):
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2237
2238
    def test_unlock_on_locked_repo(self):
2239
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2240
        request = smart_repo.SmartServerRepositoryUnlock(backing)
3015.2.12 by Robert Collins
Make test_smart use specific formats as needed to exercise locked and unlocked repositories.
2241
        repository = self.make_repository('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
2242
        token = repository.lock_write().repository_token
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2243
        repository.leave_lock_in_place()
2244
        repository.unlock()
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2245
        response = request.execute(b'', token)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2246
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2247
            smart_req.SmartServerResponse((b'ok',)), response)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2248
        # The repository is now unlocked.  Verify that with a new repository
2249
        # object.
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
2250
        new_repo = repository.controldir.open_repository()
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2251
        new_repo.lock_write()
2252
        new_repo.unlock()
2253
2254
    def test_unlock_on_unlocked_repo(self):
2255
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2256
        request = smart_repo.SmartServerRepositoryUnlock(backing)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2257
        self.make_repository('.', format='knit')
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2258
        response = request.execute(b'', b'some token')
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2259
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2260
            smart_req.SmartServerResponse((b'TokenMismatch',)), response)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2261
2262
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
2263
class TestSmartServerRepositoryGetPhysicalLockStatus(
7143.15.2 by Jelmer Vernooij
Run autopep8.
2264
        tests.TestCaseWithTransport):
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
2265
6280.6.3 by Jelmer Vernooij
Fix test.
2266
    def test_with_write_lock(self):
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
2267
        backing = self.get_transport()
2268
        repo = self.make_repository('.')
6280.6.3 by Jelmer Vernooij
Fix test.
2269
        self.addCleanup(repo.lock_write().unlock)
2270
        # lock_write() doesn't necessarily actually take a physical
2271
        # lock out.
2272
        if repo.get_physical_lock_status():
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2273
            expected = b'yes'
6280.6.3 by Jelmer Vernooij
Fix test.
2274
        else:
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2275
            expected = b'no'
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
2276
        request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2277
        request = request_class(backing)
6280.6.3 by Jelmer Vernooij
Fix test.
2278
        self.assertEqual(smart_req.SuccessfulSmartServerResponse((expected,)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2279
                         request.execute(b'', ))
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
2280
6280.6.3 by Jelmer Vernooij
Fix test.
2281
    def test_without_write_lock(self):
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
2282
        backing = self.get_transport()
2283
        repo = self.make_repository('.')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
2284
        self.assertEqual(False, repo.get_physical_lock_status())
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
2285
        request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2286
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2287
        self.assertEqual(smart_req.SuccessfulSmartServerResponse((b'no',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2288
                         request.execute(b'', ))
6280.6.2 by Jelmer Vernooij
Add HPSS calls Repository.get_physical_lock_status and Branch.get_physical_lock_status.
2289
2290
6300.1.2 by Jelmer Vernooij
Add remote side of Repository.reconcile.
2291
class TestSmartServerRepositoryReconcile(tests.TestCaseWithTransport):
2292
2293
    def test_reconcile(self):
2294
        backing = self.get_transport()
2295
        repo = self.make_repository('.')
6300.1.7 by Jelmer Vernooij
Fix test.
2296
        token = repo.lock_write().repository_token
2297
        self.addCleanup(repo.unlock)
6300.1.2 by Jelmer Vernooij
Add remote side of Repository.reconcile.
2298
        request_class = smart_repo.SmartServerRepositoryReconcile
2299
        request = request_class(backing)
6300.1.4 by Jelmer Vernooij
Add reconcile results.
2300
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2301
            (b'ok', ),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2302
            b'garbage_inventories: 0\n'
2303
            b'inconsistent_parents: 0\n'),
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2304
            request.execute(b'', token))
6300.1.2 by Jelmer Vernooij
Add remote side of Repository.reconcile.
2305
2306
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
2307
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
2308
2309
    def test_is_readonly_no(self):
2310
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2311
        request = smart_req.SmartServerIsReadonly(backing)
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
2312
        response = request.execute()
2313
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2314
            smart_req.SmartServerResponse((b'no',)), response)
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
2315
2316
    def test_is_readonly_yes(self):
2317
        backing = self.get_readonly_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2318
        request = smart_req.SmartServerIsReadonly(backing)
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
2319
        response = request.execute()
2320
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2321
            smart_req.SmartServerResponse((b'yes',)), response)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2322
2323
2324
class TestSmartServerRepositorySetMakeWorkingTrees(
7143.15.2 by Jelmer Vernooij
Run autopep8.
2325
        tests.TestCaseWithMemoryTransport):
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
2326
2327
    def test_set_false(self):
2328
        backing = self.get_transport()
2329
        repo = self.make_repository('.', shared=True)
2330
        repo.set_make_working_trees(True)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2331
        request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
2332
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2333
        self.assertEqual(smart_req.SuccessfulSmartServerResponse((b'ok',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2334
                         request.execute(b'', b'False'))
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
2335
        repo = repo.controldir.open_repository()
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
2336
        self.assertFalse(repo.make_working_trees())
2337
2338
    def test_set_true(self):
2339
        backing = self.get_transport()
2340
        repo = self.make_repository('.', shared=True)
2341
        repo.set_make_working_trees(False)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2342
        request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
2343
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2344
        self.assertEqual(smart_req.SuccessfulSmartServerResponse((b'ok',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2345
                         request.execute(b'', b'True'))
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
2346
        repo = repo.controldir.open_repository()
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
2347
        self.assertTrue(repo.make_working_trees())
2348
2349
6280.5.2 by Jelmer Vernooij
New HPSS call VersionedFileRepository.get_serializer_format.
2350
class TestSmartServerRepositoryGetSerializerFormat(
7143.15.2 by Jelmer Vernooij
Run autopep8.
2351
        tests.TestCaseWithMemoryTransport):
6280.5.2 by Jelmer Vernooij
New HPSS call VersionedFileRepository.get_serializer_format.
2352
6280.5.4 by Jelmer Vernooij
Fix test name.
2353
    def test_get_serializer_format(self):
6280.5.2 by Jelmer Vernooij
New HPSS call VersionedFileRepository.get_serializer_format.
2354
        backing = self.get_transport()
2355
        repo = self.make_repository('.', format='2a')
2356
        request_class = smart_repo.SmartServerRepositoryGetSerializerFormat
2357
        request = request_class(backing)
2358
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2359
            smart_req.SuccessfulSmartServerResponse((b'ok', b'10')),
2360
            request.execute(b''))
6280.5.2 by Jelmer Vernooij
New HPSS call VersionedFileRepository.get_serializer_format.
2361
2362
6280.7.2 by Jelmer Vernooij
Add HPSS calls ``Repository.start_write_group``, ``Repository.abort_write_group`` and ``Repository.commit_write_group``.
2363
class TestSmartServerRepositoryWriteGroup(
7143.15.2 by Jelmer Vernooij
Run autopep8.
2364
        tests.TestCaseWithMemoryTransport):
6280.7.2 by Jelmer Vernooij
Add HPSS calls ``Repository.start_write_group``, ``Repository.abort_write_group`` and ``Repository.commit_write_group``.
2365
2366
    def test_start_write_group(self):
2367
        backing = self.get_transport()
2368
        repo = self.make_repository('.')
2369
        lock_token = repo.lock_write().repository_token
2370
        self.addCleanup(repo.unlock)
2371
        request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2372
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2373
        self.assertEqual(smart_req.SuccessfulSmartServerResponse((b'ok', [])),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2374
                         request.execute(b'', lock_token))
6280.7.9 by Jelmer Vernooij
test repositories with unsuspendable write groups.
2375
2376
    def test_start_write_group_unsuspendable(self):
2377
        backing = self.get_transport()
2378
        repo = self.make_repository('.', format='knit')
2379
        lock_token = repo.lock_write().repository_token
2380
        self.addCleanup(repo.unlock)
2381
        request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2382
        request = request_class(backing)
2383
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2384
            smart_req.FailedSmartServerResponse((b'UnsuspendableWriteGroup',)),
2385
            request.execute(b'', lock_token))
6280.7.2 by Jelmer Vernooij
Add HPSS calls ``Repository.start_write_group``, ``Repository.abort_write_group`` and ``Repository.commit_write_group``.
2386
2387
    def test_commit_write_group(self):
2388
        backing = self.get_transport()
2389
        repo = self.make_repository('.')
2390
        lock_token = repo.lock_write().repository_token
2391
        self.addCleanup(repo.unlock)
2392
        repo.start_write_group()
2393
        tokens = repo.suspend_write_group()
2394
        request_class = smart_repo.SmartServerRepositoryCommitWriteGroup
2395
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2396
        self.assertEqual(smart_req.SuccessfulSmartServerResponse((b'ok',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2397
                         request.execute(b'', lock_token, tokens))
6280.7.2 by Jelmer Vernooij
Add HPSS calls ``Repository.start_write_group``, ``Repository.abort_write_group`` and ``Repository.commit_write_group``.
2398
2399
    def test_abort_write_group(self):
2400
        backing = self.get_transport()
2401
        repo = self.make_repository('.')
2402
        lock_token = repo.lock_write().repository_token
2403
        repo.start_write_group()
2404
        tokens = repo.suspend_write_group()
2405
        self.addCleanup(repo.unlock)
2406
        request_class = smart_repo.SmartServerRepositoryAbortWriteGroup
2407
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2408
        self.assertEqual(smart_req.SuccessfulSmartServerResponse((b'ok',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2409
                         request.execute(b'', lock_token, tokens))
6280.7.2 by Jelmer Vernooij
Add HPSS calls ``Repository.start_write_group``, ``Repository.abort_write_group`` and ``Repository.commit_write_group``.
2410
6280.7.6 by Jelmer Vernooij
Fix remaining tests.
2411
    def test_check_write_group(self):
2412
        backing = self.get_transport()
2413
        repo = self.make_repository('.')
2414
        lock_token = repo.lock_write().repository_token
2415
        repo.start_write_group()
2416
        tokens = repo.suspend_write_group()
2417
        self.addCleanup(repo.unlock)
2418
        request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2419
        request = request_class(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2420
        self.assertEqual(smart_req.SuccessfulSmartServerResponse((b'ok',)),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2421
                         request.execute(b'', lock_token, tokens))
6280.7.6 by Jelmer Vernooij
Fix remaining tests.
2422
2423
    def test_check_write_group_invalid(self):
2424
        backing = self.get_transport()
2425
        repo = self.make_repository('.')
2426
        lock_token = repo.lock_write().repository_token
2427
        self.addCleanup(repo.unlock)
2428
        request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2429
        request = request_class(backing)
2430
        self.assertEqual(smart_req.FailedSmartServerResponse(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2431
            (b'UnresumableWriteGroup', [b'random'],
2432
                b'Malformed write group token')),
2433
            request.execute(b'', lock_token, [b"random"]))
6280.7.6 by Jelmer Vernooij
Fix remaining tests.
2434
6280.7.2 by Jelmer Vernooij
Add HPSS calls ``Repository.start_write_group``, ``Repository.abort_write_group`` and ``Repository.commit_write_group``.
2435
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2436
class TestSmartServerPackRepositoryAutopack(tests.TestCaseWithTransport):
2437
2438
    def make_repo_needing_autopacking(self, path='.'):
2439
        # Make a repo in need of autopacking.
2440
        tree = self.make_branch_and_tree('.', format='pack-0.92')
2441
        repo = tree.branch.repository
2442
        # monkey-patch the pack collection to disable autopacking
2443
        repo._pack_collection._max_pack_count = lambda count: count
2444
        for x in range(10):
2445
            tree.commit('commit %s' % x)
2446
        self.assertEqual(10, len(repo._pack_collection.names()))
2447
        del repo._pack_collection._max_pack_count
2448
        return repo
2449
2450
    def test_autopack_needed(self):
2451
        repo = self.make_repo_needing_autopacking()
4145.1.6 by Robert Collins
More test fallout, but all caught now.
2452
        repo.lock_write()
2453
        self.addCleanup(repo.unlock)
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2454
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2455
        request = smart_packrepo.SmartServerPackRepositoryAutopack(
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2456
            backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2457
        response = request.execute(b'')
2458
        self.assertEqual(smart_req.SmartServerResponse((b'ok',)), response)
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2459
        repo._pack_collection.reload_pack_names()
2460
        self.assertEqual(1, len(repo._pack_collection.names()))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2461
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2462
    def test_autopack_not_needed(self):
2463
        tree = self.make_branch_and_tree('.', format='pack-0.92')
2464
        repo = tree.branch.repository
4145.1.6 by Robert Collins
More test fallout, but all caught now.
2465
        repo.lock_write()
2466
        self.addCleanup(repo.unlock)
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2467
        for x in range(9):
2468
            tree.commit('commit %s' % x)
2469
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2470
        request = smart_packrepo.SmartServerPackRepositoryAutopack(
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2471
            backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2472
        response = request.execute(b'')
2473
        self.assertEqual(smart_req.SmartServerResponse((b'ok',)), response)
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2474
        repo._pack_collection.reload_pack_names()
2475
        self.assertEqual(9, len(repo._pack_collection.names()))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2476
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2477
    def test_autopack_on_nonpack_format(self):
3801.1.20 by Andrew Bennetts
Return ('ok',) rather than an error the autopack RPC is used on a non-pack repo.
2478
        """A request to autopack a non-pack repo is a no-op."""
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2479
        repo = self.make_repository('.', format='knit')
2480
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2481
        request = smart_packrepo.SmartServerPackRepositoryAutopack(
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2482
            backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2483
        response = request.execute(b'')
2484
        self.assertEqual(smart_req.SmartServerResponse((b'ok',)), response)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2485
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
2486
4760.2.5 by Andrew Bennetts
Add some more tests.
2487
class TestSmartServerVfsGet(tests.TestCaseWithMemoryTransport):
2488
2489
    def test_unicode_path(self):
2490
        """VFS requests expect unicode paths to be escaped."""
2491
        filename = u'foo\N{INTERROBANG}'
2492
        filename_escaped = urlutils.escape(filename)
2493
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2494
        request = vfs.GetRequest(backing)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2495
        backing.put_bytes_non_atomic(filename_escaped, b'contents')
2496
        self.assertEqual(smart_req.SmartServerResponse((b'ok', ), b'contents'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2497
                         request.execute(filename_escaped.encode('ascii')))
4760.2.5 by Andrew Bennetts
Add some more tests.
2498
2499
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
2500
class TestHandlers(tests.TestCase):
2501
    """Tests for the request.request_handlers object."""
2502
3526.3.1 by Andrew Bennetts
Remove registrations of defunct HPSS verbs.
2503
    def test_all_registrations_exist(self):
2504
        """All registered request_handlers can be found."""
2505
        # If there's a typo in a register_lazy call, this loop will fail with
2506
        # an AttributeError.
5050.78.5 by John Arbash Meinel
Merge the 2.1-client-read-reconnect-819604 (bug #819604) to bzr-2.2
2507
        for key in smart_req.request_handlers.keys():
2508
            try:
2509
                item = smart_req.request_handlers.get(key)
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
2510
            except AttributeError as e:
5050.78.5 by John Arbash Meinel
Merge the 2.1-client-read-reconnect-819604 (bug #819604) to bzr-2.2
2511
                raise AttributeError('failed to get %s: %s' % (key, e))
3526.3.1 by Andrew Bennetts
Remove registrations of defunct HPSS verbs.
2512
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
2513
    def assertHandlerEqual(self, verb, handler):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
2514
        self.assertEqual(smart_req.request_handlers.get(verb), handler)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
2515
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
2516
    def test_registered_methods(self):
2517
        """Test that known methods are registered to the correct object."""
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2518
        self.assertHandlerEqual(b'Branch.break_lock',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2519
                                smart_branch.SmartServerBranchBreakLock)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2520
        self.assertHandlerEqual(b'Branch.get_config_file',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2521
                                smart_branch.SmartServerBranchGetConfigFile)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2522
        self.assertHandlerEqual(b'Branch.put_config_file',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2523
                                smart_branch.SmartServerBranchPutConfigFile)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2524
        self.assertHandlerEqual(b'Branch.get_parent',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2525
                                smart_branch.SmartServerBranchGetParent)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2526
        self.assertHandlerEqual(b'Branch.get_physical_lock_status',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2527
                                smart_branch.SmartServerBranchRequestGetPhysicalLockStatus)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2528
        self.assertHandlerEqual(b'Branch.get_tags_bytes',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2529
                                smart_branch.SmartServerBranchGetTagsBytes)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2530
        self.assertHandlerEqual(b'Branch.lock_write',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2531
                                smart_branch.SmartServerBranchRequestLockWrite)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2532
        self.assertHandlerEqual(b'Branch.last_revision_info',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2533
                                smart_branch.SmartServerBranchRequestLastRevisionInfo)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2534
        self.assertHandlerEqual(b'Branch.revision_history',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2535
                                smart_branch.SmartServerRequestRevisionHistory)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2536
        self.assertHandlerEqual(b'Branch.revision_id_to_revno',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2537
                                smart_branch.SmartServerBranchRequestRevisionIdToRevno)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2538
        self.assertHandlerEqual(b'Branch.set_config_option',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2539
                                smart_branch.SmartServerBranchRequestSetConfigOption)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2540
        self.assertHandlerEqual(b'Branch.set_last_revision',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2541
                                smart_branch.SmartServerBranchRequestSetLastRevision)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2542
        self.assertHandlerEqual(b'Branch.set_last_revision_info',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2543
                                smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2544
        self.assertHandlerEqual(b'Branch.set_last_revision_ex',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2545
                                smart_branch.SmartServerBranchRequestSetLastRevisionEx)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2546
        self.assertHandlerEqual(b'Branch.set_parent_location',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2547
                                smart_branch.SmartServerBranchRequestSetParentLocation)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2548
        self.assertHandlerEqual(b'Branch.unlock',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2549
                                smart_branch.SmartServerBranchRequestUnlock)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2550
        self.assertHandlerEqual(b'BzrDir.destroy_branch',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2551
                                smart_dir.SmartServerBzrDirRequestDestroyBranch)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2552
        self.assertHandlerEqual(b'BzrDir.find_repository',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2553
                                smart_dir.SmartServerRequestFindRepositoryV1)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2554
        self.assertHandlerEqual(b'BzrDir.find_repositoryV2',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2555
                                smart_dir.SmartServerRequestFindRepositoryV2)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2556
        self.assertHandlerEqual(b'BzrDirFormat.initialize',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2557
                                smart_dir.SmartServerRequestInitializeBzrDir)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2558
        self.assertHandlerEqual(b'BzrDirFormat.initialize_ex_1.16',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2559
                                smart_dir.SmartServerRequestBzrDirInitializeEx)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2560
        self.assertHandlerEqual(b'BzrDir.checkout_metadir',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2561
                                smart_dir.SmartServerBzrDirRequestCheckoutMetaDir)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2562
        self.assertHandlerEqual(b'BzrDir.cloning_metadir',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2563
                                smart_dir.SmartServerBzrDirRequestCloningMetaDir)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2564
        self.assertHandlerEqual(b'BzrDir.get_branches',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2565
                                smart_dir.SmartServerBzrDirRequestGetBranches)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2566
        self.assertHandlerEqual(b'BzrDir.get_config_file',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2567
                                smart_dir.SmartServerBzrDirRequestConfigFile)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2568
        self.assertHandlerEqual(b'BzrDir.open_branch',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2569
                                smart_dir.SmartServerRequestOpenBranch)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2570
        self.assertHandlerEqual(b'BzrDir.open_branchV2',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2571
                                smart_dir.SmartServerRequestOpenBranchV2)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2572
        self.assertHandlerEqual(b'BzrDir.open_branchV3',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2573
                                smart_dir.SmartServerRequestOpenBranchV3)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2574
        self.assertHandlerEqual(b'PackRepository.autopack',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2575
                                smart_packrepo.SmartServerPackRepositoryAutopack)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2576
        self.assertHandlerEqual(b'Repository.add_signature_text',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2577
                                smart_repo.SmartServerRepositoryAddSignatureText)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2578
        self.assertHandlerEqual(b'Repository.all_revision_ids',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2579
                                smart_repo.SmartServerRepositoryAllRevisionIds)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2580
        self.assertHandlerEqual(b'Repository.break_lock',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2581
                                smart_repo.SmartServerRepositoryBreakLock)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2582
        self.assertHandlerEqual(b'Repository.gather_stats',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2583
                                smart_repo.SmartServerRepositoryGatherStats)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2584
        self.assertHandlerEqual(b'Repository.get_parent_map',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2585
                                smart_repo.SmartServerRepositoryGetParentMap)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2586
        self.assertHandlerEqual(b'Repository.get_physical_lock_status',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2587
                                smart_repo.SmartServerRepositoryGetPhysicalLockStatus)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2588
        self.assertHandlerEqual(b'Repository.get_rev_id_for_revno',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2589
                                smart_repo.SmartServerRepositoryGetRevIdForRevno)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2590
        self.assertHandlerEqual(b'Repository.get_revision_graph',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2591
                                smart_repo.SmartServerRepositoryGetRevisionGraph)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2592
        self.assertHandlerEqual(b'Repository.get_revision_signature_text',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2593
                                smart_repo.SmartServerRepositoryGetRevisionSignatureText)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2594
        self.assertHandlerEqual(b'Repository.get_stream',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2595
                                smart_repo.SmartServerRepositoryGetStream)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2596
        self.assertHandlerEqual(b'Repository.get_stream_1.19',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2597
                                smart_repo.SmartServerRepositoryGetStream_1_19)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2598
        self.assertHandlerEqual(b'Repository.iter_revisions',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2599
                                smart_repo.SmartServerRepositoryIterRevisions)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2600
        self.assertHandlerEqual(b'Repository.has_revision',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2601
                                smart_repo.SmartServerRequestHasRevision)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2602
        self.assertHandlerEqual(b'Repository.insert_stream',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2603
                                smart_repo.SmartServerRepositoryInsertStream)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2604
        self.assertHandlerEqual(b'Repository.insert_stream_locked',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2605
                                smart_repo.SmartServerRepositoryInsertStreamLocked)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2606
        self.assertHandlerEqual(b'Repository.is_shared',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2607
                                smart_repo.SmartServerRepositoryIsShared)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2608
        self.assertHandlerEqual(b'Repository.iter_files_bytes',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2609
                                smart_repo.SmartServerRepositoryIterFilesBytes)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2610
        self.assertHandlerEqual(b'Repository.lock_write',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2611
                                smart_repo.SmartServerRepositoryLockWrite)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2612
        self.assertHandlerEqual(b'Repository.make_working_trees',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2613
                                smart_repo.SmartServerRepositoryMakeWorkingTrees)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2614
        self.assertHandlerEqual(b'Repository.pack',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2615
                                smart_repo.SmartServerRepositoryPack)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2616
        self.assertHandlerEqual(b'Repository.reconcile',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2617
                                smart_repo.SmartServerRepositoryReconcile)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2618
        self.assertHandlerEqual(b'Repository.tarball',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2619
                                smart_repo.SmartServerRepositoryTarball)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2620
        self.assertHandlerEqual(b'Repository.unlock',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2621
                                smart_repo.SmartServerRepositoryUnlock)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2622
        self.assertHandlerEqual(b'Repository.start_write_group',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2623
                                smart_repo.SmartServerRepositoryStartWriteGroup)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2624
        self.assertHandlerEqual(b'Repository.check_write_group',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2625
                                smart_repo.SmartServerRepositoryCheckWriteGroup)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2626
        self.assertHandlerEqual(b'Repository.commit_write_group',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2627
                                smart_repo.SmartServerRepositoryCommitWriteGroup)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2628
        self.assertHandlerEqual(b'Repository.abort_write_group',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2629
                                smart_repo.SmartServerRepositoryAbortWriteGroup)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2630
        self.assertHandlerEqual(b'VersionedFileRepository.get_serializer_format',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2631
                                smart_repo.SmartServerRepositoryGetSerializerFormat)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2632
        self.assertHandlerEqual(b'VersionedFileRepository.get_inventories',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2633
                                smart_repo.SmartServerRepositoryGetInventories)
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2634
        self.assertHandlerEqual(b'Transport.is_readonly',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2635
                                smart_req.SmartServerIsReadonly)
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
2636
2637
2638
class SmartTCPServerHookTests(tests.TestCaseWithMemoryTransport):
2639
    """Tests for SmartTCPServer hooks."""
2640
2641
    def setUp(self):
2642
        super(SmartTCPServerHookTests, self).setUp()
2643
        self.server = server.SmartTCPServer(self.get_transport())
2644
2645
    def test_run_server_started_hooks(self):
2646
        """Test the server started hooks get fired properly."""
2647
        started_calls = []
2648
        server.SmartTCPServer.hooks.install_named_hook('server_started',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2649
                                                       lambda backing_urls, url: started_calls.append(
2650
                                                           (backing_urls, url)),
2651
                                                       None)
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
2652
        started_ex_calls = []
2653
        server.SmartTCPServer.hooks.install_named_hook('server_started_ex',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2654
                                                       lambda backing_urls, url: started_ex_calls.append(
2655
                                                           (backing_urls, url)),
2656
                                                       None)
5611.1.3 by Jelmer Vernooij
review comments from Vincent.
2657
        self.server._sockname = ('example.com', 42)
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
2658
        self.server.run_server_started_hooks()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
2659
        self.assertEqual(started_calls,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2660
                         [([self.get_transport().base], 'bzr://example.com:42/')])
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
2661
        self.assertEqual(started_ex_calls,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2662
                         [([self.get_transport().base], self.server)])
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
2663
2664
    def test_run_server_started_hooks_ipv6(self):
2665
        """Test that socknames can contain 4-tuples."""
2666
        self.server._sockname = ('::', 42, 0, 0)
2667
        started_calls = []
2668
        server.SmartTCPServer.hooks.install_named_hook('server_started',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2669
                                                       lambda backing_urls, url: started_calls.append(
2670
                                                           (backing_urls, url)),
2671
                                                       None)
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
2672
        self.server.run_server_started_hooks()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
2673
        self.assertEqual(started_calls,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2674
                         [([self.get_transport().base], 'bzr://:::42/')])
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
2675
2676
    def test_run_server_stopped_hooks(self):
2677
        """Test the server stopped hooks."""
5611.1.3 by Jelmer Vernooij
review comments from Vincent.
2678
        self.server._sockname = ('example.com', 42)
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
2679
        stopped_calls = []
2680
        server.SmartTCPServer.hooks.install_named_hook('server_stopped',
7143.15.2 by Jelmer Vernooij
Run autopep8.
2681
                                                       lambda backing_urls, url: stopped_calls.append(
2682
                                                           (backing_urls, url)),
2683
                                                       None)
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
2684
        self.server.run_server_stopped_hooks()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
2685
        self.assertEqual(stopped_calls,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2686
                         [([self.get_transport().base], 'bzr://example.com:42/')])
6305.2.2 by Jelmer Vernooij
Add smart side of pack.
2687
2688
2689
class TestSmartServerRepositoryPack(tests.TestCaseWithMemoryTransport):
2690
2691
    def test_pack(self):
2692
        backing = self.get_transport()
2693
        request = smart_repo.SmartServerRepositoryPack(backing)
2694
        tree = self.make_branch_and_memory_tree('.')
6305.2.4 by Jelmer Vernooij
Fix tests.
2695
        repo_token = tree.branch.repository.lock_write().repository_token
6305.2.2 by Jelmer Vernooij
Add smart side of pack.
2696
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2697
        self.assertIs(None, request.execute(b'', repo_token, False))
6305.2.3 by Jelmer Vernooij
Store hint in body.
2698
6305.2.2 by Jelmer Vernooij
Add smart side of pack.
2699
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2700
            smart_req.SuccessfulSmartServerResponse((b'ok', ), ),
2701
            request.do_body(b''))
6305.2.2 by Jelmer Vernooij
Add smart side of pack.
2702
6282.6.7 by Jelmer Vernooij
Add basic server side test.
2703
6282.6.28 by Jelmer Vernooij
Rename VersionedFileRepository.iter_inventories to VersionedFileRepository.get_inventories.
2704
class TestSmartServerRepositoryGetInventories(tests.TestCaseWithTransport):
6282.6.7 by Jelmer Vernooij
Add basic server side test.
2705
2706
    def _get_serialized_inventory_delta(self, repository, base_revid, revid):
6405.2.10 by Jelmer Vernooij
Fix more tests.
2707
        base_inv = repository.revision_tree(base_revid).root_inventory
2708
        inv = repository.revision_tree(revid).root_inventory
6282.6.7 by Jelmer Vernooij
Add basic server side test.
2709
        inv_delta = inv._make_delta(base_inv)
2710
        serializer = inventory_delta.InventoryDeltaSerializer(True, False)
6973.6.1 by Jelmer Vernooij
More bees.
2711
        return b"".join(serializer.delta_to_lines(base_revid, revid, inv_delta))
6282.6.7 by Jelmer Vernooij
Add basic server side test.
2712
2713
    def test_single(self):
2714
        backing = self.get_transport()
6282.6.28 by Jelmer Vernooij
Rename VersionedFileRepository.iter_inventories to VersionedFileRepository.get_inventories.
2715
        request = smart_repo.SmartServerRepositoryGetInventories(backing)
6282.6.36 by Jelmer Vernooij
Fix smart server tests.
2716
        t = self.make_branch_and_tree('.', format='2a')
6282.6.7 by Jelmer Vernooij
Add basic server side test.
2717
        self.addCleanup(t.lock_write().unlock)
6855.4.1 by Jelmer Vernooij
Yet more bees.
2718
        self.build_tree_contents([("file", b"somecontents")])
2719
        t.add(["file"], [b"thefileid"])
2720
        t.commit(rev_id=b'somerev', message="add file")
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2721
        self.assertIs(None, request.execute(b'', b'unordered'))
2722
        response = request.do_body(b"somerev\n")
6282.6.7 by Jelmer Vernooij
Add basic server side test.
2723
        self.assertTrue(response.is_successful())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2724
        self.assertEqual(response.args, (b"ok", ))
6282.6.43 by Jelmer Vernooij
Fix stream name.
2725
        stream = [('inventory-deltas', [
6973.7.8 by Jelmer Vernooij
Fix more tests.
2726
            versionedfile.FulltextContentFactory(b'somerev', None, None,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2727
                                                 self._get_serialized_inventory_delta(
2728
                                                     t.branch.repository, b'null:', b'somerev'))])]
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
2729
        fmt = controldir.format_registry.get('2a')().repository_format
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
2730
        self.assertEqual(
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2731
            b"".join(response.body_stream),
2732
            b"".join(smart_repo._stream_to_byte_stream(stream, fmt)))
6282.6.10 by Jelmer Vernooij
Fix smart tests.
2733
2734
    def test_empty(self):
2735
        backing = self.get_transport()
6282.6.28 by Jelmer Vernooij
Rename VersionedFileRepository.iter_inventories to VersionedFileRepository.get_inventories.
2736
        request = smart_repo.SmartServerRepositoryGetInventories(backing)
6282.6.33 by Jelmer Vernooij
Fix some tests.
2737
        t = self.make_branch_and_tree('.', format='2a')
6282.6.10 by Jelmer Vernooij
Fix smart tests.
2738
        self.addCleanup(t.lock_write().unlock)
6855.4.1 by Jelmer Vernooij
Yet more bees.
2739
        self.build_tree_contents([("file", b"somecontents")])
2740
        t.add(["file"], [b"thefileid"])
2741
        t.commit(rev_id=b'somerev', message="add file")
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2742
        self.assertIs(None, request.execute(b'', b'unordered'))
2743
        response = request.do_body(b"")
6282.6.10 by Jelmer Vernooij
Fix smart tests.
2744
        self.assertTrue(response.is_successful())
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
2745
        self.assertEqual(response.args, (b"ok", ))
2746
        self.assertEqual(b"".join(response.body_stream),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2747
                         b"Bazaar pack format 1 (introduced in 0.18)\nB54\n\nBazaar repository format 2a (needs bzr 1.16 or later)\nE")
6968.5.6 by Jelmer Vernooij
Add test.
2748
2749
6989.3.2 by Jelmer Vernooij
Add HPSS call get_stream_for_missing_keys.
2750
class TestSmartServerRepositoryGetStreamForMissingKeys(GetStreamTestBase):
2751
2752
    def test_missing(self):
2753
        """The search argument may be a 'ancestry-of' some heads'."""
2754
        backing = self.get_transport()
2755
        request = smart_repo.SmartServerRepositoryGetStreamForMissingKeys(
2756
            backing)
2757
        repo, r1, r2 = self.make_two_commit_repo()
2758
        request.execute(b'', repo._format.network_name())
2759
        lines = b'inventories\t' + r1
2760
        response = request.do_body(lines)
2761
        self.assertEqual((b'ok',), response.args)
2762
        stream_bytes = b''.join(response.body_stream)
2763
        self.assertStartsWith(stream_bytes, b'Bazaar pack format 1')
6989.3.3 by Jelmer Vernooij
merge trunk.
2764
6989.3.4 by Jelmer Vernooij
Deal with unknown formats.
2765
    def test_unknown_format(self):
2766
        """The format may not be known by the remote server."""
2767
        backing = self.get_transport()
2768
        request = smart_repo.SmartServerRepositoryGetStreamForMissingKeys(
2769
            backing)
2770
        repo, r1, r2 = self.make_two_commit_repo()
2771
        request.execute(b'', b'yada yada yada')
2772
        expected = smart_req.FailedSmartServerResponse(
2773
            (b'UnknownFormat', b'repository', b'yada yada yada'))
2774
6989.3.3 by Jelmer Vernooij
merge trunk.
2775
6968.5.6 by Jelmer Vernooij
Add test.
2776
class TestSmartServerRepositoryRevisionArchive(tests.TestCaseWithTransport):
2777
    def test_get(self):
2778
        backing = self.get_transport()
2779
        request = smart_repo.SmartServerRepositoryRevisionArchive(backing)
2780
        t = self.make_branch_and_tree('.')
2781
        self.addCleanup(t.lock_write().unlock)
2782
        self.build_tree_contents([("file", b"somecontents")])
2783
        t.add(["file"], [b"thefileid"])
2784
        t.commit(rev_id=b'somerev', message="add file")
6995 by Jelmer Vernooij
Merge lp:~jelmer/brz/hpss-archive.
2785
        response = request.execute(b'', b"somerev", b"tar", b"foo.tar", b"foo")
6968.5.6 by Jelmer Vernooij
Add test.
2786
        self.assertTrue(response.is_successful())
2787
        self.assertEqual(response.args, (b"ok", ))
2788
        b = BytesIO(b"".join(response.body_stream))
2789
        with tarfile.open(mode='r', fileobj=b) as tf:
2790
            self.assertEqual(['foo/file'], tf.getnames())
6997.6.5 by Jelmer Vernooij
Add tests.
2791
2792
2793
class TestSmartServerRepositoryAnnotateFileRevision(tests.TestCaseWithTransport):
2794
2795
    def test_get(self):
2796
        backing = self.get_transport()
2797
        request = smart_repo.SmartServerRepositoryAnnotateFileRevision(backing)
2798
        t = self.make_branch_and_tree('.')
2799
        self.addCleanup(t.lock_write().unlock)
2800
        self.build_tree_contents([("file", b"somecontents\nmorecontents\n")])
2801
        t.add(["file"], [b"thefileid"])
2802
        t.commit(rev_id=b'somerev', message="add file")
2803
        response = request.execute(b'', b"somerev", b"file")
2804
        self.assertTrue(response.is_successful())
2805
        self.assertEqual(response.args, (b"ok", ))
2806
        self.assertEqual(
7143.15.2 by Jelmer Vernooij
Run autopep8.
2807
            [[b'somerev', b'somecontents\n'], [b'somerev', b'morecontents\n']],
2808
            bencode.bdecode(response.body))