diff options
author | Will Thompson <will.thompson@collabora.co.uk> | 2011-09-13 12:32:50 +0100 |
---|---|---|
committer | Will Thompson <will.thompson@collabora.co.uk> | 2011-09-13 12:33:36 +0100 |
commit | 1931d4f2c71f0574a93cac848e2a1e0b40d6588c (patch) | |
tree | c0dd70460724f1f96e8ac4bf1da71903904b0d7b | |
parent | ca1f8bfff656a0de8f002eee9d0056bbb93301b1 (diff) |
Test that MC sets reasonable errors when CM crashes
This was intended to be a regression test for
<https://bugs.freedesktop.org/show_bug.cgi?id=40129>, but it turned out
that MC is already pretty well-behaved.
-rw-r--r-- | tests/twisted/Makefile.am | 1 | ||||
-rw-r--r-- | tests/twisted/account-manager/crashy-cm.py | 88 |
2 files changed, 89 insertions, 0 deletions
diff --git a/tests/twisted/Makefile.am b/tests/twisted/Makefile.am index a9f1d99d..355a998b 100644 --- a/tests/twisted/Makefile.am +++ b/tests/twisted/Makefile.am @@ -4,6 +4,7 @@ TWISTED_BASIC_TESTS = \ account-manager/account-basics.py \ account-manager/avatar.py \ account-manager/bad-cm.py \ + account-manager/crashy-cm.py \ account-manager/create-auto-connect.py \ account-manager/create-twice.py \ account-manager/create-with-properties.py \ diff --git a/tests/twisted/account-manager/crashy-cm.py b/tests/twisted/account-manager/crashy-cm.py new file mode 100644 index 00000000..2eebeb8b --- /dev/null +++ b/tests/twisted/account-manager/crashy-cm.py @@ -0,0 +1,88 @@ +# vim: set fileencoding=utf-8 : +# +# crashy-cm: tests that MC sets at least moderately-useful error information on +# accounts when they're disconnected due to the CM crashing. +# +# Copyright © 2011 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 +from servicetest import ( + tp_name_prefix, tp_path_prefix, assertEquals, +) +from mctest import ( + exec_test, create_fakecm_account, SimulatedConnection, +) +import constants as cs + +def test(q, bus, mc): + cm_bus = dbus.bus.BusConnection() + cm_bus.set_exit_on_disconnect(False) # we'll disconnect later + q.attach_to_bus(cm_bus) + + params = dbus.Dictionary( + {"account": "someguy@example.com", + "password": "secrecy", + }, signature='sv') + (cm_name_ref, account) = create_fakecm_account(q, bus, mc, params, + cm_bus=cm_bus) + + account.Properties.Set(cs.ACCOUNT, 'Enabled', True) + + # Set online presence + presence = dbus.Struct( + (dbus.UInt32(cs.PRESENCE_TYPE_BUSY), 'busy', 'Fixing MC bugs'), + signature='uss') + account.Properties.Set(cs.ACCOUNT, 'RequestedPresence', presence) + + e = q.expect('dbus-method-call', method='RequestConnection', + args=['fakeprotocol', params], + destination=tp_name_prefix + '.ConnectionManager.fakecm', + path=tp_path_prefix + '/ConnectionManager/fakecm', + interface=tp_name_prefix + '.ConnectionManager', + handled=False) + + conn = SimulatedConnection(q, cm_bus, 'fakecm', 'fakeprotocol', '_', + 'myself', has_presence=True) + + q.dbus_return(e.message, conn.bus_name, conn.object_path, signature='so') + + q.expect('dbus-method-call', method='Connect', + path=conn.object_path, handled=True) + + # Connect succeeds + conn.StatusChanged(cs.CONN_STATUS_CONNECTED, cs.CONN_STATUS_REASON_NONE) + + # CM crashes + conn.release_name() + del cm_name_ref + cm_bus.flush() + cm_bus.close() + + # MC should report the connection dying. + e = q.expect('dbus-signal', signal='AccountPropertyChanged', + predicate=lambda e: 'ConnectionError' in e.args[0]) + changed, = e.args + assertEquals('/', changed['Connection']) + assertEquals(cs.CONN_STATUS_DISCONNECTED, changed['ConnectionStatus']) + # In the absence of a better code, None will have to do. + assertEquals(cs.CONN_STATUS_REASON_NONE, changed['ConnectionStatusReason']) + # And NoReply will do as “it crashed”. + assertEquals(cs.DBUS_ERROR_NO_REPLY, changed['ConnectionError']) + +if __name__ == '__main__': + exec_test(test) |