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