From cbbde758b8ea533916fe25dc25d64bac564ea09a Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Sun, 26 Aug 2012 15:20:34 +0200 Subject: soup-request: Add support to handle gresource URI requests GFile already supports gresource when using g_file_new_for_uri() with a resource:// URI. We can add "resource" as a valid scheme for SoupRequestFile and make sure the GFile is created with the gresource URI for gresource requests. https://bugzilla.gnome.org/show_bug.cgi?id=682721 --- tests/resource-test.c | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 tests/resource-test.c (limited to 'tests/resource-test.c') diff --git a/tests/resource-test.c b/tests/resource-test.c new file mode 100644 index 00000000..449820a4 --- /dev/null +++ b/tests/resource-test.c @@ -0,0 +1,296 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2012 Igalia S.L. + */ + +#include "test-utils.h" + +SoupBuffer *index_buffer; + +static void +get_index (void) +{ + char *contents; + gsize length; + GError *error = NULL; + + if (!g_file_get_contents (SRCDIR "/index.txt", &contents, &length, &error)) { + g_printerr ("Could not read index.txt: %s\n", + error->message); + exit (1); + } + + index_buffer = soup_buffer_new (SOUP_MEMORY_TAKE, contents, length); +} + +static void +register_gresource (void) +{ + GResource *resource; + GError *error = NULL; + + resource = g_resource_load ("soup-tests.gresource", &error); + if (!resource) { + g_printerr ("Could not load resource soup-tests.gresource: %s\n", + error->message); + exit (1); + } + g_resources_register (resource); + g_resource_unref (resource); +} + +static void +check_results (GString *body) +{ + if (body->len != index_buffer->length) { + debug_printf (1, " body length mismatch: expected %d, got %d\n", + (int)index_buffer->length, (int)body->len); + errors++; + } else if (memcmp (body->str, index_buffer->data, body->len) != 0) { + debug_printf (1, " body data mismatch\n"); + errors++; + } +} + +typedef struct { + GString *body; + char buffer[1024]; + GMainLoop *loop; +} AsyncRequestData; + +static void +stream_closed (GObject *source, GAsyncResult *result, gpointer user_data) +{ + GInputStream *in = G_INPUT_STREAM (source); + AsyncRequestData *data = user_data; + GError *error = NULL; + + if (!g_input_stream_close_finish (in, result, &error)) { + debug_printf (1, " close failed: %s\n", error->message); + g_error_free (error); + errors++; + } + g_main_loop_quit (data->loop); + g_object_unref (in); +} + +static void +test_read_ready (GObject *source, GAsyncResult *result, gpointer user_data) +{ + GInputStream *in = G_INPUT_STREAM (source); + AsyncRequestData *data = user_data; + gssize nread; + GError *error = NULL; + + nread = g_input_stream_read_finish (in, result, &error); + if (nread == -1) { + debug_printf (1, " g_input_stream_read failed: %s\n", + error->message); + g_clear_error (&error); + g_input_stream_close (in, NULL, NULL); + g_object_unref (in); + errors++; + return; + } else if (nread == 0) { + g_input_stream_close_async (in, G_PRIORITY_DEFAULT, NULL, + stream_closed, data); + return; + } + + g_string_append_len (data->body, data->buffer, nread); + g_input_stream_read_async (in, data->buffer, sizeof (data->buffer), + G_PRIORITY_DEFAULT, NULL, + test_read_ready, data); +} + +static void +async_request_sent (GObject *source, GAsyncResult *result, gpointer user_data) +{ + GInputStream *in; + AsyncRequestData *data = user_data; + GError *error = NULL; + + in = soup_request_send_finish (SOUP_REQUEST (source), result, &error); + if (!in) { + debug_printf (1, " soup_request_send_async failed: %s\n", + error->message); + g_clear_error (&error); + errors++; + return; + } + + g_input_stream_read_async (in, data->buffer, sizeof (data->buffer), + G_PRIORITY_DEFAULT, NULL, + test_read_ready, data); +} + +static void +do_async_request (SoupRequest *request) +{ + AsyncRequestData data; + + data.body = g_string_new (NULL); + soup_request_send_async (request, NULL, async_request_sent, &data); + + data.loop = g_main_loop_new (soup_session_get_async_context (soup_request_get_session (request)), TRUE); + g_main_loop_run (data.loop); + g_main_loop_unref (data.loop); + + check_results (data.body); + g_string_free (data.body, TRUE); +} + +static void +do_sync_request (SoupRequest *request) +{ + GInputStream *in; + GString *body; + char buffer[1024]; + gssize nread; + GError *error = NULL; + + in = soup_request_send (request, NULL, &error); + if (!in) { + debug_printf (1, " soup_request_send failed: %s\n", + error->message); + g_clear_error (&error); + errors++; + return; + } + + body = g_string_new (NULL); + do { + nread = g_input_stream_read (in, buffer, sizeof (buffer), + NULL, &error); + if (nread == -1) { + debug_printf (1, " g_input_stream_read failed: %s\n", + error->message); + g_clear_error (&error); + errors++; + break; + } + g_string_append_len (body, buffer, nread); + } while (nread > 0); + + if (!g_input_stream_close (in, NULL, &error)) { + debug_printf (1, " g_input_stream_close failed: %s\n", + error->message); + g_clear_error (&error); + errors++; + } + g_object_unref (in); + + check_results (body); + g_string_free (body, TRUE); +} + +static void +do_request_file_test (SoupRequester *requester, + gboolean async) +{ + SoupRequest *request; + GFile *index; + char *uri_string; + SoupURI *uri; + + index = g_file_new_for_path (SRCDIR "/index.txt"); + uri_string = g_file_get_uri (index); + g_object_unref (index); + + uri = soup_uri_new (uri_string); + g_free (uri_string); + + request = soup_requester_request_uri (requester, uri, NULL); + if (async) + do_async_request (request); + else + do_sync_request (request); + g_object_unref (request); + + soup_uri_free (uri); +} + +static void +do_request_data_test (SoupRequester *requester, + gboolean async) +{ + SoupRequest *request; + gchar *base64; + char *uri_string; + SoupURI *uri; + + base64 = g_base64_encode ((const guchar *)index_buffer->data, index_buffer->length); + uri_string = g_strdup_printf ("data:text/plain;charset=utf8;base64,%s", base64); + g_free (base64); + + uri = soup_uri_new (uri_string); + g_free (uri_string); + + request = soup_requester_request_uri (requester, uri, NULL); + if (async) + do_async_request (request); + else + do_sync_request (request); + g_object_unref (request); + + soup_uri_free (uri); +} + +static void +do_request_gresource_test (SoupRequester *requester, + gboolean async) +{ + SoupRequest *request; + SoupURI *uri; + + uri = soup_uri_new ("resource:///org/gnome/libsoup/tests/index.txt"); + request = soup_requester_request_uri (requester, uri, NULL); + if (async) + do_async_request (request); + else + do_sync_request (request); + g_object_unref (request); + + soup_uri_free (uri); +} + +int +main (int argc, char **argv) +{ + SoupSession *session; + SoupRequester *requester; + + test_init (argc, argv, NULL); + + get_index (); + register_gresource (); + + /* Sync tests */ + session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL); + requester = soup_requester_new (); + soup_session_add_feature (session, SOUP_SESSION_FEATURE (requester)); + g_object_unref (requester); + + do_request_file_test (requester, FALSE); + do_request_data_test (requester, FALSE); + do_request_gresource_test (requester, FALSE); + + soup_test_session_abort_unref (session); + + /* Async tests */ + session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, + SOUP_SESSION_USE_THREAD_CONTEXT, TRUE, + NULL); + requester = soup_requester_new (); + soup_session_add_feature (session, SOUP_SESSION_FEATURE (requester)); + g_object_unref (requester); + + do_request_file_test (requester, TRUE); + do_request_data_test (requester, TRUE); + do_request_gresource_test (requester, TRUE); + + soup_test_session_abort_unref (session); + + test_cleanup (); + return errors != 0; +} -- cgit v1.2.1 From 64272f77902c91145f6dcbaad5919791b4bc7e36 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Mon, 10 Dec 2012 17:30:21 +0100 Subject: tests: fix SoupRequester deprecation warnings Fix multipart-test and resource-test to use the new SoupSession APIs rather than SoupRequester. Fix requester-test (which intentionally tests that SoupRequester still works too) to not show deprecation warnings. --- tests/resource-test.c | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) (limited to 'tests/resource-test.c') diff --git a/tests/resource-test.c b/tests/resource-test.c index 449820a4..21e2f98e 100644 --- a/tests/resource-test.c +++ b/tests/resource-test.c @@ -185,8 +185,8 @@ do_sync_request (SoupRequest *request) } static void -do_request_file_test (SoupRequester *requester, - gboolean async) +do_request_file_test (SoupSession *session, + gboolean async) { SoupRequest *request; GFile *index; @@ -200,7 +200,7 @@ do_request_file_test (SoupRequester *requester, uri = soup_uri_new (uri_string); g_free (uri_string); - request = soup_requester_request_uri (requester, uri, NULL); + request = soup_session_request_uri (session, uri, NULL); if (async) do_async_request (request); else @@ -211,8 +211,8 @@ do_request_file_test (SoupRequester *requester, } static void -do_request_data_test (SoupRequester *requester, - gboolean async) +do_request_data_test (SoupSession *session, + gboolean async) { SoupRequest *request; gchar *base64; @@ -226,7 +226,7 @@ do_request_data_test (SoupRequester *requester, uri = soup_uri_new (uri_string); g_free (uri_string); - request = soup_requester_request_uri (requester, uri, NULL); + request = soup_session_request_uri (session, uri, NULL); if (async) do_async_request (request); else @@ -237,14 +237,14 @@ do_request_data_test (SoupRequester *requester, } static void -do_request_gresource_test (SoupRequester *requester, - gboolean async) +do_request_gresource_test (SoupSession *session, + gboolean async) { SoupRequest *request; SoupURI *uri; uri = soup_uri_new ("resource:///org/gnome/libsoup/tests/index.txt"); - request = soup_requester_request_uri (requester, uri, NULL); + request = soup_session_request_uri (session, uri, NULL); if (async) do_async_request (request); else @@ -258,7 +258,6 @@ int main (int argc, char **argv) { SoupSession *session; - SoupRequester *requester; test_init (argc, argv, NULL); @@ -267,13 +266,10 @@ main (int argc, char **argv) /* Sync tests */ session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL); - requester = soup_requester_new (); - soup_session_add_feature (session, SOUP_SESSION_FEATURE (requester)); - g_object_unref (requester); - do_request_file_test (requester, FALSE); - do_request_data_test (requester, FALSE); - do_request_gresource_test (requester, FALSE); + do_request_file_test (session, FALSE); + do_request_data_test (session, FALSE); + do_request_gresource_test (session, FALSE); soup_test_session_abort_unref (session); @@ -281,13 +277,10 @@ main (int argc, char **argv) session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, SOUP_SESSION_USE_THREAD_CONTEXT, TRUE, NULL); - requester = soup_requester_new (); - soup_session_add_feature (session, SOUP_SESSION_FEATURE (requester)); - g_object_unref (requester); - do_request_file_test (requester, TRUE); - do_request_data_test (requester, TRUE); - do_request_gresource_test (requester, TRUE); + do_request_file_test (session, TRUE); + do_request_data_test (session, TRUE); + do_request_gresource_test (session, TRUE); soup_test_session_abort_unref (session); -- cgit v1.2.1 From 64e667bda5009c8f1acd03659c457e26b16457a6 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Tue, 10 Dec 2013 15:47:34 +0100 Subject: tests: initial port to the gtestutils framework Some programs need to be split up into more tests, and the debug output is mostly not updated for the new format. --- tests/resource-test.c | 163 +++++++++++++++++++------------------------------- 1 file changed, 63 insertions(+), 100 deletions(-) (limited to 'tests/resource-test.c') diff --git a/tests/resource-test.c b/tests/resource-test.c index 21e2f98e..e41c6032 100644 --- a/tests/resource-test.c +++ b/tests/resource-test.c @@ -39,19 +39,6 @@ register_gresource (void) g_resource_unref (resource); } -static void -check_results (GString *body) -{ - if (body->len != index_buffer->length) { - debug_printf (1, " body length mismatch: expected %d, got %d\n", - (int)index_buffer->length, (int)body->len); - errors++; - } else if (memcmp (body->str, index_buffer->data, body->len) != 0) { - debug_printf (1, " body data mismatch\n"); - errors++; - } -} - typedef struct { GString *body; char buffer[1024]; @@ -65,11 +52,8 @@ stream_closed (GObject *source, GAsyncResult *result, gpointer user_data) AsyncRequestData *data = user_data; GError *error = NULL; - if (!g_input_stream_close_finish (in, result, &error)) { - debug_printf (1, " close failed: %s\n", error->message); - g_error_free (error); - errors++; - } + g_input_stream_close_finish (in, result, &error); + g_assert_no_error (error); g_main_loop_quit (data->loop); g_object_unref (in); } @@ -84,12 +68,10 @@ test_read_ready (GObject *source, GAsyncResult *result, gpointer user_data) nread = g_input_stream_read_finish (in, result, &error); if (nread == -1) { - debug_printf (1, " g_input_stream_read failed: %s\n", - error->message); + g_assert_no_error (error); g_clear_error (&error); g_input_stream_close (in, NULL, NULL); g_object_unref (in); - errors++; return; } else if (nread == 0) { g_input_stream_close_async (in, G_PRIORITY_DEFAULT, NULL, @@ -112,10 +94,8 @@ async_request_sent (GObject *source, GAsyncResult *result, gpointer user_data) in = soup_request_send_finish (SOUP_REQUEST (source), result, &error); if (!in) { - debug_printf (1, " soup_request_send_async failed: %s\n", - error->message); + g_assert_no_error (error); g_clear_error (&error); - errors++; return; } @@ -136,7 +116,8 @@ do_async_request (SoupRequest *request) g_main_loop_run (data.loop); g_main_loop_unref (data.loop); - check_results (data.body); + soup_assert_cmpmem (data.body->str, data.body->len, + index_buffer->data, index_buffer->length); g_string_free (data.body, TRUE); } @@ -151,10 +132,8 @@ do_sync_request (SoupRequest *request) in = soup_request_send (request, NULL, &error); if (!in) { - debug_printf (1, " soup_request_send failed: %s\n", - error->message); + g_assert_no_error (error); g_clear_error (&error); - errors++; return; } @@ -163,127 +142,111 @@ do_sync_request (SoupRequest *request) nread = g_input_stream_read (in, buffer, sizeof (buffer), NULL, &error); if (nread == -1) { - debug_printf (1, " g_input_stream_read failed: %s\n", - error->message); + g_assert_no_error (error); g_clear_error (&error); - errors++; break; } g_string_append_len (body, buffer, nread); } while (nread > 0); - if (!g_input_stream_close (in, NULL, &error)) { - debug_printf (1, " g_input_stream_close failed: %s\n", - error->message); - g_clear_error (&error); - errors++; - } + g_input_stream_close (in, NULL, &error); + g_assert_no_error (error); + g_clear_error (&error); g_object_unref (in); - check_results (body); + soup_assert_cmpmem (body->str, body->len, index_buffer->data, index_buffer->length); g_string_free (body, TRUE); } static void -do_request_file_test (SoupSession *session, - gboolean async) +do_request (const char *uri_string, gconstpointer type) { + SoupSession *session; SoupRequest *request; - GFile *index; - char *uri_string; - SoupURI *uri; + GError *error = NULL; - index = g_file_new_for_path (SRCDIR "/index.txt"); - uri_string = g_file_get_uri (index); - g_object_unref (index); + session = soup_test_session_new (GPOINTER_TO_SIZE (type), + SOUP_SESSION_USE_THREAD_CONTEXT, TRUE, + NULL); - uri = soup_uri_new (uri_string); - g_free (uri_string); + request = soup_session_request (session, uri_string, &error); + g_assert_no_error (error); - request = soup_session_request_uri (session, uri, NULL); - if (async) + if (SOUP_IS_SESSION_ASYNC (session)) do_async_request (request); else do_sync_request (request); + g_object_unref (request); + soup_test_session_abort_unref (session); +} - soup_uri_free (uri); +static void +do_request_file_test (gconstpointer type) +{ + GFile *index; + char *uri_string; + + index = g_file_new_for_path (SRCDIR "/index.txt"); + uri_string = g_file_get_uri (index); + g_object_unref (index); + + do_request (uri_string, type); + g_free (uri_string); } static void -do_request_data_test (SoupSession *session, - gboolean async) +do_request_data_test (gconstpointer type) { - SoupRequest *request; gchar *base64; char *uri_string; - SoupURI *uri; base64 = g_base64_encode ((const guchar *)index_buffer->data, index_buffer->length); uri_string = g_strdup_printf ("data:text/plain;charset=utf8;base64,%s", base64); g_free (base64); - uri = soup_uri_new (uri_string); + do_request (uri_string, type); g_free (uri_string); - - request = soup_session_request_uri (session, uri, NULL); - if (async) - do_async_request (request); - else - do_sync_request (request); - g_object_unref (request); - - soup_uri_free (uri); } static void -do_request_gresource_test (SoupSession *session, - gboolean async) +do_request_gresource_test (gconstpointer type) { - SoupRequest *request; - SoupURI *uri; - - uri = soup_uri_new ("resource:///org/gnome/libsoup/tests/index.txt"); - request = soup_session_request_uri (session, uri, NULL); - if (async) - do_async_request (request); - else - do_sync_request (request); - g_object_unref (request); - - soup_uri_free (uri); + do_request ("resource:///org/gnome/libsoup/tests/index.txt", type); } int main (int argc, char **argv) { - SoupSession *session; + int ret; test_init (argc, argv, NULL); get_index (); register_gresource (); - /* Sync tests */ - session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL); - - do_request_file_test (session, FALSE); - do_request_data_test (session, FALSE); - do_request_gresource_test (session, FALSE); - - soup_test_session_abort_unref (session); - - /* Async tests */ - session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, - SOUP_SESSION_USE_THREAD_CONTEXT, TRUE, - NULL); - - do_request_file_test (session, TRUE); - do_request_data_test (session, TRUE); - do_request_gresource_test (session, TRUE); - - soup_test_session_abort_unref (session); + g_test_add_data_func ("/resource/sync/file", + GSIZE_TO_POINTER (SOUP_TYPE_SESSION_SYNC), + do_request_file_test); + g_test_add_data_func ("/resource/sync/data", + GSIZE_TO_POINTER (SOUP_TYPE_SESSION_SYNC), + do_request_data_test); + g_test_add_data_func ("/resource/sync/gresource", + GSIZE_TO_POINTER (SOUP_TYPE_SESSION_SYNC), + do_request_gresource_test); + + g_test_add_data_func ("/resource/async/file", + GSIZE_TO_POINTER (SOUP_TYPE_SESSION_ASYNC), + do_request_file_test); + g_test_add_data_func ("/resource/async/data", + GSIZE_TO_POINTER (SOUP_TYPE_SESSION_ASYNC), + do_request_data_test); + g_test_add_data_func ("/resource/async/gresource", + GSIZE_TO_POINTER (SOUP_TYPE_SESSION_ASYNC), + do_request_gresource_test); + + ret = g_test_run (); test_cleanup (); - return errors != 0; + return ret; } -- cgit v1.2.1 From 094eee8d1e0ac31e83f45e026ef26688e1468884 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Wed, 11 Dec 2013 18:15:13 +0100 Subject: tests: Add resources/* to soup-test.gresource, add utility functions Add the files in resources/ to soup-test.gresource, and add soup_test_load_resource() to get the contents of one of them, and then use this in places that were previously reading them by hand. Except forms-test, which needs to pass a filename to curl, so have it use index.txt instead of one of the resource files. Now none of the tests access the resources/ directory at runtime. Also add soup_test_get_index() to read index.txt rather than reimplementing it in multiple test programs. --- tests/resource-test.c | 36 ++---------------------------------- 1 file changed, 2 insertions(+), 34 deletions(-) (limited to 'tests/resource-test.c') diff --git a/tests/resource-test.c b/tests/resource-test.c index e41c6032..50d63ab9 100644 --- a/tests/resource-test.c +++ b/tests/resource-test.c @@ -7,38 +7,6 @@ SoupBuffer *index_buffer; -static void -get_index (void) -{ - char *contents; - gsize length; - GError *error = NULL; - - if (!g_file_get_contents (SRCDIR "/index.txt", &contents, &length, &error)) { - g_printerr ("Could not read index.txt: %s\n", - error->message); - exit (1); - } - - index_buffer = soup_buffer_new (SOUP_MEMORY_TAKE, contents, length); -} - -static void -register_gresource (void) -{ - GResource *resource; - GError *error = NULL; - - resource = g_resource_load ("soup-tests.gresource", &error); - if (!resource) { - g_printerr ("Could not load resource soup-tests.gresource: %s\n", - error->message); - exit (1); - } - g_resources_register (resource); - g_resource_unref (resource); -} - typedef struct { GString *body; char buffer[1024]; @@ -222,8 +190,8 @@ main (int argc, char **argv) test_init (argc, argv, NULL); - get_index (); - register_gresource (); + index_buffer = soup_test_get_index (); + soup_test_register_resources (); g_test_add_data_func ("/resource/sync/file", GSIZE_TO_POINTER (SOUP_TYPE_SESSION_SYNC), -- cgit v1.2.1 From c92ef5cf5fc71d6cd6c29c87a258561b8a525d2b Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Wed, 11 Dec 2013 19:55:50 +0100 Subject: tests: use TAP, and install the tests Import glib-tap.mk to run the tests in TAP mode, and to provide rules to install the tests. This required some restructuring of httpd.conf-related stuff in order to come up with a configuration that would work for all three cases (srcdir==buildir, srcdir!=builddir, and installed). --- tests/resource-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/resource-test.c') diff --git a/tests/resource-test.c b/tests/resource-test.c index 50d63ab9..6fcb899e 100644 --- a/tests/resource-test.c +++ b/tests/resource-test.c @@ -155,7 +155,7 @@ do_request_file_test (gconstpointer type) GFile *index; char *uri_string; - index = g_file_new_for_path (SRCDIR "/index.txt"); + index = g_file_new_for_path (g_test_get_filename (G_TEST_DIST, "index.txt", NULL)); uri_string = g_file_get_uri (index); g_object_unref (index); -- cgit v1.2.1