← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/dbusmenu/v2work into lp:dbusmenu

 

Ted Gould has proposed merging lp:~ted/dbusmenu/v2work into lp:dbusmenu.

    Requested reviews:
    DBus Menu Team (dbusmenu-team)


Update to do a replace instead of an insert that was causing crashes.  Whoo, hoo!  Required a lot of tests to be written to find.
-- 
https://code.launchpad.net/~ted/dbusmenu/v2work/+merge/16456
Your team ayatana-commits is subscribed to branch lp:dbusmenu.
=== modified file '.bzrignore'
--- .bzrignore	2009-12-17 22:41:01 +0000
+++ .bzrignore	2009-12-21 22:33:17 +0000
@@ -54,3 +54,6 @@
 tests/test-mago
 tests/*.bustle
 libdbusmenu-gtk/libdbusmenu_gtk_la-genericmenuitem.lo
+tests/test-glib-objects
+tests/test-glib-objects-test
+tests/test-glib-objects.xml

=== modified file 'libdbusmenu-glib/menuitem-marshal.list'
--- libdbusmenu-glib/menuitem-marshal.list	2009-06-23 19:38:58 +0000
+++ libdbusmenu-glib/menuitem-marshal.list	2009-12-21 22:33:17 +0000
@@ -1,4 +1,4 @@
-VOID: STRING, STRING
+VOID: STRING, POINTER
 VOID: OBJECT, UINT, UINT
 VOID: OBJECT, UINT
 VOID: OBJECT

=== modified file 'libdbusmenu-glib/menuitem.c'
--- libdbusmenu-glib/menuitem.c	2009-12-15 20:03:08 +0000
+++ libdbusmenu-glib/menuitem.c	2009-12-21 22:33:17 +0000
@@ -122,8 +122,8 @@
 	                                           G_SIGNAL_RUN_LAST,
 	                                           G_STRUCT_OFFSET(DbusmenuMenuitemClass, property_changed),
 	                                           NULL, NULL,
-	                                           _dbusmenu_menuitem_marshal_VOID__STRING_STRING,
-	                                           G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
+	                                           _dbusmenu_menuitem_marshal_VOID__STRING_POINTER,
+	                                           G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_POINTER);
 	/**
 		DbusmenuMenuitem::item-activated:
 		@arg0: The #DbusmenuMenuitem object.
@@ -250,7 +250,7 @@
 /* A small little function to both clear the insides of a 
    value as well as the memory it itself uses. */
 static void
-g_value_free (gpointer data)
+_g_value_free (gpointer data)
 {
 	if (data == NULL) return;
 	GValue * value = (GValue*)data;
@@ -269,7 +269,7 @@
 	priv->id = 0; 
 	priv->children = NULL;
 
-	priv->properties = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_value_free);
+	priv->properties = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, _g_value_free);
 
 	priv->root = FALSE;
 	
@@ -815,12 +815,13 @@
 	g_value_init(lval, G_VALUE_TYPE(value));
 	g_value_copy(value, lval);
 
-	g_hash_table_insert(priv->properties, lprop, lval);
+	g_hash_table_replace(priv->properties, lprop, lval);
 	#ifdef MASSIVEDEBUGGING
 	gchar * valstr = g_strdup_value_contents(lval);
 	g_debug("Menuitem %d (%s) signalling property '%s' changed to '%s'", ID(mi), LABEL(mi), property, g_utf8_strlen(valstr, 50) < 25 ? valstr : "<too long>");
 	g_free(valstr);
 	#endif
+
 	g_signal_emit(G_OBJECT(mi), signals[PROPERTY_CHANGED], 0, lprop, lval, TRUE);
 
 	return TRUE;

=== modified file 'tests/Makefile.am'
--- tests/Makefile.am	2009-12-17 22:41:01 +0000
+++ tests/Makefile.am	2009-12-21 22:33:17 +0000
@@ -2,6 +2,7 @@
 DBUS_RUNNER=dbus-test-runner
 
 TESTS = \
+	test-glib-objects-test \
 	test-glib-layout \
 	test-glib-properties \
 	test-glib-simple-items \
@@ -10,6 +11,7 @@
 
 check_PROGRAMS = \
 	glib-server-nomenu \
+	test-glib-objects \
 	test-glib-layout-client \
 	test-glib-layout-server \
 	test-glib-properties-client \
@@ -71,6 +73,28 @@
 
 
 ######################
+# Test Glib Object
+######################
+
+OBJECT_XML_REPORT = test-glib-objects.xml
+
+test-glib-objects-test: test-glib-objects Makefile.am
+	@echo "#!/bin/bash" > $@
+	@echo $(DBUS_RUNNER) -b $@.bustle --task gtester --parameter -k --parameter -o --parameter $(OBJECT_XML_REPORT) --parameter ./test-glib-objects >> $@
+	@chmod +x $@
+
+test_glib_objects_SOURCES = \
+	test-glib-objects.c
+
+test_glib_objects_CFLAGS = \
+	-I $(srcdir)/.. \
+	$(DBUSMENUGLIB_CFLAGS) -Wall -Werror
+
+test_glib_objects_LDADD = \
+	../libdbusmenu-glib/libdbusmenu-glib.la \
+	$(DBUSMENUGLIB_LIBS)
+
+######################
 # Test Glib Properties
 ######################
 
@@ -239,6 +263,8 @@
 
 DISTCLEANFILES = \
 	$(TESTS) \
+	$(OBJECT_XML_FILE) \
+	test-glib-objects-test.bustle \
 	test-glib-layout.bustle \
 	test-glib-properties.bustle \
 	test-glib-simple-items.bustle \

=== added file 'tests/test-glib-objects.c'
--- tests/test-glib-objects.c	1970-01-01 00:00:00 +0000
+++ tests/test-glib-objects.c	2009-12-21 22:33:17 +0000
@@ -0,0 +1,233 @@
+/*
+Testing for the various objects just by themselves.
+
+Copyright 2009 Canonical Ltd.
+
+Authors:
+    Ted Gould <ted@xxxxxxxxxxxxx>
+
+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 <glib.h>
+#include <glib-object.h>
+
+#include <libdbusmenu-glib/menuitem.h>
+
+/* Building the basic menu item, make sure we didn't break
+   any core GObject stuff */
+static void
+test_object_menuitem (void)
+{
+	/* Build a menu item */
+	DbusmenuMenuitem * item = dbusmenu_menuitem_new();
+
+	/* Test to make sure it's a happy object */
+	g_assert(item != NULL);
+	g_assert(G_IS_OBJECT(item));
+	g_assert(DBUSMENU_IS_MENUITEM(item));
+
+	/* Set up a check to make sure it gets destroyed on unref */
+	g_object_add_weak_pointer(G_OBJECT(item), (gpointer *)&item);
+	g_object_unref(item);
+
+	/* Did it go away? */
+	g_assert(item == NULL);
+
+	return;
+}
+
+/* Set a string prop, make sure it's stored as one */
+static void
+test_object_menuitem_props_string (void)
+{
+	/* Build a menu item */
+	DbusmenuMenuitem * item = dbusmenu_menuitem_new();
+	const GValue * out = NULL;
+
+	/* Test to make sure it's a happy object */
+	g_assert(item != NULL);
+
+	/* Setting a string */
+	dbusmenu_menuitem_property_set(item, "string", "value");
+	out = dbusmenu_menuitem_property_get_value(item, "string");
+	g_assert(out != NULL);
+	g_assert(G_VALUE_TYPE(out) == G_TYPE_STRING);
+	g_assert(!g_strcmp0(g_value_get_string(out), "value"));
+	g_assert(!g_strcmp0(dbusmenu_menuitem_property_get(item, "string"), "value"));
+
+	g_object_unref(item);
+
+	return;
+}
+
+/* Set an integer prop, make sure it's stored as one */
+static void
+test_object_menuitem_props_int (void)
+{
+	/* Build a menu item */
+	DbusmenuMenuitem * item = dbusmenu_menuitem_new();
+	const GValue * out = NULL;
+
+	/* Test to make sure it's a happy object */
+	g_assert(item != NULL);
+
+	/* Setting a string */
+	dbusmenu_menuitem_property_set_int(item, "int", 12345);
+	out = dbusmenu_menuitem_property_get_value(item, "int");
+	g_assert(out != NULL);
+	g_assert(G_VALUE_TYPE(out) == G_TYPE_INT);
+	g_assert(g_value_get_int(out) == 12345);
+	g_assert(dbusmenu_menuitem_property_get_int(item, "int") == 12345);
+
+	g_object_unref(item);
+
+	return;
+}
+
+/* Set a boolean prop, make sure it's stored as one */
+static void
+test_object_menuitem_props_bool (void)
+{
+	/* Build a menu item */
+	DbusmenuMenuitem * item = dbusmenu_menuitem_new();
+	const GValue * out = NULL;
+
+	/* Test to make sure it's a happy object */
+	g_assert(item != NULL);
+
+	/* Setting a string */
+	dbusmenu_menuitem_property_set_bool(item, "boolean", TRUE);
+	out = dbusmenu_menuitem_property_get_value(item, "boolean");
+	g_assert(out != NULL);
+	g_assert(G_VALUE_TYPE(out) == G_TYPE_BOOLEAN);
+	g_assert(g_value_get_boolean(out));
+	g_assert(dbusmenu_menuitem_property_get_int(item, "boolean"));
+
+	g_object_unref(item);
+
+	return;
+}
+
+/* Set the same property several times with
+   different types. */
+static void
+test_object_menuitem_props_swap (void)
+{
+	/* Build a menu item */
+	DbusmenuMenuitem * item = dbusmenu_menuitem_new();
+
+	/* Test to make sure it's a happy object */
+	g_assert(item != NULL);
+
+	/* Setting a boolean */
+	dbusmenu_menuitem_property_set_bool(item, "swapper", TRUE);
+	g_assert(dbusmenu_menuitem_property_get_bool(item, "swapper"));
+
+	/* Setting a int */
+	dbusmenu_menuitem_property_set_int(item, "swapper", 5432);
+	g_assert(dbusmenu_menuitem_property_get_int(item, "swapper") == 5432);
+
+	/* Setting a string */
+	dbusmenu_menuitem_property_set(item, "swapper", "mystring");
+	g_assert(!g_strcmp0(dbusmenu_menuitem_property_get(item, "swapper"), "mystring"));
+
+	/* Setting a boolean */
+	dbusmenu_menuitem_property_set_bool(item, "swapper", FALSE);
+	g_assert(!dbusmenu_menuitem_property_get_bool(item, "swapper"));
+
+	g_object_unref(item);
+
+	return;
+}
+
+/* A helper to put a value into a pointer for eval. */
+static void
+test_object_menuitem_props_signals_helper (DbusmenuMenuitem * mi, gchar * property, GValue * value, GValue ** out)
+{
+	/* g_debug("Signal handler got: %s", property); */
+	if (!g_strcmp0(property, "swapper")) {
+		*out = value;
+	}
+	return;
+}
+
+/* Set the same property several times with
+   different types. */
+static void
+test_object_menuitem_props_signals (void)
+{
+	/* Build a menu item */
+	DbusmenuMenuitem * item = dbusmenu_menuitem_new();
+	GValue * out = NULL;
+
+	/* Test to make sure it's a happy object */
+	g_assert(item != NULL);
+
+	/* Setting up our callback */
+	g_signal_connect(G_OBJECT(item), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(test_object_menuitem_props_signals_helper), &out);
+
+	/* Setting a boolean */
+	dbusmenu_menuitem_property_set_bool(item, "swapper", TRUE);
+	g_assert(out != NULL);
+	g_assert(g_value_get_boolean(out));
+	out = NULL;
+
+	/* Setting a int */
+	dbusmenu_menuitem_property_set_int(item, "swapper", 5432);
+	g_assert(out != NULL);
+	g_assert(g_value_get_int(out) == 5432);
+	out = NULL;
+
+	/* Setting a string */
+	dbusmenu_menuitem_property_set(item, "swapper", "mystring");
+	g_assert(out != NULL);
+	g_assert(!g_strcmp0(g_value_get_string(out), "mystring"));
+	out = NULL;
+
+	/* Setting a boolean */
+	dbusmenu_menuitem_property_set_bool(item, "swapper", FALSE);
+	g_assert(out != NULL);
+	g_assert(!g_value_get_boolean(out));
+	out = NULL;
+
+	g_object_unref(item);
+
+	return;
+}
+
+/* Build the test suite */
+static void
+test_glib_objects_suite (void)
+{
+	g_test_add_func ("/dbusmenu/glib/objects/menuitem/base",          test_object_menuitem);
+	g_test_add_func ("/dbusmenu/glib/objects/menuitem/props_string",  test_object_menuitem_props_string);
+	g_test_add_func ("/dbusmenu/glib/objects/menuitem/props_int",     test_object_menuitem_props_int);
+	g_test_add_func ("/dbusmenu/glib/objects/menuitem/props_bool",    test_object_menuitem_props_bool);
+	g_test_add_func ("/dbusmenu/glib/objects/menuitem/props_swap",    test_object_menuitem_props_swap);
+	g_test_add_func ("/dbusmenu/glib/objects/menuitem/props_signals", test_object_menuitem_props_signals);
+	return;
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+	g_type_init();
+	g_test_init(&argc, &argv, NULL);
+
+	/* Test suites */
+	test_glib_objects_suite();
+
+
+	return g_test_run ();
+}


Follow ups