Rev 5262: Ensure a simple dialog can occur between a client and a server. in file:///home/vila/src/bzr/experimental/leaking-tests/
Vincent Ladeuil
v.ladeuil+lp at free.fr
Wed Jun 2 16:45:08 BST 2010
At file:///home/vila/src/bzr/experimental/leaking-tests/
------------------------------------------------------------
revno: 5262
revision-id: v.ladeuil+lp at free.fr-20100602154508-g5ojvqupg1ioq41a
parent: v.ladeuil+lp at free.fr-20100602145004-mth2e7a51ox29nw5
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: propagate-exceptions
timestamp: Wed 2010-06-02 17:45:08 +0200
message:
Ensure a simple dialog can occur between a client and a server.
* bzrlib/tests/test_test_server.py:
(TCPClient.connect): Ensure we don't reuse a connected client.
(TCPClient.read, TCPClient.write): Basic methods to dialog with
the server.
(TCPConnectionHandler.handle): Implement a basic dialog handling
for the server.
(TestTestingServerInAThread.test_client_talks_server_respond):
Test a connection end to end.
* bzrlib/tests/test_server.py:
(TestingTCPServerMixin.verify_request): Don't process the
connection if we are not serving anymore.
-------------- next part --------------
=== modified file 'bzrlib/tests/test_server.py'
--- a/bzrlib/tests/test_server.py 2010-06-02 14:50:04 +0000
+++ b/bzrlib/tests/test_server.py 2010-06-02 15:45:08 +0000
@@ -307,6 +307,15 @@
self.server_close()
self.stopped.set()
+ def verify_request(self, request, client_address):
+ """Verify the request.
+
+ Return True if we should proceed with this request, False if we should
+ not even touch a single byte in the socket ! This is used to stop the
+ server with a dummy last connection.
+ """
+ return self.serving.isSet()
+
def stop_clients(self):
pass
=== modified file 'bzrlib/tests/test_test_server.py'
--- a/bzrlib/tests/test_test_server.py 2010-06-02 14:50:04 +0000
+++ b/bzrlib/tests/test_test_server.py 2010-06-02 15:45:08 +0000
@@ -29,6 +29,9 @@
self.sock = None
def connect(self, addr):
+ if self.sock is not None:
+ raise AssertionError('Already connected to %r'
+ % (self.sock.getsockname(),))
self.sock = osutils.connect_socket(addr)
def disconnect(self):
@@ -37,26 +40,61 @@
self.sock.close()
self.sock = None
+ def write(self, s):
+ return self.sock.sendall(s)
+
+ def read(self, bufsize=4096):
+ return self.sock.recv(bufsize)
+
+
class TCPConnectionHandler(SocketServer.StreamRequestHandler):
def handle(self):
- pass
+ self.done = False
+ self.handle_connection()
+ while not self.done:
+ self.handle_connection()
+
+ def handle_connection(self):
+ req = self.rfile.readline()
+ if not req:
+ self.done = True
+ elif req == 'ping\n':
+ self.wfile.write('pong\n')
+ else:
+ raise ValueError('[%s] not understood' % req)
class TestTestingServerInAThread(tests.TestCase):
- def test_start_stop(self):
- server = test_server.TestingTCPServerInAThread(
+ def get_server(self):
+ server = test_server.TestingTCPServerInAThread(
('localhost', 0), test_server.TestingTCPServer,
TCPConnectionHandler)
- client = TCPClient()
server.start_server()
self.addCleanup(server.stop_server)
- client.connect(server.server_address)
+ return server
+
+ def get_client(self):
+ client = TCPClient()
self.addCleanup(client.disconnect)
+ return client
+
+ def test_start_stop(self):
+ server = self.get_server()
+ client = self.get_client()
+ client.connect(server.server_address)
server.stop_server()
# since the server doesn't accept connections anymore attempting to
# connect should fail
+ client = self.get_client()
self.assertRaises(socket.error, client.connect, server.server_address)
+ def test_client_talks_server_respond(self):
+ server = self.get_server()
+ client = self.get_client()
+ client.connect(server.server_address)
+ self.assertIs(None, client.write('ping\n'))
+ resp = client.read()
+ self.assertEquals('pong\n', resp)
More information about the bazaar-commits
mailing list