diff options
| author | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2010-12-21 15:59:30 +0000 |
|---|---|---|
| committer | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2010-12-21 15:59:30 +0000 |
| commit | d43e3a50ace82ad1b4603f6ee08709bd53b7a507 (patch) | |
| tree | f3a984c584344592bcc31f2ee183f833085c5daa | |
| parent | 6d6b34b49171602e9bf47039b991d0376dd2c457 (diff) | |
tests: add a test for DelayApprovers observers
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
| -rw-r--r-- | test/twisted/Makefile.am | 1 | ||||
| -rw-r--r-- | test/twisted/dispatcher/delay-approvers.py | 141 | ||||
| -rw-r--r-- | test/twisted/mctest.py | 4 |
3 files changed, 145 insertions, 1 deletions
diff --git a/test/twisted/Makefile.am b/test/twisted/Makefile.am index 179b737b..b81c1124 100644 --- a/test/twisted/Makefile.am +++ b/test/twisted/Makefile.am @@ -40,6 +40,7 @@ TWISTED_BASIC_TESTS = \ dispatcher/create-rejected-by-mini-plugin.py \ dispatcher/create-text.py \ dispatcher/created-behind-our-back.py \ + dispatcher/delay-approvers.py \ dispatcher/dispatch-activatable.py \ dispatcher/dispatch-before-connected.py \ dispatcher/dispatch-delayed-by-mini-plugin.py \ diff --git a/test/twisted/dispatcher/delay-approvers.py b/test/twisted/dispatcher/delay-approvers.py new file mode 100644 index 00000000..fae08bc2 --- /dev/null +++ b/test/twisted/dispatcher/delay-approvers.py @@ -0,0 +1,141 @@ +# Copyright (C) 2010 Collabora Ltd. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA + +import dbus +import dbus.bus +import dbus.service + +from servicetest import EventPattern, tp_name_prefix, tp_path_prefix, \ + call_async, sync_dbus +from mctest import exec_test, SimulatedConnection, SimulatedClient, \ + create_fakecm_account, enable_fakecm_account, SimulatedChannel, \ + expect_client_setup +import constants as cs + +def test(q, bus, mc): + params = dbus.Dictionary({"account": "someguy@example.com", + "password": "secrecy"}, signature='sv') + cm_name_ref, account = create_fakecm_account(q, bus, mc, params) + conn = enable_fakecm_account(q, bus, mc, account, params) + + text_fixed_properties = dbus.Dictionary({ + cs.CHANNEL + '.TargetHandleType': cs.HT_CONTACT, + cs.CHANNEL + '.ChannelType': cs.CHANNEL_TYPE_TEXT, + }, signature='sv') + + # Empathy is an approver for text channels with + # DelayApprovers=TRUE. + empathy = SimulatedClient(q, bus, 'Empathy', + observe=[text_fixed_properties], approve=[], + handle=[], delay_approvers=True) + + # Kopete is an approver and handler for text channels. + kopete = SimulatedClient(q, bus, 'Kopete', + observe=[], approve=[text_fixed_properties], + handle=[text_fixed_properties]) + + expect_client_setup(q, [empathy, kopete]) + + # subscribe to the OperationList interface (MC assumes that until this + # property has been retrieved once, nobody cares) + + cd = bus.get_object(cs.CD, cs.CD_PATH) + cd_props = dbus.Interface(cd, cs.PROPERTIES_IFACE) + assert cd_props.Get(cs.CD_IFACE_OP_LIST, 'DispatchOperations') == [] + + # A text channel appears! + channel_properties = dbus.Dictionary(text_fixed_properties, + signature='sv') + channel_properties[cs.CHANNEL + '.TargetID'] = 'juliet' + channel_properties[cs.CHANNEL + '.TargetHandle'] = \ + conn.ensure_handle(cs.HT_CONTACT, 'juliet') + channel_properties[cs.CHANNEL + '.InitiatorID'] = 'juliet' + channel_properties[cs.CHANNEL + '.InitiatorHandle'] = \ + conn.ensure_handle(cs.HT_CONTACT, 'juliet') + channel_properties[cs.CHANNEL + '.Requested'] = False + channel_properties[cs.CHANNEL + '.Interfaces'] = dbus.Array(signature='s') + + chan = SimulatedChannel(conn, channel_properties) + chan.announce() + + e = q.expect('dbus-signal', + path=cs.CD_PATH, + interface=cs.CD_IFACE_OP_LIST, + signal='NewDispatchOperation') + + cdo_path = e.args[0] + cdo = bus.get_object(cs.CD, cdo_path) + cdo_iface = dbus.Interface(cdo, cs.CDO) + cdo_props_iface = dbus.Interface(cdo, cs.PROPERTIES_IFACE) + + # Empathy, the observer, gets the channel to observe. Because it + # has DelayApprovers=TRUE, Kopete should not have + # AddDispatchOperation called on it until Empathy returns from + # ObserveChannels. + forbidden = [EventPattern('dbus-method-call', + path=kopete.object_path, + interface=cs.APPROVER, method='AddDispatchOperation')] + q.forbid_events(forbidden) + + o = q.expect('dbus-method-call', + path=empathy.object_path, + interface=cs.OBSERVER, method='ObserveChannels', + handled=False) + + # Waste a little time here and there. We can't call sync_dbus + # here because it calls Ping and libdbus returns from Ping + # synchronously and doesn't turn the main loop handle enough. + call_async(q, cd_props, 'Get', cs.CD_IFACE_OP_LIST, 'DispatchOperations') + event = q.expect('dbus-return', method='Get') + + # Finally return from ObserveChannels, so now we expect ADO to be + # called on Kopete. + q.dbus_return(o.message, bus=bus, signature='') + q.unforbid_events(forbidden) + + e = q.expect('dbus-method-call', + path=kopete.object_path, + interface=cs.APPROVER, method='AddDispatchOperation', + handled=False) + + q.dbus_return(e.message, bus=bus, signature='') + + # The user responds to Kopete + call_async(q, cdo_iface, 'HandleWith', + cs.tp_name_prefix + '.Client.Kopete') + + # Kopete is asked to handle the channels + k = q.expect('dbus-method-call', + path=kopete.object_path, + interface=cs.HANDLER, method='HandleChannels', + handled=False) + + # Kopete accepts the channels + q.dbus_return(k.message, bus=bus, signature='') + + q.expect_many( + EventPattern('dbus-return', method='HandleWith'), + EventPattern('dbus-signal', interface=cs.CDO, signal='Finished'), + EventPattern('dbus-signal', interface=cs.CD_IFACE_OP_LIST, + signal='DispatchOperationFinished'), + ) + + # Now there are no more active channel dispatch operations + assert cd_props.Get(cs.CD_IFACE_OP_LIST, 'DispatchOperations') == [] + +if __name__ == '__main__': + exec_test(test, {}) diff --git a/test/twisted/mctest.py b/test/twisted/mctest.py index e67b8cd1..5d2b9401 100644 --- a/test/twisted/mctest.py +++ b/test/twisted/mctest.py @@ -652,7 +652,7 @@ class SimulatedClient(object): observe=[], approve=[], handle=[], cap_tokens=[], bypass_approval=False, wants_recovery=False, request_notification=True, implement_get_interfaces=True, - is_handler=None, bypass_observers=False): + is_handler=None, bypass_observers=False, delay_approvers=False): self.q = q self.bus = bus self.bus_name = '.'.join([cs.tp_name_prefix, 'Client', clientname]) @@ -663,6 +663,7 @@ class SimulatedClient(object): self.handle = aasv(handle) self.bypass_approval = bool(bypass_approval) self.bypass_observers = bool(bypass_observers) + self.delay_approvers = bool(delay_approvers) self.wants_recovery = bool(wants_recovery) self.request_notification = bool(request_notification) self.handled_channels = dbus.Array([], signature='o') @@ -753,6 +754,7 @@ class SimulatedClient(object): self.q.dbus_return(e.message, { 'ObserverChannelFilter': self.observe, 'Recover': self.wants_recovery, + 'DelayApprovers': dbus.Boolean(self.delay_approvers), }, signature='a{sv}', bus=self.bus) |
