[glib] glib/tests: fix leaks



commit 1a2c5e155deacb7ebeb8d0ca2c800a97a90a7ab9
Author: Dan Winship <danw gnome org>
Date:   Thu Aug 23 12:48:49 2012 -0400

    glib/tests: fix leaks
    
    https://bugzilla.gnome.org/show_bug.cgi?id=682560

 glib/tests/asyncqueue.c          |    4 +
 glib/tests/bookmarkfile.c        |    3 +-
 glib/tests/checksum.c            |   13 +-
 glib/tests/collate.c             |   15 +-
 glib/tests/cond.c                |    9 +
 glib/tests/convert.c             |    1 +
 glib/tests/dataset.c             |    2 +
 glib/tests/fileutils.c           |    2 +
 glib/tests/gwakeuptest.c         |    1 +
 glib/tests/mainloop.c            |   33 +-
 glib/tests/markup-parse.c        |    3 +-
 glib/tests/option-context.c      |    8 +-
 glib/tests/queue.c               |    6 +-
 glib/tests/regex.c               |  919 ++++++++++++++++++++------------------
 glib/tests/spawn-multithreaded.c |    7 +-
 glib/tests/spawn-singlethread.c  |    8 +-
 glib/tests/string.c              |    2 +
 glib/tests/timeout.c             |    6 +-
 glib/tests/unix.c                |    4 +-
 19 files changed, 574 insertions(+), 472 deletions(-)
---
diff --git a/glib/tests/asyncqueue.c b/glib/tests/asyncqueue.c
index 21b672f..fce411b 100644
--- a/glib/tests/asyncqueue.c
+++ b/glib/tests/asyncqueue.c
@@ -167,6 +167,8 @@ test_async_queue_threads (void)
 
   g_assert_cmpint (s, ==, total);
   g_assert_cmpint (c, ==, 1000);
+
+  g_async_queue_unref (q);
 }
 
 static void
@@ -201,6 +203,8 @@ test_async_queue_timed (void)
   diff = end - start;
   g_assert_cmpint (diff, >=, G_USEC_PER_SEC / 10);
   g_assert_cmpint (diff, <, G_USEC_PER_SEC);
+
+  g_async_queue_unref (q);
 }
 
 int
diff --git a/glib/tests/bookmarkfile.c b/glib/tests/bookmarkfile.c
index 9cd758b..3028298 100644
--- a/glib/tests/bookmarkfile.c
+++ b/glib/tests/bookmarkfile.c
@@ -287,7 +287,8 @@ main (int argc, char *argv[])
   while ((name = g_dir_read_name (dir)) != NULL)
     {
       path = g_strdup_printf ("/bookmarks/parse/%s", name);
-      g_test_add_data_func (path, g_build_filename (SRCDIR, "bookmarks", name, NULL), test_file);
+      g_test_add_data_func_full (path, g_build_filename (SRCDIR, "bookmarks", name, NULL),
+                                 test_file, g_free);
       g_free (path);
     }
   g_dir_close (dir);
diff --git a/glib/tests/checksum.c b/glib/tests/checksum.c
index d900b9a..3bf8164 100644
--- a/glib/tests/checksum.c
+++ b/glib/tests/checksum.c
@@ -752,15 +752,18 @@ add_checksum_test (GChecksumType  type,
 {
   ChecksumTest *test;
   gchar *path;
+
   test = g_new0 (ChecksumTest, 1);
   test->checksum_type = type;
   test->sum = sum;
   test->length = length;
+
   path = g_strdup_printf ("/checksum/%s/%d", type_name, length);
   g_test_add_data_func (path, test, test_checksum);
   g_free (path);
+
   path = g_strdup_printf ("/checksum/%s/reset/%d", type_name, length);
-  g_test_add_data_func (path, test, test_checksum_reset);
+  g_test_add_data_func_full (path, test, test_checksum_reset, g_free);
   g_free (path);
 }
 
@@ -771,11 +774,13 @@ add_checksum_string_test (GChecksumType   type,
 {
   ChecksumComputeTest *test;
   gchar *path;
+
   test = g_new0 (ChecksumComputeTest, 1);
   test->checksum_type = type;
   test->sums = sums;
+
   path = g_strdup_printf ("/checksum/%s/string", type_name);
-  g_test_add_data_func (path, test, test_checksum_string);
+  g_test_add_data_func_full (path, test, test_checksum_string, g_free);
   g_free (path);
 }
 
@@ -786,11 +791,13 @@ add_checksum_bytes_test (GChecksumType   type,
 {
   ChecksumComputeTest *test;
   gchar *path;
+
   test = g_new0 (ChecksumComputeTest, 1);
   test->checksum_type = type;
   test->sums = sums;
+
   path = g_strdup_printf ("/checksum/%s/bytes", type_name);
-  g_test_add_data_func (path, test, test_checksum_bytes);
+  g_test_add_data_func_full (path, test, test_checksum_bytes, g_free);
   g_free (path);
 }
 
diff --git a/glib/tests/collate.c b/glib/tests/collate.c
index 29a62ea..a99d1f9 100644
--- a/glib/tests/collate.c
+++ b/glib/tests/collate.c
@@ -10,10 +10,16 @@ typedef struct {
 } CollateTest;
 
 typedef struct {
-  const gchar *key;
+  gchar *key;
   const gchar *str;
 } Line;
 
+static void
+clear_line (Line *line)
+{
+  g_free (line->key);
+}
+
 static int
 compare_collate (const void *a, const void *b)
 {
@@ -35,10 +41,13 @@ compare_key (const void *a, const void *b)
 static void
 do_collate (gboolean for_file, gboolean use_key, const CollateTest *test)
 {
-  GArray *line_array = g_array_new (FALSE, FALSE, sizeof(Line));
+  GArray *line_array;
   Line line;
   gint i;
 
+  line_array = g_array_new (FALSE, FALSE, sizeof(Line));
+  g_array_set_clear_func (line_array, (GDestroyNotify)clear_line);
+
   for (i = 0; test->input[i]; i++)
     {
       line.str = test->input[i];
@@ -61,6 +70,8 @@ do_collate (gboolean for_file, gboolean use_key, const CollateTest *test)
       else
         g_assert_cmpstr (str, ==, test->sorted[i]);
     }
+
+  g_array_free (line_array, TRUE);
 }
 
 static void
diff --git a/glib/tests/cond.c b/glib/tests/cond.c
index 33a7676..4046ab0 100644
--- a/glib/tests/cond.c
+++ b/glib/tests/cond.c
@@ -170,6 +170,13 @@ barrier_wait (Barrier *barrier)
   return ret;
 }
 
+static void
+barrier_clear (Barrier *barrier)
+{
+  g_mutex_clear (&barrier->mutex);
+  g_cond_clear (&barrier->cond);
+}
+
 static Barrier b;
 static gint check;
 
@@ -220,6 +227,8 @@ test_cond2 (void)
     g_thread_join (threads[i]);
 
   g_assert_cmpint (g_atomic_int_get (&check), ==, 10);
+
+  barrier_clear (&b);
 }
 
 int
diff --git a/glib/tests/convert.c b/glib/tests/convert.c
index df87244..2742fa6 100644
--- a/glib/tests/convert.c
+++ b/glib/tests/convert.c
@@ -699,6 +699,7 @@ test_no_conv (void)
 
   /* error code is unreliable, since we mishandle errno there */
   g_assert (error && error->domain == G_CONVERT_ERROR);
+  g_error_free (error);
 }
 
 int
diff --git a/glib/tests/dataset.c b/glib/tests/dataset.c
index 75a77f7..fa57d84 100644
--- a/glib/tests/dataset.c
+++ b/glib/tests/dataset.c
@@ -125,6 +125,8 @@ test_dataset_foreach (void)
   g_dataset_set_data_full (location, "test3", "test3", notify);
   g_dataset_foreach (location, foreach, &my_count);
   g_assert (my_count == 3);
+
+  g_dataset_destroy (location);
 }
 
 static void
diff --git a/glib/tests/fileutils.c b/glib/tests/fileutils.c
index 3ab13f5..2a6d3fc 100644
--- a/glib/tests/fileutils.c
+++ b/glib/tests/fileutils.c
@@ -669,6 +669,7 @@ test_file_open_tmp (void)
   g_assert_no_error (error);
   g_assert (name != NULL);
   unlink (name);
+  g_free (name);
   close (fd);
 
   fd = g_file_open_tmp (NULL, &name, &error);
@@ -676,6 +677,7 @@ test_file_open_tmp (void)
   g_assert_no_error (error);
   g_assert (name != NULL);
   g_unlink (name);
+  g_free (name);
   close (fd);
 
   name = NULL;
diff --git a/glib/tests/gwakeuptest.c b/glib/tests/gwakeuptest.c
index a30a9f8..eaa10ca 100644
--- a/glib/tests/gwakeuptest.c
+++ b/glib/tests/gwakeuptest.c
@@ -107,6 +107,7 @@ context_clear (struct context *ctx)
   g_assert (ctx->pending_tokens == NULL);
   g_assert (ctx->quit);
 
+  g_mutex_clear (&ctx->lock);
   g_wakeup_free (ctx->wakeup);
 }
 
diff --git a/glib/tests/mainloop.c b/glib/tests/mainloop.c
index 31bf72f..3b78c65 100644
--- a/glib/tests/mainloop.c
+++ b/glib/tests/mainloop.c
@@ -247,6 +247,16 @@ test_priorities (void)
   g_main_context_unref (ctx);
 }
 
+static gboolean
+quit_loop (gpointer data)
+{
+  GMainLoop *loop = data;
+
+  g_main_loop_quit (loop);
+
+  return G_SOURCE_REMOVE;
+}
+
 static gint count;
 
 static gboolean
@@ -276,9 +286,11 @@ static gpointer
 thread_func (gpointer data)
 {
   GMainContext *ctx = data;
+  GMainLoop *loop;
   GSource *source;
 
   g_main_context_push_thread_default (ctx);
+  loop = g_main_loop_new (ctx, FALSE);
 
   g_mutex_lock (&mutex);
   thread_ready = TRUE;
@@ -286,12 +298,14 @@ thread_func (gpointer data)
   g_mutex_unlock (&mutex);
 
   source = g_timeout_source_new (500);
-  g_source_set_callback (source, (GSourceFunc)g_thread_exit, NULL, NULL);
+  g_source_set_callback (source, quit_loop, loop, NULL);
   g_source_attach (source, ctx);
   g_source_unref (source);
 
-  while (TRUE)
-    g_main_context_iteration (ctx, TRUE);
+  g_main_loop_run (loop);
+
+  g_main_context_pop_thread_default (ctx);
+  g_main_loop_unref (loop);
 
   return NULL;
 }
@@ -328,16 +342,8 @@ test_invoke (void)
 
   g_thread_join (thread);
   g_assert_cmpint (count, ==, 3);
-}
-
-static gboolean
-quit_loop (gpointer data)
-{
-  GMainLoop *loop = data;
-
-  g_main_loop_quit (loop);
 
-  return G_SOURCE_REMOVE;
+  g_main_context_unref (ctx);
 }
 
 static gboolean
@@ -353,6 +359,7 @@ run_inner_loop (gpointer user_data)
   timeout = g_timeout_source_new (100);
   g_source_set_callback (timeout, quit_loop, inner, NULL);
   g_source_attach (timeout, ctx);
+  g_source_unref (timeout);
 
   g_main_loop_run (inner);
   g_main_loop_unref (inner);
@@ -429,6 +436,7 @@ test_child_sources (void)
   g_assert_cmpint (b, ==, 3);
   g_assert_cmpint (c, ==, 3);
 
+  g_source_destroy (parent);
   g_source_unref (parent);
   g_source_unref (child_b);
   g_source_unref (child_c);
@@ -485,6 +493,7 @@ test_recursive_child_sources (void)
   g_assert_cmpint (b, ==, 9);
   g_assert_cmpint (c, ==, 4);
 
+  g_source_destroy (parent);
   g_source_unref (parent);
   g_source_unref (child_b);
   g_source_unref (child_c);
diff --git a/glib/tests/markup-parse.c b/glib/tests/markup-parse.c
index 5adc272..4c7445e 100644
--- a/glib/tests/markup-parse.c
+++ b/glib/tests/markup-parse.c
@@ -304,7 +304,8 @@ main (int argc, char *argv[])
         continue;
 
       path = g_strdup_printf ("/markup/parse/%s", name);
-      g_test_add_data_func (path, g_build_filename (SRCDIR, "markups", name, NULL),  test_parse);
+      g_test_add_data_func_full (path, g_build_filename (SRCDIR, "markups", name, NULL),
+                                 test_parse, g_free);
       g_free (path);
     }
   g_dir_close (dir);
diff --git a/glib/tests/option-context.c b/glib/tests/option-context.c
index da511ad..433b7dc 100644
--- a/glib/tests/option-context.c
+++ b/glib/tests/option-context.c
@@ -2119,7 +2119,7 @@ test_group_parse (void)
     { "faz", 'z', 0, G_OPTION_ARG_STRING, &arg5, NULL, NULL },
     { NULL }
   };
-  gchar **argv;
+  gchar **argv, **orig_argv;
   gint argc;
   GError *error = NULL;
   gboolean retval;
@@ -2131,7 +2131,10 @@ test_group_parse (void)
   g_option_context_add_group (context, group);
 
   argv = split_string ("program --test arg1 -f arg2 --group-test arg3 --frob arg4 -z arg5", &argc);
+  orig_argv = g_memdup (argv, (argc + 1) * sizeof (char *));
+
   retval = g_option_context_parse (context, &argc, &argv, &error);
+
   g_assert_no_error (error);
   g_assert (retval);
   g_assert_cmpstr (arg1, ==, "arg1");
@@ -2145,6 +2148,9 @@ test_group_parse (void)
   g_free (arg3);
   g_free (arg4);
   g_free (arg5);
+
+  g_free (argv);
+  g_strfreev (orig_argv);
   g_option_context_free (context);
 }
 
diff --git a/glib/tests/queue.c b/glib/tests/queue.c
index e2593a4..f7c7276 100644
--- a/glib/tests/queue.c
+++ b/glib/tests/queue.c
@@ -498,8 +498,9 @@ random_test (gconstpointer d)
         case REMOVE:
           if (!g_queue_is_empty (q))
             g_queue_remove (q, qinf->tail->data);
+          /* qinf->head/qinf->tail may be invalid at this point */
           if (!g_queue_is_empty (q))
-            g_queue_remove (q, qinf->head->data);
+            g_queue_remove (q, q->head->data);
           if (!g_queue_is_empty (q))
             g_queue_remove (q, g_queue_peek_nth (q, get_random_position (q, TRUE)));
 
@@ -510,8 +511,9 @@ random_test (gconstpointer d)
         case REMOVE_ALL:
           if (!g_queue_is_empty (q))
             g_queue_remove_all (q, qinf->tail->data);
+          /* qinf->head/qinf->tail may be invalid at this point */
           if (!g_queue_is_empty (q))
-            g_queue_remove_all (q, qinf->head->data);
+            g_queue_remove_all (q, q->head->data);
           if (!g_queue_is_empty (q))
             g_queue_remove_all (q, g_queue_peek_nth (q, get_random_position (q, TRUE)));
 
diff --git a/glib/tests/regex.c b/glib/tests/regex.c
index 6a999cf..f205bf2 100644
--- a/glib/tests/regex.c
+++ b/glib/tests/regex.c
@@ -82,34 +82,34 @@ test_new (gconstpointer d)
   g_regex_unref (regex);
 }
 
-#define TEST_NEW(_pattern, _compile_opts, _match_opts) {   \
-  TestNewData *data;                                    \
-  gchar *path;                                          \
-  data = g_new0 (TestNewData, 1);                       \
-  data->pattern = _pattern;                              \
-  data->compile_opts = _compile_opts;                    \
-  data->match_opts = _match_opts;                        \
-  data->expected_error = 0;                             \
-  data->check_flags = FALSE;                            \
-  path = g_strdup_printf ("/regex/new/%d", ++total);    \
-  g_test_add_data_func (path, data, test_new);          \
-  g_free (path);                                        \
+#define TEST_NEW(_pattern, _compile_opts, _match_opts) {    \
+  TestNewData *data;                                        \
+  gchar *path;                                              \
+  data = g_new0 (TestNewData, 1);                           \
+  data->pattern = _pattern;                                 \
+  data->compile_opts = _compile_opts;                       \
+  data->match_opts = _match_opts;                           \
+  data->expected_error = 0;                                 \
+  data->check_flags = FALSE;                                \
+  path = g_strdup_printf ("/regex/new/%d", ++total);        \
+  g_test_add_data_func_full (path, data, test_new, g_free); \
+  g_free (path);                                            \
 }
 
 #define TEST_NEW_CHECK_FLAGS(_pattern, _compile_opts, _match_opts, _real_compile_opts, _real_match_opts) { \
-  TestNewData *data; \
-  gchar *path; \
-  data = g_new0 (TestNewData, 1); \
-  data->pattern = _pattern; \
-  data->compile_opts = _compile_opts; \
-  data->match_opts = 0; \
-  data->expected_error = 0; \
-  data->check_flags = TRUE; \
-  data->real_compile_opts = _real_compile_opts; \
-  data->real_match_opts = _real_match_opts; \
+  TestNewData *data;                                             \
+  gchar *path;                                                   \
+  data = g_new0 (TestNewData, 1);                                \
+  data->pattern = _pattern;                                      \
+  data->compile_opts = _compile_opts;                            \
+  data->match_opts = 0;                                          \
+  data->expected_error = 0;                                      \
+  data->check_flags = TRUE;                                      \
+  data->real_compile_opts = _real_compile_opts;                  \
+  data->real_match_opts = _real_match_opts;                      \
   path = g_strdup_printf ("/regex/new-check-flags/%d", ++total); \
-  g_test_add_data_func (path, data, test_new); \
-  g_free (path); \
+  g_test_add_data_func_full (path, data, test_new, g_free);      \
+  g_free (path);                                                 \
 }
 
 static void
@@ -126,17 +126,17 @@ test_new_fail (gconstpointer d)
   g_error_free (error);
 }
 
-#define TEST_NEW_FAIL(_pattern, _compile_opts, _expected_error) {  \
-  TestNewData *data;                                            \
-  gchar *path;                                                  \
-  data = g_new0 (TestNewData, 1);                               \
-  data->pattern = _pattern;                                      \
-  data->compile_opts = _compile_opts;                            \
-  data->match_opts = 0;                                         \
-  data->expected_error = _expected_error;                        \
-  path = g_strdup_printf ("/regex/new-fail/%d", ++total);       \
-  g_test_add_data_func (path, data, test_new_fail);             \
-  g_free (path);                                                \
+#define TEST_NEW_FAIL(_pattern, _compile_opts, _expected_error) { \
+  TestNewData *data;                                              \
+  gchar *path;                                                    \
+  data = g_new0 (TestNewData, 1);                                 \
+  data->pattern = _pattern;                                       \
+  data->compile_opts = _compile_opts;                             \
+  data->match_opts = 0;                                           \
+  data->expected_error = _expected_error;                         \
+  path = g_strdup_printf ("/regex/new-fail/%d", ++total);         \
+  g_test_add_data_func_full (path, data, test_new_fail, g_free);  \
+  g_free (path);                                                  \
 }
 
 typedef struct {
@@ -164,13 +164,13 @@ test_match_simple (gconstpointer d)
   TestMatchData *data;                                                  \
   gchar *path;                                                          \
   data = g_new0 (TestMatchData, 1);                                     \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->compile_opts = _compile_opts;                                    \
-  data->match_opts = _match_opts;                                        \
-  data->expected = _expected;                                            \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->compile_opts = _compile_opts;                                   \
+  data->match_opts = _match_opts;                                       \
+  data->expected = _expected;                                           \
   path = g_strdup_printf ("/regex/match-%s/%d", _name, ++total);        \
-  g_test_add_data_func (path, data, test_match_simple);                 \
+  g_test_add_data_func_full (path, data, test_match_simple, g_free);    \
   g_free (path);                                                        \
 }
 
@@ -212,16 +212,16 @@ test_match (gconstpointer d)
   TestMatchData *data;                                                  \
   gchar *path;                                                          \
   data = g_new0 (TestMatchData, 1);                                     \
-  data->pattern = _pattern;                                              \
-  data->compile_opts = _compile_opts;                                    \
-  data->match_opts = _match_opts;                                        \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
-  data->match_opts2 = _match_opts2;                                      \
-  data->expected = _expected;                                            \
+  data->pattern = _pattern;                                             \
+  data->compile_opts = _compile_opts;                                   \
+  data->match_opts = _match_opts;                                       \
+  data->string = _string;                                               \
+  data->string_len = _string_len;                                       \
+  data->start_position = _start_position;                               \
+  data->match_opts2 = _match_opts2;                                     \
+  data->expected = _expected;                                           \
   path = g_strdup_printf ("/regex/match/%d", ++total);                  \
-  g_test_add_data_func (path, data, test_match);                        \
+  g_test_add_data_func_full (path, data, test_match, g_free);           \
   g_free (path);                                                        \
 }
 
@@ -302,17 +302,26 @@ test_match_next (gconstpointer d)
   g_slist_free_full (matches, free_match);
 }
 
+static void
+free_match_next_data (gpointer _data)
+{
+  TestMatchNextData *data = _data;
+
+  g_slist_free_full (data->expected, g_free);
+  g_free (data);
+}
+
 #define TEST_MATCH_NEXT0(_pattern, _string, _string_len, _start_position) { \
   TestMatchNextData *data;                                              \
   gchar *path;                                                          \
   data = g_new0 (TestMatchNextData, 1);                                 \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->string_len = _string_len;                                       \
+  data->start_position = _start_position;                               \
   data->expected = NULL;                                                \
   path = g_strdup_printf ("/regex/match/next0/%d", ++total);            \
-  g_test_add_data_func (path, data, test_match_next);                   \
+  g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \
   g_free (path);                                                        \
 }
 
@@ -322,17 +331,17 @@ test_match_next (gconstpointer d)
   Match *match;                                                         \
   gchar *path;                                                          \
   data = g_new0 (TestMatchNextData, 1);                                 \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->string_len = _string_len;                                       \
+  data->start_position = _start_position;                               \
   match = g_new0 (Match, 1);                                            \
   match->string = t1;                                                   \
   match->start = s1;                                                    \
   match->end = e1;                                                      \
   data->expected = g_slist_append (NULL, match);                        \
   path = g_strdup_printf ("/regex/match/next1/%d", ++total);            \
-  g_test_add_data_func (path, data, test_match_next);                   \
+  g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \
   g_free (path);                                                        \
 }
 
@@ -342,10 +351,10 @@ test_match_next (gconstpointer d)
   Match *match;                                                         \
   gchar *path;                                                          \
   data = g_new0 (TestMatchNextData, 1);                                 \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->string_len = _string_len;                                       \
+  data->start_position = _start_position;                               \
   match = g_new0 (Match, 1);                                            \
   match->string = t1;                                                   \
   match->start = s1;                                                    \
@@ -357,7 +366,7 @@ test_match_next (gconstpointer d)
   match->end = e2;                                                      \
   data->expected = g_slist_append (data->expected, match);              \
   path = g_strdup_printf ("/regex/match/next2/%d", ++total);            \
-  g_test_add_data_func (path, data, test_match_next);                   \
+  g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \
   g_free (path);                                                        \
 }
 
@@ -367,10 +376,10 @@ test_match_next (gconstpointer d)
   Match *match;                                                         \
   gchar *path;                                                          \
   data = g_new0 (TestMatchNextData, 1);                                 \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->string_len = _string_len;                                       \
+  data->start_position = _start_position;                               \
   match = g_new0 (Match, 1);                                            \
   match->string = t1;                                                   \
   match->start = s1;                                                    \
@@ -387,7 +396,7 @@ test_match_next (gconstpointer d)
   match->end = e3;                                                      \
   data->expected = g_slist_append (data->expected, match);              \
   path = g_strdup_printf ("/regex/match/next3/%d", ++total);            \
-  g_test_add_data_func (path, data, test_match_next);                   \
+  g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \
   g_free (path);                                                        \
 }
 
@@ -397,10 +406,10 @@ test_match_next (gconstpointer d)
   Match *match;                                                         \
   gchar *path;                                                          \
   data = g_new0 (TestMatchNextData, 1);                                 \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->string_len = _string_len;                                       \
+  data->start_position = _start_position;                               \
   match = g_new0 (Match, 1);                                            \
   match->string = t1;                                                   \
   match->start = s1;                                                    \
@@ -422,7 +431,7 @@ test_match_next (gconstpointer d)
   match->end = e4;                                                      \
   data->expected = g_slist_append (data->expected, match);              \
   path = g_strdup_printf ("/regex/match/next4/%d", ++total);            \
-  g_test_add_data_func (path, data, test_match_next);                   \
+  g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \
   g_free (path);                                                        \
 }
 
@@ -462,13 +471,13 @@ test_match_count (gconstpointer d)
   TestMatchCountData *data;                                             \
   gchar *path;                                                          \
   data = g_new0 (TestMatchCountData, 1);                                \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->start_position = _start_position;                                \
-  data->match_opts = _match_opts;                                        \
-  data->expected_count = _expected_count;                                \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->start_position = _start_position;                               \
+  data->match_opts = _match_opts;                                       \
+  data->expected_count = _expected_count;                               \
   path = g_strdup_printf ("/regex/match/count/%d", ++total);            \
-  g_test_add_data_func (path, data, test_match_count);                 \
+  g_test_add_data_func_full (path, data, test_match_count, g_free);     \
   g_free (path);                                                        \
 }
 
@@ -501,12 +510,12 @@ test_partial (gconstpointer d)
   TestMatchData *data;                                          \
   gchar *path;                                                  \
   data = g_new0 (TestMatchData, 1);                             \
-  data->pattern = _pattern;                                      \
-  data->string = _string;                                        \
-  data->match_opts = _match_opts;                                \
-  data->expected = _expected;                                    \
+  data->pattern = _pattern;                                     \
+  data->string = _string;                                       \
+  data->match_opts = _match_opts;                               \
+  data->expected = _expected;                                   \
   path = g_strdup_printf ("/regex/match/partial/%d", ++total);  \
-  g_test_add_data_func (path, data, test_partial);              \
+  g_test_add_data_func_full (path, data, test_partial, g_free); \
   g_free (path);                                                \
 }
 
@@ -554,15 +563,15 @@ test_sub_pattern (gconstpointer d)
   TestSubData *data;                                                    \
   gchar *path;                                                          \
   data = g_new0 (TestSubData, 1);                                       \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->start_position = _start_position;                                \
-  data->sub_n = _sub_n;                                                  \
-  data->expected_sub = _expected_sub;                                    \
-  data->expected_start = _expected_start;                                \
-  data->expected_end = _expected_end;                                    \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->start_position = _start_position;                               \
+  data->sub_n = _sub_n;                                                 \
+  data->expected_sub = _expected_sub;                                   \
+  data->expected_start = _expected_start;                               \
+  data->expected_end = _expected_end;                                   \
   path = g_strdup_printf ("/regex/match/subpattern/%d", ++total);       \
-  g_test_add_data_func (path, data, test_sub_pattern);                  \
+  g_test_add_data_func_full (path, data, test_sub_pattern, g_free);     \
   g_free (path);                                                        \
 }
 
@@ -605,38 +614,38 @@ test_named_sub_pattern (gconstpointer d)
 
 #define TEST_NAMED_SUB_PATTERN(_pattern, _string, _start_position, _sub_name, \
 			       _expected_sub, _expected_start, _expected_end) { \
-  TestNamedSubData *data;                                               \
-  gchar *path;                                                          \
-  data = g_new0 (TestNamedSubData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->flags = 0;                                                      \
-  data->start_position = _start_position;                                \
-  data->sub_name = _sub_name;                                            \
-  data->expected_sub = _expected_sub;                                    \
-  data->expected_start = _expected_start;                                \
-  data->expected_end = _expected_end;                                    \
-  path = g_strdup_printf ("/regex/match/named/subpattern/%d", ++total); \
-  g_test_add_data_func (path, data, test_named_sub_pattern);            \
-  g_free (path);                                                        \
+  TestNamedSubData *data;                                                 \
+  gchar *path;                                                            \
+  data = g_new0 (TestNamedSubData, 1);                                    \
+  data->pattern = _pattern;                                               \
+  data->string = _string;                                                 \
+  data->flags = 0;                                                        \
+  data->start_position = _start_position;                                 \
+  data->sub_name = _sub_name;                                             \
+  data->expected_sub = _expected_sub;                                     \
+  data->expected_start = _expected_start;                                 \
+  data->expected_end = _expected_end;                                     \
+  path = g_strdup_printf ("/regex/match/named/subpattern/%d", ++total);   \
+  g_test_add_data_func_full (path, data, test_named_sub_pattern, g_free); \
+  g_free (path);                                                          \
 }
 
 #define TEST_NAMED_SUB_PATTERN_DUPNAMES(_pattern, _string, _start_position, _sub_name, \
                                         _expected_sub, _expected_start, _expected_end) { \
-  TestNamedSubData *data;                                               \
-  gchar *path;                                                          \
-  data = g_new0 (TestNamedSubData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->flags = G_REGEX_DUPNAMES;                                       \
-  data->start_position = _start_position;                                \
-  data->sub_name = _sub_name;                                            \
-  data->expected_sub = _expected_sub;                                    \
-  data->expected_start = _expected_start;                                \
-  data->expected_end = _expected_end;                                    \
+  TestNamedSubData *data;                                                        \
+  gchar *path;                                                                   \
+  data = g_new0 (TestNamedSubData, 1);                                           \
+  data->pattern = _pattern;                                                      \
+  data->string = _string;                                                        \
+  data->flags = G_REGEX_DUPNAMES;                                                \
+  data->start_position = _start_position;                                        \
+  data->sub_name = _sub_name;                                                    \
+  data->expected_sub = _expected_sub;                                            \
+  data->expected_start = _expected_start;                                        \
+  data->expected_end = _expected_end;                                            \
   path = g_strdup_printf ("/regex/match/subpattern/named/dupnames/%d", ++total); \
-  g_test_add_data_func (path, data, test_named_sub_pattern);            \
-  g_free (path);                                                        \
+  g_test_add_data_func_full (path, data, test_named_sub_pattern, g_free);        \
+  g_free (path);                                                                 \
 }
 
 typedef struct {
@@ -682,55 +691,64 @@ test_fetch_all (gconstpointer d)
   g_strfreev (matches);
 }
 
-#define TEST_FETCH_ALL0(_pattern, _string) {                      \
-  TestFetchAllData *data;                                       \
-  gchar *path;                                                  \
-  data = g_new0 (TestFetchAllData, 1);                          \
-  data->pattern = _pattern;                                      \
-  data->string = _string;                                        \
-  data->expected = NULL;                                        \
-  path = g_strdup_printf ("/regex/fetch-all0/%d", ++total);     \
-  g_test_add_data_func (path, data, test_fetch_all);            \
-  g_free (path);                                                \
-}
-
-#define TEST_FETCH_ALL1(_pattern, _string, e1) {                  \
-  TestFetchAllData *data;                                       \
-  gchar *path;                                                  \
-  data = g_new0 (TestFetchAllData, 1);                          \
-  data->pattern = _pattern;                                      \
-  data->string = _string;                                        \
-  data->expected = g_slist_append (NULL, e1);                   \
-  path = g_strdup_printf ("/regex/fetch-all1/%d", ++total);     \
-  g_test_add_data_func (path, data, test_fetch_all);            \
-  g_free (path);                                                \
-}
-
-#define TEST_FETCH_ALL2(_pattern, _string, e1, e2) {              \
-  TestFetchAllData *data;                                       \
-  gchar *path;                                                  \
-  data = g_new0 (TestFetchAllData, 1);                          \
-  data->pattern = _pattern;                                      \
-  data->string = _string;                                        \
-  data->expected = g_slist_append (NULL, e1);                   \
-  data->expected = g_slist_append (data->expected, e2);         \
-  path = g_strdup_printf ("/regex/fetch-all2/%d", ++total);     \
-  g_test_add_data_func (path, data, test_fetch_all);            \
-  g_free (path);                                                \
-}
-
-#define TEST_FETCH_ALL3(_pattern, _string, e1, e2, e3) {          \
-  TestFetchAllData *data;                                       \
-  gchar *path;                                                  \
-  data = g_new0 (TestFetchAllData, 1);                          \
-  data->pattern = _pattern;                                      \
-  data->string = _string;                                        \
-  data->expected = g_slist_append (NULL, e1);                   \
-  data->expected = g_slist_append (data->expected, e2);         \
-  data->expected = g_slist_append (data->expected, e3);         \
-  path = g_strdup_printf ("/regex/fetch-all3/%d", ++total);     \
-  g_test_add_data_func (path, data, test_fetch_all);            \
-  g_free (path);                                                \
+static void
+free_fetch_all_data (gpointer _data)
+{
+  TestFetchAllData *data = _data;
+
+  g_slist_free (data->expected);
+  g_free (data);
+}
+
+#define TEST_FETCH_ALL0(_pattern, _string) {                                   \
+  TestFetchAllData *data;                                                      \
+  gchar *path;                                                                 \
+  data = g_new0 (TestFetchAllData, 1);                                         \
+  data->pattern = _pattern;                                                    \
+  data->string = _string;                                                      \
+  data->expected = NULL;                                                       \
+  path = g_strdup_printf ("/regex/fetch-all0/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_fetch_all, free_fetch_all_data); \
+  g_free (path);                                                               \
+}
+
+#define TEST_FETCH_ALL1(_pattern, _string, e1) {                               \
+  TestFetchAllData *data;                                                      \
+  gchar *path;                                                                 \
+  data = g_new0 (TestFetchAllData, 1);                                         \
+  data->pattern = _pattern;                                                    \
+  data->string = _string;                                                      \
+  data->expected = g_slist_append (NULL, e1);                                  \
+  path = g_strdup_printf ("/regex/fetch-all1/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_fetch_all, free_fetch_all_data); \
+  g_free (path);                                                               \
+}
+
+#define TEST_FETCH_ALL2(_pattern, _string, e1, e2) {                           \
+  TestFetchAllData *data;                                                      \
+  gchar *path;                                                                 \
+  data = g_new0 (TestFetchAllData, 1);                                         \
+  data->pattern = _pattern;                                                    \
+  data->string = _string;                                                      \
+  data->expected = g_slist_append (NULL, e1);                                  \
+  data->expected = g_slist_append (data->expected, e2);                        \
+  path = g_strdup_printf ("/regex/fetch-all2/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_fetch_all, free_fetch_all_data); \
+  g_free (path);                                                               \
+}
+
+#define TEST_FETCH_ALL3(_pattern, _string, e1, e2, e3) {                       \
+  TestFetchAllData *data;                                                      \
+  gchar *path;                                                                 \
+  data = g_new0 (TestFetchAllData, 1);                                         \
+  data->pattern = _pattern;                                                    \
+  data->string = _string;                                                      \
+  data->expected = g_slist_append (NULL, e1);                                  \
+  data->expected = g_slist_append (data->expected, e2);                        \
+  data->expected = g_slist_append (data->expected, e3);                        \
+  path = g_strdup_printf ("/regex/fetch-all3/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_fetch_all, free_fetch_all_data); \
+  g_free (path);                                                               \
 }
 
 static void
@@ -759,55 +777,55 @@ test_split_simple (gconstpointer d)
   g_strfreev (tokens);
 }
 
-#define TEST_SPLIT_SIMPLE0(_pattern, _string) {                   \
-  TestFetchAllData *data;                                       \
-  gchar *path;                                                  \
-  data = g_new0 (TestFetchAllData, 1);                          \
-  data->pattern = _pattern;                                      \
-  data->string = _string;                                        \
-  data->expected = NULL;                                        \
-  path = g_strdup_printf ("/regex/split/simple0/%d", ++total);  \
-  g_test_add_data_func (path, data, test_split_simple);         \
-  g_free (path);                                                \
-}
-
-#define TEST_SPLIT_SIMPLE1(_pattern, _string, e1) {               \
-  TestFetchAllData *data;                                       \
-  gchar *path;                                                  \
-  data = g_new0 (TestFetchAllData, 1);                          \
-  data->pattern = _pattern;                                      \
-  data->string = _string;                                        \
-  data->expected = g_slist_append (NULL, e1);                   \
-  path = g_strdup_printf ("/regex/split/simple1/%d", ++total);  \
-  g_test_add_data_func (path, data, test_split_simple);         \
-  g_free (path);                                                \
-}
-
-#define TEST_SPLIT_SIMPLE2(_pattern, _string, e1, e2) {           \
-  TestFetchAllData *data;                                       \
-  gchar *path;                                                  \
-  data = g_new0 (TestFetchAllData, 1);                          \
-  data->pattern = _pattern;                                      \
-  data->string = _string;                                        \
-  data->expected = g_slist_append (NULL, e1);                   \
-  data->expected = g_slist_append (data->expected, e2);         \
-  path = g_strdup_printf ("/regex/split/simple2/%d", ++total);  \
-  g_test_add_data_func (path, data, test_split_simple);         \
-  g_free (path);                                                \
-}
-
-#define TEST_SPLIT_SIMPLE3(_pattern, _string, e1, e2, e3) {       \
-  TestFetchAllData *data;                                       \
-  gchar *path;                                                  \
-  data = g_new0 (TestFetchAllData, 1);                          \
-  data->pattern = _pattern;                                      \
-  data->string = _string;                                        \
-  data->expected = g_slist_append (NULL, e1);                   \
-  data->expected = g_slist_append (data->expected, e2);         \
-  data->expected = g_slist_append (data->expected, e3);         \
-  path = g_strdup_printf ("/regex/split/simple3/%d", ++total);  \
-  g_test_add_data_func (path, data, test_split_simple);         \
-  g_free (path);                                                \
+#define TEST_SPLIT_SIMPLE0(_pattern, _string) {                                   \
+  TestFetchAllData *data;                                                         \
+  gchar *path;                                                                    \
+  data = g_new0 (TestFetchAllData, 1);                                            \
+  data->pattern = _pattern;                                                       \
+  data->string = _string;                                                         \
+  data->expected = NULL;                                                          \
+  path = g_strdup_printf ("/regex/split/simple0/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_split_simple, free_fetch_all_data); \
+  g_free (path);                                                                  \
+}
+
+#define TEST_SPLIT_SIMPLE1(_pattern, _string, e1) {                               \
+  TestFetchAllData *data;                                                         \
+  gchar *path;                                                                    \
+  data = g_new0 (TestFetchAllData, 1);                                            \
+  data->pattern = _pattern;                                                       \
+  data->string = _string;                                                         \
+  data->expected = g_slist_append (NULL, e1);                                     \
+  path = g_strdup_printf ("/regex/split/simple1/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_split_simple, free_fetch_all_data); \
+  g_free (path);                                                                  \
+}
+
+#define TEST_SPLIT_SIMPLE2(_pattern, _string, e1, e2) {                           \
+  TestFetchAllData *data;                                                         \
+  gchar *path;                                                                    \
+  data = g_new0 (TestFetchAllData, 1);                                            \
+  data->pattern = _pattern;                                                       \
+  data->string = _string;                                                         \
+  data->expected = g_slist_append (NULL, e1);                                     \
+  data->expected = g_slist_append (data->expected, e2);                           \
+  path = g_strdup_printf ("/regex/split/simple2/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_split_simple, free_fetch_all_data); \
+  g_free (path);                                                                  \
+}
+
+#define TEST_SPLIT_SIMPLE3(_pattern, _string, e1, e2, e3) {                       \
+  TestFetchAllData *data;                                                         \
+  gchar *path;                                                                    \
+  data = g_new0 (TestFetchAllData, 1);                                            \
+  data->pattern = _pattern;                                                       \
+  data->string = _string;                                                         \
+  data->expected = g_slist_append (NULL, e1);                                     \
+  data->expected = g_slist_append (data->expected, e2);                           \
+  data->expected = g_slist_append (data->expected, e3);                           \
+  path = g_strdup_printf ("/regex/split/simple3/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_split_simple, free_fetch_all_data); \
+  g_free (path);                                                                  \
 }
 
 static void
@@ -875,86 +893,86 @@ test_split (gconstpointer d)
   g_strfreev (tokens);
 }
 
-#define TEST_SPLIT0(_pattern, _string, _start_position, _max_tokens) {      \
-  TestFetchAllData *data;                                               \
-  gchar *path;                                                          \
-  data = g_new0 (TestFetchAllData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->start_position = _start_position;                                \
-  data->max_tokens = _max_tokens;                                        \
-  data->expected = NULL;                                                \
-  path = g_strdup_printf ("/regex/full-split0/%d", ++total);            \
-  g_test_add_data_func (path, data, test_split_full);                   \
-  g_free (path);                                                        \
-  if (_start_position == 0 && _max_tokens <= 0) {                         \
-    path = g_strdup_printf ("/regex/split0/%d", ++total);               \
-    g_test_add_data_func (path, data, test_split);                      \
-    g_free (path);                                                      \
-  }                                                                     \
-}
-
-#define TEST_SPLIT1(_pattern, _string, _start_position, _max_tokens, e1) { \
-  TestFetchAllData *data;                                               \
-  gchar *path;                                                          \
-  data = g_new0 (TestFetchAllData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->start_position = _start_position;                                \
-  data->max_tokens = _max_tokens;                                        \
-  data->expected = NULL;                                                \
-  data->expected = g_slist_append (data->expected, e1);                 \
-  path = g_strdup_printf ("/regex/full-split1/%d", ++total);            \
-  g_test_add_data_func (path, data, test_split_full);                   \
-  g_free (path);                                                        \
-  if (_start_position == 0 && _max_tokens <= 0) {                         \
-    path = g_strdup_printf ("/regex/split1/%d", ++total);               \
-    g_test_add_data_func (path, data, test_split);                      \
-    g_free (path);                                                      \
-  }                                                                     \
-}
-
-#define TEST_SPLIT2(_pattern, _string, _start_position, _max_tokens, e1, e2) { \
-  TestFetchAllData *data;                                               \
-  gchar *path;                                                          \
-  data = g_new0 (TestFetchAllData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->start_position = _start_position;                                \
-  data->max_tokens = _max_tokens;                                        \
-  data->expected = NULL;                                                \
-  data->expected = g_slist_append (data->expected, e1);                 \
-  data->expected = g_slist_append (data->expected, e2);                 \
-  path = g_strdup_printf ("/regex/full-split2/%d", ++total);            \
-  g_test_add_data_func (path, data, test_split_full);                   \
-  g_free (path);                                                        \
-  if (_start_position == 0 && _max_tokens <= 0) {                         \
-    path = g_strdup_printf ("/regex/split2/%d", ++total);               \
-    g_test_add_data_func (path, data, test_split);                      \
-    g_free (path);                                                      \
-  }                                                                     \
+#define TEST_SPLIT0(_pattern, _string, _start_position, _max_tokens) {          \
+  TestFetchAllData *data;                                                       \
+  gchar *path;                                                                  \
+  data = g_new0 (TestFetchAllData, 1);                                          \
+  data->pattern = _pattern;                                                     \
+  data->string = _string;                                                       \
+  data->start_position = _start_position;                                       \
+  data->max_tokens = _max_tokens;                                               \
+  data->expected = NULL;                                                        \
+  if (_start_position == 0 && _max_tokens <= 0) {                               \
+    path = g_strdup_printf ("/regex/split0/%d", ++total);                       \
+    g_test_add_data_func (path, data, test_split);                              \
+    g_free (path);                                                              \
+  }                                                                             \
+  path = g_strdup_printf ("/regex/full-split0/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_split_full, free_fetch_all_data); \
+  g_free (path);                                                                \
+}
+
+#define TEST_SPLIT1(_pattern, _string, _start_position, _max_tokens, e1) {      \
+  TestFetchAllData *data;                                                       \
+  gchar *path;                                                                  \
+  data = g_new0 (TestFetchAllData, 1);                                          \
+  data->pattern = _pattern;                                                     \
+  data->string = _string;                                                       \
+  data->start_position = _start_position;                                       \
+  data->max_tokens = _max_tokens;                                               \
+  data->expected = NULL;                                                        \
+  data->expected = g_slist_append (data->expected, e1);                         \
+  if (_start_position == 0 && _max_tokens <= 0) {                               \
+    path = g_strdup_printf ("/regex/split1/%d", ++total);                       \
+    g_test_add_data_func (path, data, test_split);                              \
+    g_free (path);                                                              \
+  }                                                                             \
+  path = g_strdup_printf ("/regex/full-split1/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_split_full, free_fetch_all_data); \
+  g_free (path);                                                                \
+}
+
+#define TEST_SPLIT2(_pattern, _string, _start_position, _max_tokens, e1, e2) {  \
+  TestFetchAllData *data;                                                       \
+  gchar *path;                                                                  \
+  data = g_new0 (TestFetchAllData, 1);                                          \
+  data->pattern = _pattern;                                                     \
+  data->string = _string;                                                       \
+  data->start_position = _start_position;                                       \
+  data->max_tokens = _max_tokens;                                               \
+  data->expected = NULL;                                                        \
+  data->expected = g_slist_append (data->expected, e1);                         \
+  data->expected = g_slist_append (data->expected, e2);                         \
+  if (_start_position == 0 && _max_tokens <= 0) {                               \
+    path = g_strdup_printf ("/regex/split2/%d", ++total);                       \
+    g_test_add_data_func (path, data, test_split);                              \
+    g_free (path);                                                              \
+  }                                                                             \
+  path = g_strdup_printf ("/regex/full-split2/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_split_full, free_fetch_all_data); \
+  g_free (path);                                                                \
 }
 
 #define TEST_SPLIT3(_pattern, _string, _start_position, _max_tokens, e1, e2, e3) { \
-  TestFetchAllData *data;                                               \
-  gchar *path;                                                          \
-  data = g_new0 (TestFetchAllData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->start_position = _start_position;                                \
-  data->max_tokens = _max_tokens;                                        \
-  data->expected = NULL;                                                \
-  data->expected = g_slist_append (data->expected, e1);                 \
-  data->expected = g_slist_append (data->expected, e2);                 \
-  data->expected = g_slist_append (data->expected, e3);                 \
-  path = g_strdup_printf ("/regex/full-split3/%d", ++total);            \
-  g_test_add_data_func (path, data, test_split_full);                   \
-  g_free (path);                                                        \
-  if (_start_position == 0 && _max_tokens <= 0) {                         \
-    path = g_strdup_printf ("/regex/split3/%d", ++total);               \
-    g_test_add_data_func (path, data, test_split);                      \
-    g_free (path);                                                      \
-  }                                                                     \
+  TestFetchAllData *data;                                                          \
+  gchar *path;                                                                     \
+  data = g_new0 (TestFetchAllData, 1);                                             \
+  data->pattern = _pattern;                                                        \
+  data->string = _string;                                                          \
+  data->start_position = _start_position;                                          \
+  data->max_tokens = _max_tokens;                                                  \
+  data->expected = NULL;                                                           \
+  data->expected = g_slist_append (data->expected, e1);                            \
+  data->expected = g_slist_append (data->expected, e2);                            \
+  data->expected = g_slist_append (data->expected, e3);                            \
+  if (_start_position == 0 && _max_tokens <= 0) {                                  \
+    path = g_strdup_printf ("/regex/split3/%d", ++total);                          \
+    g_test_add_data_func (path, data, test_split);                                 \
+    g_free (path);                                                                 \
+  }                                                                                \
+  path = g_strdup_printf ("/regex/full-split3/%d", ++total);                       \
+  g_test_add_data_func_full (path, data, test_split_full, free_fetch_all_data);    \
+  g_free (path);                                                                   \
 }
 
 typedef struct {
@@ -978,15 +996,15 @@ test_check_replacement (gconstpointer d)
 }
 
 #define TEST_CHECK_REPLACEMENT(_string_to_expand, _expected, _expected_refs) { \
-  TestCheckReplacementData *data;                                           \
-  gchar *path;                                                              \
-  data = g_new0 (TestCheckReplacementData, 1);                              \
-  data->string_to_expand = _string_to_expand;                                \
-  data->expected = _expected;                                                \
-  data->expected_refs = _expected_refs;                                      \
-  path = g_strdup_printf ("/regex/check-repacement/%d", ++total);  \
-  g_test_add_data_func (path, data, test_check_replacement);                \
-  g_free (path);                                                            \
+  TestCheckReplacementData *data;                                              \
+  gchar *path;                                                                 \
+  data = g_new0 (TestCheckReplacementData, 1);                                 \
+  data->string_to_expand = _string_to_expand;                                  \
+  data->expected = _expected;                                                  \
+  data->expected_refs = _expected_refs;                                        \
+  path = g_strdup_printf ("/regex/check-repacement/%d", ++total);              \
+  g_test_add_data_func_full (path, data, test_check_replacement, g_free);      \
+  g_free (path);                                                               \
 }
 
 typedef struct {
@@ -1020,17 +1038,17 @@ test_expand (gconstpointer d)
 }
 
 #define TEST_EXPAND(_pattern, _string, _string_to_expand, _raw, _expected) { \
-  TestExpandData *data;                                                 \
-  gchar *path;                                                          \
-  data = g_new0 (TestExpandData, 1);                                    \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_to_expand = _string_to_expand;                            \
-  data->raw = _raw;                                                      \
-  data->expected = _expected;                                            \
-  path = g_strdup_printf ("/regex/expand/%d", ++total);                 \
-  g_test_add_data_func (path, data, test_expand);                       \
-  g_free (path);                                                        \
+  TestExpandData *data;                                                      \
+  gchar *path;                                                               \
+  data = g_new0 (TestExpandData, 1);                                         \
+  data->pattern = _pattern;                                                  \
+  data->string = _string;                                                    \
+  data->string_to_expand = _string_to_expand;                                \
+  data->raw = _raw;                                                          \
+  data->expected = _expected;                                                \
+  path = g_strdup_printf ("/regex/expand/%d", ++total);                      \
+  g_test_add_data_func_full (path, data, test_expand, g_free);               \
+  g_free (path);                                                             \
 }
 
 typedef struct {
@@ -1061,13 +1079,13 @@ test_replace (gconstpointer d)
   TestReplaceData *data;                                                \
   gchar *path;                                                          \
   data = g_new0 (TestReplaceData, 1);                                   \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->start_position = _start_position;                                \
-  data->replacement = _replacement;                                      \
-  data->expected = _expected;                                            \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->start_position = _start_position;                               \
+  data->replacement = _replacement;                                     \
+  data->expected = _expected;                                           \
   path = g_strdup_printf ("/regex/replace/%d", ++total);                \
-  g_test_add_data_func (path, data, test_replace);                      \
+  g_test_add_data_func_full (path, data, test_replace, g_free);         \
   g_free (path);                                                        \
 }
 
@@ -1091,13 +1109,13 @@ test_replace_lit (gconstpointer d)
   TestReplaceData *data;                                                \
   gchar *path;                                                          \
   data = g_new0 (TestReplaceData, 1);                                   \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->start_position = _start_position;                                \
-  data->replacement = _replacement;                                      \
-  data->expected = _expected;                                            \
+  data->pattern = _pattern;                                             \
+  data->string = _string;                                               \
+  data->start_position = _start_position;                               \
+  data->replacement = _replacement;                                     \
+  data->expected = _expected;                                           \
   path = g_strdup_printf ("/regex/replace-literally/%d", ++total);      \
-  g_test_add_data_func (path, data, test_replace_lit);                  \
+  g_test_add_data_func_full (path, data, test_replace_lit, g_free);     \
   g_free (path);                                                        \
 }
 
@@ -1121,16 +1139,16 @@ test_get_string_number (gconstpointer d)
   g_regex_unref (regex);
 }
 
-#define TEST_GET_STRING_NUMBER(_pattern, _name, _expected_num) { \
-  TestStringNumData *data;                                      \
-  gchar *path;                                                  \
-  data = g_new0 (TestStringNumData, 1);                         \
-  data->pattern = _pattern;                                      \
-  data->name = _name;                                            \
-  data->expected_num = _expected_num;                            \
-  path = g_strdup_printf ("/regex/string-number/%d", ++total);  \
-  g_test_add_data_func (path, data, test_get_string_number);    \
-  g_free (path);                                                \
+#define TEST_GET_STRING_NUMBER(_pattern, _name, _expected_num) {          \
+  TestStringNumData *data;                                                \
+  gchar *path;                                                            \
+  data = g_new0 (TestStringNumData, 1);                                   \
+  data->pattern = _pattern;                                               \
+  data->name = _name;                                                     \
+  data->expected_num = _expected_num;                                     \
+  path = g_strdup_printf ("/regex/string-number/%d", ++total);            \
+  g_test_add_data_func_full (path, data, test_get_string_number, g_free); \
+  g_free (path);                                                          \
 }
 
 typedef struct {
@@ -1152,16 +1170,16 @@ test_escape (gconstpointer d)
   g_free (escaped);
 }
 
-#define TEST_ESCAPE(_string, _length, _expected) {         \
-  TestEscapeData *data;                                 \
-  gchar *path;                                          \
-  data = g_new0 (TestEscapeData, 1);                    \
-  data->string = _string;                                \
-  data->length = _length;                                \
-  data->expected = _expected;                            \
-  path = g_strdup_printf ("/regex/escape/%d", ++total);  \
-  g_test_add_data_func (path, data, test_escape);       \
-  g_free (path);                                        \
+#define TEST_ESCAPE(_string, _length, _expected) {             \
+  TestEscapeData *data;                                        \
+  gchar *path;                                                 \
+  data = g_new0 (TestEscapeData, 1);                           \
+  data->string = _string;                                      \
+  data->length = _length;                                      \
+  data->expected = _expected;                                  \
+  path = g_strdup_printf ("/regex/escape/%d", ++total);        \
+  g_test_add_data_func_full (path, data, test_escape, g_free); \
+  g_free (path);                                               \
 }
 
 static void
@@ -1177,16 +1195,16 @@ test_escape_nul (gconstpointer d)
   g_free (escaped);
 }
 
-#define TEST_ESCAPE_NUL(_string, _length, _expected) {  \
-  TestEscapeData *data;                                 \
-  gchar *path;                                          \
-  data = g_new0 (TestEscapeData, 1);                    \
-  data->string = _string;                               \
-  data->length = _length;                               \
-  data->expected = _expected;                           \
-  path = g_strdup_printf ("/regex/escape_nul/%d", ++total);  \
-  g_test_add_data_func (path, data, test_escape_nul);   \
-  g_free (path);                                        \
+#define TEST_ESCAPE_NUL(_string, _length, _expected) {             \
+  TestEscapeData *data;                                            \
+  gchar *path;                                                     \
+  data = g_new0 (TestEscapeData, 1);                               \
+  data->string = _string;                                          \
+  data->length = _length;                                          \
+  data->expected = _expected;                                      \
+  path = g_strdup_printf ("/regex/escape_nul/%d", ++total);        \
+  g_test_add_data_func_full (path, data, test_escape_nul, g_free); \
+  g_free (path);                                                   \
 }
 
 typedef struct {
@@ -1288,116 +1306,125 @@ test_match_all (gconstpointer d)
   g_regex_unref (regex);
 }
 
-#define TEST_MATCH_ALL0(_pattern, _string, _string_len, _start_position) { \
-  TestMatchAllData *data;                                               \
-  gchar *path;                                                          \
-  data = g_new0 (TestMatchAllData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
-  data->expected = NULL;                                                \
-  path = g_strdup_printf ("/regex/match-all-full0/%d", ++total);        \
-  g_test_add_data_func (path, data, test_match_all_full);               \
-  g_free (path);                                                        \
-  if (_string_len == -1 && _start_position == 0) {                        \
-    path = g_strdup_printf ("/regex/match-all0/%d", ++total);           \
-    g_test_add_data_func (path, data, test_match_all);                  \
-    g_free (path);                                                      \
-  }                                                                     \
-}
-
-#define TEST_MATCH_ALL1(_pattern, _string, _string_len, _start_position, \
-                        t1, s1, e1) {                                   \
-  TestMatchAllData *data;                                               \
-  Match *match;                                                         \
-  gchar *path;                                                          \
-  data = g_new0 (TestMatchAllData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
-  data->expected = NULL;                                                \
-  match = g_new0 (Match, 1);                                            \
-  match->string = t1;                                                   \
-  match->start = s1;                                                    \
-  match->end = e1;                                                      \
-  data->expected = g_slist_append (data->expected, match);              \
-  path = g_strdup_printf ("/regex/match-all-full1/%d", ++total);        \
-  g_test_add_data_func (path, data, test_match_all_full);               \
-  g_free (path);                                                        \
-  if (_string_len == -1 && _start_position == 0) {                        \
-    path = g_strdup_printf ("/regex/match-all1/%d", ++total);           \
-    g_test_add_data_func (path, data, test_match_all);                  \
-    g_free (path);                                                      \
-  }                                                                     \
-}
-
-#define TEST_MATCH_ALL2(_pattern, _string, _string_len, _start_position, \
-                        t1, s1, e1, t2, s2, e2) {                       \
-  TestMatchAllData *data;                                               \
-  Match *match;                                                         \
-  gchar *path;                                                          \
-  data = g_new0 (TestMatchAllData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
-  data->expected = NULL;                                                \
-  match = g_new0 (Match, 1);                                            \
-  match->string = t1;                                                   \
-  match->start = s1;                                                    \
-  match->end = e1;                                                      \
-  data->expected = g_slist_append (data->expected, match);              \
-  match = g_new0 (Match, 1);                                            \
-  match->string = t2;                                                   \
-  match->start = s2;                                                    \
-  match->end = e2;                                                      \
-  data->expected = g_slist_append (data->expected, match);              \
-  path = g_strdup_printf ("/regex/match-all-full2/%d", ++total);        \
-  g_test_add_data_func (path, data, test_match_all_full);               \
-  g_free (path);                                                        \
-  if (_string_len == -1 && _start_position == 0) {                        \
-    path = g_strdup_printf ("/regex/match-all2/%d", ++total);           \
-    g_test_add_data_func (path, data, test_match_all);                  \
-    g_free (path);                                                      \
-  }                                                                     \
-}
-
-#define TEST_MATCH_ALL3(_pattern, _string, _string_len, _start_position, \
-                        t1, s1, e1, t2, s2, e2, t3, s3, e3) {           \
-  TestMatchAllData *data;                                               \
-  Match *match;                                                         \
-  gchar *path;                                                          \
-  data = g_new0 (TestMatchAllData, 1);                                  \
-  data->pattern = _pattern;                                              \
-  data->string = _string;                                                \
-  data->string_len = _string_len;                                        \
-  data->start_position = _start_position;                                \
-  data->expected = NULL;                                                \
-  match = g_new0 (Match, 1);                                            \
-  match->string = t1;                                                   \
-  match->start = s1;                                                    \
-  match->end = e1;                                                      \
-  data->expected = g_slist_append (data->expected, match);              \
-  match = g_new0 (Match, 1);                                            \
-  match->string = t2;                                                   \
-  match->start = s2;                                                    \
-  match->end = e2;                                                      \
-  data->expected = g_slist_append (data->expected, match);              \
-  match = g_new0 (Match, 1);                                            \
-  match->string = t3;                                                   \
-  match->start = s3;                                                    \
-  match->end = e3;                                                      \
-  data->expected = g_slist_append (data->expected, match);              \
-  path = g_strdup_printf ("/regex/match-all-full3/%d", ++total);        \
-  g_test_add_data_func (path, data, test_match_all_full);               \
-  g_free (path);                                                        \
-  if (_string_len == -1 && _start_position == 0) {                        \
-    path = g_strdup_printf ("/regex/match-all3/%d", ++total);           \
-    g_test_add_data_func (path, data, test_match_all);                  \
-    g_free (path);                                                      \
-  }                                                                     \
+static void
+free_match_all_data (gpointer _data)
+{
+  TestMatchAllData *data = _data;
+
+  g_slist_free_full (data->expected, g_free);
+  g_free (data);
+}
+
+#define TEST_MATCH_ALL0(_pattern, _string, _string_len, _start_position) {          \
+  TestMatchAllData *data;                                                           \
+  gchar *path;                                                                      \
+  data = g_new0 (TestMatchAllData, 1);                                              \
+  data->pattern = _pattern;                                                         \
+  data->string = _string;                                                           \
+  data->string_len = _string_len;                                                   \
+  data->start_position = _start_position;                                           \
+  data->expected = NULL;                                                            \
+  if (_string_len == -1 && _start_position == 0) {                                  \
+    path = g_strdup_printf ("/regex/match-all0/%d", ++total);                       \
+    g_test_add_data_func (path, data, test_match_all);                              \
+    g_free (path);                                                                  \
+  }                                                                                 \
+  path = g_strdup_printf ("/regex/match-all-full0/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_match_all_full, free_match_all_data); \
+  g_free (path);                                                                    \
+}
+
+#define TEST_MATCH_ALL1(_pattern, _string, _string_len, _start_position,            \
+                        t1, s1, e1) {                                               \
+  TestMatchAllData *data;                                                           \
+  Match *match;                                                                     \
+  gchar *path;                                                                      \
+  data = g_new0 (TestMatchAllData, 1);                                              \
+  data->pattern = _pattern;                                                         \
+  data->string = _string;                                                           \
+  data->string_len = _string_len;                                                   \
+  data->start_position = _start_position;                                           \
+  data->expected = NULL;                                                            \
+  match = g_new0 (Match, 1);                                                        \
+  match->string = t1;                                                               \
+  match->start = s1;                                                                \
+  match->end = e1;                                                                  \
+  data->expected = g_slist_append (data->expected, match);                          \
+  if (_string_len == -1 && _start_position == 0) {                                  \
+    path = g_strdup_printf ("/regex/match-all1/%d", ++total);                       \
+    g_test_add_data_func (path, data, test_match_all);                              \
+    g_free (path);                                                                  \
+  }                                                                                 \
+  path = g_strdup_printf ("/regex/match-all-full1/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_match_all_full, free_match_all_data); \
+  g_free (path);                                                                    \
+}
+
+#define TEST_MATCH_ALL2(_pattern, _string, _string_len, _start_position,            \
+                        t1, s1, e1, t2, s2, e2) {                                   \
+  TestMatchAllData *data;                                                           \
+  Match *match;                                                                     \
+  gchar *path;                                                                      \
+  data = g_new0 (TestMatchAllData, 1);                                              \
+  data->pattern = _pattern;                                                         \
+  data->string = _string;                                                           \
+  data->string_len = _string_len;                                                   \
+  data->start_position = _start_position;                                           \
+  data->expected = NULL;                                                            \
+  match = g_new0 (Match, 1);                                                        \
+  match->string = t1;                                                               \
+  match->start = s1;                                                                \
+  match->end = e1;                                                                  \
+  data->expected = g_slist_append (data->expected, match);                          \
+  match = g_new0 (Match, 1);                                                        \
+  match->string = t2;                                                               \
+  match->start = s2;                                                                \
+  match->end = e2;                                                                  \
+  data->expected = g_slist_append (data->expected, match);                          \
+  if (_string_len == -1 && _start_position == 0) {                                  \
+    path = g_strdup_printf ("/regex/match-all2/%d", ++total);                       \
+    g_test_add_data_func (path, data, test_match_all);                              \
+    g_free (path);                                                                  \
+  }                                                                                 \
+  path = g_strdup_printf ("/regex/match-all-full2/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_match_all_full, free_match_all_data); \
+  g_free (path);                                                                    \
+}
+
+#define TEST_MATCH_ALL3(_pattern, _string, _string_len, _start_position,            \
+                        t1, s1, e1, t2, s2, e2, t3, s3, e3) {                       \
+  TestMatchAllData *data;                                                           \
+  Match *match;                                                                     \
+  gchar *path;                                                                      \
+  data = g_new0 (TestMatchAllData, 1);                                              \
+  data->pattern = _pattern;                                                         \
+  data->string = _string;                                                           \
+  data->string_len = _string_len;                                                   \
+  data->start_position = _start_position;                                           \
+  data->expected = NULL;                                                            \
+  match = g_new0 (Match, 1);                                                        \
+  match->string = t1;                                                               \
+  match->start = s1;                                                                \
+  match->end = e1;                                                                  \
+  data->expected = g_slist_append (data->expected, match);                          \
+  match = g_new0 (Match, 1);                                                        \
+  match->string = t2;                                                               \
+  match->start = s2;                                                                \
+  match->end = e2;                                                                  \
+  data->expected = g_slist_append (data->expected, match);                          \
+  match = g_new0 (Match, 1);                                                        \
+  match->string = t3;                                                               \
+  match->start = s3;                                                                \
+  match->end = e3;                                                                  \
+  data->expected = g_slist_append (data->expected, match);                          \
+  if (_string_len == -1 && _start_position == 0) {                                  \
+    path = g_strdup_printf ("/regex/match-all3/%d", ++total);                       \
+    g_test_add_data_func (path, data, test_match_all);                              \
+    g_free (path);                                                                  \
+  }                                                                                 \
+  path = g_strdup_printf ("/regex/match-all-full3/%d", ++total);                    \
+  g_test_add_data_func_full (path, data, test_match_all_full, free_match_all_data); \
+  g_free (path);                                                                    \
 }
 
 static void
diff --git a/glib/tests/spawn-multithreaded.c b/glib/tests/spawn-multithreaded.c
index 45c5302..239bbf6 100644
--- a/glib/tests/spawn-multithreaded.c
+++ b/glib/tests/spawn-multithreaded.c
@@ -215,6 +215,7 @@ main (int   argc,
       char *argv[])
 {
   char *dirname;
+  int ret;
 
   g_test_init (&argc, &argv, NULL);
 
@@ -232,5 +233,9 @@ main (int   argc,
   g_test_add_func ("/gthread/spawn-sync", test_spawn_sync_multithreaded);
   g_test_add_func ("/gthread/spawn-async", test_spawn_async_multithreaded);
 
-  return g_test_run();
+  ret = g_test_run();
+
+  g_free (echo_prog_path);
+
+  return ret;
 }
diff --git a/glib/tests/spawn-singlethread.c b/glib/tests/spawn-singlethread.c
index 9f71d59..4898b72 100644
--- a/glib/tests/spawn-singlethread.c
+++ b/glib/tests/spawn-singlethread.c
@@ -189,6 +189,7 @@ main (int   argc,
       char *argv[])
 {
   char *dirname;
+  int ret;
 
   g_test_init (&argc, &argv, NULL);
 
@@ -221,5 +222,10 @@ main (int   argc,
   g_test_add_func ("/gthread/spawn-single-async", test_spawn_async);
   g_test_add_func ("/gthread/spawn-script", test_spawn_script);
 
-  return g_test_run();
+  ret = g_test_run();
+
+  g_free (echo_script_path);
+  g_free (echo_prog_path);
+
+  return ret;
 }
diff --git a/glib/tests/string.c b/glib/tests/string.c
index 11c8da7..454574b 100644
--- a/glib/tests/string.c
+++ b/glib/tests/string.c
@@ -490,6 +490,8 @@ test_string_to_bytes (void)
   g_assert_cmpint (byte_len, ==, 7);
 
   g_assert_cmpint (memcmp (byte_data, "foo-bar", byte_len), ==, 0);
+
+  g_bytes_unref (bytes);
 }
 
 int
diff --git a/glib/tests/timeout.c b/glib/tests/timeout.c
index 2d78723..445af22 100644
--- a/glib/tests/timeout.c
+++ b/glib/tests/timeout.c
@@ -22,6 +22,8 @@ function (gpointer data)
 static void
 test_seconds (void)
 {
+  guint id;
+
   /* Bug 642052 mentions that g_timeout_add_seconds(21475) schedules a
    * job that runs once per second.
    *
@@ -40,10 +42,12 @@ test_seconds (void)
   loop = g_main_loop_new (NULL, FALSE);
 
   g_timeout_add (2100, stop_waiting, NULL);
-  g_timeout_add_seconds (21475, function, NULL);
+  id = g_timeout_add_seconds (21475, function, NULL);
 
   g_main_loop_run (loop);
   g_main_loop_unref (loop);
+
+  g_source_remove (id);
 }
 
 static gint64 last_time;
diff --git a/glib/tests/unix.c b/glib/tests/unix.c
index 9051ade..329e19a 100644
--- a/glib/tests/unix.c
+++ b/glib/tests/unix.c
@@ -96,6 +96,7 @@ static void
 test_signal (int signum)
 {
   GMainLoop *mainloop;
+  int id;
 
   mainloop = g_main_loop_new (NULL, FALSE);
 
@@ -103,10 +104,11 @@ test_signal (int signum)
   g_unix_signal_add (signum, on_sig_received, mainloop);
   kill (getpid (), signum);
   g_assert (!sig_received);
-  g_timeout_add (5000, sig_not_received, mainloop);
+  id = g_timeout_add (5000, sig_not_received, mainloop);
   g_main_loop_run (mainloop);
   g_assert (sig_received);
   sig_received = FALSE;
+  g_source_remove (id);
 
   /* Ensure we don't get double delivery */
   g_timeout_add (500, exit_mainloop, mainloop);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]