diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2013-05-01 15:46:49 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2013-05-01 15:46:49 +0100 |
commit | 7d43b91b99535b309298592e945ecc28c567e53e (patch) | |
tree | e20e4414abaeaec5bd566f0c634258aab4ea6feb /tests/twisted | |
parent | 1ab28c1c339644304333203196c4d95a92a4e08c (diff) | |
parent | 92da2de2a91348121d85dad99d85e3657a9bf719 (diff) | |
download | telepathy-idle-7d43b91b99535b309298592e945ecc28c567e53e.tar.gz |
Merge branch 'interactive-tls'
Diffstat (limited to 'tests/twisted')
-rw-r--r-- | tests/twisted/Makefile.am | 5 | ||||
-rw-r--r-- | tests/twisted/connect/connect-close-ssl.py | 28 | ||||
-rw-r--r-- | tests/twisted/connect/connect-fail-ssl.py | 1 | ||||
-rw-r--r-- | tests/twisted/connect/connect-reject-ssl.py | 29 | ||||
-rw-r--r-- | tests/twisted/connect/connect-success-ssl.py | 8 | ||||
-rw-r--r-- | tests/twisted/connect/disconnect-before-socket-connected.py | 31 | ||||
-rw-r--r-- | tests/twisted/connect/disconnect-during-cert-verification.py | 28 | ||||
-rw-r--r-- | tests/twisted/tools/tp-glib.supp | 390 |
8 files changed, 518 insertions, 2 deletions
diff --git a/tests/twisted/Makefile.am b/tests/twisted/Makefile.am index aa749ef..764f074 100644 --- a/tests/twisted/Makefile.am +++ b/tests/twisted/Makefile.am @@ -1,9 +1,13 @@ TWISTED_TESTS = \ cm/protocol.py \ + connect/connect-close-ssl.py \ connect/connect-success.py \ connect/connect-success-ssl.py \ + connect/connect-reject-ssl.py \ connect/connect-fail.py \ connect/connect-fail-ssl.py \ + connect/disconnect-before-socket-connected.py \ + connect/disconnect-during-cert-verification.py \ connect/ping.py \ connect/server-quit-ignore.py \ connect/server-quit-noclose.py \ @@ -46,7 +50,6 @@ check-twisted: rm -f tools/core rm -f tools/idle-testing.log failed=0; \ - IDLE_TEST_BE_VULNERABLE_TO_MAN_IN_THE_MIDDLE_ATTACKS=vulnerable \ sh $(srcdir)/tools/with-session-bus.sh \ --config-file=tools/tmp-session-bus.conf \ -- $(MAKE) check-TESTS \ diff --git a/tests/twisted/connect/connect-close-ssl.py b/tests/twisted/connect/connect-close-ssl.py new file mode 100644 index 0000000..6fecd50 --- /dev/null +++ b/tests/twisted/connect/connect-close-ssl.py @@ -0,0 +1,28 @@ + +""" +Test connecting to a SSL server. +""" + +import dbus +import constants as cs +from idletest import exec_test, SSLIRCServer +from servicetest import EventPattern, wrap_channel + +def test(q, bus, conn, stream): + conn.Connect() + q.expect_many( + EventPattern('dbus-signal', signal='StatusChanged', args=[1, 1]), + EventPattern('irc-connected')) + e = q.expect('dbus-signal', signal='NewChannels') + channels = e.args[0] + path, props = channels[0] + + channel = wrap_channel(bus.get_object(conn.bus_name, path), + cs.CHANNEL_TYPE_SERVER_TLS_CONNECTION) + channel.Close() + + q.expect('dbus-signal', signal='StatusChanged', args=[2, 2]) + +if __name__ == '__main__': + exec_test(test, {'use-ssl':dbus.Boolean(True)}, protocol=SSLIRCServer) + diff --git a/tests/twisted/connect/connect-fail-ssl.py b/tests/twisted/connect/connect-fail-ssl.py index dd9658f..283bc03 100644 --- a/tests/twisted/connect/connect-fail-ssl.py +++ b/tests/twisted/connect/connect-fail-ssl.py @@ -14,4 +14,3 @@ def test(q, bus, conn, stream): if __name__ == '__main__': # there is no ssl server listening at port 5600, so this should fail exec_test(test, {'port': dbus.UInt32(5600), 'use-ssl': dbus.Boolean(True)}) - diff --git a/tests/twisted/connect/connect-reject-ssl.py b/tests/twisted/connect/connect-reject-ssl.py new file mode 100644 index 0000000..8028428 --- /dev/null +++ b/tests/twisted/connect/connect-reject-ssl.py @@ -0,0 +1,29 @@ + +""" +Test connecting to a SSL server. +""" + +import dbus +import constants as cs +from idletest import exec_test, SSLIRCServer +from servicetest import EventPattern, call_async + +def test(q, bus, conn, stream): + conn.Connect() + q.expect_many( + EventPattern('dbus-signal', signal='StatusChanged', args=[1, 1]), + EventPattern('irc-connected')) + e = q.expect('dbus-signal', signal='NewChannels') + channels = e.args[0] + path, props = channels[0] + + cert = bus.get_object (conn.bus_name, props[cs.TLS_CERT_PATH]) + cert.Reject([(cs.TLS_REJECT_REASON_UNTRUSTED, cs.CERT_UNTRUSTED, {})], + signature = 'a(usa{sv})') + + q.expect('dbus-signal', signal='StatusChanged', args=[2, 2]) + return True + +if __name__ == '__main__': + exec_test(test, {'use-ssl':dbus.Boolean(True)}, protocol=SSLIRCServer) + diff --git a/tests/twisted/connect/connect-success-ssl.py b/tests/twisted/connect/connect-success-ssl.py index 627eeb8..33062c5 100644 --- a/tests/twisted/connect/connect-success-ssl.py +++ b/tests/twisted/connect/connect-success-ssl.py @@ -4,6 +4,7 @@ Test connecting to a SSL server. """ import dbus +import constants as cs from idletest import exec_test, SSLIRCServer from servicetest import EventPattern, call_async @@ -12,6 +13,13 @@ def test(q, bus, conn, stream): q.expect_many( EventPattern('dbus-signal', signal='StatusChanged', args=[1, 1]), EventPattern('irc-connected')) + e = q.expect('dbus-signal', signal='NewChannels') + channels = e.args[0] + path, props = channels[0] + + cert = bus.get_object (conn.bus_name, props[cs.TLS_CERT_PATH]) + cert.Accept() + q.expect('dbus-signal', signal='SelfHandleChanged', args=[1L]) q.expect('dbus-signal', signal='StatusChanged', args=[0, 1]) diff --git a/tests/twisted/connect/disconnect-before-socket-connected.py b/tests/twisted/connect/disconnect-before-socket-connected.py new file mode 100644 index 0000000..8fc89e0 --- /dev/null +++ b/tests/twisted/connect/disconnect-before-socket-connected.py @@ -0,0 +1,31 @@ +""" +Test disconnecting before the TCP session is established. +""" + +from idletest import exec_test +from servicetest import call_async + +def test(q, bus, conn, stream): + conn.Connect() + q.expect('dbus-signal', signal='StatusChanged', args=[1, 1]) + + # We want the call to Disconnect to reach Idle before the call to + # g_socket_client_connect_to_host(), which connects to this Python process, + # completes. I tried making the Twisted infrastructure stop calling + # .accept() but that doesn't seem to have any effect. + # + # But! All is not lost! Making a blocking call to Disconnect() does the + # job, because we block in libdbus and Twisted doesn't get a chance to poll + # the listening socket until Disconnect() returns. + conn.Disconnect() + + # The bug was that Idle would not try to cancel the in-progress connection + # attempt. It worked when the connection was blocked on TLS verification + # (see disconnect-during-cert-verification.py) because closing that channel + # (as a side-effect of disconnecting) caused the TCP connection attempt to + # fail, but didn't work in this case. + q.expect('dbus-signal', signal='StatusChanged', args=[2, 1]) + +if __name__ == '__main__': + exec_test(test) + diff --git a/tests/twisted/connect/disconnect-during-cert-verification.py b/tests/twisted/connect/disconnect-during-cert-verification.py new file mode 100644 index 0000000..83fe004 --- /dev/null +++ b/tests/twisted/connect/disconnect-during-cert-verification.py @@ -0,0 +1,28 @@ +""" +Test disconnecting while a certificate verification channel is open. +""" + +import dbus +import constants as cs +from idletest import exec_test, SSLIRCServer +from servicetest import EventPattern, sync_dbus + +def test(q, bus, conn, stream): + conn.Connect() + q.expect_many( + EventPattern('dbus-signal', signal='StatusChanged', args=[1, 1]), + EventPattern('irc-connected')) + e = q.expect('dbus-signal', signal='NewChannels') + + conn.Disconnect() + q.expect_many( + EventPattern('dbus-signal', signal='StatusChanged'), + EventPattern('irc-disconnected'), + ) + + # Idle would now crash in an idle callback; so let's see if it's alive. + sync_dbus(bus, q, conn) + +if __name__ == '__main__': + exec_test(test, {'use-ssl':dbus.Boolean(True)}, protocol=SSLIRCServer) + diff --git a/tests/twisted/tools/tp-glib.supp b/tests/twisted/tools/tp-glib.supp new file mode 100644 index 0000000..28bd5a0 --- /dev/null +++ b/tests/twisted/tools/tp-glib.supp @@ -0,0 +1,390 @@ +# Valgrind error suppression file + +# ============================= libc ================================== + +{ + ld.so initialization + selinux + Memcheck:Leak + ... + fun:_dl_init + obj:/lib/ld-*.so +} + +{ + dlopen initialization, triggered by handle-leak-debug code + Memcheck:Leak + ... + fun:__libc_dlopen_mode + fun:init + fun:backtrace + fun:handle_leak_debug_bt + fun:dynamic_ensure_handle + fun:tp_handle_ensure +} + +# default.supp has these for 2.10, but they're too specific +{ + Debian libc6 (2.10.x, 2.11.x) stripped dynamic linker + Memcheck:Cond + fun:index + fun:expand_dynamic_string_token + fun:_dl_map_object + fun:map_doit + fun:_dl_catch_error + fun:do_preload + fun:dl_main + fun:_dl_sysdep_start + fun:_dl_start + obj:/lib/ld-*.so +} +{ + Debian libc6 (2.9.x - 2.11.x) stripped dynamic linker + Memcheck:Cond + fun:_dl_relocate_object + fun:dl_main + fun:_dl_sysdep_start + fun:_dl_start + obj:/lib/ld-*.so +} + +{ + ld.so initialization on glibc 2.9 + Memcheck:Cond + fun:strlen + fun:_dl_init_paths + fun:dl_main + fun:_dl_sysdep_start + fun:_dl_start + obj:/lib/ld-2.9.so +} + +# ======================= libselinux on Debian amd64 ===================== + +{ + I have no idea what SELinux is doing but it's not my problem + Memcheck:Cond + ... + obj:/lib/libselinux.so.1 + obj:/lib/libselinux.so.1 + obj:/lib/libselinux.so.1 +} + +{ + I have no idea what SELinux is doing but it's not my problem + Memcheck:Value8 + ... + obj:/lib/libselinux.so.1 + obj:/lib/libselinux.so.1 + obj:/lib/libselinux.so.1 +} + +{ + I have no idea what SELinux is doing but it's not my problem + Memcheck:Leak + ... + obj:/lib/libselinux.so.1 + obj:/lib/libselinux.so.1 + obj:/lib/libselinux.so.1 +} + +# ============================= GLib ================================== + +{ + g_set_prgname copies its argument + Memcheck:Leak + ... + fun:g_set_prgname +} + +{ + one g_get_charset per child^Wprocess + Memcheck:Leak + ... + fun:g_get_charset +} + +{ + one g_get_home_dir per process + Memcheck:Leak + ... + fun:g_get_home_dir +} + +{ + GQuarks can't be freed + Memcheck:Leak + ... + fun:g_quark_from_static_string +} + +{ + GQuarks can't be freed + Memcheck:Leak + ... + fun:g_quark_from_string +} + +{ + interned strings can't be freed + Memcheck:Leak + ... + fun:g_intern_string +} + +{ + interned strings can't be freed + Memcheck:Leak + ... + fun:g_intern_static_string +} + +{ + shared global default g_main_context + Memcheck:Leak + ... + fun:g_main_context_new + fun:g_main_context_default +} + +{ + GTest initialization + Memcheck:Leak + ... + fun:g_test_init + fun:main +} + +{ + GTest admin + Memcheck:Leak + ... + fun:g_test_add_vtable +} + +{ + GTest pseudorandomness + Memcheck:Leak + ... + fun:g_rand_new_with_seed_array + fun:test_run_seed + ... + fun:g_test_run +} + +{ + GSLice initialization + Memcheck:Leak + ... + fun:g_malloc0 + fun:g_slice_init_nomessage + fun:g_slice_alloc +} + +# ============================= GObject =============================== + +{ + g_type_init + Memcheck:Leak + ... + fun:g_type_init +} + +{ + g_type_init_with_debug_flags + Memcheck:Leak + ... + fun:g_type_init_with_debug_flags +} + +{ + g_type_register_static + Memcheck:Leak + ... + fun:g_type_register_static +} + +{ + g_type_add_interface_static + Memcheck:Leak + ... + fun:g_type_add_interface_static +} + +{ + initialization of interfaces + Memcheck:Leak + ... + fun:type_iface_vtable_base_init_Wm + fun:g_type_class_ref +} + +# ============================= GIO =================================== + +{ + GIO init + Memcheck:Leak + ... + fun:g_inet_address_class_intern_init +} + +{ + g_simple_async_result class + Memcheck:Leak + ... + fun:g_type_class_ref + ... + fun:g_simple_async_result_new +} + +# ============================= dbus-glib ============================= + +{ + registering marshallers is permanent + Memcheck:Leak + ... + fun:dbus_g_object_register_marshaller_array + fun:dbus_g_object_register_marshaller +} + +{ + dbus-glib specialized GTypes are permanent + Memcheck:Leak + ... + fun:dbus_g_type_specialized_init +} + +{ + libdbus shared connection + Memcheck:Leak + ... + fun:dbus_g_bus_get +} + +{ + dbus-gobject registrations aren't freed unless we fall off the bus + Memcheck:Leak + ... + fun:g_slist_append + fun:dbus_g_connection_register_g_object +} + +{ + DBusGProxy slots aren't freed unless we fall off the bus + Memcheck:Leak + ... + fun:dbus_connection_allocate_data_slot + ... + fun:dbus_g_proxy_constructor +} + +{ + error registrations are for life, not just for Christmas + Memcheck:Leak + ... + fun:dbus_g_error_domain_register +} + +{ + DBusGProxy class init + Memcheck:Leak + ... + fun:dbus_g_proxy_class_init +} + +# ============================= telepathy-glib ======================== + +{ + tp_dbus_daemon_constructor @daemons once per DBusConnection + Memcheck:Leak + ... + fun:g_slice_alloc + fun:tp_dbus_daemon_constructor +} + +{ + tp_proxy_subclass_add_error_mapping refs the enum + Memcheck:Leak + ... + fun:g_type_class_ref + fun:tp_proxy_subclass_add_error_mapping +} + +{ + tp_proxy_or_subclass_hook_on_interface_add never frees its list + Memcheck:Leak + ... + fun:tp_proxy_or_subclass_hook_on_interface_add +} + +{ + tp_dbus_daemon_constructor filter not freed til we fall off the bus + Memcheck:Leak + ... + fun:dbus_connection_add_filter + fun:tp_dbus_daemon_constructor +} + +{ + tp_g_socket_address_from_variant reffing GNIO types + Memcheck:Leak + ... + fun:g_type_class_ref + ... + fun:tp_g_socket_address_from_variant +} + +{ + creating classes for DBusGProxy + Memcheck:Leak + ... + fun:g_type_class_ref + ... + fun:g_object_new + ... + fun:tp_proxy_borrow_interface_by_id +} + +{ + creating classes for tp_dbus_daemon_new + Memcheck:Leak + ... + fun:g_type_class_ref + ... + fun:g_object_new + ... + fun:tp_dbus_daemon_new +} + +{ + creating classes for TpCHannel + Memcheck:Leak + ... + fun:g_type_class_ref + ... + fun:g_object_new + ... + fun:tp_channel_new +} + +{ + creating a boxed type to use in TpCapabilities + Memcheck:Leak + ... + fun:g_type_class_ref + ... + fun:g_param_spec_boxed + fun:tp_capabilities_class_intern_init +} + +# ============================= questionable ========================== + +{ + creating classes for instances (this is a pretty big hammer) + Memcheck:Leak + ... + fun:g_type_class_ref + ... + fun:g_type_create_instance + ... + fun:g_param_spec_string +} |