diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 62 | ||||
-rw-r--r-- | tests/Makefile.am.strings | 38 | ||||
-rw-r--r-- | tests/test-dbus-listener.cc | 370 | ||||
-rw-r--r-- | tests/test-device.cc | 470 | ||||
-rw-r--r-- | tests/test-indicator.cc | 312 |
5 files changed, 1252 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..0c60247 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,62 @@ +TESTS = +CLEANFILES = +BUILT_SOURCES = +check_PROGRAMS = + +### +### +### + +# stock UMB tests on user-visible strings +include $(srcdir)/Makefile.am.strings + +check_LIBRARIES = libgtest.a +nodist_libgtest_a_SOURCES = \ + $(GTEST_SOURCE)/src/gtest-all.cc \ + $(GTEST_SOURCE)/src/gtest_main.cc + +AM_CPPFLAGS = $(GTEST_CPPFLAGS) -I${top_srcdir}/src -Wall -Werror +AM_CXXFLAGS = $(GTEST_CXXFLAGS) + +### +### +### + +TEST_LIBS = \ + $(top_builddir)/src/.libs/libpower.a \ + $(INDICATOR_LIBS) \ + $(UPOWER_LIBS) \ + $(COVERAGE_LDFLAGS) \ + libgtest.a + +TEST_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + $(UPOWER_CFLAGS) \ + $(INDICATOR_CFLAGS) + +BUILT_SOURCES += gschemas.compiled +CLEANFILES += gschemas.compiled +gschemas.compiled: Makefile + @glib-compile-schemas --targetdir=$(abs_builddir) $(top_builddir)/data + +TESTS += test-device +check_PROGRAMS += test-device +test_device_SOURCES = test-device.cc +test_device_LDADD = $(TEST_LIBS) +test_device_CPPFLAGS = $(TEST_CPPFLAGS) + +#TESTS += test-dbus-listener +#check_PROGRAMS += test-dbus-listener +#test_dbus_listener_SOURCES = test-dbus-listener.cc +#test_dbus_listener_LDADD = $(TEST_LIBS) +#test_dbus_listener_CPPFLAGS = $(TEST_CPPFLAGS) + +TESTS += test-indicator +check_PROGRAMS += test-indicator +test_indicator_SOURCES = test-indicator.cc +test_indicator_LDADD = $(TEST_LIBS) +test_indicator_CPPFLAGS = $(TEST_CPPFLAGS) -DSCHEMA_DIR="\"$(top_builddir)/tests/\"" + +### +### +### diff --git a/tests/Makefile.am.strings b/tests/Makefile.am.strings new file mode 100644 index 0000000..26a23a8 --- /dev/null +++ b/tests/Makefile.am.strings @@ -0,0 +1,38 @@ +TESTS += \ + test-ellipsis \ + test-space-ellipsis \ + test-ascii-quotes + +##### +# Tests for there being proper ellipsis instead of three periods in a row +##### +test-ellipsis: $(top_srcdir)/po + @echo "#!/bin/bash" > $@ + @echo "(cd $(top_srcdir)/po && make $(GETTEXT_PACKAGE).pot)" >> $@ + @echo "grep -c -e \"^msgid.*\.\.\.\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"Ellipsis found in user visible strings\" >&2 && exit 1" >> $@ + @echo "exit 0" >> $@ + @chmod +x $@ + +##### +# Tests for there being a space before an ellipsis +##### +test-space-ellipsis: $(top_srcdir)/po + @echo "#!/bin/bash" > $@ + @echo "(cd $(top_srcdir)/po && make $(GETTEXT_PACKAGE).pot)" >> $@ + @echo "grep -c -e \"^msgid.* …\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"Space before ellipsis found in user visible strings\" >&2 && exit 1" >> $@ + @echo "exit 0" >> $@ + @chmod +x $@ + +##### +# Tests for ASCII quote types +##### +test-ascii-quotes: $(top_srcdir)/po + @echo "#!/bin/bash" > $@ + @echo "(cd $(top_srcdir)/po && make $(GETTEXT_PACKAGE).pot)" >> $@ + @echo "grep -c -e \"^msgid \\\".*'.*\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"ASCII apostrophy found in user visible strings\" >&2 && exit 1" >> $@ + @echo "grep -c -e \"^msgid \\\".*\\\".*\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"ASCII quote found in user visible strings\" >&2 && exit 1" >> $@ + @echo "grep -c -e \"^msgid \\\".*\\\`.*\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"ASCII backtick found in user visible strings\" >&2 && exit 1" >> $@ + @echo "exit 0" >> $@ + @chmod +x $@ + +CLEANFILES += $(TESTS) diff --git a/tests/test-dbus-listener.cc b/tests/test-dbus-listener.cc new file mode 100644 index 0000000..8bf74bf --- /dev/null +++ b/tests/test-dbus-listener.cc @@ -0,0 +1,370 @@ +/* +Copyright 2012 Canonical Ltd. + +Authors: + Charles Kerr <charles.kerr@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <gtest/gtest.h> + +#include "dbus-listener.h" +#include "device.h" + +/*** +**** +***/ + +namespace +{ + void ensure_glib_initialized () + { + static bool initialized = false; + + if (G_UNLIKELY(!initialized)) + { + initialized = true; + g_type_init(); + } + } +} + +/*** +**** +***/ + +class DbusListenerTest : public ::testing::Test +{ + 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() + { + bus_acquired = false; + 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); + } +}; + +/*** +**** +***/ + + +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_signal_connect(o, INDICATOR_POWER_DBUS_LISTENER_DEVICES_ENUMERATED, + G_CALLBACK(on_devices_enumerated), this); + 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)); + + // 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); +} + +TEST_F(DbusListenerTest, GSDHasNoDevices) +{ + 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); + + // 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); + + // test the devices should have gotten + 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); +} + +TEST_F(DbusListenerTest, GSDReturnsError) +{ + 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); + 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); + + // test the devices should have gotten + 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); +} + +/* This test emits a PropertiesChanged signal and confirms that + the dbus listener asks for a fresh set of devices as a result. */ +TEST_F(DbusListenerTest, GSDPropChanged) +{ + 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); + GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_DBUS_LISTENER_TYPE, 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); + // test the devices should have gotten + ASSERT_EQ (g_slist_length(devices), 0); + + // build a GetDevices retval that shows an AC line and a discharging battery + g_clear_pointer (&gsd_power_error_string, g_free); + 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); + + // tell the listener that some property changed + GVariantBuilder props_builder; + g_variant_builder_init (&props_builder, G_VARIANT_TYPE ("a{sv}")); + GVariant * props_changed = g_variant_new ("(s@a{sv}@as)", GSD_POWER_DBUS_INTERFACE, + g_variant_builder_end (&props_builder), + g_variant_new_strv (NULL, 0)); + g_variant_ref_sink (props_changed); + GError * error = NULL; + g_dbus_connection_emit_signal (connection, + NULL, + GSD_POWER_DBUS_PATH, + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + props_changed, + &error); + ASSERT_TRUE(error == NULL); + + // give i-power's dbus listener a chance to ask for a fresh device list + g_main_loop_run (mainloop); + ASSERT_EQ (g_slist_length(devices), 2); + + // cleanup + g_object_unref (o); +} diff --git a/tests/test-device.cc b/tests/test-device.cc new file mode 100644 index 0000000..2c88ea1 --- /dev/null +++ b/tests/test-device.cc @@ -0,0 +1,470 @@ +/* +Copyright 2012 Canonical Ltd. + +Authors: + Charles Kerr <charles.kerr@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <gtest/gtest.h> +#include "device.h" + +namespace +{ + void ensure_glib_initialized () + { + static bool initialized = false; + + if (G_UNLIKELY(!initialized)) + { + initialized = true; + g_type_init(); + } + } +} + +class DeviceTest : public ::testing::Test +{ + protected: + + virtual void SetUp() + { + ensure_glib_initialized (); + } + + virtual void TearDown() + { + } + + protected: + + void check_icon_names (const IndicatorPowerDevice * device, const char * expected) + { + char ** names = indicator_power_device_get_icon_names (device); + char * str = g_strjoinv (";", names); + ASSERT_STREQ (expected, str); + g_free (str); + g_strfreev (names); + } + + void check_strings (const IndicatorPowerDevice * device, + const char * expected_timestring, + const char * expected_details, + const char * expected_accessible) + { + char * timestring = NULL; + char * details = NULL; + char * accessible = NULL; + + indicator_power_device_get_time_details (device, ×tring, &details, &accessible); + EXPECT_STREQ (expected_timestring, timestring); + EXPECT_STREQ (expected_details, details); + EXPECT_STREQ (expected_accessible, accessible); + + g_free (accessible); + g_free (details); + g_free (timestring); + } +}; + + +/*** +**** +***/ + +TEST_F(DeviceTest, GObjectNew) +{ + ensure_glib_initialized (); + + GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_DEVICE_TYPE, NULL)); + ASSERT_TRUE (o != NULL); + ASSERT_TRUE (INDICATOR_IS_POWER_DEVICE(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); +} + +TEST_F(DeviceTest, Properties) +{ + int i; + gdouble d; + GObject * o; + gchar * str; + guint64 u64; + const gchar * key; + + ensure_glib_initialized (); + + o = G_OBJECT (g_object_new (INDICATOR_POWER_DEVICE_TYPE, NULL)); + ASSERT_TRUE (o != NULL); + ASSERT_TRUE (INDICATOR_IS_POWER_DEVICE(o)); + + // Test getting & setting a Device's properties. + + // KIND + key = INDICATOR_POWER_DEVICE_KIND; + g_object_set (o, key, UP_DEVICE_KIND_BATTERY, NULL); + g_object_get (o, key, &i, NULL); + ASSERT_EQ (i, UP_DEVICE_KIND_BATTERY); + + // STATE + key = INDICATOR_POWER_DEVICE_STATE; + g_object_set (o, key, UP_DEVICE_STATE_CHARGING, NULL); + g_object_get (o, key, &i, NULL); + ASSERT_EQ (i, UP_DEVICE_STATE_CHARGING); + + // OBJECT_PATH + key = INDICATOR_POWER_DEVICE_OBJECT_PATH; + g_object_set (o, key, "/object/path", NULL); + g_object_get (o, key, &str, NULL); + ASSERT_STREQ (str, "/object/path"); + g_free (str); + + // PERCENTAGE + key = INDICATOR_POWER_DEVICE_PERCENTAGE; + g_object_set (o, key, 50.0, NULL); + g_object_get (o, key, &d, NULL); + ASSERT_EQ((int)d, 50); + + // TIME + key = INDICATOR_POWER_DEVICE_TIME; + g_object_set (o, key, (guint64)30, NULL); + g_object_get (o, key, &u64, NULL); + ASSERT_EQ(u64, 30); + + // cleanup + g_object_unref (o); +} + +TEST_F(DeviceTest, New) +{ + ensure_glib_initialized (); + + IndicatorPowerDevice * device = indicator_power_device_new ("/object/path", + UP_DEVICE_KIND_BATTERY, + 50.0, + UP_DEVICE_STATE_CHARGING, + 30); + ASSERT_TRUE (device != NULL); + ASSERT_TRUE (INDICATOR_IS_POWER_DEVICE(device)); + ASSERT_EQ (indicator_power_device_get_kind(device), UP_DEVICE_KIND_BATTERY); + ASSERT_EQ (indicator_power_device_get_state(device), UP_DEVICE_STATE_CHARGING); + ASSERT_STREQ (indicator_power_device_get_object_path(device), "/object/path"); + ASSERT_EQ ((int)indicator_power_device_get_percentage(device), 50); + ASSERT_EQ (indicator_power_device_get_time(device), 30); + + // cleanup + g_object_unref (device); +} + +TEST_F(DeviceTest, NewFromVariant) +{ + ensure_glib_initialized (); + + GVariant * variant = g_variant_new ("(susdut)", + "/object/path", + UP_DEVICE_KIND_BATTERY, + "icon", + 50.0, + UP_DEVICE_STATE_CHARGING, + 30); + IndicatorPowerDevice * device = indicator_power_device_new_from_variant (variant); + ASSERT_TRUE (variant != NULL); + ASSERT_TRUE (device != NULL); + ASSERT_TRUE (INDICATOR_IS_POWER_DEVICE(device)); + ASSERT_EQ (indicator_power_device_get_kind(device), UP_DEVICE_KIND_BATTERY); + ASSERT_EQ (indicator_power_device_get_state(device), UP_DEVICE_STATE_CHARGING); + ASSERT_STREQ (indicator_power_device_get_object_path(device), "/object/path"); + ASSERT_EQ ((int)indicator_power_device_get_percentage(device), 50); + ASSERT_EQ (indicator_power_device_get_time(device), 30); + + // cleanup + g_object_unref (device); + g_variant_unref (variant); +} + +TEST_F(DeviceTest, BadAccessors) +{ + ensure_glib_initialized (); + + // test that these functions can handle being passed NULL pointers + IndicatorPowerDevice * device = NULL; + indicator_power_device_get_kind (device); + indicator_power_device_get_time (device); + indicator_power_device_get_state (device); + indicator_power_device_get_percentage (device); + indicator_power_device_get_object_path (device); + + // test that these functions can handle being passed non-device GObjects + device = reinterpret_cast<IndicatorPowerDevice*>(g_cancellable_new ()); + indicator_power_device_get_kind (device); + indicator_power_device_get_time (device); + indicator_power_device_get_state (device); + indicator_power_device_get_percentage (device); + indicator_power_device_get_object_path (device); + g_object_unref (device); +} + +/*** +**** +***/ + +TEST_F(DeviceTest, IconNames) +{ + IndicatorPowerDevice * device = INDICATOR_POWER_DEVICE (g_object_new (INDICATOR_POWER_DEVICE_TYPE, NULL)); + GObject * o = G_OBJECT(device); + + // bad arguments + ASSERT_TRUE (indicator_power_device_get_icon_names (NULL) == NULL); + + // power + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_LINE_POWER, + NULL); + check_icon_names (device, "ac-adapter-symbolic;" + "ac-adapter"); + + // monitor + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_MONITOR, + NULL); + check_icon_names (device, "gpm-monitor-symbolic;" + "gpm-monitor"); + + // empty battery + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_EMPTY, + NULL); + check_icon_names (device, "battery-empty-symbolic;" + "gpm-battery-empty;" + "gpm-battery-000;" + "battery-empty"); + + // charged battery + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_FULLY_CHARGED, + NULL); + check_icon_names (device, "battery-full-charged-symbolic;battery-full-charging-symbolic;" + "gpm-battery-full;gpm-battery-100;" + "battery-full-charged;battery-full-charging"); + + // charging battery, 95% + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 95.0, + NULL); + check_icon_names (device, "battery-caution-charging-symbolic;" + "gpm-battery-000-charging;" + "battery-caution-charging"); + + // charging battery, 85% + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 85.0, + NULL); + check_icon_names (device, "battery-caution-charging-symbolic;" + "gpm-battery-000-charging;" + "battery-caution-charging"); + + // charging battery, 50% + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + NULL); + check_icon_names (device, "battery-caution-charging-symbolic;" + "gpm-battery-000-charging;" + "battery-caution-charging"); + + // charging battery, 25% + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 25.0, + NULL); + check_icon_names (device, "battery-caution-charging-symbolic;" + "gpm-battery-000-charging;" + "battery-caution-charging"); + + // charging battery, 5% + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 5.0, + NULL); + check_icon_names (device, "battery-caution-charging-symbolic;" + "gpm-battery-000-charging;" + "battery-caution-charging"); + + + // discharging battery, 95% + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 95.0, + NULL); + check_icon_names (device, "battery-full-symbolic;" + "gpm-battery-100;" + "battery-full"); + + // discharging battery, 85% + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 85.0, + NULL); + check_icon_names (device, "battery-full-symbolic;" + "gpm-battery-080;" + "battery-full"); + + // discharging battery, 50% -- 1 hour left + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + INDICATOR_POWER_DEVICE_TIME, (guint64)(60*60), + NULL); + check_icon_names (device, "battery-good-symbolic;" + "gpm-battery-060;" + "battery-good"); + + // discharging battery, 25% -- 1 hour left + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 25.0, + INDICATOR_POWER_DEVICE_TIME, (guint64)(60*60), + NULL); + check_icon_names (device, "battery-good-symbolic;" + "gpm-battery-040;" + "battery-good"); + + // discharging battery, 25% -- 15 minutes left + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 25.0, + INDICATOR_POWER_DEVICE_TIME, (guint64)(60*15), + NULL); + check_icon_names (device, "battery-low-symbolic;" + "gpm-battery-020;" + "battery-low"); + + // discharging battery, 5% -- 1 hour left + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 5.0, + INDICATOR_POWER_DEVICE_TIME, (guint64)(60*60), + NULL); + check_icon_names (device, "battery-good-symbolic;" + "gpm-battery-040;" + "battery-good"); + + // discharging battery, 5% -- 15 minutes left + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 5.0, + INDICATOR_POWER_DEVICE_TIME, (guint64)(60*15), + NULL); + check_icon_names (device, "battery-caution-symbolic;" + "gpm-battery-000;" + "battery-caution"); + // state unknown + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_UNKNOWN, + NULL); + check_icon_names (device, "battery-missing-symbolic;" + "gpm-battery-missing;" + "battery-missing"); + + // cleanup + g_object_unref(o); +} + + +TEST_F(DeviceTest, Labels) +{ + // set our language so that i18n won't break these tests + char * real_lang = g_strdup(g_getenv ("LANG")); + g_setenv ("LANG", "en_US.UTF-8", TRUE); + + // bad args: NULL device + check_strings (NULL, NULL, NULL, NULL); + + // bad args: a GObject that isn't a device + GObject * o = G_OBJECT(g_cancellable_new()); + check_strings ((IndicatorPowerDevice*)o, NULL, NULL, NULL); + g_object_unref (o); + + /** + *** + **/ + + IndicatorPowerDevice * device = INDICATOR_POWER_DEVICE (g_object_new (INDICATOR_POWER_DEVICE_TYPE, NULL)); + o = G_OBJECT(device); + + // charging + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + INDICATOR_POWER_DEVICE_TIME, guint64(60*61), + NULL); + check_strings (device, "(1:01)", + "Battery (1:01 to charge)", + "Battery (1 hour 1 minute to charge (50%))"); + + // discharging, < 12 hours left + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + INDICATOR_POWER_DEVICE_TIME, guint64(60*61), + NULL); + check_strings (device, "1:01", + "Battery (1:01 left)", + "Battery (1 hour 1 minute left (50%))"); + + // discharging, > 12 hours left + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + INDICATOR_POWER_DEVICE_TIME, guint64(60*60*13), + NULL); + check_strings (device, "13:00", "Battery", "Battery"); + + // fully charged + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_FULLY_CHARGED, + INDICATOR_POWER_DEVICE_PERCENTAGE, 100.0, + INDICATOR_POWER_DEVICE_TIME, guint64(0), + NULL); + check_strings (device, "", "Battery (charged)", "Battery (charged)"); + + // percentage but no time estimate + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + INDICATOR_POWER_DEVICE_TIME, guint64(0), + NULL); + check_strings (device, "(50%)", "Battery (50%)", "Battery (50%)"); + + // no percentage, no time estimate + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 0.0, + INDICATOR_POWER_DEVICE_TIME, guint64(0), + NULL); + check_strings (device, "(not present)", "Battery (not present)", "Battery (not present)"); + + // power line + g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_LINE_POWER, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_UNKNOWN, + INDICATOR_POWER_DEVICE_PERCENTAGE, 0.0, + INDICATOR_POWER_DEVICE_TIME, guint64(0), + NULL); + check_strings (device, "AC Adapter", "AC Adapter", "AC Adapter"); + + // cleanup + g_object_unref(o); + g_setenv ("LANG", real_lang, TRUE); + g_free (real_lang); +} diff --git a/tests/test-indicator.cc b/tests/test-indicator.cc new file mode 100644 index 0000000..b9f7321 --- /dev/null +++ b/tests/test-indicator.cc @@ -0,0 +1,312 @@ +/* +Copyright 2012 Canonical Ltd. + +Authors: + Charles Kerr <charles.kerr@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <gtest/gtest.h> + +#include "dbus-listener.h" +#include "device.h" +#include "indicator-power.h" + +/*** +**** +***/ + +namespace +{ + void ensure_glib_initialized () + { + static bool initialized = false; + + if (G_UNLIKELY(!initialized)) + { + initialized = true; + g_type_init(); + } + } +} + +/*** +**** +***/ + +class IndicatorTest : public ::testing::Test +{ + protected: + + IndicatorPowerDevice * ac_device; + IndicatorPowerDevice * battery_device; + + virtual void SetUp() + { + ensure_glib_initialized (); + + g_setenv( "GSETTINGS_SCHEMA_DIR", SCHEMA_DIR, TRUE); + + ac_device = indicator_power_device_new ( + "/org/freedesktop/UPower/devices/line_power_AC", + UP_DEVICE_KIND_LINE_POWER, + 0.0, UP_DEVICE_STATE_UNKNOWN, 0); + + battery_device = indicator_power_device_new ( + "/org/freedesktop/UPower/devices/battery_BAT0", + UP_DEVICE_KIND_BATTERY, + 52.871712, UP_DEVICE_STATE_DISCHARGING, 8834); + } + + virtual void TearDown() + { + g_object_unref (battery_device); + g_object_unref (ac_device); + } + + const char* GetAccessibleDesc (IndicatorPower * power) const + { + GList * entries = indicator_object_get_entries (INDICATOR_OBJECT(power)); + g_assert (g_list_length(entries) == 1); + IndicatorObjectEntry * entry = static_cast<IndicatorObjectEntry*>(entries->data); + const char * ret = entry->accessible_desc; + g_list_free (entries); + return ret; + } +}; + +/*** +**** +***/ + +TEST_F(IndicatorTest, GObjectNew) +{ + GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_TYPE, NULL)); + ASSERT_TRUE (o != NULL); + ASSERT_TRUE (IS_INDICATOR_POWER(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); +} + +TEST_F(IndicatorTest, SetDevices) +{ + GSList * devices; + IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL)); + + devices = NULL; + devices = g_slist_append (devices, ac_device); + devices = g_slist_append (devices, battery_device); + indicator_power_set_devices (power, devices); + g_slist_free (devices); + + g_object_unref (power); +} + +TEST_F(IndicatorTest, DischargingStrings) +{ + IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL)); + GSList * devices = g_slist_append (NULL, battery_device); + + // give the indicator a discharging battery with 30 minutes of life left + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + INDICATOR_POWER_DEVICE_TIME, guint64(60*30), + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (30 minutes left (50%))"); + + // give the indicator a discharging battery with 1 hour of life left + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + INDICATOR_POWER_DEVICE_TIME, guint64(60*60), + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (1 hour left (50%))"); + + // give the indicator a discharging battery with 2 hours of life left + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_PERCENTAGE, 100.0, + INDICATOR_POWER_DEVICE_TIME, guint64(60*60*2), + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (2 hours left (100%))"); + + // give the indicator a discharging battery with over 12 hours of life left + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_TIME, guint64(60*60*12 + 1), + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery"); + + // give the indicator a discharging battery with 29 seconds left + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_TIME, guint64(29), + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (Unknown time left (100%))"); + + // what happens if the time estimate isn't available + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_TIME, guint64(0), + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (50%)"); + + // what happens if the time estimate AND percentage isn't available + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_TIME, guint64(0), + INDICATOR_POWER_DEVICE_PERCENTAGE, 0.0, + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (not present)"); + + // cleanup + g_slist_free (devices); + g_object_unref (power); +} + +TEST_F(IndicatorTest, ChargingStrings) +{ + IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL)); + GSList * devices = g_slist_prepend (NULL, battery_device); + + // give the indicator a discharging battery with 1 hour of life left + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING, + INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0, + INDICATOR_POWER_DEVICE_TIME, guint64(60*60), + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (1 hour to charge (50%))"); + + // give the indicator a discharging battery with 2 hours of life left + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_TIME, guint64(60*60*2), + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (2 hours to charge (50%))"); + + // cleanup + g_slist_free (devices); + g_object_unref (power); +} + +TEST_F(IndicatorTest, ChargedStrings) +{ + IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL)); + GSList * devices = g_slist_append (NULL, battery_device); + + // give the indicator a discharging battery with 1 hour of life left + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_FULLY_CHARGED, + INDICATOR_POWER_DEVICE_PERCENTAGE, 100.0, + INDICATOR_POWER_DEVICE_TIME, guint64(0), + NULL); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (charged)"); + + // cleanup + g_slist_free (devices); + g_object_unref (power); +} + +TEST_F(IndicatorTest, AvoidChargingBatteriesWithZeroSecondsLeft) +{ + IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL)); + + g_object_set (battery_device, + INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_FULLY_CHARGED, + INDICATOR_POWER_DEVICE_PERCENTAGE, 100.0, + INDICATOR_POWER_DEVICE_TIME, guint64(0), + NULL); + IndicatorPowerDevice * bad_battery_device = indicator_power_device_new ( + "/org/freedesktop/UPower/devices/battery_BAT0", + UP_DEVICE_KIND_BATTERY, + 53, UP_DEVICE_STATE_CHARGING, 0); + + GSList * devices = NULL; + devices = g_slist_append (devices, battery_device); + devices = g_slist_append (devices, bad_battery_device); + indicator_power_set_devices (power, devices); + ASSERT_STREQ (GetAccessibleDesc(power), "Battery (53%)"); + + // cleanup + g_slist_free (devices); + g_object_unref (power); + g_object_unref (bad_battery_device); +} + +TEST_F(IndicatorTest, OtherDevices) +{ + IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL)); + + g_object_ref (battery_device); + GSList * devices = g_slist_append (NULL, battery_device); + + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/mouse", UP_DEVICE_KIND_MOUSE, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/ups", UP_DEVICE_KIND_UPS, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/keyboard", UP_DEVICE_KIND_KEYBOARD, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/pda", UP_DEVICE_KIND_PDA, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/phone", UP_DEVICE_KIND_PHONE, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/monitor", UP_DEVICE_KIND_MONITOR, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/media_player", UP_DEVICE_KIND_MEDIA_PLAYER, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/tablet", UP_DEVICE_KIND_TABLET, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/computer", UP_DEVICE_KIND_COMPUTER, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + devices = g_slist_append (devices, indicator_power_device_new ( + "/org/freedesktop/UPower/devices/unknown", UP_DEVICE_KIND_UNKNOWN, + 0, UP_DEVICE_STATE_UNKNOWN, 0)); + + indicator_power_set_devices (power, devices); + + // FIXME: this tests to confirm the code doesn't crash, + // but further tests would be helpful + + // cleanup + g_slist_free_full (devices, g_object_unref); + g_object_unref (power); +} + +TEST_F(IndicatorTest, NoDevices) +{ + IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL)); + + indicator_power_set_devices (power, NULL); + + // FIXME: this tests to confirm the code doesn't crash, + // but further tests would be helpful + + // cleanup + g_object_unref (power); +} |