diff options
author | Sergio Villar Senin <svillar@igalia.com> | 2013-02-15 21:40:37 +0100 |
---|---|---|
committer | Sergio Villar Senin <svillar@igalia.com> | 2013-02-18 11:03:15 +0100 |
commit | 054b1e3059f5b9b677d2117ecc3130fa6cd79f1a (patch) | |
tree | d42c1013bb092c6d99107d06973dc082ce40236f | |
parent | 3f294a7b6661df7d8dfad3dff175f8807b257c44 (diff) | |
download | libsoup-054b1e3059f5b9b677d2117ecc3130fa6cd79f1a.tar.gz |
cache-test: added a new cancellation test
Added do_refcounting_test that checks that streams do not leak any
reference when a message is cancelled just before starting to read.
This test also need a new cancel flag called
SOUP_TEST_REQUEST_CANCEL_AFTER_SEND_FINISH.
https://bugzilla.gnome.org/show_bug.cgi?id=682527
-rw-r--r-- | tests/cache-test.c | 61 | ||||
-rw-r--r-- | tests/test-utils.c | 10 | ||||
-rw-r--r-- | tests/test-utils.h | 3 |
3 files changed, 73 insertions, 1 deletions
diff --git a/tests/cache-test.c b/tests/cache-test.c index 9469dc12..d9400fe5 100644 --- a/tests/cache-test.c +++ b/tests/cache-test.c @@ -550,6 +550,66 @@ do_cancel_test (SoupURI *base_uri) g_free (body2); } +static void +do_refcounting_test (SoupURI *base_uri) +{ + SoupSession *session; + SoupCache *cache; + char *cache_dir; + SoupRequestHTTP *req; + GInputStream *stream, *base_stream; + SoupURI *uri; + GError *error = NULL; + guint flags; + + debug_printf (1, "Cache refcounting tests\n"); + + cache_dir = g_dir_make_tmp ("cache-test-XXXXXX", NULL); + debug_printf (2, " Caching to %s\n", cache_dir); + cache = soup_cache_new (cache_dir, SOUP_CACHE_SINGLE_USER); + session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, + SOUP_SESSION_USE_THREAD_CONTEXT, TRUE, + SOUP_SESSION_ADD_FEATURE, cache, + NULL); + + last_request_validated = last_request_hit_network = FALSE; + cancelled_requests = 0; + + uri = soup_uri_new_with_base (base_uri, "/1"); + req = soup_session_request_http_uri (session, "GET", uri, NULL); + soup_uri_free (uri); + + flags = SOUP_TEST_REQUEST_CANCEL_AFTER_SEND_FINISH | SOUP_TEST_REQUEST_CANCEL_MESSAGE; + stream = soup_test_request_send (SOUP_REQUEST (req), NULL, flags, &error); + if (!stream) { + debug_printf (1, " could not send request: %s\n", + error->message); + g_error_free (error); + g_object_unref (req); + return; + } + + base_stream = g_filter_input_stream_get_base_stream (G_FILTER_INPUT_STREAM (stream)); + g_object_add_weak_pointer (G_OBJECT (base_stream), (gpointer *)&base_stream); + + g_clear_object (&req); + g_object_unref (stream); + + debug_printf (1, " Checking that the base stream is properly unref'ed\n"); + if (base_stream) { + errors++; + debug_printf (1, "leaked GInputStream!\n"); + g_object_remove_weak_pointer (G_OBJECT (base_stream), (gpointer *)&base_stream); + } + + soup_cache_flush ((SoupCache *)soup_session_get_feature (session, SOUP_TYPE_CACHE)); + + soup_test_session_abort_unref (session); + + g_object_unref (cache); + g_free (cache_dir); +} + int main (int argc, char **argv) { @@ -565,6 +625,7 @@ main (int argc, char **argv) do_basics_test (base_uri); do_cancel_test (base_uri); + do_refcounting_test (base_uri); soup_uri_free (base_uri); soup_test_server_quit_unref (server); diff --git a/tests/test-utils.c b/tests/test-utils.c index 754b84a9..a2c24cfc 100644 --- a/tests/test-utils.c +++ b/tests/test-utils.c @@ -469,6 +469,16 @@ soup_test_request_send (SoupRequest *req, stream = soup_request_send_finish (req, data.result, error); + if (cancel_data && (flags & SOUP_TEST_REQUEST_CANCEL_AFTER_SEND_FINISH)) { + GMainContext *context; + + cancel_message_or_cancellable (cancel_data); + + context = g_main_loop_get_context (data.loop); + while (g_main_context_pending (context)) + g_main_context_iteration (context, FALSE); + } + g_main_loop_unref (data.loop); g_object_unref (data.result); diff --git a/tests/test-utils.h b/tests/test-utils.h index e7782ee4..b7b21951 100644 --- a/tests/test-utils.h +++ b/tests/test-utils.h @@ -28,7 +28,8 @@ typedef enum { SOUP_TEST_REQUEST_CANCEL_MESSAGE = (1 << 0), SOUP_TEST_REQUEST_CANCEL_CANCELLABLE = (1 << 1), SOUP_TEST_REQUEST_CANCEL_SOON = (1 << 2), - SOUP_TEST_REQUEST_CANCEL_IMMEDIATE = (1 << 3) + SOUP_TEST_REQUEST_CANCEL_IMMEDIATE = (1 << 3), + SOUP_TEST_REQUEST_CANCEL_AFTER_SEND_FINISH = (1 << 4), } SoupTestRequestFlags; SoupSession *soup_test_session_new (GType type, ...); |