[gxml/gsoc2013] tests/valgrind: add memory testing files, like suppression files, and .c and .vala tests
- From: Richard Hans Schwarting <rschwart src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml/gsoc2013] tests/valgrind: add memory testing files, like suppression files, and .c and .vala tests
- Date: Sun, 28 Jul 2013 05:32:39 +0000 (UTC)
commit e7ada06aec296f6e5543dc29b247ff388a9a77a5
Author: Richard Schwarting <aquarichy gmail com>
Date: Sun Jul 28 01:30:11 2013 -0400
tests/valgrind: add memory testing files, like suppression files, and .c and .vala tests
test/valgrind/Makefile | 49 ++++++++++++++++++++
test/valgrind/attributes.vala | 25 ++++++++++
test/valgrind/document.c | 12 +++++
test/valgrind/example.vala | 76 +++++++++++++++++++++++++++++++
test/valgrind/gfile.c | 13 +++++
test/valgrind/gio.supp | 29 ++++++++++++
test/valgrind/glib.supp | 16 +++++++
test/valgrind/gobject.c | 12 +++++
test/valgrind/gtype.supp | 45 ++++++++++++++++++
test/valgrind/libxml2.c | 28 +++++++++++
test/valgrind/libxml2.supp | 43 +++++++++++++++++
test/valgrind/scope.vala | 25 ++++++++++
test/valgrind/small.vala | 24 ++++++++++
test/valgrind/small2.vala | 24 ++++++++++
test/valgrind/small2a.c | 28 +++++++++++
test/valgrind/small2b.c | 25 ++++++++++
test/valgrind/unlink_unattached_nodes.c | 45 ++++++++++++++++++
17 files changed, 519 insertions(+), 0 deletions(-)
---
diff --git a/test/valgrind/Makefile b/test/valgrind/Makefile
new file mode 100644
index 0000000..6509fc4
--- /dev/null
+++ b/test/valgrind/Makefile
@@ -0,0 +1,49 @@
+VALAC=valac
+VALAFLAGS=-g --save-temps --vapidir=../../gxml --pkg gxml
+CC=gcc
+CFLAGS=-g `pkg-config --cflags --libs glib-2.0 gobject-2.0 gxml gio-2.0`
+
+all: unlink_unattached_nodes small2a small2b gobject document example attributes small small2 scope libxml2
supp
+
+example: example.vala
+ $(VALAC) $(VALAFLAGS) example.vala -o example
+
+attributes: attributes.vala
+ $(VALAC) $(VALAFLAGS) attributes.vala -o attributes
+
+small: small.vala
+ $(VALAC) $(VALAFLAGS) small.vala -o small
+
+small2: small2.vala
+ $(VALAC) $(VALAFLAGS) small2.vala -o small2
+
+scope: scope.vala
+ $(VALAC) $(VALAFLAGS) scope.vala -o scope
+
+unlink_unattached_nodes: unlink_unattached_nodes.c
+
+small2a: small2a.c
+
+small2b: small2b.c
+
+gfile: gfile.c
+
+gobject: gobject.c
+
+document: document.c
+
+libxml2: libxml2.c
+
+clean:
+ rm example small small2 small2a small2b gobject document scope attributes unlink_unattached_nodes
libxml2 *~ \#*\#
+
+runnew:
+ (cd ../.. && make && make install); make clean; make
+ make run
+
+run:
+ G_SLICE=always-malloc valgrind --leak-check=full --show-reachable=yes --suppressions=libxml2.supp
--suppressions=gio.supp --suppressions=gtype.supp --suppressions=glib.supp --num-callers=40 ./example
+
+# we compile it for users of GXml
+supp:
+ cat *.supp > ../../gxml.supp
diff --git a/test/valgrind/attributes.vala b/test/valgrind/attributes.vala
new file mode 100644
index 0000000..ada7879
--- /dev/null
+++ b/test/valgrind/attributes.vala
@@ -0,0 +1,25 @@
+using GXml;
+
+int main (string[] args) {
+ // string[] authors = { "John Green", "Jane Austen", "J.D. Salinger" };
+ // string[] titles = { "The Fault in Our Stars", "Pride & Prejudice", "Nine Stories" };
+
+ try {
+ Document doc = new Document ();
+ Element root = doc.create_element ("Bookshelf");
+ doc.append_child (root);
+
+ Element owner = doc.create_element ("Owner");
+ root.append_child (owner);
+ owner.set_attribute ("fullname", "John Green");
+
+ // Element books = doc.create_element ("Books");
+ // root.append_child (books);
+
+ //stdout.printf ("create_a_document:\n%s\n", doc.to_string (true, 8));
+ } catch (GLib.Error e) {
+ stderr.printf ("%s\n", e.message);
+ }
+
+ return 0;
+}
diff --git a/test/valgrind/document.c b/test/valgrind/document.c
new file mode 100644
index 0000000..aff8154
--- /dev/null
+++ b/test/valgrind/document.c
@@ -0,0 +1,12 @@
+#include <glib.h>
+#include <glib-object.h>
+#include <gxml/gxml.h>
+
+int main (void) {
+ GXmlDocument *doc;
+
+ doc = gxml_document_new ();
+ g_object_unref (doc);
+
+ return 0;
+}
diff --git a/test/valgrind/example.vala b/test/valgrind/example.vala
new file mode 100755
index 0000000..f0d566f
--- /dev/null
+++ b/test/valgrind/example.vala
@@ -0,0 +1,76 @@
+using GXml;
+
+void create_a_document () {
+ string[] authors = { "John Green", "Jane Austen", "J.D. Salinger" };
+ string[] titles = { "The Fault in Our Stars", "Pride & Prejudice", "Nine Stories" };
+
+ Document doc = new Document ();
+ Element root = doc.create_element ("Bookshelf");
+ doc.append_child (root);
+ Element owner = doc.create_element ("Owner");
+ root.append_child (owner);
+ owner.set_attribute ("fullname", "John Green");
+
+ Element books = doc.create_element ("Books");
+ root.append_child (books);
+
+ for (int i = 0; i < authors.length; i++) {
+ Element book = doc.create_element ("Book");
+ book.set_attribute ("author", authors[i]);
+ book.set_attribute ("title", titles[i]);
+ books.append_child (book);
+ }
+
+ stdout.printf ("create_a_document:\n%s\n", doc.to_string (true, 8));
+}
+
+void create_a_document_from_a_string () {
+ string xml;
+ Document doc;
+
+ xml = """<?xml version="1.0"?>
+<Bookshelf>
+<Owner fullname="John Green"/>
+<Books>
+<Book author="John Green" title="The Fault in Our Stars"/>
+<Book author="Jane Austen" title="Pride & Prejudice"/>
+<Book author="J.D. Salinger" title="Nine Stories"/>
+</Books>
+</Bookshelf>""";
+
+ doc = new Document.from_string (xml);
+ stdout.printf ("create_a_document_from_a_string:\n%s\n", doc.to_string (true, 8));
+}
+
+void create_a_document_from_a_file () {
+ File f = File.new_for_path ("bookshelf.xml");
+ Cancellable can = new Cancellable ();
+ Document doc;
+
+ doc = new Document.from_gfile (f, can);
+ stdout.printf ("create_a_document_from_a_file:\n%s\n", doc.to_string (true, 8));
+}
+
+void create_a_document_from_a_path () {
+ Document doc;
+
+ doc = new Document.from_path ("bookshelf.xml");
+ stdout.printf ("create_a_document_from_a_path:\n%s\n", doc.to_string (true, 8));
+}
+
+void saving_a_document_to_a_path () {
+ Document doc;
+
+ doc = new Document.from_path ("bookshelf.xml");
+ doc.save_to_path ("bookshelf2.xml");
+}
+
+int main (string[] args) {
+ create_a_document ();
+ create_a_document_from_a_string ();
+ create_a_document_from_a_file ();
+ create_a_document_from_a_path ();
+ saving_a_document_to_a_path ();
+
+ return 0;
+}
diff --git a/test/valgrind/gfile.c b/test/valgrind/gfile.c
new file mode 100644
index 0000000..7c55015
--- /dev/null
+++ b/test/valgrind/gfile.c
@@ -0,0 +1,13 @@
+#include <glib.h>
+#include <gio/gio.h>
+
+int main (void) {
+ GFile *file;
+
+ file = g_file_new_for_path ("bookshelf.xml");
+
+ g_object_unref (file);
+
+
+ return 0;
+}
diff --git a/test/valgrind/gio.supp b/test/valgrind/gio.supp
new file mode 100644
index 0000000..b61d4b8
--- /dev/null
+++ b/test/valgrind/gio.supp
@@ -0,0 +1,29 @@
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:gobject_init_ctor
+ fun:_dl_init
+}
+{
+ label:
+ Memcheck:Leak
+ ...
+ fun:_g_io_module_get_default
+ fun:g_file_new_for_path
+}
+{
+ label:
+ Memcheck:Leak
+ ...
+ fun:try_implementation
+ fun:_g_io_module_get_default
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:g_private_get
+ fun:g_cancellable_push_current
+ fun:g_input_stream_read
+}
diff --git a/test/valgrind/glib.supp b/test/valgrind/glib.supp
new file mode 100644
index 0000000..d6f735b
--- /dev/null
+++ b/test/valgrind/glib.supp
@@ -0,0 +1,16 @@
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:g_type_class_ref
+ fun:g_object_newv
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:g_thread_proxy
+ fun:start_thread
+ fun:clone
+}
+
\ No newline at end of file
diff --git a/test/valgrind/gobject.c b/test/valgrind/gobject.c
new file mode 100644
index 0000000..32e9138
--- /dev/null
+++ b/test/valgrind/gobject.c
@@ -0,0 +1,12 @@
+#include <glib.h>
+#include <glib-object.h>
+#include <gxml/gxml.h>
+
+int main (void) {
+ GObject *obj;
+
+ obj = g_object_newv (G_TYPE_OBJECT, 0, NULL);
+ g_object_unref (obj);
+
+ return 0;
+}
diff --git a/test/valgrind/gtype.supp b/test/valgrind/gtype.supp
new file mode 100644
index 0000000..de4f837
--- /dev/null
+++ b/test/valgrind/gtype.supp
@@ -0,0 +1,45 @@
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:g_type_register_static*
+ fun:*_get_type
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:g_type_add_interface_static
+ fun:*_get_type
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:g_type_interface_add_prerequisite
+ fun:*_get_type
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:g_type_create_instance
+ fun:g_object_constructor
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:g_type_class_ref
+ fun:g_type_create_instance
+}
+{
+ label
+ Memcheck:Leak
+ fun:memalign
+ ...
+ fun:g_type_create_instance
+ fun:*_construct_*
+}
+
+
diff --git a/test/valgrind/libxml2.c b/test/valgrind/libxml2.c
new file mode 100644
index 0000000..5c9a4eb
--- /dev/null
+++ b/test/valgrind/libxml2.c
@@ -0,0 +1,28 @@
+#include <libxml/tree.h>
+#include <stdio.h>
+#include <string.h>
+
+int main (void) {
+ char *str = "<Bookshelf><Book>Text</Book></Bookshelf>";
+ xmlDoc *doc = xmlReadMemory (str, strlen (str), NULL, NULL, 0);
+
+ // to string
+ xmlChar *mem;
+ int size;
+ xmlDocDumpFormatMemoryEnc (doc, &mem, &size, NULL, 0);
+ printf ("[%s]\n", (char*)mem);
+ xmlFree (mem);
+
+ // set attribute
+ xmlNode *root = xmlDocGetRootElement (doc);
+ xmlAttr *attr = xmlSetProp (root, "name", "Alice");
+
+ xmlFreeDoc (doc);
+
+ /* In C, you'd call this when you were done with the library;
+ TODO: do we want to expose this in Vala? We can't automatically run
+ it when we're done using the library from Vala, sadly. */
+ //xmlCleanupParser ();
+
+ return 0;
+}
diff --git a/test/valgrind/libxml2.supp b/test/valgrind/libxml2.supp
new file mode 100644
index 0000000..dceb99f
--- /dev/null
+++ b/test/valgrind/libxml2.supp
@@ -0,0 +1,43 @@
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:xmlInitCharEncodingHandlers
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:xmlInitParserCtxt
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:xmlInitParser__internal_alias*
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:xmlNewCharEncodingHandler
+ fun:xmlGetCharEncodingHandler
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:__xmlInitializeDict
+ ...
+ fun:xmlDocDumpFormatMemory*
+}
+{
+ label
+ Memcheck:Leak
+ ...
+ fun:__xmlInitializeDict
+ ...
+ fun:xmlNewDocProp
+}
+
+
diff --git a/test/valgrind/scope.vala b/test/valgrind/scope.vala
new file mode 100644
index 0000000..710e704
--- /dev/null
+++ b/test/valgrind/scope.vala
@@ -0,0 +1,25 @@
+using GXml;
+
+void create_a_document () {
+ try {
+ Element owner;
+
+ {
+ Document doc = new Document ();
+ Element root = doc.create_element ("Bookshelf");
+ doc.append_child (root);
+ owner = doc.create_element ("Owner");
+ root.append_child (owner);
+ // owner.set_attribute ("fullname", "John Green");
+ }
+ stdout.printf ("Element owner:\n%s\n", owner.to_string (true, 8));
+ } catch (GLib.Error e) {
+ stderr.printf ("%s\n", e.message);
+ }
+}
+
+int main (string[] args) {
+ create_a_document ();
+
+ return 0;
+}
diff --git a/test/valgrind/small.vala b/test/valgrind/small.vala
new file mode 100755
index 0000000..e716ab3
--- /dev/null
+++ b/test/valgrind/small.vala
@@ -0,0 +1,24 @@
+using GXml;
+
+void create_a_document () {
+ try {
+ Document doc = new Document ();
+
+ // Element root = doc.create_element ("Bookshelf");
+ // doc.append_child (root);
+
+ // Element owner = doc.create_element ("Owner");
+ // root.append_child (owner);
+ // owner.set_attribute ("fullname", "John Green");
+
+ stdout.printf ("create_a_document:\n%s\n", doc.to_string (true, 8));
+ } catch (GLib.Error e) {
+ stderr.printf ("%s\n", e.message);
+ }
+}
+
+int main (string[] args) {
+ create_a_document ();
+
+ return 0;
+}
diff --git a/test/valgrind/small2.vala b/test/valgrind/small2.vala
new file mode 100644
index 0000000..daea909
--- /dev/null
+++ b/test/valgrind/small2.vala
@@ -0,0 +1,24 @@
+using GXml;
+
+void create_a_document () {
+ try {
+ Document doc = new Document ();
+
+ Element root = doc.create_element ("Bookshelf");
+ doc.append_child (root);
+
+ Element owner = doc.create_element ("Owner");
+ //root.append_child (owner);
+ // owner.set_attribute ("fullname", "John Green");
+
+ stdout.printf ("create_a_document:\n%s\n", doc.to_string (true, 8));
+ } catch (GLib.Error e) {
+ stderr.printf ("%s\n", e.message);
+ }
+}
+
+int main (string[] args) {
+ create_a_document ();
+
+ return 0;
+}
diff --git a/test/valgrind/small2a.c b/test/valgrind/small2a.c
new file mode 100644
index 0000000..cd1664a
--- /dev/null
+++ b/test/valgrind/small2a.c
@@ -0,0 +1,28 @@
+#include <glib.h>
+#include <glib-object.h>
+#include <gxml/gxml.h>
+
+/**
+ * In this one, we DO attach the owner node.
+ */
+int main (int argc, char ** argv) {
+ GXmlDocument* doc;
+ GXmlElement* root;
+ GXmlElement* owner;
+
+ doc = gxml_document_new ();
+ root = gxml_document_create_element (doc, "Bookshelf");
+ gxml_node_append_child (GXML_NODE (doc), GXML_NODE (root));
+ owner = gxml_document_create_element (doc, "Owner");
+ // do attach owner
+ gxml_node_append_child (GXML_NODE (root), GXML_NODE (owner));
+
+ g_object_unref (owner);
+ g_object_unref (root);
+ g_object_unref (doc);
+
+ return 0;
+}
+
+
+
diff --git a/test/valgrind/small2b.c b/test/valgrind/small2b.c
new file mode 100644
index 0000000..df41670
--- /dev/null
+++ b/test/valgrind/small2b.c
@@ -0,0 +1,25 @@
+#include <glib.h>
+#include <glib-object.h>
+#include <gxml/gxml.h>
+
+/**
+ * In this one, we do NOT attach the owner node.
+ */
+int main () {
+ GXmlDocument* doc;
+ GXmlElement* root;
+ GXmlElement* owner;
+
+ doc = gxml_document_new ();
+ root = gxml_document_create_element (doc, "Bookshelf");
+ gxml_node_append_child (GXML_NODE (doc), GXML_NODE (root));
+ owner = gxml_document_create_element (doc, "Owner");
+ // don't attach owner
+
+ g_object_unref (owner);
+ g_object_unref (root);
+ g_object_unref (doc);
+
+ return 0;
+}
+
diff --git a/test/valgrind/unlink_unattached_nodes.c b/test/valgrind/unlink_unattached_nodes.c
new file mode 100644
index 0000000..4969eb8
--- /dev/null
+++ b/test/valgrind/unlink_unattached_nodes.c
@@ -0,0 +1,45 @@
+#include <glib.h>
+#include <glib-object.h>
+#include <gxml/gxml.h>
+
+/* This test creates some nodes that are not attached to the tree.
+ Run with valgrind --leak-check=full --show-reachable=yes to make
+ sure that they still get cleaned up.
+
+ (At present, doc calls free on the document, which gets rid of the
+ tree. I'm testing having an additional list of new nodes that were
+ created and are perhaps outside the tree. All the nodes below,
+ whether in the tree or not, will be in the new-nodes list which
+ we'll try to get rid of. The crux of the idea is using
+ xmlUnlinkNode in a separate xmlList. Let's see how this goes!);
+*/
+
+int main () {
+ GXmlDocument* doc;
+ GXmlElement* root;
+ GXmlElement* owner1;
+ GXmlElement* owner2;
+ GXmlElement* book;
+
+ doc = gxml_document_new ();
+
+ /* This node belongs to the doc and is attached to the tree */
+ root = gxml_document_create_element (doc, "Bookshelf");
+ gxml_node_append_child (GXML_NODE (doc), GXML_NODE (root));
+
+ /* owner1, owner2 belong to doc, but aren't part of the document tree */
+ owner1 = gxml_document_create_element (doc, "Owner1");
+ owner2 = gxml_document_create_element (doc, "Owner2");
+ /* book is outside the tree as well, but is a child of owner2 */
+ book = gxml_document_create_element (doc, "Book");
+ gxml_node_append_child (GXML_NODE (owner2), GXML_NODE (book));
+
+ g_object_unref (doc);
+ g_object_unref (root);
+ g_object_unref (owner1);
+ g_object_unref (owner2);
+ g_object_unref (book);
+
+ return 0;
+}
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]