[Telepathy-commits] [telepathy-gabble/master] pass 2 list of events to open_bystream to break races

Guillaume Desmottes guillaume.desmottes at collabora.co.uk
Thu Mar 5 07:28:55 PST 2009


---
 tests/twisted/bytestream.py                     |   50 ++++++++++++-----------
 tests/twisted/tubes/accept-private-dbus-tube.py |   23 ++++++----
 2 files changed, 40 insertions(+), 33 deletions(-)

diff --git a/tests/twisted/bytestream.py b/tests/twisted/bytestream.py
index 77b57ce..cb2ba4a 100644
--- a/tests/twisted/bytestream.py
+++ b/tests/twisted/bytestream.py
@@ -11,6 +11,11 @@ from servicetest import Event, EventPattern
 from gabbletest import acknowledge_iq, sync_stream, make_result_iq
 import ns
 
+def wait_events(q, expected, my_event):
+    tmp = expected + [my_event]
+    events = q.expect_many(*tmp)
+    return events[:-1], events[-1]
+
 def create_from_si_offer(stream, q, bytestream_cls, iq, initiator):
     si_nodes = xpath.queryForNodes('/iq/si', iq)
     assert si_nodes is not None
@@ -45,7 +50,7 @@ class Bytestream(object):
         self.target = target
         self.initiated = initiated
 
-    def open_bytestream(self, expected=None):
+    def open_bytestream(self, expected_before=[], expected_after=[]):
         raise NotImplemented
 
     def send_data(self, data):
@@ -165,13 +170,9 @@ class BytestreamS5B(Bytestream):
         streamhost = xpath.queryForNodes('/iq/query/streamhost-used', iq)[0]
         assert streamhost['jid'] == self.initiator
 
-    def _socks5_expect_connection(self, expected):
-        if expected is not None:
-            event, _ = self.q.expect_many(expected,
-                EventPattern('s5b-connected'))
-        else:
-            event = None
-            self.q.expect('s5b-connected')
+    def _socks5_expect_connection(self, expected_before, expected_after):
+        events_before, _ = wait_events(self.q, expected_before,
+            EventPattern('s5b-connected'))
 
         self._wait_auth_request()
         self._send_auth_reply()
@@ -179,10 +180,12 @@ class BytestreamS5B(Bytestream):
         self._send_connect_reply()
 
         # wait for S5B IQ reply
-        e = self.q.expect('stream-iq', iq_type='result', to=self.initiator)
+        events_after, e = wait_events(self.q, expected_after,
+            EventPattern('stream-iq', iq_type='result', to=self.initiator))
+
         self._check_s5b_reply(e.stanza)
 
-        return event
+        return events_before, events_after
 
     def _listen_socks5(self):
         for port in range(5000,5100):
@@ -195,7 +198,7 @@ class BytestreamS5B(Bytestream):
 
         assert False, "Can't find a free port"
 
-    def open_bytestream(self, expected=None):
+    def open_bytestream(self, expected_before=[], expected_after=[]):
         port = self._listen_socks5()
 
         self._send_socks5_init([
@@ -208,7 +211,7 @@ class BytestreamS5B(Bytestream):
             ('Not me', '127.0.0.1', port),
             ])
 
-        return self._socks5_expect_connection(expected)
+        return self._socks5_expect_connection(expected_before, expected_after)
 
     def send_data(self, data):
         self.transport.write(data)
@@ -359,12 +362,14 @@ class BytestreamIBB(Bytestream):
     def get_ns(self):
         return ns.IBB
 
-    def open_bytestream(self, expected=None):
+    def open_bytestream(self, expected_before=[], expected_after=[]):
         # open IBB bytestream
         send_ibb_open(self.stream, self.initiator, self.target, self.stream_id, 4096)
 
-        if expected is not None:
-            return self.q.expect_many(expected)[0]
+        events_before = self.q.expect_many(*expected_before)
+        events_after = self.q.expect_many(*expected_after)
+
+        return events_before, events_after
 
     def send_data(self, data):
         if self.initiated:
@@ -473,7 +478,7 @@ class BytestreamSIFallback(Bytestream):
         assert str(value[0]) == self.socks5.get_ns()
         assert str(value[1]) == self.ibb.get_ns()
 
-    def open_bytestream(self, expected=None):
+    def open_bytestream(self, expected_before=[], expected_after=[]):
         # first propose to peer to connect using SOCKS5
         # We set an invalid IP so that won't work
         self.socks5._send_socks5_init([
@@ -481,18 +486,15 @@ class BytestreamSIFallback(Bytestream):
             (self.initiator, 'invalid.invalid', 12345),
             ])
 
-        if expected is not None:
-            event, iq_event = self.q.expect_many(expected,
-                EventPattern('stream-iq', iq_type='error', to=self.initiator))
-        else:
-            event = None
-            iq_event = self.q.expect('stream-iq', iq_type='error', to=self.initiator)
+        events_before, iq_event = wait_events(self.q, expected_before,
+            EventPattern('stream-iq', iq_type='error', to=self.initiator))
 
         self.socks5.check_error_stanza(iq_event.stanza)
 
         # socks5 failed, let's try IBB
-        self.ibb.open_bytestream()
-        return event
+        _, events_after = self.ibb.open_bytestream([], expected_after)
+
+        return events_before, events_after
 
     def send_data(self, data):
         self.used.send_data(data)
diff --git a/tests/twisted/tubes/accept-private-dbus-tube.py b/tests/twisted/tubes/accept-private-dbus-tube.py
index c490d8d..83b6fbb 100644
--- a/tests/twisted/tubes/accept-private-dbus-tube.py
+++ b/tests/twisted/tubes/accept-private-dbus-tube.py
@@ -123,9 +123,10 @@ def test(q, bus, conn, stream, bytestream_cls):
     assert len(tube) == 1
 
     # Init the bytestream
-    event = bytestream.open_bytestream(EventPattern('dbus-return', method='AcceptDBusTube'))
+    events, _ = bytestream.open_bytestream([EventPattern('dbus-return', method='AcceptDBusTube')])
+    return_event = events[0]
 
-    address = event.value[0]
+    address = return_event.value[0]
     assert len(address) > 0
 
     event = q.expect('dbus-signal', signal='TubeStateChanged',
@@ -165,18 +166,22 @@ def test(q, bus, conn, stream, bytestream_cls):
     # accept the tube (new API)
     call_async(q, dbus_tube_iface, 'AcceptDBusTube')
 
-    event = q.expect('stream-iq', iq_type='result')
-    bytestream.check_si_reply(event.stanza)
-    tube = xpath.queryForNodes('/iq/si/tube[@xmlns="%s"]' % ns.TUBES, event.stanza)
-    assert len(tube) == 1
-
     # Init the bytestream
-    return_event = bytestream.open_bytestream(EventPattern('dbus-return', method='AcceptDBusTube'))
+    events, state_event = bytestream.open_bytestream(
+            [EventPattern('stream-iq', iq_type='result'),
+                EventPattern('dbus-return', method='AcceptDBusTube')],
+            [EventPattern('dbus-signal', signal='TubeChannelStateChanged')])
+
+    iq_event = events[0]
+    bytestream.check_si_reply(iq_event.stanza)
+    tube = xpath.queryForNodes('/iq/si/tube[@xmlns="%s"]' % ns.TUBES, iq_event.stanza)
+    assert len(tube) == 1
 
-    state_event = q.expect('dbus-signal', signal='TubeChannelStateChanged')
+    return_event = events[1]
     addr = return_event.value[0]
     assert len(addr) > 0
 
+    state_event = state_event[0]
     assert state_event.args[0] == cs.TUBE_STATE_OPEN
 
     # close the tube
-- 
1.5.6.5




More information about the telepathy-commits mailing list