summaryrefslogtreecommitdiff
path: root/tests/twisted/tubes/offer-muc-stream-tube.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/twisted/tubes/offer-muc-stream-tube.py')
-rw-r--r--tests/twisted/tubes/offer-muc-stream-tube.py218
1 files changed, 32 insertions, 186 deletions
diff --git a/tests/twisted/tubes/offer-muc-stream-tube.py b/tests/twisted/tubes/offer-muc-stream-tube.py
index 433d79c82..2188e82a9 100644
--- a/tests/twisted/tubes/offer-muc-stream-tube.py
+++ b/tests/twisted/tubes/offer-muc-stream-tube.py
@@ -11,7 +11,6 @@ import constants as cs
import ns
import tubetestutil as t
from mucutil import join_muc
-from muctubeutil import get_muc_tubes_channel
from bytestream import BytestreamS5BRelay, BytestreamS5BRelayBugged
from twisted.words.xish import xpath
@@ -73,127 +72,25 @@ def test(q, bus, conn, stream, bytestream_cls,
acknowledge_iq(stream, iq_event.stanza)
- self_handle = conn.GetSelfHandle()
- self_name = conn.InspectHandles(cs.HT_CONTACT, [self_handle])[0]
-
t.check_conn_properties(q, conn)
- room_handle, tubes_chan, tubes_iface = get_muc_tubes_channel(q, bus, conn,
- stream, 'chat@conf.localhost')
-
- tubes_self_handle = tubes_chan.GetSelfHandle(dbus_interface=cs.CHANNEL_IFACE_GROUP)
-
bob_handle = conn.RequestHandles(cs.HT_CONTACT, ['chat@conf.localhost/bob'])[0]
address = t.create_server(q, address_type)
- # offer stream tube (old API) using an Unix socket
- call_async(q, tubes_iface, 'OfferStreamTube',
- 'echo', sample_parameters, address_type, address,
- access_control, access_control_param)
+ def new_chan_predicate(e):
+ types = []
+ for _, props in e.args[0]:
+ types.append(props[cs.CHANNEL_TYPE])
- new_tube_event, stream_event, _, new_channels_event = q.expect_many(
- EventPattern('dbus-signal', signal='NewTube'),
- EventPattern('stream-presence', to='chat@conf.localhost/test'),
- EventPattern('dbus-return', method='OfferStreamTube'),
- EventPattern('dbus-signal', signal='NewChannels'))
-
- # handle new_tube_event
- stream_tube_id = new_tube_event.args[0]
- assert new_tube_event.args[1] == tubes_self_handle
- assert new_tube_event.args[2] == 1 # Stream
- assert new_tube_event.args[3] == 'echo'
- assert new_tube_event.args[4] == sample_parameters
- assert new_tube_event.args[5] == cs.TUBE_CHANNEL_STATE_OPEN
-
- # handle stream_event
- # We announce our newly created tube in our muc presence
- presence = stream_event.stanza
- tubes_nodes = xpath.queryForNodes('/presence/tubes[@xmlns="%s"]'
- % ns.TUBES, presence)
- assert tubes_nodes is not None
- assert len(tubes_nodes) == 1
+ return cs.CHANNEL_TYPE_STREAM_TUBE in types
- tube_nodes = xpath.queryForNodes('/tubes/tube', tubes_nodes[0])
- assert tube_nodes is not None
- assert len(tube_nodes) == 1
- for tube in tube_nodes:
- assert tube['type'] == 'stream'
- assert not tube.hasAttribute('initiator')
- assert tube['service'] == 'echo'
- assert not tube.hasAttribute('stream-id')
- assert not tube.hasAttribute('dbus-name')
- assert tube['id'] == str(stream_tube_id)
-
- params = {}
- parameter_nodes = xpath.queryForNodes('/tube/parameters/parameter', tube)
- for node in parameter_nodes:
- assert node['name'] not in params
- params[node['name']] = (node['type'], str(node))
- assert params == {'ay': ('bytes', 'aGVsbG8='),
- 's': ('str', 'hello'),
- 'i': ('int', '-123'),
- 'u': ('uint', '123'),
- }
-
- # tube is also announced using new API
- channels = new_channels_event.args[0]
- assert len(channels) == 1
- path, props = channels[0]
- assert props[cs.CHANNEL_TYPE] == cs.CHANNEL_TYPE_STREAM_TUBE
- assert props[cs.INITIATOR_HANDLE] == tubes_self_handle
- assert props[cs.INITIATOR_ID] == 'chat@conf.localhost/test'
- assert props[cs.INTERFACES] == [cs.CHANNEL_IFACE_GROUP, cs.CHANNEL_IFACE_TUBE]
- assert props[cs.REQUESTED] == True
- assert props[cs.TARGET_HANDLE] == room_handle
- assert props[cs.TARGET_ID] == 'chat@conf.localhost'
- assert props[cs.STREAM_TUBE_SERVICE] == 'echo'
-
- tube_chan = bus.get_object(conn.bus_name, path)
- tube_props = tube_chan.GetAll(cs.CHANNEL_IFACE_TUBE, dbus_interface=cs.PROPERTIES_IFACE,
- byte_arrays=True)
- assert tube_props['Parameters'] == sample_parameters
- assert tube_props['State'] == cs.TUBE_CHANNEL_STATE_OPEN
-
- tubes = tubes_iface.ListTubes(byte_arrays=True)
- assert tubes == [(
- stream_tube_id,
- tubes_self_handle,
- 1, # Stream
- 'echo',
- sample_parameters,
- cs.TUBE_CHANNEL_STATE_OPEN
- )]
-
- assert len(tubes) == 1, unwrap(tubes)
- expected_tube = (stream_tube_id, tubes_self_handle, cs.TUBE_TYPE_STREAM,
- 'echo', sample_parameters, cs.TUBE_STATE_OPEN)
- t.check_tube_in_tubes(expected_tube, tubes)
-
- # FIXME: if we use an unknown JID here, everything fails
- # (the code uses lookup where it should use ensure)
-
- bytestream = connect_to_tube(stream, q, bytestream_cls, 'chat@conf.localhost', stream_tube_id)
-
- iq_event, socket_event, _, conn_event = q.expect_many(
- EventPattern('stream-iq', iq_type='result'),
- EventPattern('socket-connected'),
- EventPattern('dbus-signal', signal='StreamTubeNewConnection',
- args=[stream_tube_id, bob_handle], interface=cs.CHANNEL_TYPE_TUBES),
- EventPattern('dbus-signal', signal='NewRemoteConnection',
- interface=cs.CHANNEL_TYPE_STREAM_TUBE))
-
- protocol = socket_event.protocol
-
- # handle iq_event
- bytestream.check_si_reply(iq_event.stanza)
- tube = xpath.queryForNodes('/iq//si/tube[@xmlns="%s"]' % ns.TUBES, iq_event.stanza)
- assert len(tube) == 1
-
- handle, access, conn_id = conn_event.args
- assert handle == bob_handle
+ def find_stream_tube(channels):
+ for path, props in channels:
+ if props[cs.CHANNEL_TYPE] == cs.CHANNEL_TYPE_STREAM_TUBE:
+ return path, props
- use_tube(q, bytestream, protocol, conn_id)
+ return None, None
# offer a stream tube to another room (new API)
address = t.create_server(q, address_type, block_reading=True)
@@ -201,68 +98,22 @@ def test(q, bus, conn, stream, bytestream_cls,
request = {
cs.CHANNEL_TYPE: cs.CHANNEL_TYPE_STREAM_TUBE,
cs.TARGET_HANDLE_TYPE: cs.HT_ROOM,
- cs.TARGET_ID: 'chat2@conf.localhost',
+ cs.TARGET_ID: 'chat@conf.localhost',
cs.STREAM_TUBE_SERVICE: 'newecho',
}
_, _, new_tube_path, new_tube_props = \
- join_muc(q, bus, conn, stream, 'chat2@conf.localhost', request)
-
- # The order in which the NewChannels signals are fired is
- # undefined -- it could be the (tubes, text) channels first, or it
- # could be the tube channel first; so let's accept either order
- # here.
-
- first, second = q.expect_many(
- EventPattern('dbus-signal', signal='NewChannels'),
- EventPattern('dbus-signal', signal='NewChannels'))
-
- # NewChannels signal with the text and tubes channels together.
- def nc_textandtubes(event):
- channels = event.args[0]
- assert len(channels) == 2
- path1, prop1 = channels[0]
- path2, prop2 = channels[1]
- assert sorted([prop1[cs.CHANNEL_TYPE], prop2[cs.CHANNEL_TYPE]]) == \
- [cs.CHANNEL_TYPE_TEXT, cs.CHANNEL_TYPE_TUBES]
-
- got_text, got_tubes = False, False
- for path, props in channels:
- if props[cs.CHANNEL_TYPE] == cs.CHANNEL_TYPE_TEXT:
- got_text = True
- elif props[cs.CHANNEL_TYPE] == cs.CHANNEL_TYPE_TUBES:
- got_tubes = True
- else:
- assert False
-
- assert props[cs.INITIATOR_HANDLE] == self_handle
- assert props[cs.INITIATOR_ID] == self_name
- assert cs.CHANNEL_IFACE_GROUP in props[cs.INTERFACES]
- assert props[cs.TARGET_ID] == 'chat2@conf.localhost'
- assert props[cs.REQUESTED] == False
-
- assert (got_text, got_tubes) == (True, True)
-
- # NewChannels signal with the tube channel.
- def nc_tube(event):
- # FIXME: in this case, all channels should probably be announced together
- channels = event.args[0]
- assert len(channels) == 1
- path, prop = channels[0]
- assert prop[cs.CHANNEL_TYPE] == cs.CHANNEL_TYPE_STREAM_TUBE
- assert prop[cs.INITIATOR_ID] == 'chat2@conf.localhost/test'
- assert prop[cs.REQUESTED] == True
- assert prop[cs.TARGET_HANDLE_TYPE] == cs.HT_ROOM
- assert prop[cs.TARGET_ID] == 'chat2@conf.localhost'
- assert prop[cs.STREAM_TUBE_SERVICE] == 'newecho'
-
- return path, prop
-
- if len(first.args[0]) == 1:
- path, prop = nc_tube(first)
- nc_textandtubes(second)
- else:
- nc_textandtubes(first)
- path, prop = nc_tube(second)
+ join_muc(q, bus, conn, stream, 'chat@conf.localhost', request)
+
+ e = q.expect('dbus-signal', signal='NewChannels',
+ predicate=new_chan_predicate)
+
+ path, prop = find_stream_tube(e.args[0])
+ assert prop[cs.CHANNEL_TYPE] == cs.CHANNEL_TYPE_STREAM_TUBE
+ assert prop[cs.INITIATOR_ID] == 'chat@conf.localhost/test'
+ assert prop[cs.REQUESTED] == True
+ assert prop[cs.TARGET_HANDLE_TYPE] == cs.HT_ROOM
+ assert prop[cs.TARGET_ID] == 'chat@conf.localhost'
+ assert prop[cs.STREAM_TUBE_SERVICE] == 'newecho'
# check that the tube channel is in the channels list
all_channels = conn.Get(cs.CONN_IFACE_REQUESTS, 'Channels',
@@ -279,21 +130,13 @@ def test(q, bus, conn, stream, bytestream_cls,
# offer the tube
call_async(q, stream_tube_iface, 'Offer', address_type, address, access_control, {'foo': 'bar'})
- new_tube_event, stream_event, _, status_event = q.expect_many(
- EventPattern('dbus-signal', signal='NewTube'),
- EventPattern('stream-presence', to='chat2@conf.localhost/test'),
+ stream_event, _, status_event = q.expect_many(
+ EventPattern('stream-presence', to='chat@conf.localhost/test'),
EventPattern('dbus-return', method='Offer'),
EventPattern('dbus-signal', signal='TubeChannelStateChanged', args=[cs.TUBE_CHANNEL_STATE_OPEN]))
tube_self_handle = tube_chan.GetSelfHandle(dbus_interface=cs.CHANNEL_IFACE_GROUP)
- assert conn.InspectHandles(cs.HT_CONTACT, [tube_self_handle]) == ['chat2@conf.localhost/test']
-
- # handle new_tube_event
- stream_tube_id = new_tube_event.args[0]
- assert new_tube_event.args[2] == 1 # Stream
- assert new_tube_event.args[3] == 'newecho'
- assert new_tube_event.args[4] == {'foo': 'bar'}
- assert new_tube_event.args[5] == cs.TUBE_CHANNEL_STATE_OPEN
+ assert conn.InspectHandles(cs.HT_CONTACT, [tube_self_handle]) == ['chat@conf.localhost/test']
presence = stream_event.stanza
tubes_nodes = xpath.queryForNodes('/presence/tubes[@xmlns="%s"]'
@@ -301,6 +144,8 @@ def test(q, bus, conn, stream, bytestream_cls,
assert tubes_nodes is not None
assert len(tubes_nodes) == 1
+ stream_tube_id = 666
+
tube_nodes = xpath.queryForNodes('/tubes/tube', tubes_nodes[0])
assert tube_nodes is not None
assert len(tube_nodes) == 1
@@ -310,7 +155,8 @@ def test(q, bus, conn, stream, bytestream_cls,
assert tube['service'] == 'newecho'
assert not tube.hasAttribute('stream-id')
assert not tube.hasAttribute('dbus-name')
- assert tube['id'] == str(stream_tube_id)
+
+ stream_tube_id = int(tube['id'])
params = {}
parameter_nodes = xpath.queryForNodes('/tube/parameters/parameter', tube)
@@ -319,9 +165,9 @@ def test(q, bus, conn, stream, bytestream_cls,
params[node['name']] = (node['type'], str(node))
assert params == {'foo': ('str', 'bar')}
- bob_handle = conn.RequestHandles(cs.HT_CONTACT, ['chat2@conf.localhost/bob'])[0]
+ bob_handle = conn.RequestHandles(cs.HT_CONTACT, ['chat@conf.localhost/bob'])[0]
- bytestream = connect_to_tube(stream, q, bytestream_cls, 'chat2@conf.localhost', stream_tube_id)
+ bytestream = connect_to_tube(stream, q, bytestream_cls, 'chat@conf.localhost', stream_tube_id)
iq_event, socket_event, conn_event = q.expect_many(
EventPattern('stream-iq', iq_type='result'),