aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Kerr <charles.kerr@canonical.com>2012-05-29 13:29:32 -0500
committerCharles Kerr <charles.kerr@canonical.com>2012-05-29 13:29:32 -0500
commit8a37ae27c57386bb321f6d97cfc9883d03b9027a (patch)
tree1bf826e26b5cbd2ba57b58b185a87fe756a1a171
parent7f08c9a317a964aaf859df9489a7361fb60ecd42 (diff)
downloadayatana-indicator-power-8a37ae27c57386bb321f6d97cfc9883d03b9027a.tar.gz
ayatana-indicator-power-8a37ae27c57386bb321f6d97cfc9883d03b9027a.tar.bz2
ayatana-indicator-power-8a37ae27c57386bb321f6d97cfc9883d03b9027a.zip
add tests for gsd GetDevices returning (a) no devices and (b) an error
-rw-r--r--tests/test-dbus-listener.cc326
1 files changed, 196 insertions, 130 deletions
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<DbusListenerTest*> (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<DbusListenerTest*> (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<DbusListenerTest*> (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<DbusListenerTest*> (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<DbusListenerTest*> (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[] =
+ "<node>"
+ " <interface name='org.gnome.SettingsDaemon.Power'>"
+ " <property name='Icon' type='s' access='read'>"
+ " </property>"
+ " <property name='Tooltip' type='s' access='read'>"
+ " </property>"
+ " <method name='GetDevices'>"
+ " <arg name='devices' type='a(susdut)' direction='out' />"
+ " </method>"
+ " </interface>"
+ "</node>";
+ 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<DbusListenerTest*> (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<DbusListenerTest*> (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<DbusListenerTest*> (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<DbusListenerTest*> (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[] = "<node>"
- " <interface name='org.gnome.SettingsDaemon.Power'>"
- " <property name='Icon' type='s' access='read'>"
- " </property>"
- " <property name='Tooltip' type='s' access='read'>"
- " </property>"
- " <method name='GetDevices'>"
- " <arg name='devices' type='a(susdut)' direction='out' />"
- " </method>"
- " </interface>"
- "</node>";
- 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);
}