~bzr-pqm/bzr/bzr.dev

4988.10.5 by John Arbash Meinel
Merge bzr.dev 5021 to resolve NEWS
1
# Copyright (C) 2006-2010 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
2692.1.18 by Andrew Bennetts
Merge from bzr.dev.
28
from cStringIO import StringIO
2018.18.2 by Martin Pool
smart method Repository.tarball actually returns the tarball
29
import tarfile
30
2692.1.2 by Andrew Bennetts
Merge from bzr.dev.
31
from bzrlib import (
2694.5.4 by Jelmer Vernooij
Move bzrlib.util.bencode to bzrlib._bencode_py.
32
    bencode,
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
33
    branch as _mod_branch,
2692.1.2 by Andrew Bennetts
Merge from bzr.dev.
34
    bzrdir,
35
    errors,
36
    pack,
37
    tests,
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
38
    transport,
2692.1.2 by Andrew Bennetts
Merge from bzr.dev.
39
    urlutils,
4634.19.1 by Robert Collins
Combine adjacent substreams of the same type in bzrlib.smart.repository._byte_stream_to_stream.
40
    versionedfile,
2692.1.2 by Andrew Bennetts
Merge from bzr.dev.
41
    )
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
42
from bzrlib.smart import (
43
    branch as smart_branch,
44
    bzrdir as smart_dir,
45
    repository as smart_repo,
46
    packrepository as smart_packrepo,
47
    request as smart_req,
48
    server,
49
    vfs,
50
    )
5017.3.25 by Vincent Ladeuil
selftest -s bt.test_smart_transport passing
51
from bzrlib.tests import test_server
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
52
from bzrlib.transport import (
53
    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.
54
    memory,
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
55
    )
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
56
57
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
58
def load_tests(standard_tests, module, loader):
59
    """Multiply tests version and protocol consistency."""
60
    # FindRepository tests.
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
61
    scenarios = [
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
62
        ("find_repository", {
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
63
            "_request_class": smart_dir.SmartServerRequestFindRepositoryV1}),
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
64
        ("find_repositoryV2", {
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
65
            "_request_class": smart_dir.SmartServerRequestFindRepositoryV2}),
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
66
        ("find_repositoryV3", {
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
67
            "_request_class": smart_dir.SmartServerRequestFindRepositoryV3}),
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
68
        ]
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
69
    to_adapt, result = tests.split_suite_by_re(standard_tests,
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
70
        "TestSmartServerRequestFindRepository")
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
71
    v2_only, v1_and_2 = tests.split_suite_by_re(to_adapt,
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
72
        "_v2")
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
73
    tests.multiply_tests(v1_and_2, scenarios, result)
74
    # The first scenario is only applicable to v1 protocols, it is deleted
75
    # since.
76
    tests.multiply_tests(v2_only, scenarios[1:], result)
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
77
    return result
78
79
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
80
class TestCaseWithChrootedTransport(tests.TestCaseWithTransport):
81
82
    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.
83
        self.vfs_transport_factory = memory.MemoryServer
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
84
        tests.TestCaseWithTransport.setUp(self)
85
        self._chroot_server = None
86
87
    def get_transport(self, relpath=None):
88
        if self._chroot_server is None:
89
            backing_transport = tests.TestCaseWithTransport.get_transport(self)
90
            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,
91
            self.start_server(self._chroot_server)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
92
        t = transport.get_transport(self._chroot_server.get_url())
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
93
        if relpath is not None:
94
            t = t.clone(relpath)
95
        return t
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
96
97
4634.47.4 by Andrew Bennetts
Make more of bzrlib/tests/test_smart.py use MemoryTransport.
98
class TestCaseWithSmartMedium(tests.TestCaseWithMemoryTransport):
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
99
100
    def setUp(self):
101
        super(TestCaseWithSmartMedium, self).setUp()
102
        # We're allowed to set  the transport class here, so that we don't use
103
        # the default or a parameterized class, but rather use the
104
        # TestCaseWithTransport infrastructure to set up a smart server and
105
        # transport.
3245.4.28 by Andrew Bennetts
Remove another XXX, and include test ID in smart server thread names.
106
        self.transport_server = self.make_transport_server
107
108
    def make_transport_server(self):
5017.3.25 by Vincent Ladeuil
selftest -s bt.test_smart_transport passing
109
        return test_server.SmartTCPServer_for_testing('-' + self.id())
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
110
111
    def get_smart_medium(self):
112
        """Get a smart medium to use in tests."""
113
        return self.get_transport().get_smart_medium()
114
115
4634.19.1 by Robert Collins
Combine adjacent substreams of the same type in bzrlib.smart.repository._byte_stream_to_stream.
116
class TestByteStreamToStream(tests.TestCase):
117
118
    def test_repeated_substreams_same_kind_are_one_stream(self):
119
        # Make a stream - an iterable of bytestrings.
120
        stream = [('text', [versionedfile.FulltextContentFactory(('k1',), None,
121
            None, 'foo')]),('text', [
122
            versionedfile.FulltextContentFactory(('k2',), None, None, 'bar')])]
123
        fmt = bzrdir.format_registry.get('pack-0.92')().repository_format
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
124
        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.
125
        streams = []
126
        # Iterate the resulting iterable; checking that we get only one stream
127
        # out.
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
128
        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.
129
        for kind, substream in stream:
130
            streams.append((kind, list(substream)))
131
        self.assertLength(1, streams)
132
        self.assertLength(2, streams[0][1])
133
134
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
135
class TestSmartServerResponse(tests.TestCase):
136
137
    def test__eq__(self):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
138
        self.assertEqual(smart_req.SmartServerResponse(('ok', )),
139
            smart_req.SmartServerResponse(('ok', )))
140
        self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
141
            smart_req.SmartServerResponse(('ok', ), 'body'))
142
        self.assertNotEqual(smart_req.SmartServerResponse(('ok', )),
143
            smart_req.SmartServerResponse(('notok', )))
144
        self.assertNotEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
145
            smart_req.SmartServerResponse(('ok', )))
2018.5.41 by Robert Collins
Fix SmartServerResponse.__eq__ to handle None.
146
        self.assertNotEqual(None,
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
147
            smart_req.SmartServerResponse(('ok', )))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
148
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
149
    def test__str__(self):
150
        """SmartServerResponses can be stringified."""
151
        self.assertEqual(
3691.2.6 by Martin Pool
Disable RemoteBranch stacking, but get get_stacked_on_url working, and passing back exceptions
152
            "<SuccessfulSmartServerResponse args=('args',) body='body'>",
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
153
            str(smart_req.SuccessfulSmartServerResponse(('args',), 'body')))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
154
        self.assertEqual(
3691.2.6 by Martin Pool
Disable RemoteBranch stacking, but get get_stacked_on_url working, and passing back exceptions
155
            "<FailedSmartServerResponse args=('args',) body='body'>",
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
156
            str(smart_req.FailedSmartServerResponse(('args',), 'body')))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
157
158
159
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
160
161
    def test_translate_client_path(self):
162
        transport = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
163
        request = smart_req.SmartServerRequest(transport, 'foo/')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
164
        self.assertEqual('./', request.translate_client_path('foo/'))
165
        self.assertRaises(
166
            errors.InvalidURLJoin, request.translate_client_path, 'foo/..')
167
        self.assertRaises(
168
            errors.PathNotChild, request.translate_client_path, '/')
169
        self.assertRaises(
170
            errors.PathNotChild, request.translate_client_path, 'bar/')
171
        self.assertEqual('./baz', request.translate_client_path('foo/baz'))
4760.2.2 by Michael Hudson
test
172
        e_acute = u'\N{LATIN SMALL LETTER E WITH ACUTE}'.encode('utf-8')
173
        self.assertEqual('./' + urlutils.escape(e_acute),
174
                         request.translate_client_path('foo/' + e_acute))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
175
4760.2.5 by Andrew Bennetts
Add some more tests.
176
    def test_translate_client_path_vfs(self):
177
        """VfsRequests receive escaped paths rather than raw UTF-8."""
178
        transport = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
179
        request = vfs.VfsRequest(transport, 'foo/')
4760.2.5 by Andrew Bennetts
Add some more tests.
180
        e_acute = u'\N{LATIN SMALL LETTER E WITH ACUTE}'.encode('utf-8')
181
        escaped = urlutils.escape('foo/' + e_acute)
182
        self.assertEqual('./' + urlutils.escape(e_acute),
183
                         request.translate_client_path(escaped))
184
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
185
    def test_transport_from_client_path(self):
186
        transport = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
187
        request = smart_req.SmartServerRequest(transport, 'foo/')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
188
        self.assertEqual(
189
            transport.base,
190
            request.transport_from_client_path('foo/').base)
191
192
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
193
class TestSmartServerBzrDirRequestCloningMetaDir(
194
    tests.TestCaseWithMemoryTransport):
195
    """Tests for BzrDir.cloning_metadir."""
196
197
    def test_cloning_metadir(self):
198
        """When there is a bzrdir present, the call succeeds."""
199
        backing = self.get_transport()
200
        dir = self.make_bzrdir('.')
201
        local_result = dir.cloning_metadir()
202
        request_class = smart_dir.SmartServerBzrDirRequestCloningMetaDir
203
        request = request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
204
        expected = smart_req.SuccessfulSmartServerResponse(
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
205
            (local_result.network_name(),
206
            local_result.repository_format.network_name(),
4084.2.2 by Robert Collins
Review feedback.
207
            ('branch', local_result.get_branch_format().network_name())))
4070.7.4 by Andrew Bennetts
Deal with branch references better in BzrDir.cloning_metadir RPC (changes protocol).
208
        self.assertEqual(expected, request.execute('', 'False'))
209
210
    def test_cloning_metadir_reference(self):
4160.2.9 by Andrew Bennetts
Fix BzrDir.cloning_metadir RPC to fail on branch references, and make
211
        """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).
212
        backing = self.get_transport()
213
        referenced_branch = self.make_branch('referenced')
214
        dir = self.make_bzrdir('.')
215
        local_result = dir.cloning_metadir()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
216
        reference = _mod_branch.BranchReferenceFormat().initialize(
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
217
            dir, target_branch=referenced_branch)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
218
        reference_url = _mod_branch.BranchReferenceFormat().get_reference(dir)
4070.7.4 by Andrew Bennetts
Deal with branch references better in BzrDir.cloning_metadir RPC (changes protocol).
219
        # The server shouldn't try to follow the branch reference, so it's fine
220
        # if the referenced branch isn't reachable.
221
        backing.rename('referenced', 'moved')
222
        request_class = smart_dir.SmartServerBzrDirRequestCloningMetaDir
223
        request = request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
224
        expected = smart_req.FailedSmartServerResponse(('BranchReference',))
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
225
        self.assertEqual(expected, request.execute('', 'False'))
226
227
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
228
class TestSmartServerRequestCreateRepository(tests.TestCaseWithMemoryTransport):
229
    """Tests for BzrDir.create_repository."""
230
231
    def test_makes_repository(self):
232
        """When there is a bzrdir present, the call succeeds."""
233
        backing = self.get_transport()
234
        self.make_bzrdir('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
235
        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.
236
        request = request_class(backing)
4606.3.1 by Robert Collins
Make test_smart tests more stable when the default format changes.
237
        reference_bzrdir_format = bzrdir.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.
238
        reference_format = reference_bzrdir_format.repository_format
239
        network_name = reference_format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
240
        expected = smart_req.SuccessfulSmartServerResponse(
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
241
            ('ok', 'no', 'no', 'no', network_name))
242
        self.assertEqual(expected, request.execute('', network_name, 'True'))
243
244
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
245
class TestSmartServerRequestFindRepository(tests.TestCaseWithMemoryTransport):
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
246
    """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.
247
248
    def test_no_repository(self):
249
        """When there is no repository to be found, ('norepository', ) is returned."""
250
        backing = self.get_transport()
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
251
        request = self._request_class(backing)
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
252
        self.make_bzrdir('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
253
        self.assertEqual(smart_req.SmartServerResponse(('norepository', )),
2692.1.19 by Andrew Bennetts
Tweak for consistency suggested by John's review.
254
            request.execute(''))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
255
256
    def test_nonshared_repository(self):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
257
        # nonshared repositorys only allow 'find' to return a handle when the
258
        # 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.
259
        # the repository is at.
260
        backing = self.get_transport()
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
261
        request = self._request_class(backing)
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
262
        result = self._make_repository_and_result()
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
263
        self.assertEqual(result, request.execute(''))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
264
        self.make_bzrdir('subdir')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
265
        self.assertEqual(smart_req.SmartServerResponse(('norepository', )),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
266
            request.execute('subdir'))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
267
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
268
    def _make_repository_and_result(self, shared=False, format=None):
269
        """Convenience function to setup a repository.
270
271
        :result: The SmartServerResponse to expect when opening it.
272
        """
273
        repo = self.make_repository('.', shared=shared, format=format)
274
        if repo.supports_rich_root():
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
275
            rich_root = 'yes'
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
276
        else:
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
277
            rich_root = 'no'
2018.5.138 by Robert Collins
Merge bzr.dev.
278
        if repo._format.supports_tree_reference:
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
279
            subtrees = 'yes'
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
280
        else:
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
281
            subtrees = 'no'
4606.3.1 by Robert Collins
Make test_smart tests more stable when the default format changes.
282
        if repo._format.supports_external_lookups:
283
            external = 'yes'
284
        else:
285
            external = 'no'
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
286
        if (smart_dir.SmartServerRequestFindRepositoryV3 ==
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
287
            self._request_class):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
288
            return smart_req.SuccessfulSmartServerResponse(
4606.3.1 by Robert Collins
Make test_smart tests more stable when the default format changes.
289
                ('ok', '', rich_root, subtrees, external,
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
290
                 repo._format.network_name()))
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
291
        elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
292
            self._request_class):
293
            # All tests so far are on formats, and for non-external
294
            # repositories.
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
295
            return smart_req.SuccessfulSmartServerResponse(
4606.3.1 by Robert Collins
Make test_smart tests more stable when the default format changes.
296
                ('ok', '', rich_root, subtrees, external))
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
297
        else:
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
298
            return smart_req.SuccessfulSmartServerResponse(
299
                ('ok', '', rich_root, subtrees))
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
300
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
301
    def test_shared_repository(self):
302
        """When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
303
        backing = self.get_transport()
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
304
        request = self._request_class(backing)
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
305
        result = self._make_repository_and_result(shared=True)
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
306
        self.assertEqual(result, request.execute(''))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
307
        self.make_bzrdir('subdir')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
308
        result2 = smart_req.SmartServerResponse(
309
            result.args[0:1] + ('..', ) + result.args[2:])
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
310
        self.assertEqual(result2,
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
311
            request.execute('subdir'))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
312
        self.make_bzrdir('subdir/deeper')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
313
        result3 = smart_req.SmartServerResponse(
314
            result.args[0:1] + ('../..', ) + result.args[2:])
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
315
        self.assertEqual(result3,
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
316
            request.execute('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.
317
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
318
    def test_rich_root_and_subtree_encoding(self):
319
        """Test for the format attributes for rich root and subtree support."""
320
        backing = self.get_transport()
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
321
        request = self._request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
322
        result = self._make_repository_and_result(
323
            format='dirstate-with-subtree')
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
324
        # check the test will be valid
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
325
        self.assertEqual('yes', result.args[2])
326
        self.assertEqual('yes', result.args[3])
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
327
        self.assertEqual(result, request.execute(''))
328
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
329
    def test_supports_external_lookups_no_v2(self):
330
        """Test for the supports_external_lookups attribute."""
331
        backing = self.get_transport()
332
        request = self._request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
333
        result = self._make_repository_and_result(
334
            format='dirstate-with-subtree')
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
335
        # check the test will be valid
336
        self.assertEqual('no', result.args[4])
2692.1.24 by Andrew Bennetts
Merge from bzr.dev.
337
        self.assertEqual(result, request.execute(''))
338
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
339
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
340
class TestSmartServerBzrDirRequestGetConfigFile(
341
    tests.TestCaseWithMemoryTransport):
342
    """Tests for BzrDir.get_config_file."""
343
344
    def test_present(self):
345
        backing = self.get_transport()
346
        dir = self.make_bzrdir('.')
347
        dir.get_config().set_default_stack_on("/")
348
        local_result = dir._get_config()._get_config_file().read()
349
        request_class = smart_dir.SmartServerBzrDirRequestConfigFile
350
        request = request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
351
        expected = smart_req.SuccessfulSmartServerResponse((), local_result)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
352
        self.assertEqual(expected, request.execute(''))
353
354
    def test_missing(self):
355
        backing = self.get_transport()
356
        dir = self.make_bzrdir('.')
357
        request_class = smart_dir.SmartServerBzrDirRequestConfigFile
358
        request = request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
359
        expected = smart_req.SuccessfulSmartServerResponse((), '')
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
360
        self.assertEqual(expected, request.execute(''))
361
362
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
363
class TestSmartServerRequestInitializeBzrDir(tests.TestCaseWithMemoryTransport):
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
364
365
    def test_empty_dir(self):
366
        """Initializing an empty dir should succeed and do it."""
367
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
368
        request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
369
        self.assertEqual(smart_req.SmartServerResponse(('ok', )),
2692.1.20 by Andrew Bennetts
Tweak for consistency suggested by John's review.
370
            request.execute(''))
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
371
        made_dir = bzrdir.BzrDir.open_from_transport(backing)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
372
        # 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 :).
373
        # default formart.
374
        self.assertRaises(errors.NoWorkingTree, made_dir.open_workingtree)
375
        self.assertRaises(errors.NotBranchError, made_dir.open_branch)
376
        self.assertRaises(errors.NoRepositoryPresent, made_dir.open_repository)
377
378
    def test_missing_dir(self):
379
        """Initializing a missing directory should fail like the bzrdir api."""
380
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
381
        request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
382
        self.assertRaises(errors.NoSuchFile,
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
383
            request.execute, 'subdir')
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
384
385
    def test_initialized_dir(self):
386
        """Initializing an extant bzrdir should fail like the bzrdir api."""
387
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
388
        request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
389
        self.make_bzrdir('subdir')
390
        self.assertRaises(errors.FileExists,
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
391
            request.execute, 'subdir')
392
393
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
394
class TestSmartServerRequestBzrDirInitializeEx(
395
    tests.TestCaseWithMemoryTransport):
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
396
    """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.
397
4294.2.10 by Robert Collins
Review feedback.
398
    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.
399
    """
400
401
    def test_empty_dir(self):
402
        """Initializing an empty dir should succeed and do it."""
403
        backing = self.get_transport()
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
404
        name = self.make_bzrdir('reference')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
405
        request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
406
        self.assertEqual(
407
            smart_req.SmartServerResponse(('', '', '', '', '', '', name,
408
                                           'False', '', '', '')),
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
409
            request.execute(name, '', 'True', 'False', 'False', '', '', '', '',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
410
                            'False'))
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
411
        made_dir = bzrdir.BzrDir.open_from_transport(backing)
412
        # no branch, tree or repository is expected with the current
4294.2.10 by Robert Collins
Review feedback.
413
        # default format.
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
414
        self.assertRaises(errors.NoWorkingTree, made_dir.open_workingtree)
415
        self.assertRaises(errors.NotBranchError, made_dir.open_branch)
416
        self.assertRaises(errors.NoRepositoryPresent, made_dir.open_repository)
417
418
    def test_missing_dir(self):
419
        """Initializing a missing directory should fail like the bzrdir api."""
420
        backing = self.get_transport()
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
421
        name = self.make_bzrdir('reference')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
422
        request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
423
        self.assertRaises(errors.NoSuchFile, request.execute, name,
424
            'subdir/dir', 'False', 'False', 'False', '', '', '', '', 'False')
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
425
426
    def test_initialized_dir(self):
4416.3.4 by Jonathan Lange
Fix a typo.
427
        """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.
428
        backing = self.get_transport()
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
429
        name = self.make_bzrdir('reference')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
430
        request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
431
        self.make_bzrdir('subdir')
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
432
        self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
433
            'False', 'False', 'False', '', '', '', '', 'False')
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
434
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.
435
436
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
437
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.
438
    def test_no_directory(self):
439
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
440
        request = smart_dir.SmartServerRequestOpenBzrDir(backing)
441
        self.assertEqual(smart_req.SmartServerResponse(('no', )),
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.
442
            request.execute('does-not-exist'))
443
444
    def test_empty_directory(self):
445
        backing = self.get_transport()
446
        backing.mkdir('empty')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
447
        request = smart_dir.SmartServerRequestOpenBzrDir(backing)
448
        self.assertEqual(smart_req.SmartServerResponse(('no', )),
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.
449
            request.execute('empty'))
450
451
    def test_outside_root_client_path(self):
452
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
453
        request = smart_dir.SmartServerRequestOpenBzrDir(backing,
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.
454
            root_client_path='root')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
455
        self.assertEqual(smart_req.SmartServerResponse(('no', )),
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.
456
            request.execute('not-root'))
457
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
458
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.
459
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
460
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.
461
    def test_no_directory(self):
462
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
463
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
464
        self.assertEqual(smart_req.SmartServerResponse(('no', )),
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.
465
            request.execute('does-not-exist'))
466
467
    def test_empty_directory(self):
468
        backing = self.get_transport()
469
        backing.mkdir('empty')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
470
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
471
        self.assertEqual(smart_req.SmartServerResponse(('no', )),
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.
472
            request.execute('empty'))
473
474
    def test_present_without_workingtree(self):
475
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
476
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
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.
477
        self.make_bzrdir('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
478
        self.assertEqual(smart_req.SmartServerResponse(('yes', 'no')),
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.
479
            request.execute(''))
480
4634.47.6 by Andrew Bennetts
Give 'no' response for paths outside the root_client_path.
481
    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.
482
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
483
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing,
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.
484
            root_client_path='root')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
485
        self.assertEqual(smart_req.SmartServerResponse(('no',)),
4634.47.6 by Andrew Bennetts
Give 'no' response for paths outside the root_client_path.
486
            request.execute('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.
487
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
488
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.
489
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
490
491
    def test_present_with_workingtree(self):
5017.3.26 by Vincent Ladeuil
./bzr selftest -s bt.test_smart passing
492
        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.
493
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
494
        request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
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.
495
        bd = self.make_bzrdir('.')
496
        bd.create_repository()
497
        bd.create_branch()
498
        bd.create_workingtree()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
499
        self.assertEqual(smart_req.SmartServerResponse(('yes', 'yes')),
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.
500
            request.execute(''))
501
502
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
503
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
504
505
    def test_no_branch(self):
506
        """When there is no branch, ('nobranch', ) is returned."""
507
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
508
        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.
509
        self.make_bzrdir('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
510
        self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
2692.1.20 by Andrew Bennetts
Tweak for consistency suggested by John's review.
511
            request.execute(''))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
512
513
    def test_branch(self):
514
        """When there is a branch, 'ok' is returned."""
515
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
516
        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.
517
        self.make_branch('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
518
        self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
2692.1.20 by Andrew Bennetts
Tweak for consistency suggested by John's review.
519
            request.execute(''))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
520
521
    def test_branch_reference(self):
522
        """When there is a branch reference, the reference URL is returned."""
5017.3.26 by Vincent Ladeuil
./bzr selftest -s bt.test_smart passing
523
        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.
524
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
525
        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.
526
        branch = self.make_branch('branch')
527
        checkout = branch.create_checkout('reference',lightweight=True)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
528
        reference_url = _mod_branch.BranchReferenceFormat().get_reference(
529
            checkout.bzrdir)
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
530
        self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
531
        self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
2692.1.20 by Andrew Bennetts
Tweak for consistency suggested by John's review.
532
            request.execute('reference'))
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
533
4734.4.5 by Brian de Alwis
Address comments from Aaron Bentley
534
    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
535
        """When there is a repository, the error should return details."""
536
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
537
        request = smart_dir.SmartServerRequestOpenBranch(backing)
4734.4.4 by Brian de Alwis
Added tests to ensure branching-from-repository error returns detail
538
        repo = self.make_repository('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
539
        self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
4734.4.4 by Brian de Alwis
Added tests to ensure branching-from-repository error returns detail
540
            request.execute(''))
541
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
542
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.
543
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
544
545
    def test_no_branch(self):
546
        """When there is no branch, ('nobranch', ) is returned."""
547
        backing = self.get_transport()
548
        self.make_bzrdir('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
549
        request = smart_dir.SmartServerRequestOpenBranchV2(backing)
550
        self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
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.
551
            request.execute(''))
552
553
    def test_branch(self):
554
        """When there is a branch, 'ok' is returned."""
555
        backing = self.get_transport()
556
        expected = self.make_branch('.')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
557
        request = smart_dir.SmartServerRequestOpenBranchV2(backing)
558
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
559
                ('branch', expected)),
560
                         request.execute(''))
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.
561
562
    def test_branch_reference(self):
563
        """When there is a branch reference, the reference URL is returned."""
5017.3.26 by Vincent Ladeuil
./bzr selftest -s bt.test_smart passing
564
        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.
565
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
566
        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.
567
        branch = self.make_branch('branch')
568
        checkout = branch.create_checkout('reference',lightweight=True)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
569
        reference_url = _mod_branch.BranchReferenceFormat().get_reference(
570
            checkout.bzrdir)
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.
571
        self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
572
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
573
                ('ref', reference_url)),
574
                         request.execute('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.
575
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
576
    def test_stacked_branch(self):
577
        """Opening a stacked branch does not open the stacked-on branch."""
578
        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.
579
        feature = self.make_branch('feature')
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
580
        feature.set_stacked_on_url(trunk.base)
581
        opened_branches = []
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
582
        _mod_branch.Branch.hooks.install_named_hook(
583
            'open', opened_branches.append, None)
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
584
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
585
        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.
586
        request.setup_jail()
587
        try:
588
            response = request.execute('feature')
589
        finally:
590
            request.teardown_jail()
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
591
        expected_format = feature._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
592
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
593
                ('branch', expected_format)),
594
                         response)
4160.2.1 by Andrew Bennetts
Failing test for BzrDir.open_branchV2 RPC not opening stacked-on branch.
595
        self.assertLength(1, opened_branches)
596
4734.4.5 by Brian de Alwis
Address comments from Aaron Bentley
597
    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
598
        """When there is a repository, the error should return details."""
599
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
600
        request = smart_dir.SmartServerRequestOpenBranchV2(backing)
4734.4.4 by Brian de Alwis
Added tests to ensure branching-from-repository error returns detail
601
        repo = self.make_repository('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
602
        self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
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).
603
            request.execute(''))
604
605
606
class TestSmartServerRequestOpenBranchV3(TestCaseWithChrootedTransport):
607
608
    def test_no_branch(self):
609
        """When there is no branch, ('nobranch', ) is returned."""
610
        backing = self.get_transport()
611
        self.make_bzrdir('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
612
        request = smart_dir.SmartServerRequestOpenBranchV3(backing)
613
        self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
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).
614
            request.execute(''))
615
616
    def test_branch(self):
617
        """When there is a branch, 'ok' is returned."""
618
        backing = self.get_transport()
619
        expected = self.make_branch('.')._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
620
        request = smart_dir.SmartServerRequestOpenBranchV3(backing)
621
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
622
                ('branch', expected)),
623
                         request.execute(''))
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).
624
625
    def test_branch_reference(self):
626
        """When there is a branch reference, the reference URL is returned."""
5017.3.26 by Vincent Ladeuil
./bzr selftest -s bt.test_smart passing
627
        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).
628
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
629
        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).
630
        branch = self.make_branch('branch')
631
        checkout = branch.create_checkout('reference',lightweight=True)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
632
        reference_url = _mod_branch.BranchReferenceFormat().get_reference(
633
            checkout.bzrdir)
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).
634
        self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
635
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
636
                ('ref', reference_url)),
637
                         request.execute('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).
638
639
    def test_stacked_branch(self):
640
        """Opening a stacked branch does not open the stacked-on branch."""
641
        trunk = self.make_branch('trunk')
642
        feature = self.make_branch('feature')
643
        feature.set_stacked_on_url(trunk.base)
644
        opened_branches = []
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
645
        _mod_branch.Branch.hooks.install_named_hook(
646
            '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).
647
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
648
        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).
649
        request.setup_jail()
650
        try:
651
            response = request.execute('feature')
652
        finally:
653
            request.teardown_jail()
654
        expected_format = feature._format.network_name()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
655
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(
656
                ('branch', expected_format)),
657
                         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).
658
        self.assertLength(1, opened_branches)
659
660
    def test_notification_on_branch_from_repository(self):
661
        """When there is a repository, the error should return details."""
662
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
663
        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).
664
        repo = self.make_repository('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
665
        self.assertEqual(smart_req.SmartServerResponse(
666
                ('nobranch', 'location is a repository')),
667
                         request.execute(''))
4734.4.4 by Brian de Alwis
Added tests to ensure branching-from-repository error returns detail
668
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.
669
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
670
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
671
672
    def test_empty(self):
673
        """For an empty branch, the body is empty."""
674
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
675
        request = smart_branch.SmartServerRequestRevisionHistory(backing)
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
676
        self.make_branch('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
677
        self.assertEqual(smart_req.SmartServerResponse(('ok', ), ''),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
678
            request.execute(''))
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
679
680
    def test_not_empty(self):
681
        """For a non-empty branch, the body is empty."""
682
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
683
        request = smart_branch.SmartServerRequestRevisionHistory(backing)
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
684
        tree = self.make_branch_and_memory_tree('.')
685
        tree.lock_write()
686
        tree.add('')
687
        r1 = tree.commit('1st commit')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
688
        r2 = tree.commit('2nd commit', rev_id=u'\xc8'.encode('utf-8'))
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
689
        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.
690
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
691
            smart_req.SmartServerResponse(('ok', ), ('\x00'.join([r1, r2]))),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
692
            request.execute(''))
693
694
695
class TestSmartServerBranchRequest(tests.TestCaseWithMemoryTransport):
2018.5.49 by Wouter van Heyst
Refactor SmartServerBranchRequest out from SmartServerRequestRevisionHistory to
696
697
    def test_no_branch(self):
698
        """When there is a bzrdir and no branch, NotBranchError is raised."""
699
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
700
        request = smart_branch.SmartServerBranchRequest(backing)
2018.5.49 by Wouter van Heyst
Refactor SmartServerBranchRequest out from SmartServerRequestRevisionHistory to
701
        self.make_bzrdir('.')
702
        self.assertRaises(errors.NotBranchError,
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
703
            request.execute, '')
2018.5.49 by Wouter van Heyst
Refactor SmartServerBranchRequest out from SmartServerRequestRevisionHistory to
704
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
705
    def test_branch_reference(self):
706
        """When there is a branch reference, NotBranchError is raised."""
707
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
708
        request = smart_branch.SmartServerBranchRequest(backing)
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
709
        branch = self.make_branch('branch')
710
        checkout = branch.create_checkout('reference',lightweight=True)
711
        self.assertRaises(errors.NotBranchError,
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
712
            request.execute, 'checkout')
713
714
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
    tests.TestCaseWithMemoryTransport):
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
717
718
    def test_empty(self):
2018.5.170 by Andrew Bennetts
Use 'null:' instead of '' to mean NULL_REVISION on the wire.
719
        """For an empty branch, the result is ('ok', '0', 'null:')."""
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
720
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
721
        request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
722
        self.make_branch('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
723
        self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
724
            request.execute(''))
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
725
726
    def test_not_empty(self):
727
        """For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
729
        request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
730
        tree = self.make_branch_and_memory_tree('.')
731
        tree.lock_write()
732
        tree.add('')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
733
        rev_id_utf8 = u'\xc8'.encode('utf-8')
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
734
        r1 = tree.commit('1st commit')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
735
        r2 = tree.commit('2nd commit', rev_id=rev_id_utf8)
2018.5.50 by Wouter van Heyst
Add SmartServerBranchRequestLastRevisionInfo method.
736
        tree.unlock()
737
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
738
            smart_req.SmartServerResponse(('ok', '2', rev_id_utf8)),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
739
            request.execute(''))
740
741
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
742
class TestSmartServerBranchRequestGetConfigFile(
743
    tests.TestCaseWithMemoryTransport):
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
744
745
    def test_default(self):
746
        """With no file, we get empty content."""
747
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
748
        request = smart_branch.SmartServerBranchGetConfigFile(backing)
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
749
        branch = self.make_branch('.')
750
        # there should be no file by default
751
        content = ''
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
752
        self.assertEqual(smart_req.SmartServerResponse(('ok', ), content),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
753
            request.execute(''))
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
754
755
    def test_with_content(self):
756
        # SmartServerBranchGetConfigFile should return the content from
757
        # branch.control_files.get('branch.conf') for now - in the future it may
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
758
        # perform more complex processing.
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
759
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
760
        request = smart_branch.SmartServerBranchGetConfigFile(backing)
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
761
        branch = self.make_branch('.')
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
762
        branch._transport.put_bytes('branch.conf', 'foo bar baz')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
763
        self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'foo bar baz'),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
764
            request.execute(''))
765
766
4226.2.1 by Robert Collins
Set branch config options via a smart method.
767
class TestLockedBranch(tests.TestCaseWithMemoryTransport):
768
769
    def get_lock_tokens(self, branch):
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
770
        branch_token = branch.lock_write().branch_token
771
        repo_token = branch.repository.lock_write().repository_token
4226.2.1 by Robert Collins
Set branch config options via a smart method.
772
        branch.repository.unlock()
773
        return branch_token, repo_token
774
775
776
class TestSmartServerBranchRequestSetConfigOption(TestLockedBranch):
777
778
    def test_value_name(self):
779
        branch = self.make_branch('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
780
        request = smart_branch.SmartServerBranchRequestSetConfigOption(
4226.2.1 by Robert Collins
Set branch config options via a smart method.
781
            branch.bzrdir.root_transport)
782
        branch_token, repo_token = self.get_lock_tokens(branch)
783
        config = branch._get_config()
784
        result = request.execute('', branch_token, repo_token, 'bar', 'foo',
785
            '')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
786
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
4226.2.1 by Robert Collins
Set branch config options via a smart method.
787
        self.assertEqual('bar', config.get_option('foo'))
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
788
        # Cleanup
789
        branch.unlock()
4226.2.1 by Robert Collins
Set branch config options via a smart method.
790
791
    def test_value_name_section(self):
792
        branch = self.make_branch('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
793
        request = smart_branch.SmartServerBranchRequestSetConfigOption(
4226.2.1 by Robert Collins
Set branch config options via a smart method.
794
            branch.bzrdir.root_transport)
795
        branch_token, repo_token = self.get_lock_tokens(branch)
796
        config = branch._get_config()
797
        result = request.execute('', branch_token, repo_token, 'bar', 'foo',
798
            'gam')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
799
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
4226.2.1 by Robert Collins
Set branch config options via a smart method.
800
        self.assertEqual('bar', config.get_option('foo', 'gam'))
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
801
        # Cleanup
802
        branch.unlock()
4226.2.1 by Robert Collins
Set branch config options via a smart method.
803
804
5227.1.2 by Andrew Bennetts
Add Branch.set_config_option_dict RPC (and VFS fallback), fixes #430382.
805
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
806
807
    def setUp(self):
808
        TestLockedBranch.setUp(self)
809
        # A dict with non-ascii keys and values to exercise unicode
810
        # roundtripping.
811
        self.encoded_value_dict = (
812
            'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
813
        self.value_dict = {
814
            'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
815
816
    def test_value_name(self):
817
        branch = self.make_branch('.')
818
        request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
819
            branch.bzrdir.root_transport)
820
        branch_token, repo_token = self.get_lock_tokens(branch)
821
        config = branch._get_config()
822
        result = request.execute('', branch_token, repo_token,
823
            self.encoded_value_dict, 'foo', '')
824
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
825
        self.assertEqual(self.value_dict, config.get_option('foo'))
826
        # Cleanup
827
        branch.unlock()
828
829
    def test_value_name_section(self):
830
        branch = self.make_branch('.')
831
        request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
832
            branch.bzrdir.root_transport)
833
        branch_token, repo_token = self.get_lock_tokens(branch)
834
        config = branch._get_config()
835
        result = request.execute('', branch_token, repo_token,
836
            self.encoded_value_dict, 'foo', 'gam')
837
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
838
        self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
839
        # Cleanup
840
        branch.unlock()
841
842
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
843
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
844
    # Only called when the branch format and tags match [yay factory
845
    # methods] so only need to test straight forward cases.
846
847
    def test_set_bytes(self):
848
        base_branch = self.make_branch('base')
849
        tag_bytes = base_branch._get_tags_bytes()
850
        # get_lock_tokens takes out a lock.
851
        branch_token, repo_token = self.get_lock_tokens(base_branch)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
852
        request = smart_branch.SmartServerBranchSetTagsBytes(
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
853
            self.get_transport())
854
        response = request.execute('base', branch_token, repo_token)
855
        self.assertEqual(None, response)
856
        response = request.do_chunk(tag_bytes)
857
        self.assertEqual(None, response)
858
        response = request.do_end()
859
        self.assertEquals(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
860
            smart_req.SuccessfulSmartServerResponse(()), response)
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
861
        base_branch.unlock()
862
863
    def test_lock_failed(self):
864
        base_branch = self.make_branch('base')
865
        base_branch.lock_write()
866
        tag_bytes = base_branch._get_tags_bytes()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
867
        request = smart_branch.SmartServerBranchSetTagsBytes(
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
868
            self.get_transport())
869
        self.assertRaises(errors.TokenMismatch, request.execute,
870
            'base', 'wrong token', 'wrong token')
871
        # The request handler will keep processing the message parts, so even
872
        # if the request fails immediately do_chunk and do_end are still
873
        # called.
874
        request.do_chunk(tag_bytes)
875
        request.do_end()
876
        base_branch.unlock()
877
878
879
4226.2.1 by Robert Collins
Set branch config options via a smart method.
880
class SetLastRevisionTestBase(TestLockedBranch):
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
881
    """Base test case for verbs that implement set_last_revision."""
882
883
    def setUp(self):
884
        tests.TestCaseWithMemoryTransport.setUp(self)
885
        backing_transport = self.get_transport()
886
        self.request = self.request_class(backing_transport)
887
        self.tree = self.make_branch_and_memory_tree('.')
888
889
    def lock_branch(self):
4226.2.1 by Robert Collins
Set branch config options via a smart method.
890
        return self.get_lock_tokens(self.tree.branch)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
891
892
    def unlock_branch(self):
893
        self.tree.branch.unlock()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
894
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
895
    def set_last_revision(self, revision_id, revno):
896
        branch_token, repo_token = self.lock_branch()
897
        response = self._set_last_revision(
898
            revision_id, revno, branch_token, repo_token)
899
        self.unlock_branch()
900
        return response
901
902
    def assertRequestSucceeds(self, revision_id, revno):
903
        response = self.set_last_revision(revision_id, revno)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
904
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
905
                         response)
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
906
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
907
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
908
class TestSetLastRevisionVerbMixin(object):
909
    """Mixin test case for verbs that implement set_last_revision."""
910
911
    def test_set_null_to_null(self):
912
        """An empty branch can have its last revision set to 'null:'."""
913
        self.assertRequestSucceeds('null:', 0)
914
915
    def test_NoSuchRevision(self):
916
        """If the revision_id is not present, the verb returns NoSuchRevision.
917
        """
918
        revision_id = 'non-existent revision'
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
919
        self.assertEqual(smart_req.FailedSmartServerResponse(('NoSuchRevision',
920
                                                              revision_id)),
921
                         self.set_last_revision(revision_id, 1))
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
922
923
    def make_tree_with_two_commits(self):
924
        self.tree.lock_write()
925
        self.tree.add('')
926
        rev_id_utf8 = u'\xc8'.encode('utf-8')
927
        r1 = self.tree.commit('1st commit', rev_id=rev_id_utf8)
928
        r2 = self.tree.commit('2nd commit', rev_id='rev-2')
929
        self.tree.unlock()
930
931
    def test_branch_last_revision_info_is_updated(self):
932
        """A branch's tip can be set to a revision that is present in its
933
        repository.
934
        """
935
        # Make a branch with an empty revision history, but two revisions in
936
        # its repository.
937
        self.make_tree_with_two_commits()
938
        rev_id_utf8 = u'\xc8'.encode('utf-8')
939
        self.tree.branch.set_revision_history([])
940
        self.assertEqual(
941
            (0, 'null:'), self.tree.branch.last_revision_info())
942
        # We can update the branch to a revision that is present in the
943
        # repository.
944
        self.assertRequestSucceeds(rev_id_utf8, 1)
945
        self.assertEqual(
946
            (1, rev_id_utf8), self.tree.branch.last_revision_info())
947
948
    def test_branch_last_revision_info_rewind(self):
949
        """A branch's tip can be set to a revision that is an ancestor of the
950
        current tip.
951
        """
952
        self.make_tree_with_two_commits()
953
        rev_id_utf8 = u'\xc8'.encode('utf-8')
954
        self.assertEqual(
955
            (2, 'rev-2'), self.tree.branch.last_revision_info())
956
        self.assertRequestSucceeds(rev_id_utf8, 1)
957
        self.assertEqual(
958
            (1, rev_id_utf8), self.tree.branch.last_revision_info())
959
3577.1.1 by Andrew Bennetts
Cherry-pick TipChangeRejected changes from pre-branch-tip-changed-hook loom.
960
    def test_TipChangeRejected(self):
961
        """If a pre_change_branch_tip hook raises TipChangeRejected, the verb
962
        returns TipChangeRejected.
963
        """
964
        rejection_message = u'rejection message\N{INTERROBANG}'
965
        def hook_that_rejects(params):
966
            raise errors.TipChangeRejected(rejection_message)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
967
        _mod_branch.Branch.hooks.install_named_hook(
3577.1.1 by Andrew Bennetts
Cherry-pick TipChangeRejected changes from pre-branch-tip-changed-hook loom.
968
            'pre_change_branch_tip', hook_that_rejects, None)
969
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
970
            smart_req.FailedSmartServerResponse(
3577.1.1 by Andrew Bennetts
Cherry-pick TipChangeRejected changes from pre-branch-tip-changed-hook loom.
971
                ('TipChangeRejected', rejection_message.encode('utf-8'))),
972
            self.set_last_revision('null:', 0))
973
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
974
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
975
class TestSmartServerBranchRequestSetLastRevision(
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
976
        SetLastRevisionTestBase, TestSetLastRevisionVerbMixin):
977
    """Tests for Branch.set_last_revision verb."""
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
978
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
979
    request_class = smart_branch.SmartServerBranchRequestSetLastRevision
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
980
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
981
    def _set_last_revision(self, revision_id, revno, branch_token, repo_token):
982
        return self.request.execute(
983
            '', branch_token, repo_token, revision_id)
984
985
986
class TestSmartServerBranchRequestSetLastRevisionInfo(
987
        SetLastRevisionTestBase, TestSetLastRevisionVerbMixin):
988
    """Tests for Branch.set_last_revision_info verb."""
989
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
990
    request_class = smart_branch.SmartServerBranchRequestSetLastRevisionInfo
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
991
992
    def _set_last_revision(self, revision_id, revno, branch_token, repo_token):
993
        return self.request.execute(
994
            '', branch_token, repo_token, revno, revision_id)
995
996
    def test_NoSuchRevision(self):
997
        """Branch.set_last_revision_info does not have to return
998
        NoSuchRevision if the revision_id is absent.
999
        """
1000
        raise tests.TestNotApplicable()
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1001
1002
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.
1003
class TestSmartServerBranchRequestSetLastRevisionEx(
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1004
        SetLastRevisionTestBase, TestSetLastRevisionVerbMixin):
1005
    """Tests for Branch.set_last_revision_ex verb."""
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1006
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1007
    request_class = smart_branch.SmartServerBranchRequestSetLastRevisionEx
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1008
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1009
    def _set_last_revision(self, revision_id, revno, branch_token, repo_token):
1010
        return self.request.execute(
1011
            '', branch_token, repo_token, revision_id, 0, 0)
1012
1013
    def assertRequestSucceeds(self, revision_id, revno):
1014
        response = self.set_last_revision(revision_id, revno)
1015
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1016
            smart_req.SuccessfulSmartServerResponse(('ok', revno, revision_id)),
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1017
            response)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1018
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1019
    def test_branch_last_revision_info_rewind(self):
1020
        """A branch's tip can be set to a revision that is an ancestor of the
1021
        current tip, but only if allow_overwrite_descendant is passed.
1022
        """
1023
        self.make_tree_with_two_commits()
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1024
        rev_id_utf8 = u'\xc8'.encode('utf-8')
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1025
        self.assertEqual(
1026
            (2, 'rev-2'), self.tree.branch.last_revision_info())
1027
        # If allow_overwrite_descendant flag is 0, then trying to set the tip
1028
        # to an older revision ID has no effect.
1029
        branch_token, repo_token = self.lock_branch()
1030
        response = self.request.execute(
1031
            '', branch_token, repo_token, rev_id_utf8, 0, 0)
1032
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1033
            smart_req.SuccessfulSmartServerResponse(('ok', 2, 'rev-2')),
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1034
            response)
1035
        self.assertEqual(
1036
            (2, 'rev-2'), self.tree.branch.last_revision_info())
1037
1038
        # If allow_overwrite_descendant flag is 1, then setting the tip to an
1039
        # ancestor works.
1040
        response = self.request.execute(
1041
            '', branch_token, repo_token, rev_id_utf8, 0, 1)
1042
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1043
            smart_req.SuccessfulSmartServerResponse(('ok', 1, rev_id_utf8)),
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1044
            response)
1045
        self.unlock_branch()
1046
        self.assertEqual(
1047
            (1, rev_id_utf8), self.tree.branch.last_revision_info())
1048
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1049
    def make_branch_with_divergent_history(self):
1050
        """Make a branch with divergent history in its repo.
1051
1052
        The branch's tip will be 'child-2', and the repo will also contain
1053
        'child-1', which diverges from a common base revision.
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1054
        """
1055
        self.tree.lock_write()
1056
        self.tree.add('')
1057
        r1 = self.tree.commit('1st commit')
1058
        revno_1, revid_1 = self.tree.branch.last_revision_info()
1059
        r2 = self.tree.commit('2nd commit', rev_id='child-1')
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1060
        # Undo the second commit
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1061
        self.tree.branch.set_last_revision_info(revno_1, revid_1)
1062
        self.tree.set_parent_ids([revid_1])
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1063
        # Make a new second commit, child-2.  child-2 has diverged from
1064
        # child-1.
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1065
        new_r2 = self.tree.commit('2nd commit', rev_id='child-2')
1066
        self.tree.unlock()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1067
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1068
    def test_not_allow_diverged(self):
1069
        """If allow_diverged is not passed, then setting a divergent history
1070
        returns a Diverged error.
1071
        """
1072
        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.
1073
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1074
            smart_req.FailedSmartServerResponse(('Diverged',)),
3441.5.30 by Andrew Bennetts
Improve tests for all Branch.set_last_revision* verbs.
1075
            self.set_last_revision('child-1', 2))
1076
        # The branch tip was not changed.
1077
        self.assertEqual('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.
1078
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1079
    def test_allow_diverged(self):
1080
        """If allow_diverged is passed, then setting a divergent history
1081
        succeeds.
1082
        """
1083
        self.make_branch_with_divergent_history()
1084
        branch_token, repo_token = self.lock_branch()
1085
        response = self.request.execute(
1086
            '', branch_token, repo_token, 'child-1', 1, 0)
1087
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1088
            smart_req.SuccessfulSmartServerResponse(('ok', 2, 'child-1')),
3441.5.31 by Andrew Bennetts
Add test for allow_diverged flag.
1089
            response)
1090
        self.unlock_branch()
1091
        # The branch tip was changed.
1092
        self.assertEqual('child-1', self.tree.branch.last_revision())
1093
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
1094
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
1095
class TestSmartServerBranchRequestGetParent(tests.TestCaseWithMemoryTransport):
1096
1097
    def test_get_parent_none(self):
1098
        base_branch = self.make_branch('base')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1099
        request = smart_branch.SmartServerBranchGetParent(self.get_transport())
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
1100
        response = request.execute('base')
1101
        self.assertEquals(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1102
            smart_req.SuccessfulSmartServerResponse(('',)), response)
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
1103
1104
    def test_get_parent_something(self):
1105
        base_branch = self.make_branch('base')
1106
        base_branch.set_parent(self.get_url('foo'))
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1107
        request = smart_branch.SmartServerBranchGetParent(self.get_transport())
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
1108
        response = request.execute('base')
1109
        self.assertEquals(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1110
            smart_req.SuccessfulSmartServerResponse(("../foo",)),
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
1111
            response)
1112
1113
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1114
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1115
1116
    def test_set_parent_none(self):
1117
        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.
1118
        branch.lock_write()
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1119
        branch._set_parent_location('foo')
4288.1.9 by Robert Collins
Fix up test usable of _set_parent_location on unlocked branches.
1120
        branch.unlock()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1121
        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.
1122
            self.get_transport())
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1123
        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.
1124
        try:
1125
            response = request.execute('base', branch_token, repo_token, '')
1126
        finally:
1127
            branch.unlock()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1128
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1129
        self.assertEqual(None, branch.get_parent())
1130
1131
    def test_set_parent_something(self):
1132
        branch = self.make_branch('base', format="1.9")
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1133
        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.
1134
            self.get_transport())
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1135
        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.
1136
        try:
1137
            response = request.execute('base', branch_token, repo_token,
1138
            'http://bar/')
1139
        finally:
1140
            branch.unlock()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1141
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1142
        self.assertEqual('http://bar/', branch.get_parent())
1143
1144
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1145
class TestSmartServerBranchRequestGetTagsBytes(
1146
    tests.TestCaseWithMemoryTransport):
4556.2.2 by Andrew Bennetts
Handle failures more gracefully.
1147
    # Only called when the branch format and tags match [yay factory
1148
    # 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.
1149
1150
    def test_get_bytes(self):
1151
        base_branch = self.make_branch('base')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1152
        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.
1153
            self.get_transport())
1154
        response = request.execute('base')
1155
        self.assertEquals(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1156
            smart_req.SuccessfulSmartServerResponse(('',)), 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.
1157
1158
3691.2.5 by Martin Pool
Add Branch.get_stacked_on_url rpc and tests for same
1159
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1160
1161
    def test_get_stacked_on_url(self):
1162
        base_branch = self.make_branch('base', format='1.6')
1163
        stacked_branch = self.make_branch('stacked', format='1.6')
1164
        # typically should be relative
1165
        stacked_branch.set_stacked_on_url('../base')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1166
        request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
3691.2.5 by Martin Pool
Add Branch.get_stacked_on_url rpc and tests for same
1167
            self.get_transport())
1168
        response = request.execute('stacked')
1169
        self.assertEquals(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1170
            smart_req.SmartServerResponse(('ok', '../base')),
3691.2.5 by Martin Pool
Add Branch.get_stacked_on_url rpc and tests for same
1171
            response)
1172
1173
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1174
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1175
1176
    def setUp(self):
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1177
        tests.TestCaseWithMemoryTransport.setUp(self)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1178
1179
    def test_lock_write_on_unlocked_branch(self):
1180
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1181
        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.
1182
        branch = self.make_branch('.', format='knit')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1183
        repository = branch.repository
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1184
        response = request.execute('')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1185
        branch_nonce = branch.control_files._lock.peek().get('nonce')
1186
        repository_nonce = repository.control_files._lock.peek().get('nonce')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1187
        self.assertEqual(smart_req.SmartServerResponse(
1188
                ('ok', branch_nonce, repository_nonce)),
1189
                         response)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1190
        # The branch (and associated repository) is now locked.  Verify that
1191
        # with a new branch object.
1192
        new_branch = repository.bzrdir.open_branch()
1193
        self.assertRaises(errors.LockContention, new_branch.lock_write)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1194
        # Cleanup
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1195
        request = smart_branch.SmartServerBranchRequestUnlock(backing)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1196
        response = request.execute('', branch_nonce, repository_nonce)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1197
1198
    def test_lock_write_on_locked_branch(self):
1199
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1200
        request = smart_branch.SmartServerBranchRequestLockWrite(backing)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1201
        branch = self.make_branch('.')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1202
        branch_token = branch.lock_write().branch_token
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1203
        branch.leave_lock_in_place()
1204
        branch.unlock()
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1205
        response = request.execute('')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1206
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1207
            smart_req.SmartServerResponse(('LockContention',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1208
        # Cleanup
1209
        branch.lock_write(branch_token)
1210
        branch.dont_leave_lock_in_place()
1211
        branch.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1212
1213
    def test_lock_write_with_tokens_on_locked_branch(self):
1214
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1215
        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.
1216
        branch = self.make_branch('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1217
        branch_token, repo_token = self.get_lock_tokens(branch)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1218
        branch.leave_lock_in_place()
1219
        branch.repository.leave_lock_in_place()
1220
        branch.unlock()
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1221
        response = request.execute('',
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1222
                                   branch_token, repo_token)
1223
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1224
            smart_req.SmartServerResponse(('ok', branch_token, repo_token)),
1225
            response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1226
        # Cleanup
1227
        branch.repository.lock_write(repo_token)
1228
        branch.repository.dont_leave_lock_in_place()
1229
        branch.repository.unlock()
1230
        branch.lock_write(branch_token)
1231
        branch.dont_leave_lock_in_place()
1232
        branch.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1233
1234
    def test_lock_write_with_mismatched_tokens_on_locked_branch(self):
1235
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1236
        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.
1237
        branch = self.make_branch('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1238
        branch_token, repo_token = self.get_lock_tokens(branch)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1239
        branch.leave_lock_in_place()
1240
        branch.repository.leave_lock_in_place()
1241
        branch.unlock()
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1242
        response = request.execute('',
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1243
                                   branch_token+'xxx', repo_token)
1244
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1245
            smart_req.SmartServerResponse(('TokenMismatch',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1246
        # Cleanup
1247
        branch.repository.lock_write(repo_token)
1248
        branch.repository.dont_leave_lock_in_place()
1249
        branch.repository.unlock()
1250
        branch.lock_write(branch_token)
1251
        branch.dont_leave_lock_in_place()
1252
        branch.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1253
1254
    def test_lock_write_on_locked_repo(self):
1255
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1256
        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.
1257
        branch = self.make_branch('.', format='knit')
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1258
        repo = branch.repository
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1259
        repo_token = repo.lock_write().repository_token
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1260
        repo.leave_lock_in_place()
1261
        repo.unlock()
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1262
        response = request.execute('')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1263
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1264
            smart_req.SmartServerResponse(('LockContention',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1265
        # Cleanup
1266
        repo.lock_write(repo_token)
1267
        repo.dont_leave_lock_in_place()
1268
        repo.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1269
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.
1270
    def test_lock_write_on_readonly_transport(self):
1271
        backing = self.get_readonly_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1272
        request = smart_branch.SmartServerBranchRequestLockWrite(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.
1273
        branch = self.make_branch('.')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1274
        root = self.get_transport().clone('/')
1275
        path = urlutils.relative_url(root.base, self.get_transport().base)
1276
        response = request.execute(path)
2872.5.3 by Martin Pool
Pass back LockFailed from smart server lock methods
1277
        error_name, lock_str, why_str = response.args
1278
        self.assertFalse(response.is_successful())
1279
        self.assertEqual('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.
1280
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1281
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1282
class TestSmartServerBranchRequestUnlock(TestLockedBranch):
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1283
1284
    def setUp(self):
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1285
        tests.TestCaseWithMemoryTransport.setUp(self)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1286
1287
    def test_unlock_on_locked_branch_and_repo(self):
1288
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1289
        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.
1290
        branch = self.make_branch('.', format='knit')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1291
        # Lock the branch
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1292
        branch_token, repo_token = self.get_lock_tokens(branch)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1293
        # Unlock the branch (and repo) object, leaving the physical locks
1294
        # in place.
1295
        branch.leave_lock_in_place()
1296
        branch.repository.leave_lock_in_place()
1297
        branch.unlock()
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1298
        response = request.execute('',
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1299
                                   branch_token, repo_token)
1300
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1301
            smart_req.SmartServerResponse(('ok',)), response)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1302
        # The branch is now unlocked.  Verify that with a new branch
1303
        # object.
1304
        new_branch = branch.bzrdir.open_branch()
1305
        new_branch.lock_write()
1306
        new_branch.unlock()
1307
1308
    def test_unlock_on_unlocked_branch_unlocked_repo(self):
1309
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1310
        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.
1311
        branch = self.make_branch('.', format='knit')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1312
        response = request.execute(
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1313
            '', 'branch token', 'repo token')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1314
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1315
            smart_req.SmartServerResponse(('TokenMismatch',)), response)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1316
1317
    def test_unlock_on_unlocked_branch_locked_repo(self):
1318
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1319
        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.
1320
        branch = self.make_branch('.', format='knit')
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1321
        # Lock the repository.
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1322
        repo_token = branch.repository.lock_write().repository_token
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1323
        branch.repository.leave_lock_in_place()
1324
        branch.repository.unlock()
1325
        # Issue branch lock_write request on the unlocked branch (with locked
1326
        # repo).
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1327
        response = request.execute('', 'branch token', repo_token)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1328
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1329
            smart_req.SmartServerResponse(('TokenMismatch',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1330
        # Cleanup
1331
        branch.repository.lock_write(repo_token)
1332
        branch.repository.dont_leave_lock_in_place()
1333
        branch.repository.unlock()
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1334
1335
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1336
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).
1337
1338
    def test_no_repository(self):
1339
        """Raise NoRepositoryPresent when there is a bzrdir and no repo."""
1340
        # we test this using a shared repository above the named path,
1341
        # thus checking the right search logic is used - that is, that
1342
        # its the exact path being looked at and the server is not
1343
        # searching.
1344
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1345
        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).
1346
        self.make_repository('.', shared=True)
1347
        self.make_bzrdir('subdir')
1348
        self.assertRaises(errors.NoRepositoryPresent,
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1349
            request.execute, 'subdir')
1350
1351
3441.5.4 by Andrew Bennetts
Fix test failures, and add some tests for the remote graph heads RPC.
1352
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.
1353
3211.5.3 by Robert Collins
Adjust size of batch and change gzip comments to bzip2.
1354
    def test_trivial_bzipped(self):
1355
        # 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.
1356
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1357
        request = smart_repo.SmartServerRepositoryGetParentMap(backing)
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.
1358
        tree = self.make_branch_and_memory_tree('.')
1359
1360
        self.assertEqual(None,
2692.1.24 by Andrew Bennetts
Merge from bzr.dev.
1361
            request.execute('', 'missing-id'))
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1362
        # 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.
1363
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1364
            smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
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.
1365
            request.do_body('\n\n0\n'))
1366
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1367
    def test_trivial_include_missing(self):
1368
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1369
        request = smart_repo.SmartServerRepositoryGetParentMap(backing)
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1370
        tree = self.make_branch_and_memory_tree('.')
1371
1372
        self.assertEqual(None,
1373
            request.execute('', 'missing-id', 'include-missing:'))
1374
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1375
            smart_req.SuccessfulSmartServerResponse(('ok', ),
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1376
                bz2.compress('missing:missing-id')),
1377
            request.do_body('\n\n0\n'))
1378
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.
1379
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1380
class TestSmartServerRepositoryGetRevisionGraph(
1381
    tests.TestCaseWithMemoryTransport):
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1382
1383
    def test_none_argument(self):
1384
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1385
        request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1386
        tree = self.make_branch_and_memory_tree('.')
1387
        tree.lock_write()
1388
        tree.add('')
1389
        r1 = tree.commit('1st commit')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1390
        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)
1391
        tree.unlock()
1392
1393
        # the lines of revision_id->revision_parent_list has no guaranteed
1394
        # order coming out of a dict, so sort both our test and response
1395
        lines = sorted([' '.join([r2, r1]), r1])
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1396
        response = request.execute('', '')
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1397
        response.body = '\n'.join(sorted(response.body.split('\n')))
1398
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
1399
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1400
            smart_req.SmartServerResponse(('ok', ), '\n'.join(lines)), response)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1401
1402
    def test_specific_revision_argument(self):
1403
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1404
        request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1405
        tree = self.make_branch_and_memory_tree('.')
1406
        tree.lock_write()
1407
        tree.add('')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1408
        rev_id_utf8 = u'\xc9'.encode('utf-8')
1409
        r1 = tree.commit('1st commit', rev_id=rev_id_utf8)
1410
        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)
1411
        tree.unlock()
1412
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1413
        self.assertEqual(smart_req.SmartServerResponse(('ok', ), rev_id_utf8),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1414
            request.execute('', rev_id_utf8))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1415
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1416
    def test_no_such_revision(self):
1417
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1418
        request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
1419
        tree = self.make_branch_and_memory_tree('.')
1420
        tree.lock_write()
1421
        tree.add('')
1422
        r1 = tree.commit('1st commit')
1423
        tree.unlock()
1424
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1425
        # Note that it still returns body (of zero bytes).
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1426
        self.assertEqual(smart_req.SmartServerResponse(
1427
                ('nosuchrevision', 'missingrevision', ), ''),
1428
                         request.execute('', 'missingrevision'))
1429
1430
1431
class TestSmartServerRepositoryGetRevIdForRevno(
1432
    tests.TestCaseWithMemoryTransport):
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1433
1434
    def test_revno_found(self):
1435
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1436
        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.
1437
        tree = self.make_branch_and_memory_tree('.')
1438
        tree.lock_write()
1439
        tree.add('')
1440
        rev1_id_utf8 = u'\xc8'.encode('utf-8')
1441
        rev2_id_utf8 = u'\xc9'.encode('utf-8')
1442
        tree.commit('1st commit', rev_id=rev1_id_utf8)
1443
        tree.commit('2nd commit', rev_id=rev2_id_utf8)
1444
        tree.unlock()
1445
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1446
        self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1447
            request.execute('', 1, (2, rev2_id_utf8)))
1448
1449
    def test_known_revid_missing(self):
1450
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1451
        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.
1452
        repo = self.make_repository('.')
1453
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1454
            smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1455
            request.execute('', 1, (2, 'ghost')))
1456
1457
    def test_history_incomplete(self):
1458
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1459
        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.
1460
        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.
1461
        parent.lock_write()
1462
        parent.add([''], ['TREE_ROOT'])
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1463
        r1 = parent.commit(message='first commit')
1464
        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.
1465
        parent.unlock()
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1466
        local = self.make_branch_and_memory_tree('local', format='1.9')
1467
        local.branch.pull(parent.branch)
1468
        local.set_parent_ids([r2])
1469
        r3 = local.commit(message='local commit')
1470
        local.branch.create_clone_on_transport(
1471
            self.get_transport('stacked'), stacked_on=self.get_url('parent'))
1472
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1473
            smart_req.SmartServerResponse(('history-incomplete', 2, r2)),
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1474
            request.execute('stacked', 1, (3, r3)))
1475
4476.3.68 by Andrew Bennetts
Review comments from John.
1476
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1477
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1478
1479
    def make_two_commit_repo(self):
1480
        tree = self.make_branch_and_memory_tree('.')
1481
        tree.lock_write()
1482
        tree.add('')
1483
        r1 = tree.commit('1st commit')
1484
        r2 = tree.commit('2nd commit', rev_id=u'\xc8'.encode('utf-8'))
1485
        tree.unlock()
1486
        repo = tree.branch.repository
1487
        return repo, r1, r2
1488
1489
    def test_ancestry_of(self):
1490
        """The search argument may be a 'ancestry-of' some heads'."""
1491
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1492
        request = smart_repo.SmartServerRepositoryGetStream(backing)
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1493
        repo, r1, r2 = self.make_two_commit_repo()
1494
        fetch_spec = ['ancestry-of', r2]
1495
        lines = '\n'.join(fetch_spec)
1496
        request.execute('', repo._format.network_name())
1497
        response = request.do_body(lines)
1498
        self.assertEqual(('ok',), response.args)
1499
        stream_bytes = ''.join(response.body_stream)
1500
        self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1501
1502
    def test_search(self):
1503
        """The search argument may be a 'search' of some explicit keys."""
1504
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1505
        request = smart_repo.SmartServerRepositoryGetStream(backing)
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1506
        repo, r1, r2 = self.make_two_commit_repo()
1507
        fetch_spec = ['search', '%s %s' % (r1, r2), 'null:', '2']
1508
        lines = '\n'.join(fetch_spec)
1509
        request.execute('', repo._format.network_name())
1510
        response = request.do_body(lines)
1511
        self.assertEqual(('ok',), response.args)
1512
        stream_bytes = ''.join(response.body_stream)
1513
        self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1514
1515
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1516
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).
1517
1518
    def test_missing_revision(self):
1519
        """For a missing revision, ('no', ) is returned."""
1520
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1521
        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).
1522
        self.make_repository('.')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1523
        self.assertEqual(smart_req.SmartServerResponse(('no', )),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1524
            request.execute('', 'revid'))
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
1525
1526
    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.
1527
        """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).
1528
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1529
        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).
1530
        tree = self.make_branch_and_memory_tree('.')
1531
        tree.lock_write()
1532
        tree.add('')
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1533
        rev_id_utf8 = u'\xc8abc'.encode('utf-8')
1534
        r1 = 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).
1535
        tree.unlock()
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1536
        self.assertTrue(tree.branch.repository.has_revision(rev_id_utf8))
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1537
        self.assertEqual(smart_req.SmartServerResponse(('yes', )),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1538
            request.execute('', rev_id_utf8))
1539
1540
1541
class TestSmartServerRepositoryGatherStats(tests.TestCaseWithMemoryTransport):
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
1542
1543
    def test_empty_revid(self):
1544
        """With an empty revid, we get only size an number and revisions"""
1545
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1546
        request = smart_repo.SmartServerRepositoryGatherStats(backing)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
1547
        repository = self.make_repository('.')
1548
        stats = repository.gather_stats()
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
1549
        expected_body = 'revisions: 0\n'
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1550
        self.assertEqual(smart_req.SmartServerResponse(('ok', ), expected_body),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1551
                         request.execute('', '', 'no'))
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
1552
1553
    def test_revid_with_committers(self):
1554
        """For a revid we get more infos."""
1555
        backing = self.get_transport()
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1556
        rev_id_utf8 = u'\xc8abc'.encode('utf-8')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1557
        request = smart_repo.SmartServerRepositoryGatherStats(backing)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
1558
        tree = self.make_branch_and_memory_tree('.')
1559
        tree.lock_write()
1560
        tree.add('')
1561
        # Let's build a predictable result
1562
        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.
1563
        tree.commit('a commit', timestamp=654321.4, timezone=0,
1564
                    rev_id=rev_id_utf8)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
1565
        tree.unlock()
1566
1567
        stats = tree.branch.repository.gather_stats()
1568
        expected_body = ('firstrev: 123456.200 3600\n'
1569
                         'latestrev: 654321.400 0\n'
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
1570
                         'revisions: 2\n')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1571
        self.assertEqual(smart_req.SmartServerResponse(('ok', ), expected_body),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1572
                         request.execute('',
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1573
                                         rev_id_utf8, 'no'))
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
1574
1575
    def test_not_empty_repository_with_committers(self):
1576
        """For a revid and requesting committers we get the whole thing."""
1577
        backing = self.get_transport()
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1578
        rev_id_utf8 = u'\xc8abc'.encode('utf-8')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1579
        request = smart_repo.SmartServerRepositoryGatherStats(backing)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
1580
        tree = self.make_branch_and_memory_tree('.')
1581
        tree.lock_write()
1582
        tree.add('')
1583
        # Let's build a predictable result
1584
        tree.commit('a commit', timestamp=123456.2, timezone=3600,
1585
                    committer='foo')
1586
        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.
1587
                    committer='bar', rev_id=rev_id_utf8)
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
1588
        tree.unlock()
1589
        stats = tree.branch.repository.gather_stats()
1590
1591
        expected_body = ('committers: 2\n'
1592
                         'firstrev: 123456.200 3600\n'
1593
                         'latestrev: 654321.400 0\n'
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
1594
                         'revisions: 2\n')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1595
        self.assertEqual(smart_req.SmartServerResponse(('ok', ), expected_body),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1596
                         request.execute('',
2018.5.148 by Andrew Bennetts
Fix all the DeprecationWarnings in test_smart caused by unicode revision IDs.
1597
                                         rev_id_utf8, 'yes'))
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
1598
1599
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1600
class TestSmartServerRepositoryIsShared(tests.TestCaseWithMemoryTransport):
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
1601
1602
    def test_is_shared(self):
1603
        """For a shared repository, ('yes', ) is returned."""
1604
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1605
        request = smart_repo.SmartServerRepositoryIsShared(backing)
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
1606
        self.make_repository('.', shared=True)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1607
        self.assertEqual(smart_req.SmartServerResponse(('yes', )),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1608
            request.execute('', ))
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
1609
1610
    def test_is_not_shared(self):
2018.5.58 by Wouter van Heyst
Small test fixes to reflect naming and documentation
1611
        """For a shared repository, ('no', ) is returned."""
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
1612
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1613
        request = smart_repo.SmartServerRepositoryIsShared(backing)
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
1614
        self.make_repository('.', shared=False)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1615
        self.assertEqual(smart_req.SmartServerResponse(('no', )),
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1616
            request.execute('', ))
1617
1618
1619
class TestSmartServerRepositoryLockWrite(tests.TestCaseWithMemoryTransport):
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1620
1621
    def test_lock_write_on_unlocked_repo(self):
1622
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1623
        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.
1624
        repository = self.make_repository('.', format='knit')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1625
        response = request.execute('')
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1626
        nonce = repository.control_files._lock.peek().get('nonce')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1627
        self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1628
        # The repository is now locked.  Verify that with a new repository
1629
        # object.
1630
        new_repo = repository.bzrdir.open_repository()
1631
        self.assertRaises(errors.LockContention, new_repo.lock_write)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1632
        # Cleanup
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1633
        request = smart_repo.SmartServerRepositoryUnlock(backing)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1634
        response = request.execute('', nonce)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1635
1636
    def test_lock_write_on_locked_repo(self):
1637
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1638
        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.
1639
        repository = self.make_repository('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1640
        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
1641
        repository.leave_lock_in_place()
1642
        repository.unlock()
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1643
        response = request.execute('')
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1644
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1645
            smart_req.SmartServerResponse(('LockContention',)), response)
4327.1.10 by Vincent Ladeuil
Fix 10 more lock-related test failures.
1646
        # Cleanup
1647
        repository.lock_write(repo_token)
1648
        repository.dont_leave_lock_in_place()
1649
        repository.unlock()
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1650
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.
1651
    def test_lock_write_on_readonly_transport(self):
1652
        backing = self.get_readonly_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1653
        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.
1654
        repository = self.make_repository('.', format='knit')
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.
1655
        response = request.execute('')
2872.5.3 by Martin Pool
Pass back LockFailed from smart server lock methods
1656
        self.assertFalse(response.is_successful())
1657
        self.assertEqual('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.
1658
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1659
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
1660
class TestInsertStreamBase(tests.TestCaseWithMemoryTransport):
1661
1662
    def make_empty_byte_stream(self, repo):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1663
        byte_stream = smart_repo._stream_to_byte_stream([], repo._format)
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
1664
        return ''.join(byte_stream)
1665
1666
1667
class TestSmartServerRepositoryInsertStream(TestInsertStreamBase):
1668
1669
    def test_insert_stream_empty(self):
1670
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1671
        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.
1672
        repository = self.make_repository('.')
1673
        response = request.execute('', '')
1674
        self.assertEqual(None, response)
1675
        response = request.do_chunk(self.make_empty_byte_stream(repository))
1676
        self.assertEqual(None, response)
1677
        response = request.do_end()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1678
        self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1679
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
1680
1681
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1682
1683
    def test_insert_stream_empty(self):
1684
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1685
        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.
1686
            backing)
1687
        repository = self.make_repository('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1688
        lock_token = repository.lock_write().repository_token
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
1689
        response = request.execute('', '', lock_token)
1690
        self.assertEqual(None, response)
1691
        response = request.do_chunk(self.make_empty_byte_stream(repository))
1692
        self.assertEqual(None, response)
1693
        response = request.do_end()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1694
        self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
1695
        repository.unlock()
1696
1697
    def test_insert_stream_with_wrong_lock_token(self):
1698
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1699
        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.
1700
            backing)
1701
        repository = self.make_repository('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1702
        lock_token = repository.lock_write().repository_token
4144.3.1 by Andrew Bennetts
Add Repository.insert_stream_locked server-side implementation, plus tests for server-side _translate_error.
1703
        self.assertRaises(
1704
            errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1705
        repository.unlock()
1706
1707
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1708
class TestSmartServerRepositoryUnlock(tests.TestCaseWithMemoryTransport):
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1709
1710
    def setUp(self):
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1711
        tests.TestCaseWithMemoryTransport.setUp(self)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1712
1713
    def test_unlock_on_locked_repo(self):
1714
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1715
        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.
1716
        repository = self.make_repository('.', format='knit')
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1717
        token = repository.lock_write().repository_token
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1718
        repository.leave_lock_in_place()
1719
        repository.unlock()
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1720
        response = request.execute('', token)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1721
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1722
            smart_req.SmartServerResponse(('ok',)), response)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1723
        # The repository is now unlocked.  Verify that with a new repository
1724
        # object.
1725
        new_repo = repository.bzrdir.open_repository()
1726
        new_repo.lock_write()
1727
        new_repo.unlock()
1728
1729
    def test_unlock_on_unlocked_repo(self):
1730
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1731
        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.
1732
        repository = self.make_repository('.', format='knit')
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1733
        response = request.execute('', 'some token')
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1734
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1735
            smart_req.SmartServerResponse(('TokenMismatch',)), response)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1736
1737
2692.1.1 by Andrew Bennetts
Add translate_client_path method to SmartServerRequest.
1738
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.
1739
1740
    def test_is_readonly_no(self):
1741
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1742
        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.
1743
        response = request.execute()
1744
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1745
            smart_req.SmartServerResponse(('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.
1746
1747
    def test_is_readonly_yes(self):
1748
        backing = self.get_readonly_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1749
        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.
1750
        response = request.execute()
1751
        self.assertEqual(
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1752
            smart_req.SmartServerResponse(('yes',)), response)
1753
1754
1755
class TestSmartServerRepositorySetMakeWorkingTrees(
1756
    tests.TestCaseWithMemoryTransport):
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
1757
1758
    def test_set_false(self):
1759
        backing = self.get_transport()
1760
        repo = self.make_repository('.', shared=True)
1761
        repo.set_make_working_trees(True)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1762
        request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
1763
        request = request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1764
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
1765
            request.execute('', 'False'))
1766
        repo = repo.bzrdir.open_repository()
1767
        self.assertFalse(repo.make_working_trees())
1768
1769
    def test_set_true(self):
1770
        backing = self.get_transport()
1771
        repo = self.make_repository('.', shared=True)
1772
        repo.set_make_working_trees(False)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1773
        request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
1774
        request = request_class(backing)
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1775
        self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
1776
            request.execute('', 'True'))
1777
        repo = repo.bzrdir.open_repository()
1778
        self.assertTrue(repo.make_working_trees())
1779
1780
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1781
class TestSmartServerPackRepositoryAutopack(tests.TestCaseWithTransport):
1782
1783
    def make_repo_needing_autopacking(self, path='.'):
1784
        # Make a repo in need of autopacking.
1785
        tree = self.make_branch_and_tree('.', format='pack-0.92')
1786
        repo = tree.branch.repository
1787
        # monkey-patch the pack collection to disable autopacking
1788
        repo._pack_collection._max_pack_count = lambda count: count
1789
        for x in range(10):
1790
            tree.commit('commit %s' % x)
1791
        self.assertEqual(10, len(repo._pack_collection.names()))
1792
        del repo._pack_collection._max_pack_count
1793
        return repo
1794
1795
    def test_autopack_needed(self):
1796
        repo = self.make_repo_needing_autopacking()
4145.1.6 by Robert Collins
More test fallout, but all caught now.
1797
        repo.lock_write()
1798
        self.addCleanup(repo.unlock)
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1799
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1800
        request = smart_packrepo.SmartServerPackRepositoryAutopack(
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1801
            backing)
1802
        response = request.execute('')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1803
        self.assertEqual(smart_req.SmartServerResponse(('ok',)), response)
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1804
        repo._pack_collection.reload_pack_names()
1805
        self.assertEqual(1, len(repo._pack_collection.names()))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1806
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1807
    def test_autopack_not_needed(self):
1808
        tree = self.make_branch_and_tree('.', format='pack-0.92')
1809
        repo = tree.branch.repository
4145.1.6 by Robert Collins
More test fallout, but all caught now.
1810
        repo.lock_write()
1811
        self.addCleanup(repo.unlock)
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1812
        for x in range(9):
1813
            tree.commit('commit %s' % x)
1814
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1815
        request = smart_packrepo.SmartServerPackRepositoryAutopack(
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1816
            backing)
1817
        response = request.execute('')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1818
        self.assertEqual(smart_req.SmartServerResponse(('ok',)), response)
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1819
        repo._pack_collection.reload_pack_names()
1820
        self.assertEqual(9, len(repo._pack_collection.names()))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1821
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1822
    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.
1823
        """A request to autopack a non-pack repo is a no-op."""
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1824
        repo = self.make_repository('.', format='knit')
1825
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1826
        request = smart_packrepo.SmartServerPackRepositoryAutopack(
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1827
            backing)
1828
        response = request.execute('')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1829
        self.assertEqual(smart_req.SmartServerResponse(('ok',)), response)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1830
3801.1.4 by Andrew Bennetts
Add tests for autopack RPC.
1831
4760.2.5 by Andrew Bennetts
Add some more tests.
1832
class TestSmartServerVfsGet(tests.TestCaseWithMemoryTransport):
1833
1834
    def test_unicode_path(self):
1835
        """VFS requests expect unicode paths to be escaped."""
1836
        filename = u'foo\N{INTERROBANG}'
1837
        filename_escaped = urlutils.escape(filename)
1838
        backing = self.get_transport()
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1839
        request = vfs.GetRequest(backing)
4760.2.5 by Andrew Bennetts
Add some more tests.
1840
        backing.put_bytes_non_atomic(filename_escaped, 'contents')
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1841
        self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'contents'),
4760.2.5 by Andrew Bennetts
Add some more tests.
1842
            request.execute(filename_escaped))
1843
1844
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
1845
class TestHandlers(tests.TestCase):
1846
    """Tests for the request.request_handlers object."""
1847
3526.3.1 by Andrew Bennetts
Remove registrations of defunct HPSS verbs.
1848
    def test_all_registrations_exist(self):
1849
        """All registered request_handlers can be found."""
1850
        # If there's a typo in a register_lazy call, this loop will fail with
1851
        # an AttributeError.
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1852
        for key, item in smart_req.request_handlers.iteritems():
3526.3.1 by Andrew Bennetts
Remove registrations of defunct HPSS verbs.
1853
            pass
1854
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1855
    def assertHandlerEqual(self, verb, handler):
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1856
        self.assertEqual(smart_req.request_handlers.get(verb), handler)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1857
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
1858
    def test_registered_methods(self):
1859
        """Test that known methods are registered to the correct object."""
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1860
        self.assertHandlerEqual('Branch.get_config_file',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1861
            smart_branch.SmartServerBranchGetConfigFile)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1862
        self.assertHandlerEqual('Branch.get_parent',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1863
            smart_branch.SmartServerBranchGetParent)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1864
        self.assertHandlerEqual('Branch.get_tags_bytes',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1865
            smart_branch.SmartServerBranchGetTagsBytes)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1866
        self.assertHandlerEqual('Branch.lock_write',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1867
            smart_branch.SmartServerBranchRequestLockWrite)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1868
        self.assertHandlerEqual('Branch.last_revision_info',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1869
            smart_branch.SmartServerBranchRequestLastRevisionInfo)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1870
        self.assertHandlerEqual('Branch.revision_history',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1871
            smart_branch.SmartServerRequestRevisionHistory)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1872
        self.assertHandlerEqual('Branch.set_config_option',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1873
            smart_branch.SmartServerBranchRequestSetConfigOption)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1874
        self.assertHandlerEqual('Branch.set_last_revision',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1875
            smart_branch.SmartServerBranchRequestSetLastRevision)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1876
        self.assertHandlerEqual('Branch.set_last_revision_info',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1877
            smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1878
        self.assertHandlerEqual('Branch.set_last_revision_ex',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1879
            smart_branch.SmartServerBranchRequestSetLastRevisionEx)
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
1880
        self.assertHandlerEqual('Branch.set_parent_location',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1881
            smart_branch.SmartServerBranchRequestSetParentLocation)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1882
        self.assertHandlerEqual('Branch.unlock',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1883
            smart_branch.SmartServerBranchRequestUnlock)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1884
        self.assertHandlerEqual('BzrDir.find_repository',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1885
            smart_dir.SmartServerRequestFindRepositoryV1)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1886
        self.assertHandlerEqual('BzrDir.find_repositoryV2',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1887
            smart_dir.SmartServerRequestFindRepositoryV2)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1888
        self.assertHandlerEqual('BzrDirFormat.initialize',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1889
            smart_dir.SmartServerRequestInitializeBzrDir)
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
1890
        self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1891
            smart_dir.SmartServerRequestBzrDirInitializeEx)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1892
        self.assertHandlerEqual('BzrDir.cloning_metadir',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1893
            smart_dir.SmartServerBzrDirRequestCloningMetaDir)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1894
        self.assertHandlerEqual('BzrDir.get_config_file',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1895
            smart_dir.SmartServerBzrDirRequestConfigFile)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1896
        self.assertHandlerEqual('BzrDir.open_branch',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1897
            smart_dir.SmartServerRequestOpenBranch)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1898
        self.assertHandlerEqual('BzrDir.open_branchV2',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1899
            smart_dir.SmartServerRequestOpenBranchV2)
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).
1900
        self.assertHandlerEqual('BzrDir.open_branchV3',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1901
            smart_dir.SmartServerRequestOpenBranchV3)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1902
        self.assertHandlerEqual('PackRepository.autopack',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1903
            smart_packrepo.SmartServerPackRepositoryAutopack)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1904
        self.assertHandlerEqual('Repository.gather_stats',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1905
            smart_repo.SmartServerRepositoryGatherStats)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1906
        self.assertHandlerEqual('Repository.get_parent_map',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1907
            smart_repo.SmartServerRepositoryGetParentMap)
4419.2.6 by Andrew Bennetts
Add tests for server-side logic, and fix the bugs exposed by those tests.
1908
        self.assertHandlerEqual('Repository.get_rev_id_for_revno',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1909
            smart_repo.SmartServerRepositoryGetRevIdForRevno)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1910
        self.assertHandlerEqual('Repository.get_revision_graph',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1911
            smart_repo.SmartServerRepositoryGetRevisionGraph)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1912
        self.assertHandlerEqual('Repository.get_stream',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1913
            smart_repo.SmartServerRepositoryGetStream)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1914
        self.assertHandlerEqual('Repository.has_revision',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1915
            smart_repo.SmartServerRequestHasRevision)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1916
        self.assertHandlerEqual('Repository.insert_stream',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1917
            smart_repo.SmartServerRepositoryInsertStream)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1918
        self.assertHandlerEqual('Repository.insert_stream_locked',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1919
            smart_repo.SmartServerRepositoryInsertStreamLocked)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1920
        self.assertHandlerEqual('Repository.is_shared',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1921
            smart_repo.SmartServerRepositoryIsShared)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1922
        self.assertHandlerEqual('Repository.lock_write',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1923
            smart_repo.SmartServerRepositoryLockWrite)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1924
        self.assertHandlerEqual('Repository.tarball',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1925
            smart_repo.SmartServerRepositoryTarball)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1926
        self.assertHandlerEqual('Repository.unlock',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1927
            smart_repo.SmartServerRepositoryUnlock)
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
1928
        self.assertHandlerEqual('Transport.is_readonly',
5010.2.8 by Vincent Ladeuil
Fix test_smart.py imports.
1929
            smart_req.SmartServerIsReadonly)