272
267
self.assertContainsRe(content, r'hpss request: \[[0-9-]+\]')
274
def test_bzr_serve_supports_configurable_timeout(self):
275
gs = config.GlobalStack()
276
gs.set('serve.client_timeout', 0.2)
277
process, url = self.start_server_port()
278
self.build_tree_contents([('a_file', 'contents\n')])
279
# We can connect and issue a request
280
t = transport.get_transport_from_url(url)
281
self.assertEqual('contents\n', t.get_bytes('a_file'))
282
# However, if we just wait for more content from the server, it will
283
# eventually disconnect us.
284
# TODO: Use something like signal.alarm() so that if the server doesn't
285
# properly handle the timeout, we end up failing the test instead
286
# of hanging forever.
287
m = t.get_smart_medium()
289
# Now, we wait for timeout to trigger
290
err = process.stderr.readline()
292
'Connection Timeout: disconnecting client after 0.2 seconds\n',
294
self.assertServerFinishesCleanly(process)
296
def test_bzr_serve_supports_client_timeout(self):
297
process, url = self.start_server_port(['--client-timeout=0.1'])
298
self.build_tree_contents([('a_file', 'contents\n')])
299
# We can connect and issue a request
300
t = transport.get_transport_from_url(url)
301
self.assertEqual('contents\n', t.get_bytes('a_file'))
302
# However, if we just wait for more content from the server, it will
303
# eventually disconnect us.
304
# TODO: Use something like signal.alarm() so that if the server doesn't
305
# properly handle the timeout, we end up failing the test instead
306
# of hanging forever.
307
m = t.get_smart_medium()
309
# Now, we wait for timeout to trigger
310
err = process.stderr.readline()
312
'Connection Timeout: disconnecting client after 0.1 seconds\n',
314
self.assertServerFinishesCleanly(process)
316
def test_bzr_serve_graceful_shutdown(self):
317
big_contents = 'a'*64*1024
318
self.build_tree_contents([('bigfile', big_contents)])
319
process, url = self.start_server_port(['--client-timeout=1.0'])
320
t = transport.get_transport_from_url(url)
321
m = t.get_smart_medium()
322
c = client._SmartClient(m)
323
# Start, but don't finish a response
324
resp, response_handler = c.call_expecting_body('get', 'bigfile')
325
self.assertEqual(('ok',), resp)
326
# Note: process.send_signal is a Python 2.6ism
327
process.send_signal(signal.SIGHUP)
328
# Wait for the server to notice the signal, and then read the actual
329
# body of the response. That way we know that it is waiting for the
331
self.assertEqual('Requested to stop gracefully\n',
332
process.stderr.readline())
333
self.assertEqual('Waiting for 1 client(s) to finish\n',
334
process.stderr.readline())
335
body = response_handler.read_body_bytes()
336
if body != big_contents:
337
self.fail('Failed to properly read the contents of "bigfile"')
338
# Now that our request is finished, the medium should notice it has
340
self.assertEqual('', m.read_bytes(1))
341
# And the server should be stopping
342
self.assertEqual(0, process.wait())
345
270
class TestCmdServeChrooting(TestBzrServeBase):