[telepathy-gabble/master] file_transfer_helper.py: break a race with the FileTransferStateChanged signal

Guillaume Desmottes guillaume.desmottes at collabora.co.uk
Mon May 11 05:14:52 PDT 2009


FileTransferStateChanged can be fired during self.bytestream.get_data()
if we are receiving data from a socket (SOCKS5). Break a race by
not waiting for this signal if it has already been fired while we
received the data.
---
 .../twisted/file-transfer/file_transfer_helper.py  |   25 +++++++++++++++----
 1 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/tests/twisted/file-transfer/file_transfer_helper.py b/tests/twisted/file-transfer/file_transfer_helper.py
index a76dd93..8fa5bcd 100644
--- a/tests/twisted/file-transfer/file_transfer_helper.py
+++ b/tests/twisted/file-transfer/file_transfer_helper.py
@@ -407,6 +407,14 @@ class SendFileTest(FileTransferTest):
 
         self.ft_channel.connect_to_signal('TransferredBytesChanged', bytes_changed_cb)
 
+        # FileTransferStateChanged can be fired while we are receiving data
+        # (in the SOCKS5 case for example)
+        self.completed = False
+        def ft_state_changed_cb(state, reason):
+            if state == cs.FT_STATE_COMPLETED:
+                self.completed = True
+        self.ft_channel.connect_to_signal('FileTransferStateChanged', ft_state_changed_cb)
+
         # get data from bytestream
         data = ''
         while len(data) < to_receive:
@@ -421,13 +429,18 @@ class SendFileTest(FileTransferTest):
 
         assert self.count == to_receive
 
-        # FileTransferStateChanged could have already been fired
-        events = self.bytestream.wait_bytestream_closed(
-            [EventPattern('dbus-signal', signal='FileTransferStateChanged')])
+        if self.completed:
+            # FileTransferStateChanged has already been received
+            waiting = []
+        else:
+            waiting = [EventPattern('dbus-signal', signal='FileTransferStateChanged')]
 
-        state, reason = events[0].args
-        assert state == cs.FT_STATE_COMPLETED
-        assert reason == cs.FT_STATE_CHANGE_REASON_NONE
+        events = self.bytestream.wait_bytestream_closed(waiting)
+
+        if len(waiting) > 1:
+            state, reason = events[0].args
+            assert state == cs.FT_STATE_COMPLETED
+            assert reason == cs.FT_STATE_CHANGE_REASON_NONE
 
 def exec_file_transfer_test(test_cls):
     for bytestream_cls  in [
-- 
1.5.6.5



More information about the telepathy-commits mailing list