From 1a2c5e155deacb7ebeb8d0ca2c800a97a90a7ab9 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Thu, 23 Aug 2012 12:48:49 -0400 Subject: [PATCH] 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 21b672f7a..fce411b24 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 9cd758bb4..3028298d8 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 d900b9a56..3bf816416 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 29a62eae4..a99d1f916 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 33a767605..4046ab0ba 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 df8724414..2742fa6ab 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 75a77f7e4..fa57d84d1 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 3ab13f595..2a6d3fcd1 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 a30a9f84e..eaa10caeb 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 31bf72f9f..3b78c659e 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 5adc2721b..4c7445eac 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 da511ad67..433b7dcca 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 e2593a478..f7c727692 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 6a999cfc1..f205bf2cf 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); \ +static void +free_fetch_all_data (gpointer _data) +{ + TestFetchAllData *data = _data; + + g_slist_free (data->expected); + g_free (data); } -#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_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_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_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_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); \ +#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_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 (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_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 (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_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 (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_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_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); \ - 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_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); \ - 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_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); \ - } \ +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_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_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_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_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_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); \ - } \ +#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 45c530223..239bbf647 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 9f71d596d..4898b72d8 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 11c8da7d8..454574b35 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 2d78723d8..445af2259 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 9051ade0f..329e19aa8 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);