Rev 4900: _send_request can't handle retrying during a read failure in http://bazaar.launchpad.net/~jameinel/bzr/2.1-client-reconnect-819604

John Arbash Meinel john at arbash-meinel.com
Fri Oct 7 12:07:43 UTC 2011


At http://bazaar.launchpad.net/~jameinel/bzr/2.1-client-reconnect-819604

------------------------------------------------------------
revno: 4900
revision-id: john at arbash-meinel.com-20111007120719-snkpzqcm6hyksu28
parent: john at arbash-meinel.com-20111007115742-ufmzjl8nudfdmq18
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.1-client-reconnect-819604
timestamp: Fri 2011-10-07 14:07:19 +0200
message:
  _send_request can't handle retrying during a read failure
-------------- next part --------------
=== modified file 'bzrlib/tests/test_smart_transport.py'
--- a/bzrlib/tests/test_smart_transport.py	2011-10-07 11:57:42 +0000
+++ b/bzrlib/tests/test_smart_transport.py	2011-10-07 12:07:19 +0000
@@ -95,9 +95,10 @@
     The second connection will succeed normally.
     """
 
-    def __init__(self, read_from, write_to):
+    def __init__(self, read_from, write_to, fail_at_write=True):
         super(FirstRejectedStringIOSSHVendor, self).__init__(read_from,
             write_to)
+        self.fail_at_write= fail_at_write
         self._first = True
 
     def connect_ssh(self, username, password, host, port, command):
@@ -135,10 +136,15 @@
 
     def get_filelike_channels(self):
         # We create matching pipes, and then close the ssh side
-        ssh_read, bzr_write = create_file_pipes()
         bzr_read, ssh_write = create_file_pipes()
-        ssh_read.close()
+        # We always fail when bzr goes to read
         ssh_write.close()
+        if self.vendor.fail_at_write:
+            # If set, we'll also fail when bzr goes to write
+            ssh_read, bzr_write = create_file_pipes()
+            ssh_read.close()
+        else:
+            bzr_write = self.vendor.write_to
         return bzr_read, bzr_write
 
 
@@ -3401,7 +3407,7 @@
         self.assertRaises(errors.ConnectionReset,
             handler.read_response_tuple, expect_body=False)
 
-    def test__send_request_retries(self):
+    def test__send_request_retries_on_write(self):
         response = StringIO()
         output = StringIO()
         vendor = FirstRejectedStringIOSSHVendor(response, output)
@@ -3422,6 +3428,25 @@
             ],
             vendor.calls)
 
+    def test__send_request_doesnt_retry_read_failure(self):
+        response = StringIO()
+        output = StringIO()
+        vendor = FirstRejectedStringIOSSHVendor(response, output,
+                    fail_at_write=False)
+        client_medium = medium.SmartSSHClientMedium(
+            'a host', 'a port', 'a user', 'a pass', 'base', vendor,
+            'bzr')
+        smart_client = client._SmartClient(client_medium)
+        handler = smart_client._send_request(3, 'hello', ())
+        message_sent = output.getvalue()
+        self.assertStartsWith(message_sent, 'bzr message 3 (bzr 1.6)\n')
+        self.assertEndsWith(message_sent, 's\x00\x00\x00\tl5:helloee')
+        self.assertEqual(
+            [('connect_ssh', 'a user', 'a pass', 'a host', 'a port',
+              ['bzr', 'serve', '--inet', '--directory=/', '--allow-writes']),
+            ],
+            vendor.calls)
+        self.assertRaises(errors.ConnectionReset, handler.read_response_tuple)
 
 
 class LengthPrefixedBodyDecoder(tests.TestCase):



More information about the bazaar-commits mailing list