From 5c6b9c951b6839167c3cae0e8f4678d02937cc3e Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 19 May 2011 18:16:26 +0100 Subject: [PATCH 4/4] undispatchable test: assert that observers are invoked, but approvers are not Also assert that MC doesn't close the channel as undispatchable until the Observer has had a look at it. --- tests/twisted/dispatcher/undispatchable.py | 53 ++++++++++++++++++++++++--- 1 files changed, 47 insertions(+), 6 deletions(-) diff --git a/tests/twisted/dispatcher/undispatchable.py b/tests/twisted/dispatcher/undispatchable.py index 35b5f44..de63fbc 100644 --- a/tests/twisted/dispatcher/undispatchable.py +++ b/tests/twisted/dispatcher/undispatchable.py @@ -26,7 +26,7 @@ import dbus.bus import dbus.service from servicetest import EventPattern, tp_name_prefix, tp_path_prefix, \ - call_async, sync_dbus + call_async, sync_dbus, assertEquals from mctest import exec_test, SimulatedConnection, SimulatedClient, \ create_fakecm_account, enable_fakecm_account, SimulatedChannel, \ expect_client_setup @@ -39,8 +39,8 @@ def test(q, bus, mc): 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, + cs.CHANNEL + '.TargetHandleType': cs.HT_CONTACT, }, signature='sv') # subscribe to the OperationList interface (MC assumes that until this @@ -50,6 +50,14 @@ def test(q, bus, mc): cd_props = dbus.Interface(cd, cs.PROPERTIES_IFACE) assert cd_props.Get(cs.CD_IFACE_OP_LIST, 'DispatchOperations') == [] + client = SimulatedClient(q, bus, 'Client', + observe=[text_fixed_properties], + approve=[text_fixed_properties], + handle=[], bypass_approval=False) + + # wait for MC to download the properties + expect_client_setup(q, [client]) + channel_properties = dbus.Dictionary(text_fixed_properties, signature='sv') channel_properties[cs.CHANNEL + '.TargetID'] = 'juliet' @@ -61,15 +69,48 @@ def test(q, bus, mc): channel_properties[cs.CHANNEL + '.Requested'] = False channel_properties[cs.CHANNEL + '.Interfaces'] = dbus.Array(signature='s') + forbidden = [ + EventPattern('dbus-method-call', method='AddDispatchOperation'), + ] + q.forbid_events(forbidden) + chan = SimulatedChannel(conn, channel_properties) chan.announce() - # In response, MC kills the channel - q.expect('dbus-method-call', path=chan.object_path, method='Close', - handled=True) + e = q.expect('dbus-signal', + path=cs.CD_PATH, + interface=cs.CD_IFACE_OP_LIST, + signal='NewDispatchOperation') + + cdo_path = e.args[0] + cdo_properties = e.args[1] + + assert cdo_properties[cs.CDO + '.Account'] == account.object_path + assert cdo_properties[cs.CDO + '.Connection'] == conn.object_path + assert cs.CDO + '.Interfaces' in cdo_properties - # There are still no active channel dispatch operations + handlers = cdo_properties[cs.CDO + '.PossibleHandlers'][:] + assertEquals([], handlers) + + e = q.expect('dbus-method-call', + path=client.object_path, + interface=cs.OBSERVER, method='ObserveChannels', + handled=False) + + sync_dbus(bus, q, mc) + + q.dbus_return(e.message, signature='') + + # now (but only now) MC kills the channel + q.expect_many( + EventPattern('dbus-signal', path=cdo_path, signal='Finished'), + EventPattern('dbus-method-call', path=chan.object_path, + method='Close', handled=True), + ) + + # There are no active channel dispatch operations assert cd_props.Get(cs.CD_IFACE_OP_LIST, 'DispatchOperations') == [] + if __name__ == '__main__': exec_test(test, {}) -- 1.7.5.4