summaryrefslogtreecommitdiff
path: root/tests/resource-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/resource-test.c')
-rw-r--r--tests/resource-test.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/tests/resource-test.c b/tests/resource-test.c
new file mode 100644
index 00000000..6fcb899e
--- /dev/null
+++ b/tests/resource-test.c
@@ -0,0 +1,220 @@
+/* -*- 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;
+
+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;
+
+ g_input_stream_close_finish (in, result, &error);
+ g_assert_no_error (error);
+ 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) {
+ g_assert_no_error (error);
+ g_clear_error (&error);
+ g_input_stream_close (in, NULL, NULL);
+ g_object_unref (in);
+ 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) {
+ g_assert_no_error (error);
+ g_clear_error (&error);
+ 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);
+
+ soup_assert_cmpmem (data.body->str, data.body->len,
+ index_buffer->data, index_buffer->length);
+ 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) {
+ g_assert_no_error (error);
+ g_clear_error (&error);
+ return;
+ }
+
+ body = g_string_new (NULL);
+ do {
+ nread = g_input_stream_read (in, buffer, sizeof (buffer),
+ NULL, &error);
+ if (nread == -1) {
+ g_assert_no_error (error);
+ g_clear_error (&error);
+ break;
+ }
+ g_string_append_len (body, buffer, nread);
+ } while (nread > 0);
+
+ g_input_stream_close (in, NULL, &error);
+ g_assert_no_error (error);
+ g_clear_error (&error);
+ g_object_unref (in);
+
+ soup_assert_cmpmem (body->str, body->len, index_buffer->data, index_buffer->length);
+ g_string_free (body, TRUE);
+}
+
+static void
+do_request (const char *uri_string, gconstpointer type)
+{
+ SoupSession *session;
+ SoupRequest *request;
+ GError *error = NULL;
+
+ session = soup_test_session_new (GPOINTER_TO_SIZE (type),
+ SOUP_SESSION_USE_THREAD_CONTEXT, TRUE,
+ NULL);
+
+ request = soup_session_request (session, uri_string, &error);
+ g_assert_no_error (error);
+
+ 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);
+}
+
+static void
+do_request_file_test (gconstpointer type)
+{
+ GFile *index;
+ char *uri_string;
+
+ 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);
+
+ do_request (uri_string, type);
+ g_free (uri_string);
+}
+
+static void
+do_request_data_test (gconstpointer type)
+{
+ gchar *base64;
+ char *uri_string;
+
+ 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);
+
+ do_request (uri_string, type);
+ g_free (uri_string);
+}
+
+static void
+do_request_gresource_test (gconstpointer type)
+{
+ do_request ("resource:///org/gnome/libsoup/tests/index.txt", type);
+}
+
+int
+main (int argc, char **argv)
+{
+ int ret;
+
+ test_init (argc, argv, NULL);
+
+ 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),
+ 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 ret;
+}