/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.7 by John Arbash Meinel
Merge in the bzr.dev 5582
1
# Copyright (C) 2006-2011 Canonical Ltd
1910.19.7 by Andrew Bennetts
Allow specifying the host/interface to bzr serve, and use the new test
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
1910.19.7 by Andrew Bennetts
Allow specifying the host/interface to bzr serve, and use the new test
16
17
6622.1.4 by Jelmer Vernooij
Fix some more tests.
18
"""Tests of the brz serve command."""
1910.19.7 by Andrew Bennetts
Allow specifying the host/interface to bzr serve, and use the new test
19
2018.1.2 by Andrew Bennetts
Tidy imports, skip test if paramiko isn't installed.
20
import os
1910.19.7 by Andrew Bennetts
Allow specifying the host/interface to bzr serve, and use the new test
21
import signal
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
22
import sys
6973.12.9 by Jelmer Vernooij
More fixes.
23
try:
24
    from _thread import interrupt_main
25
except ImportError:  # Python < 3
26
    from thread import interrupt_main
27
2018.1.2 by Andrew Bennetts
Tidy imports, skip test if paramiko isn't installed.
28
import threading
1910.19.7 by Andrew Bennetts
Allow specifying the host/interface to bzr serve, and use the new test
29
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
30
from ... import (
4634.43.8 by Andrew Bennetts
Test for recovering the --directory value from the transport cmd_serve passes to bzr_serve.
31
    builtins,
6133.4.21 by John Arbash Meinel
I'm trying to make sure that 'bzr serve' supports the serve.client_timeout code.
32
    config,
2309.2.5 by Alexander Belchenko
test_bzr_connect_to_bzr_ssh: win32-compatibility
33
    errors,
34
    osutils,
2598.5.1 by Aaron Bentley
Start eliminating the use of None to indicate null revision
35
    revision as _mod_revision,
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
36
    trace,
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
37
    transport,
4797.3.21 by John Arbash Meinel
Use urlutils.local_path_to_url to handle both windows and linux.
38
    urlutils,
2309.2.5 by Alexander Belchenko
test_bzr_connect_to_bzr_ssh: win32-compatibility
39
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
40
from ...branch import Branch
41
from ...controldir import ControlDir
6670.4.16 by Jelmer Vernooij
Move smart to breezy.bzr.
42
from ...bzr.smart import client, medium
43
from ...bzr.smart.server import (
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
44
    BzrServerFactory,
45
    SmartTCPServer,
46
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
47
from .. import (
4700.1.3 by Robert Collins
Merge trunk.
48
    TestCaseWithMemoryTransport,
4634.43.7 by Andrew Bennetts
Add some unit tests for parts of userdir expansion.
49
    TestCaseWithTransport,
50
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
51
from ...transport import remote
1910.19.11 by Andrew Bennetts
General code cleanup based on review comments and other observations.
52
4911.1.1 by John Arbash Meinel
Threads don't have 'get_ident()' attributes. I think spiv meant 'getName()'.
53
4815.3.7 by Gordon Tyler
Made a few changes at the suggestion of vila.
54
class TestBzrServeBase(TestCaseWithTransport):
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
55
56
    def run_bzr_serve_then_func(self, serve_args, retcode=0, func=None,
57
                                *func_args, **func_kwargs):
6622.1.29 by Jelmer Vernooij
Fix some more tests.
58
        """Run 'brz serve', and run the given func in a thread once the server
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
59
        has started.
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
60
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
61
        When 'func' terminates, the server will be terminated too.
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
62
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
63
        Returns stdout and stderr.
64
        """
65
        def on_server_start_thread(tcp_server):
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
66
            """This runs concurrently with the server thread.
67
68
            The server is interrupted as soon as ``func`` finishes, even if an
69
            exception is encountered.
70
            """
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
71
            try:
72
                # Run func if set
73
                self.tcp_server = tcp_server
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
74
                if func is not None:
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
75
                    try:
76
                        func(*func_args, **func_kwargs)
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
77
                    except Exception as e:
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
78
                        # Log errors to make some test failures a little less
79
                        # mysterious.
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
80
                        trace.mutter('func broke: %r', e)
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
81
            finally:
82
                # Then stop the server
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
83
                trace.mutter('interrupting...')
6973.12.9 by Jelmer Vernooij
More fixes.
84
                interrupt_main()
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
85
        # When the hook is fired, it just starts ``on_server_start_thread`` and
86
        # return
7143.15.2 by Jelmer Vernooij
Run autopep8.
87
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
88
        def on_server_start(backing_urls, tcp_server):
89
            t = threading.Thread(
90
                target=on_server_start_thread, args=(tcp_server,))
91
            t.start()
92
        # install hook
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
93
        SmartTCPServer.hooks.install_named_hook(
94
            'server_started_ex', on_server_start,
95
            'run_bzr_serve_then_func hook')
6973.12.9 by Jelmer Vernooij
More fixes.
96
        # It seems interrupt_main() will not raise KeyboardInterrupt
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
97
        # until after socket.accept returns. So we set the timeout low to make
98
        # the test faster.
99
        self.overrideAttr(SmartTCPServer, '_ACCEPT_TIMEOUT', 0.1)
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
100
        # start a TCP server
101
        try:
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
102
            out, err = self.run_bzr(['serve'] + list(serve_args),
103
                                    retcode=retcode)
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
104
        except KeyboardInterrupt as e:
6621.22.1 by Martin
Refactor bzrlib.ui to be based on unicode streams
105
            return (self._last_cmd_stdout.getvalue(),
7143.15.2 by Jelmer Vernooij
Run autopep8.
106
                    self._last_cmd_stderr.getvalue())
4815.3.7 by Gordon Tyler
Made a few changes at the suggestion of vila.
107
        return out, err
108
109
110
class TestBzrServe(TestBzrServeBase):
1910.19.11 by Andrew Bennetts
General code cleanup based on review comments and other observations.
111
4695.3.1 by Vincent Ladeuil
Fix test failures with no C extensions loaded.
112
    def setUp(self):
4815.3.6 by Gordon Tyler
Fixed super call in TestBzrServe.
113
        super(TestBzrServe, self).setUp()
4695.3.2 by Vincent Ladeuil
Simplified and claried as per Robert's review.
114
        self.disable_missing_extensions_warning()
4695.3.1 by Vincent Ladeuil
Fix test failures with no C extensions loaded.
115
5909.2.5 by Jonathan Riddell
split test into two tests
116
    def test_server_exception_with_hook(self):
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
117
        """Catch exception from the server in the server_exception hook.
118
119
        We use ``run_bzr_serve_then_func`` without a ``func`` so the server
120
        will receive a KeyboardInterrupt exception we want to catch.
121
        """
5909.2.3 by Jonathan Riddell
add test for server exception hook. Also ensure return code is checked in run_bzr_serve_then_func()
122
        def hook(exception):
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
123
            if exception[0] is KeyboardInterrupt:
6973.12.9 by Jelmer Vernooij
More fixes.
124
                sys.stderr.write(b'catching KeyboardInterrupt\n')
5929.2.6 by Vincent Ladeuil
Clarify the design a bit and make the test more precise and more robust.
125
                return True
126
            else:
127
                return False
5909.2.3 by Jonathan Riddell
add test for server exception hook. Also ensure return code is checked in run_bzr_serve_then_func()
128
        SmartTCPServer.hooks.install_named_hook(
129
            'server_exception', hook,
130
            'test_server_except_hook hook')
6475.2.2 by Ross Lagerwall
Update tests to use new --listen & --port options to bzr serve.
131
        args = ['--listen', 'localhost', '--port', '0', '--quiet']
5909.2.3 by Jonathan Riddell
add test for server exception hook. Also ensure return code is checked in run_bzr_serve_then_func()
132
        out, err = self.run_bzr_serve_then_func(args, retcode=0)
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
133
        self.assertEqual('catching KeyboardInterrupt\n', err)
5909.2.3 by Jonathan Riddell
add test for server exception hook. Also ensure return code is checked in run_bzr_serve_then_func()
134
5909.2.5 by Jonathan Riddell
split test into two tests
135
    def test_server_exception_no_hook(self):
136
        """test exception without hook returns error"""
137
        args = []
138
        out, err = self.run_bzr_serve_then_func(args, retcode=3)
139
2018.2.3 by Andrew Bennetts
Starting factoring out the smart server client "medium" from the protocol.
140
    def assertInetServerShutsdownCleanly(self, process):
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
141
        """Shutdown the server process looking for errors."""
2018.2.3 by Andrew Bennetts
Starting factoring out the smart server client "medium" from the protocol.
142
        # Shutdown the server: the server should shut down when it cannot read
143
        # from stdin anymore.
144
        process.stdin.close()
1910.19.11 by Andrew Bennetts
General code cleanup based on review comments and other observations.
145
        # Hide stdin from the subprocess module, so it won't fail to close it.
146
        process.stdin = None
2581.1.2 by Martin Pool
Remove unnecessary retcode=0 to run_bzr calls
147
        result = self.finish_bzr_subprocess(process)
6973.12.9 by Jelmer Vernooij
More fixes.
148
        self.assertEqual(b'', result[0])
149
        self.assertEqual(b'', result[1])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
150
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
151
    def assertServerFinishesCleanly(self, process):
6622.1.29 by Jelmer Vernooij
Fix some more tests.
152
        """Shutdown the brz serve instance process looking for errors."""
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
153
        # Shutdown the server
154
        result = self.finish_bzr_subprocess(process, retcode=3,
155
                                            send_signal=signal.SIGINT)
6973.12.9 by Jelmer Vernooij
More fixes.
156
        self.assertEqual(b'', result[0])
157
        self.assertEqual(b'brz: interrupted\n', result[1])
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
158
3287.6.4 by Robert Collins
Fix up deprecation warnings for get_revision_graph.
159
    def make_read_requests(self, branch):
160
        """Do some read only requests."""
6754.8.4 by Jelmer Vernooij
Use new context stuff.
161
        with branch.lock_read():
3287.6.4 by Robert Collins
Fix up deprecation warnings for get_revision_graph.
162
            branch.repository.all_revision_ids()
163
            self.assertEqual(_mod_revision.NULL_REVISION,
164
                             _mod_revision.ensure_null(branch.last_revision()))
165
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
166
    def start_server_inet(self, extra_options=()):
6622.1.29 by Jelmer Vernooij
Fix some more tests.
167
        """Start a brz server subprocess using the --inet option.
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
168
169
        :param extra_options: extra options to give the server.
6622.1.29 by Jelmer Vernooij
Fix some more tests.
170
        :return: a tuple with the brz process handle for passing to
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
171
            finish_bzr_subprocess, a client for the server, and a transport.
172
        """
173
        # Serve from the current directory
4911.1.1 by John Arbash Meinel
Threads don't have 'get_ident()' attributes. I think spiv meant 'getName()'.
174
        args = ['serve', '--inet']
175
        args.extend(extra_options)
176
        process = self.start_bzr_subprocess(args)
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
177
178
        # Connect to the server
179
        # We use this url because while this is no valid URL to connect to this
180
        # server instance, the transport needs a URL.
6622.1.30 by Jelmer Vernooij
Some more test fixes.
181
        url = 'bzr://localhost/'
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
182
        self.permit_url(url)
2018.5.15 by Andrew Bennetts
Tidy some imports, and bugs introduced when adding server.py
183
        client_medium = medium.SmartSimplePipesClientMedium(
3431.3.7 by Andrew Bennetts
Fix incidental breakage in blackbox/test_serve.py
184
            process.stdout, process.stdin, url)
185
        transport = remote.RemoteTransport(url, medium=client_medium)
2018.2.3 by Andrew Bennetts
Starting factoring out the smart server client "medium" from the protocol.
186
        return process, transport
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
187
188
    def start_server_port(self, extra_options=()):
6622.1.29 by Jelmer Vernooij
Fix some more tests.
189
        """Start a brz server subprocess.
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
190
191
        :param extra_options: extra options to give the server.
6622.1.29 by Jelmer Vernooij
Fix some more tests.
192
        :return: a tuple with the brz process handle for passing to
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
193
            finish_bzr_subprocess, and the base url for the server.
194
        """
195
        # Serve from the current directory
6475.2.2 by Ross Lagerwall
Update tests to use new --listen & --port options to bzr serve.
196
        args = ['serve', '--listen', 'localhost', '--port', '0']
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
197
        args.extend(extra_options)
198
        process = self.start_bzr_subprocess(args, skip_if_plan_to_signal=True)
3955.1.7 by Jonathan Lange
Fix some tests that assumed the port was on stderr rather than stdout.
199
        port_line = process.stderr.readline()
6973.12.9 by Jelmer Vernooij
More fixes.
200
        prefix = b'listening on port: '
1910.19.7 by Andrew Bennetts
Allow specifying the host/interface to bzr serve, and use the new test
201
        self.assertStartsWith(port_line, prefix)
202
        port = int(port_line[len(prefix):])
6622.1.30 by Jelmer Vernooij
Some more test fixes.
203
        url = 'bzr://localhost:%d/' % port
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
204
        self.permit_url(url)
205
        return process, url
5611.1.2 by Jelmer Vernooij
Add some tests for the hooks.
206
4815.3.1 by Gordon Tyler
Added test_bzr_serve_quiet which tests that the output of 'bzr serve --quiet' is really quiet.
207
    def test_bzr_serve_quiet(self):
208
        self.make_branch('.')
6475.2.2 by Ross Lagerwall
Update tests to use new --listen & --port options to bzr serve.
209
        args = ['--listen', 'localhost', '--port', '0', '--quiet']
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
210
        out, err = self.run_bzr_serve_then_func(args, retcode=3)
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
211
        self.assertEqual('', out)
212
        self.assertEqual('', err)
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
213
214
    def test_bzr_serve_inet_readonly(self):
6622.1.29 by Jelmer Vernooij
Fix some more tests.
215
        """brz server should provide a read only filesystem by default."""
2018.2.3 by Andrew Bennetts
Starting factoring out the smart server client "medium" from the protocol.
216
        process, transport = self.start_server_inet()
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
217
        self.assertRaises(errors.TransportNotPossible, transport.mkdir, 'adir')
2018.2.3 by Andrew Bennetts
Starting factoring out the smart server client "medium" from the protocol.
218
        self.assertInetServerShutsdownCleanly(process)
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
219
220
    def test_bzr_serve_inet_readwrite(self):
221
        # Make a branch
222
        self.make_branch('.')
223
2018.2.3 by Andrew Bennetts
Starting factoring out the smart server client "medium" from the protocol.
224
        process, transport = self.start_server_inet(['--allow-writes'])
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
225
4911.1.1 by John Arbash Meinel
Threads don't have 'get_ident()' attributes. I think spiv meant 'getName()'.
226
        # We get a working branch, and can create a directory
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
227
        branch = ControlDir.open_from_transport(transport).open_branch()
3287.6.4 by Robert Collins
Fix up deprecation warnings for get_revision_graph.
228
        self.make_read_requests(branch)
4911.1.1 by John Arbash Meinel
Threads don't have 'get_ident()' attributes. I think spiv meant 'getName()'.
229
        transport.mkdir('adir')
2018.2.3 by Andrew Bennetts
Starting factoring out the smart server client "medium" from the protocol.
230
        self.assertInetServerShutsdownCleanly(process)
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
231
232
    def test_bzr_serve_port_readonly(self):
6622.1.29 by Jelmer Vernooij
Fix some more tests.
233
        """brz server should provide a read only filesystem by default."""
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
234
        process, url = self.start_server_port()
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
235
        t = transport.get_transport_from_url(url)
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
236
        self.assertRaises(errors.TransportNotPossible, t.mkdir, 'adir')
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
237
        self.assertServerFinishesCleanly(process)
238
239
    def test_bzr_serve_port_readwrite(self):
240
        # Make a branch
241
        self.make_branch('.')
242
243
        process, url = self.start_server_port(['--allow-writes'])
1910.19.7 by Andrew Bennetts
Allow specifying the host/interface to bzr serve, and use the new test
244
245
        # Connect to the server
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
246
        branch = Branch.open(url)
3287.6.4 by Robert Collins
Fix up deprecation warnings for get_revision_graph.
247
        self.make_read_requests(branch)
2020.1.1 by Robert Collins
Add readonly support to the smart server, enabled by default via `bzr server`.
248
        self.assertServerFinishesCleanly(process)
1910.19.7 by Andrew Bennetts
Allow specifying the host/interface to bzr serve, and use the new test
249
4370.4.2 by Jelmer Vernooij
Add --protocol option to 'bzr serve'.
250
    def test_bzr_serve_supports_protocol(self):
251
        # Make a branch
252
        self.make_branch('.')
253
254
        process, url = self.start_server_port(['--allow-writes',
255
                                               '--protocol=bzr'])
256
257
        # Connect to the server
258
        branch = Branch.open(url)
259
        self.make_read_requests(branch)
260
        self.assertServerFinishesCleanly(process)
261
4911.1.1 by John Arbash Meinel
Threads don't have 'get_ident()' attributes. I think spiv meant 'getName()'.
262
    def test_bzr_serve_dhpss(self):
263
        # This is a smoke test that the server doesn't crash when run with
264
        # -Dhpss, and does drop some hpss logging to the file.
265
        self.make_branch('.')
6619.3.26 by Martin
Fix fallout from 2to3 getcwdu transformation and other test uses
266
        log_fname = self.test_dir + '/server.log'
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
267
        self.overrideEnv('BRZ_LOG', log_fname)
4911.1.1 by John Arbash Meinel
Threads don't have 'get_ident()' attributes. I think spiv meant 'getName()'.
268
        process, transport = self.start_server_inet(['-Dhpss'])
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
269
        branch = ControlDir.open_from_transport(transport).open_branch()
4911.1.1 by John Arbash Meinel
Threads don't have 'get_ident()' attributes. I think spiv meant 'getName()'.
270
        self.make_read_requests(branch)
271
        self.assertInetServerShutsdownCleanly(process)
272
        f = open(log_fname, 'rb')
273
        content = f.read()
274
        f.close()
6973.12.9 by Jelmer Vernooij
More fixes.
275
        self.assertContainsRe(content, br'hpss request: \[[0-9-]+\]')
4911.1.1 by John Arbash Meinel
Threads don't have 'get_ident()' attributes. I think spiv meant 'getName()'.
276
6133.4.21 by John Arbash Meinel
I'm trying to make sure that 'bzr serve' supports the serve.client_timeout code.
277
    def test_bzr_serve_supports_configurable_timeout(self):
278
        gs = config.GlobalStack()
6133.4.35 by John Arbash Meinel
Change int_from_store into float_from_store, which allows us to set the time under 1.0s.
279
        gs.set('serve.client_timeout', 0.2)
6499.3.9 by Vincent Ladeuil
Provide fresh config stores for tests.
280
        # Save the config as the subprocess will use it
6499.3.4 by Vincent Ladeuil
Fix failing tests, they were either brittle or requiring the config to be saved.
281
        gs.store.save()
6133.4.21 by John Arbash Meinel
I'm trying to make sure that 'bzr serve' supports the serve.client_timeout code.
282
        process, url = self.start_server_port()
6855.4.1 by Jelmer Vernooij
Yet more bees.
283
        self.build_tree_contents([('a_file', b'contents\n')])
6133.4.21 by John Arbash Meinel
I'm trying to make sure that 'bzr serve' supports the serve.client_timeout code.
284
        # We can connect and issue a request
285
        t = transport.get_transport_from_url(url)
6973.12.9 by Jelmer Vernooij
More fixes.
286
        self.assertEqual(b'contents\n', t.get_bytes('a_file'))
6133.4.21 by John Arbash Meinel
I'm trying to make sure that 'bzr serve' supports the serve.client_timeout code.
287
        # However, if we just wait for more content from the server, it will
288
        # eventually disconnect us.
6133.4.22 by John Arbash Meinel
move the comment
289
        m = t.get_smart_medium()
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
290
        m.read_bytes(1)
6133.4.21 by John Arbash Meinel
I'm trying to make sure that 'bzr serve' supports the serve.client_timeout code.
291
        # Now, we wait for timeout to trigger
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
292
        err = process.stderr.readline()
293
        self.assertEqual(
6973.12.9 by Jelmer Vernooij
More fixes.
294
            b'Connection Timeout: disconnecting client after 0.2 seconds\n',
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
295
            err)
6133.4.21 by John Arbash Meinel
I'm trying to make sure that 'bzr serve' supports the serve.client_timeout code.
296
        self.assertServerFinishesCleanly(process)
297
6133.4.29 by John Arbash Meinel
Expose --client-timeout to the command line, pass it through the layers.
298
    def test_bzr_serve_supports_client_timeout(self):
299
        process, url = self.start_server_port(['--client-timeout=0.1'])
6855.4.1 by Jelmer Vernooij
Yet more bees.
300
        self.build_tree_contents([('a_file', b'contents\n')])
6133.4.29 by John Arbash Meinel
Expose --client-timeout to the command line, pass it through the layers.
301
        # We can connect and issue a request
302
        t = transport.get_transport_from_url(url)
6973.12.9 by Jelmer Vernooij
More fixes.
303
        self.assertEqual(b'contents\n', t.get_bytes('a_file'))
6133.4.29 by John Arbash Meinel
Expose --client-timeout to the command line, pass it through the layers.
304
        # However, if we just wait for more content from the server, it will
305
        # eventually disconnect us.
306
        # TODO: Use something like signal.alarm() so that if the server doesn't
307
        #       properly handle the timeout, we end up failing the test instead
308
        #       of hanging forever.
309
        m = t.get_smart_medium()
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
310
        m.read_bytes(1)
6133.4.29 by John Arbash Meinel
Expose --client-timeout to the command line, pass it through the layers.
311
        # Now, we wait for timeout to trigger
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
312
        err = process.stderr.readline()
313
        self.assertEqual(
6973.12.9 by Jelmer Vernooij
More fixes.
314
            b'Connection Timeout: disconnecting client after 0.1 seconds\n',
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
315
            err)
6133.4.29 by John Arbash Meinel
Expose --client-timeout to the command line, pass it through the layers.
316
        self.assertServerFinishesCleanly(process)
317
6133.4.47 by John Arbash Meinel
Testing that 'bzr serve' actually installs SIGHUP and responds to it showed some problems.
318
    def test_bzr_serve_graceful_shutdown(self):
7143.15.2 by Jelmer Vernooij
Run autopep8.
319
        big_contents = b'a' * 64 * 1024
6133.4.68 by John Arbash Meinel
Fix the blackbox test to wait for the process to exit.
320
        self.build_tree_contents([('bigfile', big_contents)])
6133.4.47 by John Arbash Meinel
Testing that 'bzr serve' actually installs SIGHUP and responds to it showed some problems.
321
        process, url = self.start_server_port(['--client-timeout=1.0'])
322
        t = transport.get_transport_from_url(url)
6133.4.68 by John Arbash Meinel
Fix the blackbox test to wait for the process to exit.
323
        m = t.get_smart_medium()
324
        c = client._SmartClient(m)
325
        # Start, but don't finish a response
7063.1.1 by Jelmer Vernooij
Fix flaky test.
326
        resp, response_handler = c.call_expecting_body(b'get', b'bigfile')
6973.12.9 by Jelmer Vernooij
More fixes.
327
        self.assertEqual((b'ok',), resp)
6133.4.47 by John Arbash Meinel
Testing that 'bzr serve' actually installs SIGHUP and responds to it showed some problems.
328
        # Note: process.send_signal is a Python 2.6ism
329
        process.send_signal(signal.SIGHUP)
6133.4.68 by John Arbash Meinel
Fix the blackbox test to wait for the process to exit.
330
        # Wait for the server to notice the signal, and then read the actual
331
        # body of the response. That way we know that it is waiting for the
332
        # request to finish
6973.12.9 by Jelmer Vernooij
More fixes.
333
        self.assertEqual(b'Requested to stop gracefully\n',
6133.4.68 by John Arbash Meinel
Fix the blackbox test to wait for the process to exit.
334
                         process.stderr.readline())
7063.1.1 by Jelmer Vernooij
Fix flaky test.
335
        self.assertIn(process.stderr.readline(),
336
                      (b'', b'Waiting for 1 client(s) to finish\n'))
6133.4.68 by John Arbash Meinel
Fix the blackbox test to wait for the process to exit.
337
        body = response_handler.read_body_bytes()
338
        if body != big_contents:
339
            self.fail('Failed to properly read the contents of "bigfile"')
340
        # Now that our request is finished, the medium should notice it has
341
        # been disconnected.
6973.12.9 by Jelmer Vernooij
More fixes.
342
        self.assertEqual(b'', m.read_bytes(1))
6133.4.68 by John Arbash Meinel
Fix the blackbox test to wait for the process to exit.
343
        # And the server should be stopping
344
        self.assertEqual(0, process.wait())
6133.4.47 by John Arbash Meinel
Testing that 'bzr serve' actually installs SIGHUP and responds to it showed some problems.
345
4544.1.2 by Andrew Bennetts
Add test that would catch the lack of ChrootServer in cmd_serve.
346
4815.3.7 by Gordon Tyler
Made a few changes at the suggestion of vila.
347
class TestCmdServeChrooting(TestBzrServeBase):
4544.1.2 by Andrew Bennetts
Add test that would catch the lack of ChrootServer in cmd_serve.
348
349
    def test_serve_tcp(self):
6622.1.29 by Jelmer Vernooij
Fix some more tests.
350
        """'brz serve' wraps the given --directory in a ChrootServer.
4544.1.2 by Andrew Bennetts
Add test that would catch the lack of ChrootServer in cmd_serve.
351
352
        So requests that search up through the parent directories (like
353
        find_repositoryV3) will give "not found" responses, rather than
354
        InvalidURLJoin or jail break errors.
355
        """
356
        t = self.get_transport()
357
        t.mkdir('server-root')
358
        self.run_bzr_serve_then_func(
6511.2.2 by Jelmer Vernooij
Revert to using 127.0.0.1 when starting serve, as that is what the client will use to connect.
359
            ['--listen', '127.0.0.1', '--port', '0',
4676.3.3 by Vincent Ladeuil
Force IPV4 to fix failure on IPV6-enabled hosts.
360
             '--directory', t.local_abspath('server-root'),
4544.1.2 by Andrew Bennetts
Add test that would catch the lack of ChrootServer in cmd_serve.
361
             '--allow-writes'],
4815.3.3 by Gordon Tyler
Changed test_bzr_serve_quiet to use in-process execution of the command.
362
            func=self.when_server_started)
4544.1.2 by Andrew Bennetts
Add test that would catch the lack of ChrootServer in cmd_serve.
363
        # The when_server_started method issued a find_repositoryV3 that should
364
        # fail with 'norepository' because there are no repositories inside the
365
        # --directory.
6973.12.9 by Jelmer Vernooij
More fixes.
366
        self.assertEqual((b'norepository',), self.client_resp)
4676.3.1 by Vincent Ladeuil
Marking TestCmdServeChrooting.test_serve_tcp as expected failure
367
4544.1.2 by Andrew Bennetts
Add test that would catch the lack of ChrootServer in cmd_serve.
368
    def when_server_started(self):
369
        # Connect to the TCP server and issue some requests and see what comes
370
        # back.
371
        client_medium = medium.SmartTCPClientMedium(
372
            '127.0.0.1', self.tcp_server.port,
6622.1.30 by Jelmer Vernooij
Some more test fixes.
373
            'bzr://localhost:%d/' % (self.tcp_server.port,))
4544.1.2 by Andrew Bennetts
Add test that would catch the lack of ChrootServer in cmd_serve.
374
        smart_client = client._SmartClient(client_medium)
375
        resp = smart_client.call('mkdir', 'foo', '')
376
        resp = smart_client.call('BzrDirFormat.initialize', 'foo/')
377
        try:
378
            resp = smart_client.call('BzrDir.find_repositoryV3', 'foo/')
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
379
        except errors.ErrorFromSmartServer as e:
4544.1.2 by Andrew Bennetts
Add test that would catch the lack of ChrootServer in cmd_serve.
380
            resp = e.error_tuple
381
        self.client_resp = resp
382
        client_medium.disconnect()
383
384
4634.43.7 by Andrew Bennetts
Add some unit tests for parts of userdir expansion.
385
class TestUserdirExpansion(TestCaseWithMemoryTransport):
386
5340.15.1 by John Arbash Meinel
supersede exc-info branch
387
    @staticmethod
388
    def fake_expanduser(path):
4634.43.7 by Andrew Bennetts
Add some unit tests for parts of userdir expansion.
389
        """A simple, environment-independent, function for the duration of this
390
        test.
391
392
        Paths starting with a path segment of '~user' will expand to start with
393
        '/home/user/'.  Every other path will be unchanged.
394
        """
395
        if path.split('/', 1)[0] == '~user':
396
            return '/home/user' + path[len('~user'):]
397
        return path
398
399
    def make_test_server(self, base_path='/'):
4934.3.3 by Martin Pool
Rename Server.setUp to Server.start_server
400
        """Make and start a BzrServerFactory, backed by a memory transport, and
4634.43.7 by Andrew Bennetts
Add some unit tests for parts of userdir expansion.
401
        creat '/home/user' in that transport.
402
        """
4634.43.15 by Andrew Bennetts
Rename BzrServerMaker -> BzrServerFactory.
403
        bzr_server = BzrServerFactory(
4634.43.7 by Andrew Bennetts
Add some unit tests for parts of userdir expansion.
404
            self.fake_expanduser, lambda t: base_path)
405
        mem_transport = self.get_transport()
6926.1.4 by Jelmer Vernooij
remove mkdir_multi.
406
        mem_transport.mkdir('home')
407
        mem_transport.mkdir('home/user')
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
408
        bzr_server.set_up(mem_transport, None, None, inet=True, timeout=4.0)
4634.43.19 by Andrew Bennetts
Rename BzrServerFactory's setUp/tearDown to set_up/tear_down; this isn't a TestCase (or transport Server), so we should not use camelCase names.
409
        self.addCleanup(bzr_server.tear_down)
4634.43.7 by Andrew Bennetts
Add some unit tests for parts of userdir expansion.
410
        return bzr_server
411
412
    def test_bzr_serve_expands_userdir(self):
413
        bzr_server = self.make_test_server()
414
        self.assertTrue(bzr_server.smart_server.backing_transport.has('~user'))
415
416
    def test_bzr_serve_does_not_expand_userdir_outside_base(self):
417
        bzr_server = self.make_test_server('/foo')
7143.15.2 by Jelmer Vernooij
Run autopep8.
418
        self.assertFalse(
419
            bzr_server.smart_server.backing_transport.has('~user'))
4544.1.2 by Andrew Bennetts
Add test that would catch the lack of ChrootServer in cmd_serve.
420
4634.43.8 by Andrew Bennetts
Test for recovering the --directory value from the transport cmd_serve passes to bzr_serve.
421
    def test_get_base_path(self):
422
        """cmd_serve will turn the --directory option into a LocalTransport
4634.43.15 by Andrew Bennetts
Rename BzrServerMaker -> BzrServerFactory.
423
        (optionally decorated with 'readonly+').  BzrServerFactory can
424
        determine the original --directory from that transport.
4634.43.8 by Andrew Bennetts
Test for recovering the --directory value from the transport cmd_serve passes to bzr_serve.
425
        """
4797.3.4 by John Arbash Meinel
Per review recommendation, use 'osutils.abspath' instead of hardcoded string.
426
        # URLs always include the trailing slash, and get_base_path returns it
427
        base_dir = osutils.abspath('/a/b/c') + '/'
4797.3.21 by John Arbash Meinel
Use urlutils.local_path_to_url to handle both windows and linux.
428
        base_url = urlutils.local_path_to_url(base_dir) + '/'
4634.43.8 by Andrew Bennetts
Test for recovering the --directory value from the transport cmd_serve passes to bzr_serve.
429
        # Define a fake 'protocol' to capture the transport that cmd_serve
430
        # passes to serve_bzr.
7143.15.2 by Jelmer Vernooij
Run autopep8.
431
6133.4.34 by John Arbash Meinel
get the blackbox tests passing.
432
        def capture_transport(transport, host, port, inet, timeout):
4634.43.8 by Andrew Bennetts
Test for recovering the --directory value from the transport cmd_serve passes to bzr_serve.
433
            self.bzr_serve_transport = transport
434
        cmd = builtins.cmd_serve()
435
        # Read-only
4789.7.1 by John Arbash Meinel
Fix a 'bzr serve' test that didn't expect windows translating '/a' to 'C:/a'.
436
        cmd.run(directory=base_dir, protocol=capture_transport)
4634.43.15 by Andrew Bennetts
Rename BzrServerMaker -> BzrServerFactory.
437
        server_maker = BzrServerFactory()
4634.43.8 by Andrew Bennetts
Test for recovering the --directory value from the transport cmd_serve passes to bzr_serve.
438
        self.assertEqual(
4797.3.21 by John Arbash Meinel
Use urlutils.local_path_to_url to handle both windows and linux.
439
            'readonly+%s' % base_url, self.bzr_serve_transport.base)
4634.43.8 by Andrew Bennetts
Test for recovering the --directory value from the transport cmd_serve passes to bzr_serve.
440
        self.assertEqual(
4789.7.1 by John Arbash Meinel
Fix a 'bzr serve' test that didn't expect windows translating '/a' to 'C:/a'.
441
            base_dir, server_maker.get_base_path(self.bzr_serve_transport))
4634.43.8 by Andrew Bennetts
Test for recovering the --directory value from the transport cmd_serve passes to bzr_serve.
442
        # Read-write
4789.7.1 by John Arbash Meinel
Fix a 'bzr serve' test that didn't expect windows translating '/a' to 'C:/a'.
443
        cmd.run(directory=base_dir, protocol=capture_transport,
7143.15.2 by Jelmer Vernooij
Run autopep8.
444
                allow_writes=True)
4634.43.15 by Andrew Bennetts
Rename BzrServerMaker -> BzrServerFactory.
445
        server_maker = BzrServerFactory()
4797.3.21 by John Arbash Meinel
Use urlutils.local_path_to_url to handle both windows and linux.
446
        self.assertEqual(base_url, self.bzr_serve_transport.base)
4789.7.1 by John Arbash Meinel
Fix a 'bzr serve' test that didn't expect windows translating '/a' to 'C:/a'.
447
        self.assertEqual(base_dir,
7143.15.2 by Jelmer Vernooij
Run autopep8.
448
                         server_maker.get_base_path(self.bzr_serve_transport))
6236.1.1 by Jelmer Vernooij
bzr serve can now serve remote URLs and things behind directory services.
449
        # Read-only, from a URL
450
        cmd.run(directory=base_url, protocol=capture_transport)
451
        server_maker = BzrServerFactory()
452
        self.assertEqual(
453
            'readonly+%s' % base_url, self.bzr_serve_transport.base)
454
        self.assertEqual(
455
            base_dir, server_maker.get_base_path(self.bzr_serve_transport))