summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2014-09-25 09:24:04 +0100
committerPhilip Withnall <philip.withnall@collabora.co.uk>2014-09-25 09:54:19 +0100
commit07a46eded142f35952a56198c4d5f2a7e8edd3a8 (patch)
tree7c4f503b438af5da70fba01b48f3f1c778e88d6b /tests
parentec3783f7695dbe8a70a87e6940c03af2bb50cbd8 (diff)
downloadlibnice-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.c23
-rw-r--r--tests/test-build-io-stream.c4
-rw-r--r--tests/test-io-stream-cancelling.c9
-rw-r--r--tests/test-io-stream-common.c34
-rw-r--r--tests/test-io-stream-pollable.c1
-rw-r--r--tests/test-mainloop.c2
-rw-r--r--tests/test-new-dribble.c25
-rw-r--r--tests/test-send-recv.c4
-rw-r--r--tests/test-thread.c21
-rw-r--r--tests/test.c20
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