From 3401c861f83c0822ab97fe9d169e8dcebd52da23 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Mon, 2 Mar 2015 21:28:18 -0500 Subject: tests: plug leaks, update libsoup.supp --- tests/cache-test.c | 3 +- tests/date.c | 2 ++ tests/libsoup.supp | 88 ++++++++++++++++++++++++++++++++++++++++++++++---- tests/misc-test.c | 33 +++++++++++++------ tests/proxy-test.c | 2 ++ tests/redirect-test.c | 1 + tests/requester-test.c | 2 +- tests/server-test.c | 9 ++++-- tests/session-test.c | 2 ++ tests/socket-test.c | 4 ++- tests/test-utils.c | 46 +++++++++++++++++++++----- tests/timeout-test.c | 2 ++ tests/websocket-test.c | 18 ++++++----- 13 files changed, 176 insertions(+), 36 deletions(-) diff --git a/tests/cache-test.c b/tests/cache-test.c index ec99a2dd..7d5897c0 100644 --- a/tests/cache-test.c +++ b/tests/cache-test.c @@ -240,7 +240,8 @@ do_request_with_cancel (SoupSession *session, g_object_unref (stream); g_object_unref (req); return; - } + } else + g_clear_error (&error); g_clear_object (&cancellable); g_clear_object (&stream); diff --git a/tests/date.c b/tests/date.c index e51fa57f..55fc8ebc 100644 --- a/tests/date.c +++ b/tests/date.c @@ -177,6 +177,8 @@ check_ok_time_t (void) g_assert_cmpint (date->hour, ==, 8); g_assert_cmpint (date->minute, ==, 9); g_assert_cmpint (date->second, ==, 7); + + soup_date_free (date); } typedef struct { diff --git a/tests/libsoup.supp b/tests/libsoup.supp index ae8bda38..2c7ba9b5 100644 --- a/tests/libsoup.supp +++ b/tests/libsoup.supp @@ -208,13 +208,20 @@ glib/tlsdb Memcheck:Leak ... - fun:g_tls_backend_get_default_database + fun:g_tls_backend_gnutls_get_default_database +} +{ + glib/tlsdb_dummy + Memcheck:Leak + ... + fun:g_dummy_tls_backend_get_default_database } { glib/tlscache Memcheck:Leak ... - fun:g_tls_backend_gnutls_cache_session_data + fun:g_bytes_new_with_free_func + fun:g_tls_client_connection_gnutls_constructed } { glib/tlspriority @@ -229,6 +236,12 @@ fun:ensure_attribute_hash fun:lookup_attribute } +{ + glib/gfileinfo2 + Memcheck:Leak + ... + fun:_lookup_namespace +} { glib/unixsignalthread Memcheck:Leak @@ -312,7 +325,7 @@ glib/unused_thread_queue Memcheck:Leak ... - fun:g_async_queue_new + fun:g_async_queue_new_full fun:g_thread_pool_new } { @@ -335,6 +348,18 @@ ... fun:g_get_charset } +{ + glib/tmpdir + Memcheck:Leak + ... + fun:g_get_tmp_dir +} +{ + glib/g_get_user_name + Memcheck:Leak + ... + fun:g_get_user_name +} { glib/gtlssessioncache Memcheck:Leak @@ -414,6 +439,30 @@ fun:g_thread_pool_new fun:g_task_thread_pool_init } +{ + glib/resources + Memcheck:Leak + ... + fun:g_resource_load +} +{ + glib/resources2 + Memcheck:Leak + ... + fun:g_resources_register +} +{ + glib/worker + Memcheck:Leak + ... + fun:g_get_worker_context +} +{ + glib/worker2 + Memcheck:Leak + ... + fun:glib_worker_main +} # probably inlines the aggressive memcpy/memcmp { @@ -444,10 +493,16 @@ } { - libxml2/xmlInitParser + libxml2/xmlInitGlobals + Memcheck:Leak + ... + fun:xmlInitGlobals +} +{ + libxml2/xmlInitMemory Memcheck:Leak ... - fun:xmlInitParser + fun:xmlInitMemory } { libxml2/xmlInitParserCtxt @@ -459,7 +514,7 @@ libxml2/xmlInitializeDict Memcheck:Leak ... - fun:xmlInitializeDict + fun:__xmlInitializeDict } { libxml2/xmlInitCharEncodingHandlers @@ -503,6 +558,20 @@ fun:g_mutex_impl_new fun:g_mutex_get_impl } +{ + glib/grecmuteximpl + Memcheck:Leak + ... + fun:g_rec_mutex_impl_new + fun:g_rec_mutex_get_impl +} +{ + glib/grwlockimpl + Memcheck:Leak + ... + fun:g_rw_lock_impl_new + fun:g_rw_lock_get_impl +} { glib/gcondimpl Memcheck:Leak @@ -517,3 +586,10 @@ fun:g_private_impl_new fun:g_private_get_impl } +{ + glib/test_uri_base + Memcheck:Leak + ... + fun:g_strdup + fun:test_case_run +} \ No newline at end of file diff --git a/tests/misc-test.c b/tests/misc-test.c index 4dab6fe8..6d43bd7f 100644 --- a/tests/misc-test.c +++ b/tests/misc-test.c @@ -976,11 +976,10 @@ do_pause_cancel_test (void) g_source_remove (timeout_id); } -static void -steal_after_upgrade (SoupMessage *msg, gpointer user_data) +static gboolean +run_echo_server (gpointer user_data) { - SoupClientContext *context = user_data; - GIOStream *stream; + GIOStream *stream = user_data; GInputStream *istream; GDataInputStream *distream; GOutputStream *ostream; @@ -988,11 +987,6 @@ steal_after_upgrade (SoupMessage *msg, gpointer user_data) gssize n; GError *error = NULL; - /* This should not ever be seen. */ - soup_message_set_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR); - - stream = soup_client_context_steal_connection (context); - istream = g_io_stream_get_input_stream (stream); distream = G_DATA_INPUT_STREAM (g_data_input_stream_new (istream)); ostream = g_io_stream_get_output_stream (stream); @@ -1020,6 +1014,26 @@ steal_after_upgrade (SoupMessage *msg, gpointer user_data) g_io_stream_close (stream, NULL, &error); g_assert_no_error (error); g_object_unref (stream); + + return FALSE; +} + +static void +steal_after_upgrade (SoupMessage *msg, gpointer user_data) +{ + SoupClientContext *context = user_data; + GIOStream *stream; + GSource *source; + + /* This should not ever be seen. */ + soup_message_set_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR); + + stream = soup_client_context_steal_connection (context); + + source = g_idle_source_new (); + g_source_set_callback (source, run_echo_server, stream, NULL); + g_source_attach (source, g_main_context_get_thread_default ()); + g_source_unref (source); } static void @@ -1196,5 +1210,6 @@ main (int argc, char **argv) soup_test_server_quit_unref (ssl_server); } + test_cleanup (); return ret; } diff --git a/tests/proxy-test.c b/tests/proxy-test.c index e898a0bf..26325517 100644 --- a/tests/proxy-test.c +++ b/tests/proxy-test.c @@ -360,6 +360,8 @@ main (int argc, char **argv) soup_uri_free (base_uri); soup_test_server_quit_unref (server); + for (i = 0; i < 3; i++) + g_object_unref (proxy_resolvers[i]); test_cleanup (); return ret; diff --git a/tests/redirect-test.c b/tests/redirect-test.c index 6b165e82..ccdd4c29 100644 --- a/tests/redirect-test.c +++ b/tests/redirect-test.c @@ -458,5 +458,6 @@ main (int argc, char **argv) soup_test_session_abort_unref (async_session); soup_test_session_abort_unref (sync_session); + test_cleanup (); return ret; } diff --git a/tests/requester-test.c b/tests/requester-test.c index 506bb7f5..04c1d02f 100644 --- a/tests/requester-test.c +++ b/tests/requester-test.c @@ -747,6 +747,7 @@ do_close_test_for_session (SoupSession *session, if (error) g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); g_clear_error (&error); + g_object_unref (cancellable); g_assert_true (finished); @@ -831,7 +832,6 @@ main (int argc, char **argv) ret = g_test_run (); soup_uri_free (uri); - soup_buffer_free (response); soup_buffer_free (auth_response); soup_test_server_quit_unref (server); diff --git a/tests/server-test.c b/tests/server-test.c index 80ad03ef..9e46bb59 100644 --- a/tests/server-test.c +++ b/tests/server-test.c @@ -831,6 +831,7 @@ do_fail_404_test (ServerData *sd, gconstpointer test_data) msg = soup_message_new_from_uri ("GET", sd->base_uri); soup_session_send_message (session, msg); soup_test_assert_message_status (msg, SOUP_STATUS_NOT_FOUND); + g_object_unref (msg); g_assert_false (usd.handler_called); g_assert_false (usd.paused); @@ -855,6 +856,7 @@ do_fail_500_test (ServerData *sd, gconstpointer pause) soup_message_headers_append (msg->request_headers, "X-Test-Server-Pause", "true"); soup_session_send_message (session, msg); soup_test_assert_message_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR); + g_object_unref (msg); g_assert_true (usd.handler_called); if (pause) @@ -1097,8 +1099,8 @@ tunnel_close (Tunnel *tunnel) g_free (tunnel->client.buffer); g_free (tunnel->server.buffer); - g_object_unref (tunnel->self); - g_object_unref (tunnel->msg); + g_clear_object (&tunnel->self); + g_clear_object (&tunnel->msg); g_free (tunnel); } @@ -1196,6 +1198,8 @@ start_tunnel (SoupMessage *msg, gpointer user_data) tunnel->client.iostream = soup_client_context_steal_connection (tunnel->context); tunnel->client.istream = g_io_stream_get_input_stream (tunnel->client.iostream); tunnel->client.ostream = g_io_stream_get_output_stream (tunnel->client.iostream); + g_clear_object (&tunnel->self); + g_clear_object (&tunnel->msg); tunnel->client.buffer = g_malloc (BUFSIZE); tunnel->server.buffer = g_malloc (BUFSIZE); @@ -1296,6 +1300,7 @@ do_steal_connect_test (ServerData *sd, gconstpointer test_data) g_object_unref (msg); soup_test_session_abort_unref (session); + soup_test_server_quit_unref (proxy); soup_uri_free (proxy_uri); } diff --git a/tests/session-test.c b/tests/session-test.c index 84fe35b4..8957a258 100644 --- a/tests/session-test.c +++ b/tests/session-test.c @@ -101,6 +101,7 @@ do_test_for_session (SoupSession *session, SoupURI *uri, server_processed_message = local_timeout = FALSE; timeout_id = g_idle_add_full (G_PRIORITY_HIGH, timeout_cb, &local_timeout, NULL); soup_session_send_message (session, msg); + g_object_unref (msg); g_assert_true (server_processed_message); @@ -139,6 +140,7 @@ do_test_for_session (SoupSession *session, SoupURI *uri, while (!finished) g_main_context_iteration (NULL, TRUE); } + g_main_loop_unref (loop); soup_test_assert_message_status (msg, SOUP_STATUS_CANCELLED); g_object_unref (msg); diff --git a/tests/socket-test.c b/tests/socket-test.c index 52a8fbbf..9e32ca6f 100644 --- a/tests/socket-test.c +++ b/tests/socket-test.c @@ -167,7 +167,8 @@ do_socket_from_fd_client_test (void) g_object_unref (sock); g_object_unref (gsock); - g_object_unref (server); + soup_test_server_quit_unref (server); + soup_uri_free (uri); } static void @@ -214,6 +215,7 @@ do_socket_from_fd_server_test (void) g_assert_cmpstr (soup_address_get_physical (local), ==, "127.0.0.1"); g_assert_cmpint (soup_address_get_port (local), ==, g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (gaddr))); g_object_unref (local); + g_object_unref (gaddr); g_object_unref (sock); diff --git a/tests/test-utils.c b/tests/test-utils.c index 02455ccf..ad0410c1 100644 --- a/tests/test-utils.c +++ b/tests/test-utils.c @@ -66,6 +66,7 @@ test_init (int argc, char **argv, GOptionEntry *entries) setlocale (LC_ALL, ""); g_setenv ("GSETTINGS_BACKEND", "memory", TRUE); g_setenv ("GIO_USE_PROXY_RESOLVER", "dummy", TRUE); + g_setenv ("GIO_USE_VFS", "local", TRUE); name = strrchr (argv[0], '/'); if (!name++) @@ -444,10 +445,6 @@ soup_test_server_get_uri (SoupServer *server, return uri; /* Need to add a new listener */ - uri = soup_uri_new (NULL); - soup_uri_set_scheme (uri, scheme); - soup_uri_set_host (uri, host); - loop = g_object_get_data (G_OBJECT (server), "GMainLoop"); if (loop) { GMainContext *context = g_main_loop_get_context (loop); @@ -477,8 +474,39 @@ soup_test_server_get_uri (SoupServer *server, } static gboolean -idle_quit_server (gpointer loop) +done_waiting (gpointer user_data) { + gboolean *done = user_data; + + *done = TRUE; + return FALSE; +} + +static void +disconnect_and_wait (SoupServer *server, + GMainContext *context) +{ + GSource *source; + gboolean done = FALSE; + + source = g_idle_source_new (); + g_source_set_priority (source, G_PRIORITY_LOW); + g_source_set_callback (source, done_waiting, &done, NULL); + g_source_attach (source, context); + g_source_unref (source); + + soup_server_disconnect (server); + while (!done) + g_main_context_iteration (context, TRUE); +} + +static gboolean +idle_quit_server (gpointer user_data) +{ + SoupServer *server = user_data; + GMainLoop *loop = g_object_get_data (G_OBJECT (server), "GMainLoop"); + + disconnect_and_wait (server, g_main_loop_get_context (loop)); g_main_loop_quit (loop); return FALSE; } @@ -495,10 +523,12 @@ soup_test_server_quit_unref (SoupServer *server) loop = g_object_get_data (G_OBJECT (server), "GMainLoop"); context = g_main_loop_get_context (loop); - soup_add_completion (context, idle_quit_server, loop); + g_main_context_ref (context); + soup_add_completion (context, idle_quit_server, server); + g_main_context_unref (context); g_thread_join (thread); } else - soup_server_disconnect (server); + disconnect_and_wait (server, NULL); g_assert_cmpint (G_OBJECT (server)->ref_count, ==, 1); g_object_unref (server); @@ -610,7 +640,7 @@ soup_test_request_send (SoupRequest *req, g_timeout_add_full (G_PRIORITY_HIGH, interval, cancel_request_timeout, cancel_data, NULL); } if (cancel_data && (flags & SOUP_TEST_REQUEST_CANCEL_PREEMPTIVE)) - g_cancellable_cancel (cancellable); + cancel_message_or_cancellable (cancel_data); soup_request_send_async (req, cancellable, async_as_sync_callback, &data); g_main_loop_run (data.loop); diff --git a/tests/timeout-test.c b/tests/timeout-test.c index afb2c591..c783d9ab 100644 --- a/tests/timeout-test.c +++ b/tests/timeout-test.c @@ -265,6 +265,8 @@ do_sync_timeout_tests (gconstpointer data) do_req_tests_for_session (timeout_session, NULL, plain_session, fast_uri, slow_uri); soup_test_session_abort_unref (timeout_session); soup_test_session_abort_unref (plain_session); + + soup_uri_free (slow_uri); } static gboolean diff --git a/tests/websocket-test.c b/tests/websocket-test.c index aee8bfc6..78dced57 100644 --- a/tests/websocket-test.c +++ b/tests/websocket-test.c @@ -112,6 +112,7 @@ direct_connection_complete (GObject *object, SOUP_WEBSOCKET_CONNECTION_CLIENT, NULL, NULL); soup_uri_free (uri); + g_object_unref (conn); } static gboolean @@ -140,6 +141,7 @@ got_connection (GSocket *listener, SOUP_WEBSOCKET_CONNECTION_SERVER, NULL, NULL); soup_uri_free (uri); + g_object_unref (conn); } return FALSE; @@ -162,7 +164,7 @@ setup_direct_connection (Test *test, g_source_set_callback (listen_source, (GSourceFunc) got_connection, test, NULL); g_source_attach (listen_source, NULL); - while (test->client == NULL || (test->server == NULL && !test->no_server)) + while (test->client == NULL || (test->server == NULL && test->raw_server == NULL)) g_main_context_iteration (NULL, TRUE); g_source_destroy (listen_source); @@ -267,14 +269,12 @@ static void teardown_soup_connection (Test *test, gconstpointer data) { - g_clear_object (&test->client); - g_clear_error (&test->client_error); - - if (test->session) - soup_test_session_abort_unref (test->session); + teardown_direct_connection (test, data); - if (test->soup_server) - soup_test_server_quit_unref (test->soup_server); + g_clear_object (&test->msg); + g_clear_error (&test->client_error); + g_clear_pointer (&test->session, soup_test_session_abort_unref); + g_clear_pointer (&test->soup_server, soup_test_server_quit_unref); } @@ -779,6 +779,8 @@ test_receive_fragmented (Test *test, g_bytes_unref (received); g_thread_join (thread); + + WAIT_UNTIL (soup_websocket_connection_get_state (test->client) == SOUP_WEBSOCKET_STATE_CLOSED); } int -- cgit v1.2.1