diff options
author | Philip Withnall <philip.withnall@collabora.co.uk> | 2014-09-25 09:24:04 +0100 |
---|---|---|
committer | Philip Withnall <philip.withnall@collabora.co.uk> | 2014-09-25 09:54:19 +0100 |
commit | 07a46eded142f35952a56198c4d5f2a7e8edd3a8 (patch) | |
tree | 7c4f503b438af5da70fba01b48f3f1c778e88d6b /tests | |
parent | ec3783f7695dbe8a70a87e6940c03af2bb50cbd8 (diff) | |
download | libnice-07a46eded142f35952a56198c4d5f2a7e8edd3a8.tar.gz |
tests: Fix various memory leaks in the unit tests
The theory being that if we can get check-valgrind to pass, we could
acutally use it to find more memory leaks and other errors in the agent.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test-bsd.c | 23 | ||||
-rw-r--r-- | tests/test-build-io-stream.c | 4 | ||||
-rw-r--r-- | tests/test-io-stream-cancelling.c | 9 | ||||
-rw-r--r-- | tests/test-io-stream-common.c | 34 | ||||
-rw-r--r-- | tests/test-io-stream-pollable.c | 1 | ||||
-rw-r--r-- | tests/test-mainloop.c | 2 | ||||
-rw-r--r-- | tests/test-new-dribble.c | 25 | ||||
-rw-r--r-- | tests/test-send-recv.c | 4 | ||||
-rw-r--r-- | tests/test-thread.c | 21 | ||||
-rw-r--r-- | tests/test.c | 20 |
10 files changed, 142 insertions, 1 deletions
diff --git a/tests/test-bsd.c b/tests/test-bsd.c index fbb0813..6b747d0 100644 --- a/tests/test-bsd.c +++ b/tests/test-bsd.c @@ -69,6 +69,8 @@ test_socket_initial_properties (void) g_assert_cmpint (sock->addr.s.ip4.sin_addr.s_addr, ==, 0); // is bound to a particular port g_assert_cmpuint (nice_address_get_port (&sock->addr), !=, 0); + + nice_socket_free (sock); } static void @@ -84,6 +86,8 @@ test_socket_address_properties (void) g_assert_cmpuint (nice_address_get_port (&sock->addr), !=, 0); nice_address_set_port (&tmp, nice_address_get_port (&sock->addr)); g_assert_cmpuint (nice_address_get_port (&tmp), !=, 0); + + nice_socket_free (sock); } static void @@ -336,6 +340,25 @@ test_multi_message_recv (guint n_sends, guint n_receives, } g_slice_free1 (expected_recv_buf_len, _expected_recv_buf); + + for (i = 0; i < n_receives; i++) { + for (j = 0; j < n_bufs_per_message; j++) { + g_slice_free1 (recv_buf_size, + recv_bufs[i * n_bufs_per_message + j].buffer); + } + } + + for (i = 0; i < n_sends; i++) { + for (j = 0; j < n_bufs_per_message; j++) { + g_slice_free1 (send_buf_size, + (gpointer) send_bufs[i * n_bufs_per_message + j].buffer); + } + } + + g_free (recv_messages); + g_free (recv_bufs); + g_free (send_messages); + g_free (send_bufs); } nice_socket_free (client); diff --git a/tests/test-build-io-stream.c b/tests/test-build-io-stream.c index 0868e21..0c9c593 100644 --- a/tests/test-build-io-stream.c +++ b/tests/test-build-io-stream.c @@ -55,6 +55,8 @@ test_invalid_stream (NiceAddress *addr) * return G_IO_ERROR_BROKEN_PIPE. */ io_stream = nice_agent_get_io_stream (agent, 5, 5); g_assert (io_stream == NULL); + + g_object_unref (agent); } static void @@ -351,8 +353,10 @@ test_pollable_cancellation (NiceAddress *addr) check_pollable_source_cancellation (stream_source, cancellable); + g_object_unref (io_stream); g_source_unref (stream_source); g_object_unref (cancellable); + g_object_unref (agent); } static void diff --git a/tests/test-io-stream-cancelling.c b/tests/test-io-stream-cancelling.c index b43c0fd..55fc1f3 100644 --- a/tests/test-io-stream-cancelling.c +++ b/tests/test-io-stream-cancelling.c @@ -90,6 +90,7 @@ read_thread_cb (GInputStream *input_stream, TestIOStreamThreadData *data) len = g_input_stream_read (input_stream, buf, sizeof (buf), user_data->cancellable, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_error_free (error); g_assert (len == -1); g_main_loop_quit (data->error_loop); @@ -116,9 +117,13 @@ int main (void) l_data.cancellable = g_cancellable_new (); l_data.blocking = FALSE; + g_cond_init (&l_data.cond); + g_mutex_init (&l_data.mutex); r_data.cancellable = g_cancellable_new (); r_data.blocking = FALSE; + g_cond_init (&r_data.cond); + g_mutex_init (&r_data.mutex); l_cancellation_thread = spawn_thread ("libnice L cancel", cancellation_thread_cb, &l_data); @@ -133,6 +138,10 @@ int main (void) /* Free things. */ g_object_unref (r_data.cancellable); g_object_unref (l_data.cancellable); + g_cond_clear (&l_data.cond); + g_cond_clear (&r_data.cond); + g_mutex_clear (&l_data.mutex); + g_mutex_clear (&r_data.mutex); #ifdef G_OS_WIN32 WSACleanup (); diff --git a/tests/test-io-stream-common.c b/tests/test-io-stream-common.c index 4212f0b..bd0f3b5 100644 --- a/tests/test-io-stream-common.c +++ b/tests/test-io-stream-common.c @@ -49,6 +49,21 @@ GMutex start_mutex; GCond start_cond; gboolean started; +/* Waits about 10 seconds for @var to be NULL/FALSE */ +#define WAIT_UNTIL_UNSET(var, context) \ + if (var) \ + { \ + int i; \ + \ + for (i = 0; i < 13 && (var); i++) \ + { \ + g_usleep (1000 * (1 << i)); \ + g_main_context_iteration (context, FALSE); \ + } \ + \ + g_assert (!(var)); \ + } + static gboolean timer_cb (gpointer pointer) { g_debug ("test-thread:%s: %p", G_STRFUNC, pointer); @@ -344,6 +359,7 @@ run_io_stream_test (guint deadlock_timeout, gboolean reliable, GMutex mutex; GCond cond; guint start_count = 6; + guint stream_id; g_mutex_init (&mutex); g_cond_init (&cond); @@ -451,9 +467,26 @@ run_io_stream_test (guint deadlock_timeout, gboolean reliable, if (l_data.io_stream != NULL) g_object_unref (l_data.io_stream); + stream_id = + GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (r_data.agent), "stream-id")); + if (stream_id != 0) + nice_agent_remove_stream (r_data.agent, stream_id); + stream_id = + GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (l_data.agent), "stream-id")); + if (stream_id != 0) + nice_agent_remove_stream (l_data.agent, stream_id); + + g_object_add_weak_pointer (G_OBJECT (r_data.agent), + (gpointer *) &r_data.agent); + g_object_add_weak_pointer (G_OBJECT (l_data.agent), + (gpointer *) &l_data.agent); + g_object_unref (r_data.agent); g_object_unref (l_data.agent); + WAIT_UNTIL_UNSET (r_data.agent, r_data.main_context); + WAIT_UNTIL_UNSET (l_data.agent, l_data.main_context); + g_main_loop_unref (r_data.main_loop); g_main_loop_unref (l_data.main_loop); @@ -513,6 +546,7 @@ check_for_termination (TestIOStreamThreadData *data, gsize *recv_count, /* Remove the stream and run away. */ nice_agent_remove_stream (data->agent, stream_id); + g_object_set_data (G_OBJECT (data->agent), "stream-id", GUINT_TO_POINTER (0)); /* If both sides have finished, quit the test main loop. */ if (*recv_count > expected_recv_count && diff --git a/tests/test-io-stream-pollable.c b/tests/test-io-stream-pollable.c index 510145d..614a546 100644 --- a/tests/test-io-stream-pollable.c +++ b/tests/test-io-stream-pollable.c @@ -72,6 +72,7 @@ read_stream_cb (GObject *pollable_stream, gpointer _user_data) if (len == -1) { g_assert_error (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK); + g_error_free (error); return TRUE; } diff --git a/tests/test-mainloop.c b/tests/test-mainloop.c index e790ec7..b4e4d05 100644 --- a/tests/test-mainloop.c +++ b/tests/test-mainloop.c @@ -102,7 +102,9 @@ main (void) g_main_loop_run (loop); + nice_agent_remove_stream (agent, stream); g_object_unref (agent); + return 0; } diff --git a/tests/test-new-dribble.c b/tests/test-new-dribble.c index 59f8b13..395e275 100644 --- a/tests/test-new-dribble.c +++ b/tests/test-new-dribble.c @@ -89,6 +89,21 @@ static const uint16_t known_attributes[] = { 0 }; +/* Waits about 10 seconds for @var to be NULL/FALSE */ +#define WAIT_UNTIL_UNSET(var, context) \ + if (var) \ + { \ + int _i; \ + \ + for (_i = 0; _i < 13 && (var); _i++) \ + { \ + g_usleep (1000 * (1 << _i)); \ + g_main_context_iteration (context, FALSE); \ + } \ + \ + g_assert (!(var)); \ + } + /* * Creates a listening socket */ @@ -716,7 +731,6 @@ int main(void) src = g_cancellable_source_new (global_cancellable); g_source_set_dummy_callback (src); g_source_attach (src, NULL); - g_source_unref (src); sock = listen_socket (&stun_port); @@ -782,6 +796,9 @@ int main(void) drop_stun_packets = TRUE; send_dummy_data (); + g_object_add_weak_pointer (G_OBJECT (lagent), (gpointer *) &lagent); + g_object_add_weak_pointer (G_OBJECT (ragent), (gpointer *) &ragent); + g_object_unref (lagent); g_object_unref (ragent); @@ -792,5 +809,11 @@ int main(void) #endif g_object_unref (global_cancellable); + g_source_destroy (src); + g_source_unref (src); + + WAIT_UNTIL_UNSET (lagent, NULL); + WAIT_UNTIL_UNSET (ragent, NULL); + return 0; } diff --git a/tests/test-send-recv.c b/tests/test-send-recv.c index 0ab6408..c633655 100644 --- a/tests/test-send-recv.c +++ b/tests/test-send-recv.c @@ -904,6 +904,7 @@ read_stream_cb (GObject *pollable_stream, gpointer _user_data) if (len == -1) { g_assert_error (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK); + g_error_free (error); g_free (buf); return TRUE; } @@ -1175,6 +1176,7 @@ main (int argc, char *argv[]) if (!g_option_context_parse (context, &argc, &argv, &error)) { g_printerr ("Option parsing failed: %s\n", error->message); g_error_free (error); + g_option_context_free (context); exit (1); } @@ -1307,6 +1309,8 @@ main (int argc, char *argv[]) } done: + g_option_context_free (context); + #ifdef G_OS_WIN32 WSACleanup (); #endif diff --git a/tests/test-thread.c b/tests/test-thread.c index 63b45b4..df0b145 100644 --- a/tests/test-thread.c +++ b/tests/test-thread.c @@ -54,6 +54,21 @@ volatile gint global_ragent_cands = 0; volatile gint global_lagent_buffers = 0; volatile gint global_ragent_buffers = 0; +/* Waits about 10 seconds for @var to be NULL/FALSE */ +#define WAIT_UNTIL_UNSET(var, context) \ + if (var) \ + { \ + int _i; \ + \ + for (_i = 0; _i < 13 && (var); _i++) \ + { \ + g_usleep (1000 * (1 << _i)); \ + g_main_context_iteration (context, FALSE); \ + } \ + \ + g_assert (!(var)); \ + } + static gboolean timer_cb (gpointer pointer) { g_debug ("test-thread:%s: %p", G_STRFUNC, pointer); @@ -338,9 +353,15 @@ int main (void) g_assert (g_atomic_int_get (&global_lagent_cands) == 1); g_assert (g_atomic_int_get (&global_ragent_cands) == 1); + g_object_add_weak_pointer (G_OBJECT (lagent), (gpointer *) &lagent); + g_object_add_weak_pointer (G_OBJECT (ragent), (gpointer *) &ragent); + g_object_unref (lagent); g_object_unref (ragent); + WAIT_UNTIL_UNSET (lagent, lmainctx); + WAIT_UNTIL_UNSET (ragent, rmainctx); + g_main_loop_unref (lmainloop); g_main_loop_unref (rmainloop); g_main_loop_unref (ldmainloop); diff --git a/tests/test.c b/tests/test.c index febf065..31a9fc7 100644 --- a/tests/test.c +++ b/tests/test.c @@ -43,6 +43,21 @@ #include "agent.h" #include "agent-priv.h" +/* Waits about 10 seconds for @var to be NULL/FALSE */ +#define WAIT_UNTIL_UNSET(var, context) \ + if (var) \ + { \ + int _i; \ + \ + for (_i = 0; _i < 13 && (var); _i++) \ + { \ + g_usleep (1000 * (1 << _i)); \ + g_main_context_iteration (context, FALSE); \ + } \ + \ + g_assert (!(var)); \ + } + gint main (void) { @@ -98,7 +113,12 @@ main (void) g_slist_free (candidates); /* clean up */ + nice_agent_remove_stream (agent, stream_id); + + g_object_add_weak_pointer (G_OBJECT (agent), (gpointer *) &agent); g_object_unref (agent); + WAIT_UNTIL_UNSET (agent, NULL); + #ifdef G_OS_WIN32 WSACleanup(); #endif |