summaryrefslogtreecommitdiff
path: root/tests/twisted/avahi/caps-tubes.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/twisted/avahi/caps-tubes.py')
-rw-r--r--tests/twisted/avahi/caps-tubes.py791
1 files changed, 0 insertions, 791 deletions
diff --git a/tests/twisted/avahi/caps-tubes.py b/tests/twisted/avahi/caps-tubes.py
deleted file mode 100644
index dde30457..00000000
--- a/tests/twisted/avahi/caps-tubes.py
+++ /dev/null
@@ -1,791 +0,0 @@
-
-"""
-Test tubes capabilities with Connection.Interface.ContactCapabilities.DRAFT
-
-1. Receive presence and caps from contacts and check that
-GetContactCapabilities works correctly and that ContactCapabilitiesChanged is
-correctly received. Also check that GetContactAttributes gives the same
-results.
-
-- no tube cap at all
-- 1 stream tube cap
-- 1 D-Bus tube cap
-- 1 stream tube + 1 D-Bus tube caps
-- 2 stream tube + 2 D-Bus tube caps
-- 1 stream tube + 1 D-Bus tube caps, again, to test whether the caps cache
- works with tubes
-
-2. Test UpdateCapabilities and test that the avahi txt record is updated test
-that the D-Bus signal ContactCapabilitiesChanged is fired for the self handle,
-ask Salut for its caps with an iq request, check the reply is correct, and ask
-Salut for its caps using D-Bus method GetContactCapabilities. Also check that
-GetContactAttributes gives the same results.
-
-- no tube cap at all
-- 1 stream tube cap
-- 1 D-Bus tube cap
-- 1 stream tube + 1 D-Bus tube caps
-- 2 stream tube + 2 D-Bus tube caps
-- 1 stream tube + 1 D-Bus tube caps, again, just for the fun
-
-"""
-
-import dbus
-import sys
-
-from avahitest import AvahiAnnouncer, AvahiListener
-from avahitest import get_host_name
-from avahitest import txt_get_key
-import avahi
-
-from twisted.words.xish import domish, xpath
-
-from servicetest import EventPattern
-from saluttest import exec_test, make_result_iq, sync_stream, fixed_features
-from xmppstream import setup_stream_listener, connect_to_stream
-import ns
-from constants import *
-
-from caps_helper import compute_caps_hash, check_caps
-from config import PACKAGE_STRING
-
-print "FIXME: disabled because 1-1 tubes are disabled for now"
-# exiting 77 causes automake to consider the test to have been skipped
-raise SystemExit(77)
-
-text_fixed_properties = dbus.Dictionary({
- 'org.freedesktop.Telepathy.Channel.TargetHandleType': 1L,
- 'org.freedesktop.Telepathy.Channel.ChannelType':
- 'org.freedesktop.Telepathy.Channel.Type.Text'
- })
-text_allowed_properties = dbus.Array([
- 'org.freedesktop.Telepathy.Channel.TargetHandle',
- ])
-
-ft_fixed_properties = dbus.Dictionary({
- CHANNEL_TYPE: CHANNEL_TYPE_FILE_TRANSFER,
- TARGET_HANDLE_TYPE: HT_CONTACT
- })
-ft_allowed_properties = dbus.Array([
- FT_CONTENT_HASH_TYPE, TARGET_HANDLE, TARGET_ID, FT_CONTENT_TYPE, FT_FILENAME,
- FT_SIZE, FT_CONTENT_HASH, FT_DESCRIPTION,
- FT_DATE, FT_INITIAL_OFFSET, FT_URI
- ])
-
-stream_tube_fixed_properties = dbus.Dictionary({
- TARGET_HANDLE_TYPE: HT_CONTACT,
- CHANNEL_TYPE: CHANNEL_TYPE_STREAM_TUBE
- })
-stream_tube_allowed_properties = dbus.Array([TARGET_HANDLE,
- TARGET_ID, STREAM_TUBE_SERVICE])
-
-dbus_tube_fixed_properties = dbus.Dictionary({
- TARGET_HANDLE_TYPE: HT_CONTACT,
- CHANNEL_TYPE: CHANNEL_TYPE_DBUS_TUBE
- })
-dbus_tube_allowed_properties = dbus.Array([TARGET_HANDLE,
- TARGET_ID, DBUS_TUBE_SERVICE_NAME])
-
-daap_fixed_properties = dbus.Dictionary({
- 'org.freedesktop.Telepathy.Channel.TargetHandleType': 1L,
- 'org.freedesktop.Telepathy.Channel.ChannelType':
- 'org.freedesktop.Telepathy.Channel.Type.StreamTube',
- 'org.freedesktop.Telepathy.Channel.Type.StreamTube.Service':
- 'daap'
- })
-daap_allowed_properties = dbus.Array([
- 'org.freedesktop.Telepathy.Channel.TargetHandle',
- ])
-
-http_fixed_properties = dbus.Dictionary({
- 'org.freedesktop.Telepathy.Channel.TargetHandleType': 1L,
- 'org.freedesktop.Telepathy.Channel.ChannelType':
- 'org.freedesktop.Telepathy.Channel.Type.StreamTube',
- 'org.freedesktop.Telepathy.Channel.Type.StreamTube.Service':
- 'http'
- })
-http_allowed_properties = dbus.Array([
- 'org.freedesktop.Telepathy.Channel.TargetHandle',
- ])
-
-xiangqi_fixed_properties = dbus.Dictionary({
- 'org.freedesktop.Telepathy.Channel.TargetHandleType': 1L,
- 'org.freedesktop.Telepathy.Channel.ChannelType':
- 'org.freedesktop.Telepathy.Channel.Type.DBusTube',
- 'org.freedesktop.Telepathy.Channel.Type.DBusTube.ServiceName':
- 'com.example.Xiangqi'
- })
-xiangqi_allowed_properties = dbus.Array([
- 'org.freedesktop.Telepathy.Channel.TargetHandle',
- ])
-
-go_fixed_properties = dbus.Dictionary({
- 'org.freedesktop.Telepathy.Channel.TargetHandleType': 1L,
- 'org.freedesktop.Telepathy.Channel.ChannelType':
- 'org.freedesktop.Telepathy.Channel.Type.DBusTube',
- 'org.freedesktop.Telepathy.Channel.Type.DBusTube.ServiceName':
- 'com.example.Go'
- })
-go_allowed_properties = dbus.Array([
- 'org.freedesktop.Telepathy.Channel.TargetHandle',
- ])
-
-def make_presence(from_jid, type, status):
- presence = domish.Element((None, 'presence'))
-
- if from_jid is not None:
- presence['from'] = from_jid
-
- if type is not None:
- presence['type'] = type
-
- if status is not None:
- presence.addElement('status', content=status)
-
- return presence
-
-def presence_add_caps(presence, ver, client, hash=None):
- c = presence.addElement(('http://jabber.org/protocol/caps', 'c'))
- c['node'] = client
- c['ver'] = ver
- if hash is not None:
- c['hash'] = hash
- return presence
-
-# last value of the "ver" key we resolved. We use it to be sure that the
-# modified caps has already be announced.
-old_ver = ''
-
-def receive_presence_and_ask_caps(q, stream, service):
- global old_ver
-
- event_avahi, event_dbus = q.expect_many(
- EventPattern('service-resolved', service=service),
- EventPattern('dbus-signal', signal='ContactCapabilitiesChanged')
- )
- signaled_caps = event_dbus.args[0][1]
-
- ver = txt_get_key(event_avahi.txt, "ver")
- while ver == old_ver:
- # be sure that the announced caps actually changes
- event_avahi = q.expect('service-resolved', service=service)
- ver = txt_get_key(event_avahi.txt, "ver")
- old_ver = ver
-
- hash = txt_get_key(event_avahi.txt, "hash")
- node = txt_get_key(event_avahi.txt, "node")
- assert hash == 'sha-1'
-
- # ask caps
- request = """
-<iq from='fake_contact@jabber.org/resource'
- id='disco1'
- to='salut@jabber.org/resource'
- type='get'>
- <query xmlns='http://jabber.org/protocol/disco#info'
- node='""" + node + '#' + ver + """'/>
-</iq>
-"""
- stream.send(request)
-
- # receive caps
- event = q.expect('stream-iq',
- query_ns='http://jabber.org/protocol/disco#info')
- caps_str = str(xpath.queryForNodes('/iq/query/feature', event.stanza))
-
- features = []
- for feature in xpath.queryForNodes('/iq/query/feature', event.stanza):
- features.append(feature['var'])
-
- # Check if the hash matches the announced capabilities
- assert ver == compute_caps_hash(['client/pc//%s' % PACKAGE_STRING], features, {})
-
- return (event, caps_str, signaled_caps)
-
-def caps_contain(event, cap):
- node = xpath.queryForNodes('/iq/query/feature[@var="%s"]'
- % cap,
- event.stanza)
- if node is None:
- return False
- if len(node) != 1:
- return False
- var = node[0].attributes['var']
- if var is None:
- return False
- return var == cap
-
-def test_tube_caps_from_contact(q, bus, conn, service,
- client):
-
- conn_caps_iface = dbus.Interface(conn, CONN_IFACE_CONTACT_CAPS)
- conn_contacts_iface = dbus.Interface(conn, CONN_IFACE_CONTACTS)
-
- # send presence with no tube cap
- ver = compute_caps_hash([], [], {})
- txt_record = { "txtvers": "1", "status": "avail",
- "node": client, "ver": ver, "hash": "sha-1"}
- contact_name = "test-caps-tube@" + get_host_name()
- listener, port = setup_stream_listener(q, contact_name)
- announcer = AvahiAnnouncer(contact_name, "_presence._tcp", port,
- txt_record)
-
- # this is the first presence, Salut connects to the contact
- e = q.expect('incoming-connection', listener = listener)
- incoming = e.connection
-
- # Salut looks up our capabilities
- event = q.expect('stream-iq', connection = incoming, iq_type='set',
- query_ns='http://jabber.org/protocol/disco#info')
- query_node = xpath.queryForNodes('/iq/query', event.stanza)[0]
- assert query_node.attributes['node'] == \
- client + '#' + ver, (query_node.attributes['node'], client, ver)
-
- contact_handle = conn.RequestHandles(HT_CONTACT, [contact_name])[0]
-
- # send good reply
- result = make_result_iq(event.stanza)
- query = result.firstChildElement()
- query['node'] = client + '#' + ver
-
- feature = query.addElement('feature')
- feature['var'] = 'http://jabber.org/protocol/jingle'
- feature = query.addElement('feature')
- feature['var'] = 'http://jabber.org/protocol/jingle/description/audio'
- feature = query.addElement('feature')
- feature['var'] = 'http://www.google.com/transport/p2p'
- incoming.send(result)
-
- # no change in ContactCapabilities, so no signal ContactCapabilitiesChanged
- sync_stream(q, incoming)
-
- # no special capabilities
- basic_caps = dbus.Dictionary({contact_handle:
- [(text_fixed_properties, text_allowed_properties)]})
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == basic_caps, caps
- # test again, to check GetContactCapabilities does not have side effect
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == basic_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [contact_handle], [CONN_IFACE_CONTACT_CAPS], False) \
- [contact_handle][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[contact_handle], \
- caps_via_contacts_iface
-
- # send presence with generic tube capability
- txt_record['ver'] = compute_caps_hash([], [ns.TUBES], {})
- announcer.update(txt_record)
-
- # Salut looks up our capabilities
- event = q.expect('stream-iq', connection = incoming,
- query_ns='http://jabber.org/protocol/disco#info')
- query_node = xpath.queryForNodes('/iq/query', event.stanza)[0]
- assert query_node.attributes['node'] == \
- client + '#' + txt_record['ver']
-
- # send good reply
- result = make_result_iq(event.stanza)
- query = result.firstChildElement()
- query['node'] = client + '#' + txt_record['ver']
- feature = query.addElement('feature')
- feature['var'] = ns.TUBES
- incoming.send(result)
-
- # generic tubes capabilities
- generic_tubes_caps = dbus.Dictionary({contact_handle:
- [(text_fixed_properties, text_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties)]})
- # FIXME: add D-Bus tube once implemented
- # (dbus_tube_fixed_properties, dbus_tube_allowed_properties)]})
- event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
- assert len(event.args) == 1
- assert event.args[0] == generic_tubes_caps, generic_tubes_caps
-
- # send presence with 1 stream tube cap
- txt_record['ver'] = compute_caps_hash([], [ns.TUBES + '/stream#daap'], {})
- announcer.update(txt_record)
-
- # Salut looks up our capabilities
- event = q.expect('stream-iq', connection = incoming, iq_type='set',
- query_ns='http://jabber.org/protocol/disco#info')
- query_node = xpath.queryForNodes('/iq/query', event.stanza)[0]
- assert query_node.attributes['node'] == \
- client + '#' + txt_record['ver']
-
- # send good reply
- result = make_result_iq(event.stanza)
- query = result.firstChildElement()
- query['node'] = client + '#' + txt_record['ver']
- feature = query.addElement('feature')
- feature['var'] = ns.TUBES + '/stream#daap'
- incoming.send(result)
-
- event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
- signaled_caps = event.args[0][contact_handle]
- assert len(signaled_caps) == 3, signaled_caps # basic caps + daap
- assert (daap_fixed_properties, daap_allowed_properties) in signaled_caps
-
- # daap capabilities
- daap_caps = dbus.Dictionary({contact_handle:
- [(text_fixed_properties, text_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties),
- (daap_fixed_properties, daap_allowed_properties)]})
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == daap_caps, caps
- # test again, to check GetContactCapabilities does not have side effect
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == daap_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [contact_handle], [CONN_IFACE_CONTACT_CAPS], False) \
- [contact_handle][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[contact_handle], \
- caps_via_contacts_iface
-
- # send presence with 1 D-Bus tube cap
- txt_record['ver'] = compute_caps_hash([], [ns.TUBES + '/dbus#com.example.Xiangqi'], {})
- announcer.update(txt_record)
-
- # Salut looks up our capabilities
- event = q.expect('stream-iq', connection = incoming, iq_type='set',
- query_ns='http://jabber.org/protocol/disco#info')
- query_node = xpath.queryForNodes('/iq/query', event.stanza)[0]
- assert query_node.attributes['node'] == \
- client + '#' + txt_record['ver']
-
- # send good reply
- result = make_result_iq(event.stanza)
- query = result.firstChildElement()
- query['node'] = client + '#' + txt_record['ver']
- feature = query.addElement('feature')
- feature['var'] = ns.TUBES + '/dbus#com.example.Xiangqi'
- incoming.send(result)
-
- event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
- signaled_caps = event.args[0][contact_handle]
- assert len(signaled_caps) == 3, signaled_caps # basic caps + Xiangqi
- assert (xiangqi_fixed_properties, xiangqi_allowed_properties) in signaled_caps
-
- # xiangqi capabilities
- xiangqi_caps = dbus.Dictionary({contact_handle:
- [(text_fixed_properties, text_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties),
- (xiangqi_fixed_properties, xiangqi_allowed_properties)]})
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == xiangqi_caps, caps
- # test again, to check GetContactCapabilities does not have side effect
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == xiangqi_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [contact_handle], [CONN_IFACE_CONTACT_CAPS], False) \
- [contact_handle][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[contact_handle], \
- caps_via_contacts_iface
-
- # send presence with both D-Bus and stream tube caps
- txt_record['ver'] = compute_caps_hash([], [ns.TUBES + '/dbus#com.example.Xiangqi',
- ns.TUBES + '/stream#daap'], {})
- announcer.update(txt_record)
-
- # Salut looks up our capabilities
- event = q.expect('stream-iq', connection = incoming, iq_type='set',
- query_ns='http://jabber.org/protocol/disco#info')
- query_node = xpath.queryForNodes('/iq/query', event.stanza)[0]
- assert query_node.attributes['node'] == \
- client + '#' + txt_record['ver']
-
- # send good reply
- result = make_result_iq(event.stanza)
- query = result.firstChildElement()
- query['node'] = client + '#' + txt_record['ver']
- feature = query.addElement('feature')
- feature['var'] = ns.TUBES + '/dbus#com.example.Xiangqi'
- feature = query.addElement('feature')
- feature['var'] = ns.TUBES + '/stream#daap'
- incoming.send(result)
-
- event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
- signaled_caps = event.args[0][contact_handle]
- assert len(signaled_caps) == 4, signaled_caps # basic caps + daap+xiangqi
- assert (daap_fixed_properties, daap_allowed_properties) in signaled_caps
- assert (xiangqi_fixed_properties, xiangqi_allowed_properties) in signaled_caps
-
- # daap + xiangqi capabilities
- daap_xiangqi_caps = dbus.Dictionary({contact_handle:
- [(text_fixed_properties, text_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties),
- (daap_fixed_properties, daap_allowed_properties),
- (xiangqi_fixed_properties, xiangqi_allowed_properties)]})
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == daap_xiangqi_caps, caps
- # test again, to check GetContactCapabilities does not have side effect
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == daap_xiangqi_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [contact_handle], [CONN_IFACE_CONTACT_CAPS], False) \
- [contact_handle][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[contact_handle], \
- caps_via_contacts_iface
-
- # send presence with 4 tube caps
- txt_record['ver'] = compute_caps_hash([], [ns.TUBES + '/dbus#com.example.Xiangqi',
- ns.TUBES + '/dbus#com.example.Go', ns.TUBES + '/stream#daap', ns.TUBES + '/stream#http'], {})
- announcer.update(txt_record)
-
- # Salut looks up our capabilities
- event = q.expect('stream-iq', connection = incoming, iq_type='set',
- query_ns='http://jabber.org/protocol/disco#info')
- query_node = xpath.queryForNodes('/iq/query', event.stanza)[0]
- assert query_node.attributes['node'] == \
- client + '#' + txt_record['ver']
-
- # send good reply
- result = make_result_iq(event.stanza)
- query = result.firstChildElement()
- query['node'] = client + '#' + txt_record['ver']
- feature = query.addElement('feature')
- feature['var'] = ns.TUBES + '/dbus#com.example.Xiangqi'
- feature = query.addElement('feature')
- feature['var'] = ns.TUBES + '/dbus#com.example.Go'
- feature = query.addElement('feature')
- feature['var'] = ns.TUBES + '/stream#daap'
- feature = query.addElement('feature')
- feature['var'] = ns.TUBES + '/stream#http'
- incoming.send(result)
-
- event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
- signaled_caps = event.args[0][contact_handle]
- assert len(signaled_caps) == 6, signaled_caps # basic caps + 4 tubes
- assert (daap_fixed_properties, daap_allowed_properties) in signaled_caps
- assert (http_fixed_properties, http_allowed_properties) in signaled_caps
- assert (xiangqi_fixed_properties, xiangqi_allowed_properties) in signaled_caps
- assert (go_fixed_properties, go_allowed_properties) in signaled_caps
-
- # http + daap + xiangqi + go capabilities
- all_tubes_caps = dbus.Dictionary({contact_handle:
- [(text_fixed_properties, text_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties),
- (daap_fixed_properties, daap_allowed_properties),
- (http_fixed_properties, http_allowed_properties),
- (xiangqi_fixed_properties,
- xiangqi_allowed_properties),
- (go_fixed_properties, go_allowed_properties)]})
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == all_tubes_caps, caps
- # test again, to check GetContactCapabilities does not have side effect
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == all_tubes_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [contact_handle], [CONN_IFACE_CONTACT_CAPS], False) \
- [contact_handle][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[contact_handle], \
- caps_via_contacts_iface
-
- # send presence with both D-Bus and stream tube caps
- txt_record['ver'] = compute_caps_hash([], [ns.TUBES + '/dbus#com.example.Xiangqi',
- ns.TUBES + '/stream#daap'], {})
- announcer.update(txt_record)
-
- # Salut does not look up our capabilities because of the cache
-
- event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
- signaled_caps = event.args[0][contact_handle]
- assert len(signaled_caps) == 4, signaled_caps # basic caps + daap+xiangqi
- assert (daap_fixed_properties, daap_allowed_properties) in signaled_caps
- assert (xiangqi_fixed_properties, xiangqi_allowed_properties) in signaled_caps
-
- # daap + xiangqi capabilities
- daap_xiangqi_caps = dbus.Dictionary({contact_handle:
- [(text_fixed_properties, text_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties),
- (daap_fixed_properties, daap_allowed_properties),
- (xiangqi_fixed_properties, xiangqi_allowed_properties)]})
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == daap_xiangqi_caps, caps
- # test again, to check GetContactCapabilities does not have side effect
- caps = conn_caps_iface.GetContactCapabilities([contact_handle])
- assert caps == daap_xiangqi_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [contact_handle], [CONN_IFACE_CONTACT_CAPS], False) \
- [contact_handle][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[contact_handle], \
- caps_via_contacts_iface
-
-def test_tube_caps_to_contact(q, bus, conn, service):
- basic_caps = dbus.Dictionary({1:
- [(text_fixed_properties, text_allowed_properties),
- (ft_fixed_properties, ft_allowed_properties)]})
- daap_caps = dbus.Dictionary({1:
- [(text_fixed_properties, text_allowed_properties),
- (ft_fixed_properties, ft_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties),
- (daap_fixed_properties, daap_allowed_properties)]})
- xiangqi_caps = dbus.Dictionary({1:
- [(text_fixed_properties, text_allowed_properties),
- (ft_fixed_properties, ft_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties),
- (xiangqi_fixed_properties, xiangqi_allowed_properties)]})
- daap_xiangqi_caps = dbus.Dictionary({1:
- [(text_fixed_properties, text_allowed_properties),
- (ft_fixed_properties, ft_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties),
- (daap_fixed_properties, daap_allowed_properties),
- (xiangqi_fixed_properties, xiangqi_allowed_properties)]})
- all_tubes_caps = dbus.Dictionary({1:
- [(text_fixed_properties, text_allowed_properties),
- (ft_fixed_properties, ft_allowed_properties),
- (stream_tube_fixed_properties, stream_tube_allowed_properties),
- (daap_fixed_properties, daap_allowed_properties),
- (http_fixed_properties, http_allowed_properties),
- (xiangqi_fixed_properties, xiangqi_allowed_properties),
- (go_fixed_properties, go_allowed_properties)]})
-
- # send presence with no cap info
- txt_record = { "txtvers": "1", "status": "avail"}
- contact_name = "test-caps-tube2@" + get_host_name()
- listener, port = setup_stream_listener(q, contact_name)
- announcer = AvahiAnnouncer(contact_name, "_presence._tcp", port,
- txt_record)
-
- # Before opening a connection to Salut, wait Salut receives our presence
- # via Avahi. Otherwise, Salut will not allow our connection. We may
- # consider it is a bug in Salut, and we may want Salut to wait a few
- # seconds in case Avahi was slow.
- # See incoming_pending_connection_got_from(): if the SalutContact is not
- # found in the table, we close the connection.
- q.expect('dbus-signal', signal='PresencesChanged')
-
- # initialise a connection (Salut does not do it because there is no caps
- # here)
- self_handle = conn.GetSelfHandle()
- self_handle_name = conn.InspectHandles(HT_CONTACT, [self_handle])[0]
- service.resolve()
- e = q.expect('service-resolved', service = service)
- outbound = connect_to_stream(q, contact_name,
- self_handle_name, str(e.pt), e.port)
- e = q.expect('connection-result')
- assert e.succeeded, e.reason
- e = q.expect('stream-opened', connection = outbound)
-
- conn_caps_iface = dbus.Interface(conn, CONN_IFACE_CONTACT_CAPS)
- conn_contacts_iface = dbus.Interface(conn, CONN_IFACE_CONTACTS)
-
- # Check our own caps
- caps = conn_caps_iface.GetContactCapabilities([1])
- assert caps == basic_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [1], [CONN_IFACE_CONTACT_CAPS], False) \
- [1][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[1], caps_via_contacts_iface
-
- # Advertise nothing
- conn_caps_iface.UpdateCapabilities([])
-
- # Check our own caps
- caps = conn_caps_iface.GetContactCapabilities([1])
- assert caps == basic_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [1], [CONN_IFACE_CONTACT_CAPS], False) \
- [1][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[1], caps_via_contacts_iface
-
- sync_stream(q, outbound)
-
- # Advertise daap
- ret_caps = conn_caps_iface.UpdateCapabilities(
- [('bigclient', [daap_fixed_properties], [])])
-
- # Expect Salut to reply with the correct caps
- event, caps_str, signaled_caps = receive_presence_and_ask_caps(q, outbound,
- service)
- assert caps_contain(event, ns.TUBES) == True, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#daap') == True, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#http') == False, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Go') \
- == False, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Xiangqi') \
- == False, caps_str
- assert len(signaled_caps) == 4, signaled_caps # basic caps + daap
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_STREAM_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- STREAM_TUBE_SERVICE: 'daap'}, [TARGET_HANDLE]) in signaled_caps
-
- # Check our own caps
- caps = conn_caps_iface.GetContactCapabilities([1])
- assert caps == daap_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [1], [CONN_IFACE_CONTACT_CAPS], False) \
- [1][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[1], caps_via_contacts_iface
-
- # Advertise xiangqi
- ret_caps = conn_caps_iface.SetSelfCapabilities(
- [('bigclient', [xiangqi_fixed_properties], [])])
-
- # Expect Salut to reply with the correct caps
- event, caps_str, signaled_caps = receive_presence_and_ask_caps(q, outbound,
- service)
- assert caps_contain(event, ns.TUBES) == True, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#daap') == False, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#http') == False, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Go') \
- == False, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Xiangqi') \
- == True, caps_str
- assert len(signaled_caps) == 4, signaled_caps # basic caps + daap
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_DBUS_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- DBUS_TUBE_SERVICE_NAME: 'com.example.Xiangqi'}, [TARGET_HANDLE]) in signaled_caps
-
- # Check our own caps
- caps = conn_caps_iface.GetContactCapabilities([1])
- assert caps == xiangqi_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [1], [CONN_IFACE_CONTACT_CAPS], False) \
- [1][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[1], caps_via_contacts_iface
-
- # Advertise daap + xiangqi
- ret_caps = conn_caps_iface.SetSelfCapabilities(
- [('bigclient', [daap_fixed_properties + xiangqi_fixed_properties], [])])
-
- # Expect Salut to reply with the correct caps
- event, caps_str, signaled_caps = receive_presence_and_ask_caps(q, outbound,
- service)
- assert caps_contain(event, ns.TUBES) == True, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#daap') == True, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#http') == False, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Go') \
- == False, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Xiangqi') \
- == True, caps_str
- assert len(signaled_caps) == 5, signaled_caps # basic caps + daap+xiangqi
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_STREAM_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- STREAM_TUBE_SERVICE: 'daap'}, [TARGET_HANDLE]) in signaled_caps
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_DBUS_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- DBUS_TUBE_SERVICE_NAME: 'com.example.Xiangqi'}, [TARGET_HANDLE]) in signaled_caps
-
- # Check our own caps
- caps = conn_caps_iface.GetContactCapabilities([1])
- assert caps == daap_xiangqi_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [1], [CONN_IFACE_CONTACT_CAPS], False) \
- [1][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[1], caps_via_contacts_iface
-
- # Advertise 4 tubes
- ret_caps = conn_caps_iface.SetSelfCapabilities(
- [('bigclient', [daap_fixed_properties, http_fixed_properties,
- go_fixed_properties, xiangqi_fixed_properties], [])])
-
- # Expect Salut to reply with the correct caps
- event, caps_str, signaled_caps = receive_presence_and_ask_caps(q, outbound,
- service)
- assert caps_contain(event, ns.TUBES) == True, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#daap') == True, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#http') == True, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Go') \
- == True, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Xiangqi') \
- == True, caps_str
- assert len(signaled_caps) == 7, signaled_caps # basic caps + 4 tubes
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_STREAM_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- STREAM_TUBE_SERVICE: 'daap'}, [TARGET_HANDLE]) in signaled_caps
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_DBUS_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- DBUS_TUBE_SERVICE_NAME: 'com.example.Xiangqi'}, [TARGET_HANDLE]) in signaled_caps
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_STREAM_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- STREAM_TUBE_SERVICE: 'http'}, [TARGET_HANDLE]) in signaled_caps
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_DBUS_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- DBUS_TUBE_SERVICE_NAME: 'com.example.Go'}, [TARGET_HANDLE]) in signaled_caps
-
- # Check our own caps
- caps = conn_caps_iface.GetContactCapabilities([1])
- assert caps == all_tubes_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [1], [CONN_IFACE_CONTACT_CAPS], False) \
- [1][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[1], caps_via_contacts_iface
-
- # Advertise daap + xiangqi
- ret_caps = conn_caps_iface.SetSelfCapabilities(
- [('bigclient', [daap_fixed_properties + xiangqi_fixed_properties], [])])
-
- # Expect Salut to reply with the correct caps
- event, caps_str, signaled_caps = receive_presence_and_ask_caps(q, outbound,
-service)
- assert caps_contain(event, ns.TUBES) == True, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#daap') == True, caps_str
- assert caps_contain(event, ns.TUBES + '/stream#http') == False, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Go') \
- == False, caps_str
- assert caps_contain(event, ns.TUBES + '/dbus#com.example.Xiangqi') \
- == True, caps_str
- assert len(signaled_caps) == 5, signaled_caps # basic caps + daap+xiangqi
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_STREAM_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- STREAM_TUBE_SERVICE: 'daap'}, [TARGET_HANDLE]) in signaled_caps
- assert ({CHANNEL_TYPE: CHANNEL_TYPE_DBUS_TUBE, TARGET_HANDLE_TYPE: HT_CONTACT,
- DBUS_TUBE_SERVICE_NAME: 'com.example.Xiangqi'}, [TARGET_HANDLE]) in signaled_caps
-
- # Check our own caps
- caps = conn_caps_iface.GetContactCapabilities([1])
- assert caps == daap_xiangqi_caps, caps
- # check the Contacts interface give the same caps
- caps_via_contacts_iface = conn_contacts_iface.GetContactAttributes(
- [1], [CONN_IFACE_CONTACT_CAPS], False) \
- [1][CONN_IFACE_CONTACT_CAPS + '/caps']
- assert caps_via_contacts_iface == caps[1], caps_via_contacts_iface
-
-
-def test(q, bus, conn):
- # last value of the "ver" key we resolved. We use it to be sure that the
- # modified caps has already be announced.
- old_ver = None
-
- conn.Connect()
- q.expect('dbus-signal', signal='StatusChanged', args=[0, 0])
-
- self_handle = conn.GetSelfHandle()
- self_handle_name = conn.InspectHandles(1, [self_handle])[0]
-
- AvahiListener(q).listen_for_service("_presence._tcp")
- e = q.expect('service-added', name = self_handle_name,
- protocol = avahi.PROTO_INET)
- service = e.service
- service.resolve()
-
- e = q.expect('service-resolved', service = service)
- ver = txt_get_key(e.txt, "ver")
- while ver == old_ver:
- # be sure that the announced caps actually changes
- e = q.expect('service-resolved', service=service)
- ver = txt_get_key(e.txt, "ver")
- old_ver = ver
-
- caps = compute_caps_hash(['client/pc//%s' % PACKAGE_STRING],
- fixed_features, {})
- check_caps(e.txt, caps)
-
- client = 'http://telepathy.freedesktop.org/fake-client'
-
- test_tube_caps_from_contact(q, bus, conn, service,
- client)
-
- test_tube_caps_to_contact(q, bus, conn, service)
-
- conn.Disconnect()
- q.expect('dbus-signal', signal='StatusChanged', args=[2, 1])
-
-
-if __name__ == '__main__':
- exec_test(test)
-