Add a regression test for SOUP_SESSION_TIMEOUT
authorDan Winship <danw@gnome.org>
Sat, 18 Apr 2009 12:34:22 +0000 (08:34 -0400)
committerDan Winship <danw@gnome.org>
Sat, 18 Apr 2009 12:34:22 +0000 (08:34 -0400)
.gitignore
tests/Makefile.am
tests/test-utils.c
tests/test-utils.h
tests/timeout-test.c [new file with mode: 0644]

index 6bb1459..b53e571 100644 (file)
@@ -70,6 +70,7 @@ tests/simple-httpd
 tests/simple-proxy
 tests/ssl-test
 tests/streaming-test
+tests/timeout-test
 tests/uri-parsing
 tests/xmlrpc-server-test
 tests/xmlrpc-test
index 3104533..0d46df5 100644 (file)
@@ -27,6 +27,7 @@ noinst_PROGRAMS =     \
        simple-httpd    \
        simple-proxy    \
        streaming-test  \
+       timeout-test    \
        uri-parsing     \
        $(CURL_TESTS)   \
        $(APACHE_TESTS) \
@@ -59,6 +60,7 @@ simple_httpd_SOURCES = simple-httpd.c
 simple_proxy_SOURCES = simple-proxy.c
 ssl_test_SOURCES = ssl-test.c $(TEST_SRCS)
 streaming_test_SOURCES = streaming-test.c $(TEST_SRCS)
+timeout_test_SOURCES = timeout-test.c $(TEST_SRCS)
 uri_parsing_SOURCES = uri-parsing.c $(TEST_SRCS)
 xmlrpc_test_SOURCES = xmlrpc-test.c $(TEST_SRCS)
 xmlrpc_server_test_SOURCES = xmlrpc-server-test.c $(TEST_SRCS)
@@ -86,6 +88,7 @@ TESTS =                       \
        ntlm-test       \
        redirect-test   \
        streaming-test  \
+       timeout-test    \
        uri-parsing     \
        $(APACHE_TESTS) \
        $(CURL_TESTS)   \
index bc48a55..b970ed4 100644 (file)
@@ -253,13 +253,26 @@ soup_test_session_abort_unref (SoupSession *session)
 
 static gpointer run_server_thread (gpointer user_data);
 
-SoupServer *
-soup_test_server_new (gboolean in_own_thread)
+static SoupServer *
+test_server_new (gboolean in_own_thread, gboolean ssl)
 {
        GMainContext *async_context;
+       const char *ssl_cert_file, *ssl_key_file;
+
+       if (test_server)
+               test_server_shutdown ();
 
        async_context = in_own_thread ? g_main_context_new () : NULL;
+
+       if (ssl) {
+               ssl_cert_file = SRCDIR "/test-cert.pem";
+               ssl_key_file = SRCDIR "/test-key.pem";
+       } else
+               ssl_cert_file = ssl_key_file = NULL;
+
        test_server = soup_server_new (SOUP_SERVER_ASYNC_CONTEXT, async_context,
+                                      SOUP_SERVER_SSL_CERT_FILE, ssl_cert_file,
+                                      SOUP_SERVER_SSL_KEY_FILE, ssl_key_file,
                                       NULL);
        if (async_context)
                g_main_context_unref (async_context);
@@ -278,6 +291,18 @@ soup_test_server_new (gboolean in_own_thread)
        return test_server;
 }
 
+SoupServer *
+soup_test_server_new (gboolean in_own_thread)
+{
+       return test_server_new (in_own_thread, FALSE);
+}
+
+SoupServer *
+soup_test_server_new_ssl (gboolean in_own_thread)
+{
+       return test_server_new (in_own_thread, TRUE);
+}
+
 static gpointer
 run_server_thread (gpointer user_data)
 {
index ff9f472..803c344 100644 (file)
@@ -18,4 +18,5 @@ void apache_cleanup (void);
 SoupSession *soup_test_session_new         (GType type, ...);
 void         soup_test_session_abort_unref (SoupSession *session);
 
-SoupServer  *soup_test_server_new  (gboolean in_own_thread);
+SoupServer  *soup_test_server_new     (gboolean in_own_thread);
+SoupServer  *soup_test_server_new_ssl (gboolean in_own_thread);
diff --git a/tests/timeout-test.c b/tests/timeout-test.c
new file mode 100644 (file)
index 0000000..73cad70
--- /dev/null
@@ -0,0 +1,115 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "libsoup/soup.h"
+
+#include "test-utils.h"
+
+static void
+do_tests_for_session (SoupSession *session,
+                     char *fast_uri, char *slow_uri)
+{
+       SoupMessage *msg;
+
+       debug_printf (1, "    fast\n");
+       msg = soup_message_new ("GET", fast_uri);
+       soup_session_send_message (session, msg);
+       if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
+               debug_printf (1, "      FAILED: %d %s (expected 200 OK)\n",
+                             msg->status_code, msg->reason_phrase);
+               errors++;
+       }
+       g_object_unref (msg);
+
+       debug_printf (1, "    slow\n");
+       msg = soup_message_new ("GET", slow_uri);
+       soup_session_send_message (session, msg);
+       if (msg->status_code != SOUP_STATUS_IO_ERROR) {
+               debug_printf (1, "      FAILED: %d %s (expected %d %s)\n",
+                             msg->status_code, msg->reason_phrase,
+                             SOUP_STATUS_IO_ERROR,
+                             soup_status_get_phrase (SOUP_STATUS_IO_ERROR));
+               errors++;
+       }
+       g_object_unref (msg);
+}
+
+static void
+do_timeout_tests (char *fast_uri, char *slow_uri)
+{
+       SoupSession *session;
+
+       debug_printf (1, "  async\n");
+       session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
+                                        SOUP_SESSION_TIMEOUT, 1,
+                                        NULL);
+       do_tests_for_session (session, fast_uri, slow_uri);
+       soup_test_session_abort_unref (session);
+
+       debug_printf (1, "  sync\n");
+       session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC,
+                                        SOUP_SESSION_TIMEOUT, 1,
+                                        NULL);
+       do_tests_for_session (session, fast_uri, slow_uri);
+       soup_test_session_abort_unref (session);
+}
+
+static void
+server_handler (SoupServer        *server,
+               SoupMessage       *msg, 
+               const char        *path,
+               GHashTable        *query,
+               SoupClientContext *client,
+               gpointer           user_data)
+{
+       if (!strcmp (path, "/slow")) {
+               /* Sleep 1.1 seconds. */
+               g_usleep (1100000);
+       }
+
+       soup_message_set_status (msg, SOUP_STATUS_OK);
+       soup_message_set_response (msg, "text/plain",
+                                  SOUP_MEMORY_STATIC,
+                                  "ok\r\n", 4);
+}
+
+int
+main (int argc, char **argv)
+{
+       SoupServer *server;
+       char *fast_uri, *slow_uri;
+
+       test_init (argc, argv, NULL);
+
+       debug_printf (1, "http\n");
+       server = soup_test_server_new (TRUE);
+       soup_server_add_handler (server, NULL, server_handler, NULL, NULL);
+       fast_uri = g_strdup_printf ("http://127.0.0.1:%u/",
+                                   soup_server_get_port (server));
+       slow_uri = g_strdup_printf ("http://127.0.0.1:%u/slow",
+                                   soup_server_get_port (server));
+       do_timeout_tests (fast_uri, slow_uri);
+       g_free (fast_uri);
+       g_free (slow_uri);
+
+       debug_printf (1, "https\n");
+       server = soup_test_server_new_ssl (TRUE);
+       soup_server_add_handler (server, NULL, server_handler, NULL, NULL);
+       fast_uri = g_strdup_printf ("https://127.0.0.1:%u/",
+                                   soup_server_get_port (server));
+       slow_uri = g_strdup_printf ("https://127.0.0.1:%u/slow",
+                                   soup_server_get_port (server));
+       do_timeout_tests (fast_uri, slow_uri);
+       g_free (fast_uri);
+       g_free (slow_uri);
+
+       test_cleanup ();
+       return errors != 0;
+}