From 8a37ae27c57386bb321f6d97cfc9883d03b9027a Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 29 May 2012 13:29:32 -0500 Subject: add tests for gsd GetDevices returning (a) no devices and (b) an error --- tests/test-dbus-listener.cc | 326 ++++++++++++++++++++++++++------------------ 1 file changed, 196 insertions(+), 130 deletions(-) (limited to 'tests') diff --git a/tests/test-dbus-listener.cc b/tests/test-dbus-listener.cc index 62caeb0..4c6c607 100644 --- a/tests/test-dbus-listener.cc +++ b/tests/test-dbus-listener.cc @@ -46,14 +46,87 @@ namespace class DbusListenerTest : public ::testing::Test { - public: - + protected: GSList * devices; GDBusConnection * connection; GMainLoop * mainloop; GTestDBus * bus; + GDBusNodeInfo * gsd_power_introspection_data; + GVariant * get_devices_retval; bool bus_acquired; bool name_acquired; + int gsd_name_ownership_id; + int gsd_power_registration_id; + char * gsd_power_error_string; + + protected: + + static void + on_bus_acquired (GDBusConnection *conn, const gchar * name, gpointer gself) + { + g_debug ("bus acquired: %s, connection is %p", name, conn); + + DbusListenerTest * test = static_cast (gself); + test->connection = conn; + test->bus_acquired = true; + } + + static void + on_name_acquired (GDBusConnection * conn, const gchar * name, gpointer gself) + { + g_debug ("name acquired: %s, connection is %p", name, conn); + + DbusListenerTest * test = static_cast (gself); + test->name_acquired = true; + g_main_loop_quit (test->mainloop); + } + + static void + on_name_lost (GDBusConnection * conn, const gchar * name, gpointer gself) + { + g_debug ("name lost: %s, connection is %p", name, conn); + + DbusListenerTest * test = static_cast (gself); + test->name_acquired = false; + g_main_loop_quit (test->mainloop); + } + + protected: + + static void + on_devices_enumerated (IndicatorPowerDbusListener * l, GSList * devices, gpointer gself) + { + g_debug ("on_devices_enumerated"); + + DbusListenerTest * test = static_cast (gself); + test->name_acquired = false; + g_slist_foreach (devices, (GFunc)g_object_ref, NULL); + test->devices = g_slist_copy (devices); + g_main_loop_quit (test->mainloop); + } + + static void + gsd_power_handle_method_call (GDBusConnection * connection, + const gchar * sender, + const gchar * object_path, + const gchar * interface_name, + const gchar * method_name, + GVariant * parameters, + GDBusMethodInvocation * invocation, + gpointer gself) + { + DbusListenerTest * test = static_cast (gself); + g_assert (!g_strcmp0 (method_name, "GetDevices")); + if (test->gsd_power_error_string != NULL) { + const GQuark domain = g_quark_from_static_string ("mock-gsd-power"); + g_message ("returning an error"); + g_dbus_method_invocation_return_error_literal (invocation, domain, 0, test->gsd_power_error_string); + } else { + g_dbus_method_invocation_return_value (invocation, test->get_devices_retval); + } + } + + protected: virtual void SetUp() { @@ -61,15 +134,72 @@ class DbusListenerTest : public ::testing::Test name_acquired = false; connection = NULL; devices = NULL; + get_devices_retval = NULL; + gsd_power_error_string = NULL; + // bring up the test bus ensure_glib_initialized (); mainloop = g_main_loop_new (NULL, FALSE); bus = g_test_dbus_new (G_TEST_DBUS_NONE); g_test_dbus_up (bus); + + // own org.gnome.SettingsDameon on this test bus + gsd_name_ownership_id = g_bus_own_name ( + G_BUS_TYPE_SESSION, + GSD_SERVICE, + G_BUS_NAME_OWNER_FLAGS_NONE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + this, NULL); + ASSERT_FALSE (bus_acquired); + ASSERT_FALSE (name_acquired); + ASSERT_TRUE (connection == NULL); + g_main_loop_run (mainloop); + ASSERT_TRUE (bus_acquired); + ASSERT_TRUE (name_acquired); + ASSERT_TRUE (G_IS_DBUS_CONNECTION(connection)); + + // parse the org.gnome.SettingsDaemon.Power interface + const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + gsd_power_introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); + ASSERT_TRUE (gsd_power_introspection_data != NULL); + + // Set up a mock GSD. + // All it really does is wait for calls to GetDevice and + // returns the get_devices_retval variant + const GDBusInterfaceVTable gsd_power_interface_vtable = { + gsd_power_handle_method_call, + NULL, /* GetProperty */ + NULL, /* SetProperty */ + }; + gsd_power_registration_id = g_dbus_connection_register_object (connection, + GSD_POWER_DBUS_PATH, + gsd_power_introspection_data->interfaces[0], + &gsd_power_interface_vtable, + this, NULL, NULL); } virtual void TearDown() { + g_free (gsd_power_error_string); + + g_dbus_connection_unregister_object (connection, gsd_power_registration_id); + + g_dbus_node_info_unref (gsd_power_introspection_data); + g_bus_unown_name (gsd_name_ownership_id); + g_slist_free_full (devices, g_object_unref); g_test_dbus_down (bus); g_main_loop_unref (mainloop); @@ -80,141 +210,82 @@ class DbusListenerTest : public ::testing::Test **** ***/ -/* -TEST_F(DbusListenerTest, GObjectNew) + +TEST_F(DbusListenerTest, GSDHasPowerAndBattery) { + // build a GetDevices retval that shows an AC line and a discharging battery + GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE("a(susdut)")); + g_variant_builder_add (builder, "(susdut)", + "/org/freedesktop/UPower/devices/line_power_AC", + UP_DEVICE_KIND_LINE_POWER, + ". GThemedIcon ac-adapter-symbolic ac-adapter ", + 0.0, + UP_DEVICE_STATE_UNKNOWN, + 0); + g_variant_builder_add (builder, "(susdut)", + "/org/freedesktop/UPower/devices/battery_BAT0", + UP_DEVICE_KIND_BATTERY, + ". GThemedIcon battery-good-symbolic gpm-battery-060 battery-good ", + 52.871712, + UP_DEVICE_STATE_DISCHARGING, + 8834); + GVariant * value = g_variant_builder_end (builder); + get_devices_retval = g_variant_new_tuple (&value, 1); + g_variant_builder_unref (builder); + + // create an i-power dbus listener to watch for GSD + ASSERT_EQ (g_slist_length(devices), 0); GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_DBUS_LISTENER_TYPE, NULL)); ASSERT_TRUE (o != NULL); ASSERT_TRUE (INDICATOR_IS_POWER_DBUS_LISTENER(o)); - g_object_run_dispose (o); // used to get coverage of both branches in the object's dispose func's g_clear_*() calls - g_object_unref (o); -} -*/ - -static void -on_bus_acquired (GDBusConnection *conn, const gchar * name, gpointer gself) -{ - g_debug ("bus acquired: %s, connection is %p", name, conn); - - DbusListenerTest * test = static_cast (gself); - test->connection = conn; - test->bus_acquired = true; -} + g_signal_connect(o, INDICATOR_POWER_DBUS_LISTENER_DEVICES_ENUMERATED, + G_CALLBACK(on_devices_enumerated), this); + g_main_loop_run (mainloop); -static void -on_name_acquired (GDBusConnection * conn, const gchar * name, gpointer gself) -{ - g_debug ("name acquired: %s, connection is %p", name, conn); + // test the devices should have gotten + ASSERT_EQ (g_slist_length(devices), 2); + IndicatorPowerDevice * device = INDICATOR_POWER_DEVICE (g_slist_nth_data (devices, 0)); + ASSERT_EQ (indicator_power_device_get_kind(device), UP_DEVICE_KIND_LINE_POWER); + ASSERT_STREQ ("/org/freedesktop/UPower/devices/line_power_AC", indicator_power_device_get_object_path(device)); + device = INDICATOR_POWER_DEVICE (g_slist_nth_data (devices, 1)); + ASSERT_EQ (UP_DEVICE_KIND_BATTERY, indicator_power_device_get_kind(device)); + ASSERT_STREQ ("/org/freedesktop/UPower/devices/battery_BAT0", indicator_power_device_get_object_path(device)); - DbusListenerTest * test = static_cast (gself); - test->name_acquired = true; - g_main_loop_quit (test->mainloop); + // cleanup + g_object_run_dispose (o); // used to get coverage of both branches in the object's dispose func's g_clear_*() calls + g_object_unref (o); } -static void -on_name_lost (GDBusConnection * conn, const gchar * name, gpointer gself) +TEST_F(DbusListenerTest, GSDHasNoDevices) { - g_debug ("name lost: %s, connection is %p", name, conn); + GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE("a(susdut)")); + GVariant * value = g_variant_builder_end (builder); + get_devices_retval = g_variant_new_tuple (&value, 1); + g_variant_builder_unref (builder); - DbusListenerTest * test = static_cast (gself); - test->name_acquired = false; - g_main_loop_quit (test->mainloop); -} + // create an i-power dbus listener to watch for GSD + ASSERT_EQ (g_slist_length(devices), 0); + GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_DBUS_LISTENER_TYPE, NULL)); + ASSERT_TRUE (o != NULL); + ASSERT_TRUE (INDICATOR_IS_POWER_DBUS_LISTENER(o)); + g_signal_connect(o, INDICATOR_POWER_DBUS_LISTENER_DEVICES_ENUMERATED, + G_CALLBACK(on_devices_enumerated), this); + g_main_loop_run (mainloop); -static void -on_devices_enumerated (IndicatorPowerDbusListener * l, GSList * devices, gpointer gself) -{ - g_debug ("on_devices_enumerated"); + // test the devices should have gotten + ASSERT_EQ (g_slist_length(devices), 0); - DbusListenerTest * test = static_cast (gself); - test->name_acquired = false; - g_slist_foreach (devices, (GFunc)g_object_ref, NULL); - test->devices = g_slist_copy (devices); - g_main_loop_quit (test->mainloop); -} + // FIXME: this test improves coverage and confirms that the code + // doesn't crash, but more meaningful tests would be better too. -static void -gsd_power_handle_method_call (GDBusConnection *connection, - const gchar *sender, - const gchar *object_path, - const gchar *interface_name, - const gchar *method_name, - GVariant *parameters, - GDBusMethodInvocation *invocation, - gpointer user_data) -{ - if (!g_strcmp0 (method_name, "GetDevices")) - { - /* create builder */ - GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE("a(susdut)")); - - g_variant_builder_add (builder, "(susdut)", - "/org/freedesktop/UPower/devices/line_power_AC", - UP_DEVICE_KIND_LINE_POWER, - ". GThemedIcon ac-adapter-symbolic ac-adapter ", - 0.0, - UP_DEVICE_STATE_UNKNOWN, - 0); - g_variant_builder_add (builder, "(susdut)", - "/org/freedesktop/UPower/devices/battery_BAT0", - UP_DEVICE_KIND_BATTERY, - ". GThemedIcon battery-good-symbolic gpm-battery-060 battery-good ", - 52.871712, - UP_DEVICE_STATE_DISCHARGING, - 8834); - - GVariant * value = g_variant_builder_end (builder); - GVariant * tuple = g_variant_new_tuple (&value, 1); - g_dbus_method_invocation_return_value (invocation, tuple); - g_variant_builder_unref (builder); - } + // cleanup + g_object_run_dispose (o); // used to get coverage of both branches in the object's dispose func's g_clear_*() calls + g_object_unref (o); } -static const GDBusInterfaceVTable gsd_power_interface_vtable = +TEST_F(DbusListenerTest, GSDReturnsError) { - gsd_power_handle_method_call, - NULL, /* GetProperty */ - NULL, /* SetProperty */ -}; - -TEST_F(DbusListenerTest, GnomeSettingsDaemon) -{ - // own org.gnome.SettingsDameon on the bus - const int name_ownership_id = g_bus_own_name ( - G_BUS_TYPE_SESSION, - GSD_SERVICE, - G_BUS_NAME_OWNER_FLAGS_NONE, - on_bus_acquired, - on_name_acquired, - on_name_lost, - this, NULL); - ASSERT_FALSE (bus_acquired); - ASSERT_FALSE (name_acquired); - ASSERT_TRUE (connection == NULL); - g_main_loop_run (mainloop); - ASSERT_TRUE (bus_acquired); - ASSERT_TRUE (name_acquired); - ASSERT_TRUE (G_IS_DBUS_CONNECTION(connection)); - - // register a mock org.gnome.SettingsDaemon.Power interface - const gchar introspection_xml[] = "" - " " - " " - " " - " " - " " - " " - " " - " " - " " - ""; - GDBusNodeInfo * introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); - ASSERT_TRUE (introspection_data != NULL); - const int registration_id = g_dbus_connection_register_object (connection, - GSD_POWER_DBUS_PATH, - introspection_data->interfaces[0], - &gsd_power_interface_vtable, - NULL, NULL, NULL); + gsd_power_error_string = g_strdup ("no devices for you lol"); // create an i-power dbus listener to watch for GSD ASSERT_EQ (g_slist_length(devices), 0); @@ -226,17 +297,12 @@ TEST_F(DbusListenerTest, GnomeSettingsDaemon) g_main_loop_run (mainloop); // test the devices should have gotten - ASSERT_EQ (g_slist_length(devices), 2); - IndicatorPowerDevice * device = INDICATOR_POWER_DEVICE (g_slist_nth_data (devices, 0)); - ASSERT_EQ (indicator_power_device_get_kind(device), UP_DEVICE_KIND_LINE_POWER); - ASSERT_STREQ ("/org/freedesktop/UPower/devices/line_power_AC", indicator_power_device_get_object_path(device)); - device = INDICATOR_POWER_DEVICE (g_slist_nth_data (devices, 1)); - ASSERT_EQ (UP_DEVICE_KIND_BATTERY, indicator_power_device_get_kind(device)); - ASSERT_STREQ ("/org/freedesktop/UPower/devices/battery_BAT0", indicator_power_device_get_object_path(device)); + ASSERT_EQ (g_slist_length(devices), 0); + + // FIXME: this test improves coverage and confirms that the code + // doesn't crash, but more meaningful tests would be better too. // cleanup g_object_run_dispose (o); // used to get coverage of both branches in the object's dispose func's g_clear_*() calls g_object_unref (o); - g_dbus_connection_unregister_object (connection, registration_id); - g_bus_unown_name (name_ownership_id); } -- cgit v1.2.3