From 8a2340c7249a714bf5c7128082b8c0c26f20a05f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 27 Aug 2010 14:31:44 -0500 Subject: Adding in an events test --- tests/Makefile.am | 34 ++++++++++++ tests/test-glib-events-client.c | 119 ++++++++++++++++++++++++++++++++++++++++ tests/test-glib-events-server.c | 109 ++++++++++++++++++++++++++++++++++++ 3 files changed, 262 insertions(+) create mode 100644 tests/test-glib-events-client.c create mode 100644 tests/test-glib-events-server.c (limited to 'tests') diff --git a/tests/Makefile.am b/tests/Makefile.am index 9f621cb..aa79c8f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -5,6 +5,7 @@ CLEANFILES= TESTS = \ test-glib-objects-test \ + test-glib-events \ test-glib-layout \ test-glib-properties \ test-glib-proxy \ @@ -20,6 +21,8 @@ TESTS = \ check_PROGRAMS = \ glib-server-nomenu \ test-glib-objects \ + test-glib-events-client \ + test-glib-events-server \ test-glib-layout-client \ test-glib-layout-server \ test-glib-properties-client \ @@ -128,6 +131,37 @@ test_glib_layout_client_LDADD = \ ../libdbusmenu-glib/libdbusmenu-glib.la \ $(DBUSMENUGLIB_LIBS) +###################### +# Test Glib Events +###################### + +test-glib-events: test-glib-events-client test-glib-events-server Makefile.am + @echo "#!/bin/bash" > $@ + @echo $(DBUS_RUNNER) --task ./test-glib-events-client --task-name Client --task ./test-glib-events-server --task-name Server --ignore-return >> $@ + @chmod +x $@ + +test_glib_events_server_SOURCES = \ + test-glib-events-server.c + +test_glib_events_server_CFLAGS = \ + -I $(srcdir)/.. \ + $(DBUSMENUGLIB_CFLAGS) -Wall -Werror + +test_glib_events_server_LDADD = \ + ../libdbusmenu-glib/libdbusmenu-glib.la \ + $(DBUSMENUGLIB_LIBS) + +test_glib_events_client_SOURCES = \ + test-glib-events-client.c + +test_glib_events_client_CFLAGS = \ + -I $(srcdir)/.. \ + $(DBUSMENUGLIB_CFLAGS) -Wall -Werror + +test_glib_events_client_LDADD = \ + ../libdbusmenu-glib/libdbusmenu-glib.la \ + $(DBUSMENUGLIB_LIBS) + ###################### # Test JSON ###################### diff --git a/tests/test-glib-events-client.c b/tests/test-glib-events-client.c new file mode 100644 index 0000000..57762cd --- /dev/null +++ b/tests/test-glib-events-client.c @@ -0,0 +1,119 @@ +/* +A test for libdbusmenu to ensure its quality. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +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 . +*/ + +#include + +#include +#include + +#include "test-glib-submenu.h" + +static guint layouton = 0; +static GMainLoop * mainloop = NULL; +static gboolean passed = TRUE; + +static void +realization (DbusmenuMenuitem * mi) +{ + const gchar * value; + gboolean original = passed; + + value = dbusmenu_menuitem_property_get(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY); + + if (layouton % 2 == 0) { + if (value == NULL) { + passed = FALSE; + } + } else { + if (value != NULL) { + passed = FALSE; + } + } + + if (original != passed) { + g_debug("Oops, this is where we failed"); + } + + return; +} + +static void +layout_updated (DbusmenuClient * client, gpointer data) +{ + g_debug("Layout Updated"); + + DbusmenuMenuitem * menuroot = dbusmenu_client_get_root(client); + if (menuroot == NULL) { + g_debug("Root is NULL?"); + return; + } + + GList * children = dbusmenu_menuitem_get_children(menuroot); + if (children == NULL) { + g_debug("No Children on root -- fail"); + passed = FALSE; + } else { + for (; children != NULL; children = g_list_next(children)) { + g_signal_connect(G_OBJECT(children->data), DBUSMENU_MENUITEM_SIGNAL_REALIZED, G_CALLBACK(realization), NULL); + } + } + + layouton++; + + if (layouts[layouton].id == -1) { + g_main_loop_quit(mainloop); + } + + return; +} + +static gboolean +timer_func (gpointer data) +{ + g_debug("Death timer. Oops. Got to: %d", layouton); + passed = FALSE; + g_main_loop_quit(mainloop); + return FALSE; +} + +int +main (int argc, char ** argv) +{ + g_type_init(); + + DbusmenuClient * client = dbusmenu_client_new("org.dbusmenu.test", "/org/test"); + g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(layout_updated), NULL); + + g_timeout_add_seconds(10, timer_func, client); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + g_object_unref(G_OBJECT(client)); + + if (passed) { + g_debug("Quiting"); + return 0; + } else { + g_debug("Quiting as we're a failure"); + return 1; + } +} diff --git a/tests/test-glib-events-server.c b/tests/test-glib-events-server.c new file mode 100644 index 0000000..68f7004 --- /dev/null +++ b/tests/test-glib-events-server.c @@ -0,0 +1,109 @@ +/* +A test for libdbusmenu to ensure its quality. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +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 . +*/ + +#include + +#include +#include +#include +#include + +#include +#include + +#include "test-glib-submenu.h" + + +static DbusmenuMenuitem * +layout2menuitem (layout_t * layout) +{ + if (layout == NULL || layout->id == 0) return NULL; + + DbusmenuMenuitem * local = dbusmenu_menuitem_new_with_id(layout->id); + + if (layout->submenu != NULL) { + guint count; + for (count = 0; layout->submenu[count].id != -1; count++) { + DbusmenuMenuitem * child = layout2menuitem(&layout->submenu[count]); + if (child != NULL) { + dbusmenu_menuitem_child_append(local, child); + } + } + } + + /* g_debug("Layout to menu return: 0x%X", (unsigned int)local); */ + return local; +} + +static guint layouton = 0; +static DbusmenuServer * server = NULL; +static GMainLoop * mainloop = NULL; + +static gboolean +timer_func (gpointer data) +{ + if (layouts[layouton].id == -1) { + g_main_loop_quit(mainloop); + return FALSE; + } + g_debug("Updating to Layout %d", layouton); + + dbusmenu_server_set_root(server, layout2menuitem(&layouts[layouton])); + layouton++; + + return TRUE; +} + +int +main (int argc, char ** argv) +{ + GError * error = NULL; + + g_type_init(); + + DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL)))); + + DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + guint nameret = 0; + + if (!org_freedesktop_DBus_request_name(bus_proxy, "org.dbusmenu.test", 0, &nameret, &error)) { + g_error("Unable to call to request name"); + return 1; + } + + if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + g_error("Unable to get name"); + return 1; + } + + server = dbusmenu_server_new("/org/test"); + + timer_func(NULL); + g_timeout_add(2500, timer_func, NULL); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + g_debug("Quiting"); + + return 0; +} -- cgit v1.2.3 From c0674ee7a6f7a2bf83f19e3c897cdda918c52d6f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 27 Aug 2010 14:50:05 -0500 Subject: First phase of restructuring these tests, now we can move on to testing. --- tests/test-glib-events-client.c | 46 ++------------------------ tests/test-glib-events-server.c | 71 +++++++++++++++++++---------------------- 2 files changed, 35 insertions(+), 82 deletions(-) (limited to 'tests') diff --git a/tests/test-glib-events-client.c b/tests/test-glib-events-client.c index 57762cd..9b05ca6 100644 --- a/tests/test-glib-events-client.c +++ b/tests/test-glib-events-client.c @@ -26,35 +26,9 @@ with this program. If not, see . #include "test-glib-submenu.h" -static guint layouton = 0; static GMainLoop * mainloop = NULL; static gboolean passed = TRUE; -static void -realization (DbusmenuMenuitem * mi) -{ - const gchar * value; - gboolean original = passed; - - value = dbusmenu_menuitem_property_get(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY); - - if (layouton % 2 == 0) { - if (value == NULL) { - passed = FALSE; - } - } else { - if (value != NULL) { - passed = FALSE; - } - } - - if (original != passed) { - g_debug("Oops, this is where we failed"); - } - - return; -} - static void layout_updated (DbusmenuClient * client, gpointer data) { @@ -66,21 +40,7 @@ layout_updated (DbusmenuClient * client, gpointer data) return; } - GList * children = dbusmenu_menuitem_get_children(menuroot); - if (children == NULL) { - g_debug("No Children on root -- fail"); - passed = FALSE; - } else { - for (; children != NULL; children = g_list_next(children)) { - g_signal_connect(G_OBJECT(children->data), DBUSMENU_MENUITEM_SIGNAL_REALIZED, G_CALLBACK(realization), NULL); - } - } - - layouton++; - - if (layouts[layouton].id == -1) { - g_main_loop_quit(mainloop); - } + dbusmenu_menuitem_handle_event(menuroot, "clicked", NULL, 0); return; } @@ -88,7 +48,7 @@ layout_updated (DbusmenuClient * client, gpointer data) static gboolean timer_func (gpointer data) { - g_debug("Death timer. Oops. Got to: %d", layouton); + g_debug("Death timer. Oops."); passed = FALSE; g_main_loop_quit(mainloop); return FALSE; @@ -102,7 +62,7 @@ main (int argc, char ** argv) DbusmenuClient * client = dbusmenu_client_new("org.dbusmenu.test", "/org/test"); g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(layout_updated), NULL); - g_timeout_add_seconds(10, timer_func, client); + g_timeout_add_seconds(5, timer_func, client); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); diff --git a/tests/test-glib-events-server.c b/tests/test-glib-events-server.c index 68f7004..db4f5c5 100644 --- a/tests/test-glib-events-server.c +++ b/tests/test-glib-events-server.c @@ -29,47 +29,24 @@ with this program. If not, see . #include #include -#include "test-glib-submenu.h" - - -static DbusmenuMenuitem * -layout2menuitem (layout_t * layout) -{ - if (layout == NULL || layout->id == 0) return NULL; - - DbusmenuMenuitem * local = dbusmenu_menuitem_new_with_id(layout->id); - - if (layout->submenu != NULL) { - guint count; - for (count = 0; layout->submenu[count].id != -1; count++) { - DbusmenuMenuitem * child = layout2menuitem(&layout->submenu[count]); - if (child != NULL) { - dbusmenu_menuitem_child_append(local, child); - } - } - } - - /* g_debug("Layout to menu return: 0x%X", (unsigned int)local); */ - return local; -} - -static guint layouton = 0; static DbusmenuServer * server = NULL; static GMainLoop * mainloop = NULL; +static gboolean passed = TRUE; + +static void +handle_event (void) { + g_debug("Handle event"); + g_main_loop_quit(mainloop); + return; +} static gboolean timer_func (gpointer data) { - if (layouts[layouton].id == -1) { - g_main_loop_quit(mainloop); - return FALSE; - } - g_debug("Updating to Layout %d", layouton); - - dbusmenu_server_set_root(server, layout2menuitem(&layouts[layouton])); - layouton++; - - return TRUE; + passed = FALSE; + g_debug("Never got a signal"); + g_main_loop_quit(mainloop); + return FALSE; } int @@ -96,14 +73,30 @@ main (int argc, char ** argv) } server = dbusmenu_server_new("/org/test"); + DbusmenuMenuitem * menuitem = dbusmenu_menuitem_new(); + dbusmenu_server_set_root(server, menuitem); - timer_func(NULL); - g_timeout_add(2500, timer_func, NULL); + g_signal_connect(G_OBJECT(menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(handle_event), NULL); + + g_timeout_add_seconds(3, timer_func, NULL); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); - g_debug("Quiting"); + if (passed) { + int i; - return 0; + for (i = 0; i < 10; i++) { + g_debug("Ignoring signals: %d", i); + g_usleep(100 * 1000); + } + } + + if (passed) { + g_debug("Test Passed"); + return 0; + } else { + g_debug("Test Failed"); + return 1; + } } -- cgit v1.2.3 From 6b16918eb4343bbe1c3be8c2806020c8e6c40284 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 27 Aug 2010 15:29:49 -0500 Subject: Fleshing out the test to get all happy --- tests/test-glib-events-client.c | 32 ++++++++++++++++++++++++++++++++ tests/test-glib-events-server.c | 4 ++-- 2 files changed, 34 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/test-glib-events-client.c b/tests/test-glib-events-client.c index 9b05ca6..688529c 100644 --- a/tests/test-glib-events-client.c +++ b/tests/test-glib-events-client.c @@ -28,6 +28,37 @@ with this program. If not, see . static GMainLoop * mainloop = NULL; static gboolean passed = TRUE; +static gboolean first = TRUE; + +static void +event_status (DbusmenuClient * client, DbusmenuMenuitem * item, gchar * name, GValue * data, guint timestamp, GError * error, gpointer user_data) +{ + g_debug("Event status: %s", error == NULL ? "Sent" : "Error"); + + if (first && error != NULL) { + passed = FALSE; + g_debug("First signal back failed."); + g_main_loop_quit(mainloop); + return; + } + + if (!first && error == NULL) { + passed = FALSE; + g_debug("Second signal didn't fail."); + g_main_loop_quit(mainloop); + return; + } + + if (!first && error != NULL) { + g_debug("Second signal failed: pass."); + g_main_loop_quit(mainloop); + return; + } + + first = FALSE; + dbusmenu_menuitem_handle_event(item, "clicked", NULL, 0); + return; +} static void layout_updated (DbusmenuClient * client, gpointer data) @@ -61,6 +92,7 @@ main (int argc, char ** argv) DbusmenuClient * client = dbusmenu_client_new("org.dbusmenu.test", "/org/test"); g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(layout_updated), NULL); + g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_EVENT_RESULT, G_CALLBACK(event_status), NULL); g_timeout_add_seconds(5, timer_func, client); diff --git a/tests/test-glib-events-server.c b/tests/test-glib-events-server.c index db4f5c5..0d1e0b1 100644 --- a/tests/test-glib-events-server.c +++ b/tests/test-glib-events-server.c @@ -86,9 +86,9 @@ main (int argc, char ** argv) if (passed) { int i; - for (i = 0; i < 10; i++) { + for (i = 0; i < 5; i++) { g_debug("Ignoring signals: %d", i); - g_usleep(100 * 1000); + g_usleep(1000 * 1000); } } -- cgit v1.2.3 From 2f8fef94c6491d501b735aec916055054d5c6d83 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 27 Aug 2010 15:57:42 -0500 Subject: Adding checking of all the parameters in the signature --- tests/test-glib-events-client.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/test-glib-events-client.c b/tests/test-glib-events-client.c index 688529c..97d5caf 100644 --- a/tests/test-glib-events-client.c +++ b/tests/test-glib-events-client.c @@ -26,6 +26,10 @@ with this program. If not, see . #include "test-glib-submenu.h" +#define TIMESTAMP_VALUE 54 +#define DATA_VALUE 32 +#define USER_VALUE 76 + static GMainLoop * mainloop = NULL; static gboolean passed = TRUE; static gboolean first = TRUE; @@ -35,6 +39,27 @@ event_status (DbusmenuClient * client, DbusmenuMenuitem * item, gchar * name, GV { g_debug("Event status: %s", error == NULL ? "Sent" : "Error"); + if (timestamp != TIMESTAMP_VALUE) { + g_debug("Timestamp value pass fail got: %d", timestamp); + passed = FALSE; + g_main_loop_quit(mainloop); + return; + } + + if (g_value_get_int(data) != DATA_VALUE) { + g_debug("Data value pass fail got: %d", g_value_get_int(data)); + passed = FALSE; + g_main_loop_quit(mainloop); + return; + } + + if (GPOINTER_TO_INT(user_data) != USER_VALUE) { + g_debug("User value pass fail got: %d", GPOINTER_TO_INT(user_data)); + passed = FALSE; + g_main_loop_quit(mainloop); + return; + } + if (first && error != NULL) { passed = FALSE; g_debug("First signal back failed."); @@ -56,12 +81,12 @@ event_status (DbusmenuClient * client, DbusmenuMenuitem * item, gchar * name, GV } first = FALSE; - dbusmenu_menuitem_handle_event(item, "clicked", NULL, 0); + dbusmenu_menuitem_handle_event(item, "clicked", data, timestamp); return; } static void -layout_updated (DbusmenuClient * client, gpointer data) +layout_updated (DbusmenuClient * client, gpointer user_data) { g_debug("Layout Updated"); @@ -71,7 +96,11 @@ layout_updated (DbusmenuClient * client, gpointer data) return; } - dbusmenu_menuitem_handle_event(menuroot, "clicked", NULL, 0); + GValue data = {0}; + g_value_init(&data, G_TYPE_INT); + g_value_set_int(&data, DATA_VALUE); + + dbusmenu_menuitem_handle_event(menuroot, "clicked", &data, TIMESTAMP_VALUE); return; } @@ -92,7 +121,7 @@ main (int argc, char ** argv) DbusmenuClient * client = dbusmenu_client_new("org.dbusmenu.test", "/org/test"); g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(layout_updated), NULL); - g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_EVENT_RESULT, G_CALLBACK(event_status), NULL); + g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_EVENT_RESULT, G_CALLBACK(event_status), GINT_TO_POINTER(USER_VALUE)); g_timeout_add_seconds(5, timer_func, client); -- cgit v1.2.3