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