[librest/wip/baedert/tests] tests: Add TestServer implementation



commit 622624585943177f29558a36c9267cb4a1e43415
Author: Timm Bäder <mail baedert org>
Date:   Tue Jul 26 08:19:32 2016 +0200

    tests: Add TestServer implementation
    
    Add a simple soup server implementation that runs in a different thread.

 tests/Makefile.am        |    8 ++--
 tests/custom-serialize.c |   27 +++-----------
 tests/proxy-continuous.c |   34 +++++++----------
 tests/proxy.c            |   90 ++++-----------------------------------------
 tests/test-server.c      |   90 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/test-server.h      |   38 +++++++++++++++++++
 tests/threaded.c         |   27 ++++----------
 7 files changed, 166 insertions(+), 148 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5d77f9c..d3fbae9 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -8,13 +8,13 @@ AM_LDFLAGS = $(SOUP_LIBS) $(GCOV_LDFLAGS) \
 
 check_PROGRAMS = $(TESTS)
 
-proxy_SOURCES = proxy.c
-proxy_continuous_SOURCES = proxy-continuous.c
-threaded_SOURCES = threaded.c
+proxy_SOURCES = proxy.c test-server.c
+proxy_continuous_SOURCES = proxy-continuous.c test-server.c
+threaded_SOURCES = threaded.c test-server.c
 oauth_SOURCES = oauth.c
 oauth_async_SOURCES = oauth-async.c
 oauth2_SOURCES = oauth2.c
 flickr_SOURCES = flickr.c
 lastfm_SOURCES = lastfm.c
 xml_SOURCES = xml.c
-custom_serialize_SOURCES = custom-serialize.c
+custom_serialize_SOURCES = custom-serialize.c test-server.c
diff --git a/tests/custom-serialize.c b/tests/custom-serialize.c
index c3fde93..ff3cecf 100644
--- a/tests/custom-serialize.c
+++ b/tests/custom-serialize.c
@@ -26,8 +26,7 @@
 #include <stdlib.h>
 #include <libsoup/soup.h>
 #include <rest/rest-proxy.h>
-
-#define PORT 8080
+#include "test-server.h"
 
 #define REST_TYPE_CUSTOM_PROXY_CALL custom_proxy_call_get_type()
 
@@ -107,33 +106,17 @@ server_callback (SoupServer *server, SoupMessage *msg,
   }
 }
 
-static void *
-server_func (gpointer data)
-{
-  GMainLoop *loop = g_main_loop_new (NULL, FALSE);
-  SoupServer *server = soup_server_new (NULL, NULL);
-  GSocketAddress *address = g_inet_socket_address_new_from_string ("127.0.0.1", PORT);
-
-  soup_server_add_handler (server, NULL, server_callback, NULL, NULL);
-  soup_server_listen (server, address, 0, NULL);
-
-  g_main_loop_run (loop);
-  return NULL;
-}
-
 static void
 test_custom_serialize ()
 {
+  TestServer *server = test_server_create (server_callback);
   RestProxy *proxy;
   RestProxyCall *call;
-  char *url;
   GError *error = NULL;
 
-  url = g_strdup_printf ("http://127.0.0.1:%d/";, PORT);
-
-  g_thread_new ("Server Thread", server_func, NULL);
+  test_server_run (server);
 
-  proxy = rest_proxy_new (url, FALSE);
+  proxy = rest_proxy_new (server->url, FALSE);
   call = g_object_new (REST_TYPE_CUSTOM_PROXY_CALL, "proxy", proxy, NULL);
 
   rest_proxy_call_set_function (call, "wrong-function");
@@ -143,9 +126,9 @@ test_custom_serialize ()
 
   g_assert_cmpint (rest_proxy_call_get_status_code (call), ==, SOUP_STATUS_OK);
 
+  test_server_stop (server);
   g_object_unref (call);
   g_object_unref (proxy);
-  g_free (url);
 }
 
 int
diff --git a/tests/proxy-continuous.c b/tests/proxy-continuous.c
index 8f4b7a8..d4c2e3f 100644
--- a/tests/proxy-continuous.c
+++ b/tests/proxy-continuous.c
@@ -27,6 +27,7 @@
 #include <stdio.h>
 #include <libsoup/soup.h>
 #include <rest/rest-proxy.h>
+#include "test-server.h"
 
 static GMainLoop *loop = NULL;
 
@@ -34,7 +35,7 @@ static GMainLoop *loop = NULL;
 #define SIZE_CHUNK 4
 static guint8 server_count = 0;
 static guint8 client_count = 0;
-static SoupServer *server;
+static TestServer *server;
 
 static gboolean
 send_chunks (gpointer user_data)
@@ -50,7 +51,7 @@ send_chunks (gpointer user_data)
   }
 
   soup_message_body_append (msg->response_body, SOUP_MEMORY_COPY, data, SIZE_CHUNK);
-  soup_server_unpause_message (server, msg);
+  soup_server_unpause_message (server->server, msg);
 
   if (server_count == NUM_CHUNKS * SIZE_CHUNK)
   {
@@ -127,29 +128,22 @@ stream_test (RestProxy *proxy)
 static void
 continuous ()
 {
-  char *url;
+  server = test_server_create (server_callback);
   RestProxy *proxy;
-  GError *error = NULL;
-  GSList *uris;
-
-
-  server = soup_server_new (NULL);
-  soup_server_listen_local (server, 0, 0, &error);
-  g_assert_no_error (error);
-
-  soup_server_add_handler (server, NULL, server_callback, NULL, NULL);
-
-  uris = soup_server_get_uris (server);
-  g_assert (g_slist_length (uris) > 0);
+  RestProxyCall *call;
 
-  url = soup_uri_to_string (uris->data, FALSE);
+  test_server_run (server);
 
   loop = g_main_loop_new (NULL, FALSE);
 
-  proxy = rest_proxy_new (url, FALSE);
-  stream_test (proxy);
-  g_slist_free_full (uris, (GDestroyNotify)soup_uri_free);
-
+  proxy = rest_proxy_new (server->url, FALSE);
+  call = rest_proxy_new_call (proxy);
+  rest_proxy_call_set_function (call, "stream");
+  rest_proxy_call_continuous (call,
+                              _call_continuous_cb,
+                              NULL,
+                              call_done_cb,
+                              NULL);
   g_main_loop_run (loop);
   g_free (url);
   g_main_loop_unref (loop);
diff --git a/tests/proxy.c b/tests/proxy.c
index b98bfcf..a284ebf 100644
--- a/tests/proxy.c
+++ b/tests/proxy.c
@@ -35,42 +35,7 @@
 #include <libsoup/soup.h>
 #include <rest/rest-proxy.h>
 
-typedef struct {
-  SoupServer *server;
-  GMainLoop  *main_loop;
-  char *url;
-  GThread *thread;
-} TestServer;
-
-static void
-test_server_stop (TestServer *server)
-{
-  g_assert (server->thread);
-  g_main_loop_quit (server->main_loop);
-  g_thread_join (server->thread);
-  g_object_unref (server->server);
-  g_main_loop_unref (server->main_loop);
-  g_free (server->url);
-  g_slice_free (TestServer, server);
-}
-
-static void *
-test_server_thread_func (gpointer data)
-{
-  TestServer *server = data;
-
-  g_main_context_push_thread_default (g_main_loop_get_context (server->main_loop));
-  g_main_loop_run (server->main_loop);
-  g_main_context_pop_thread_default (g_main_loop_get_context (server->main_loop));
-
-  return NULL;
-}
-
-static void
-test_server_run (TestServer *server)
-{
-  server->thread = g_thread_new ("Server Thread", test_server_thread_func, server);
-}
+#include "test-server.h"
 
 static void
 server_callback (SoupServer *server, SoupMessage *msg,
@@ -128,49 +93,10 @@ server_callback (SoupServer *server, SoupMessage *msg,
   }
 }
 
-static TestServer *
-create_server ()
-{
-  TestServer *test_server;
-  GMainLoop *main_loop;
-  GMainContext *context;
-  SoupServer *server;
-  GError *error = NULL;
-  GSList *uris;
-  char *url;
-
-  context = g_main_context_new ();
-  g_main_context_push_thread_default (context);
-  main_loop = g_main_loop_new (context, FALSE);
-  server = soup_server_new (NULL);
-
-  soup_server_listen_local (server, 0, 0, &error);
-  g_assert_no_error (error);
-
-  soup_server_add_handler (server, "/", server_callback,
-                           NULL, NULL);
-
-  uris = soup_server_get_uris (server);
-  g_assert (g_slist_length (uris) > 0);
-  url = soup_uri_to_string (uris->data, FALSE);
-
-  test_server = g_slice_alloc (sizeof (TestServer));
-  test_server->server = server;
-  test_server->main_loop = main_loop;
-  test_server->url = url;
-  test_server->thread = NULL;
-
-  g_slist_free_full (uris, (GDestroyNotify)soup_uri_free);
-
-  g_main_context_pop_thread_default (context);
-
-  return test_server;
-}
-
 static void
 ping ()
 {
-  TestServer *server = create_server ();
+  TestServer *server = test_server_create (server_callback);
   RestProxy *proxy = rest_proxy_new (server->url, FALSE);
   RestProxyCall *call = rest_proxy_new_call (proxy);
   GError *error = NULL;
@@ -193,7 +119,7 @@ ping ()
 static void
 echo ()
 {
-  TestServer *server = create_server ();
+  TestServer *server = test_server_create (server_callback);
   RestProxy *proxy;
   RestProxyCall *call;
   GError *error = NULL;
@@ -220,7 +146,7 @@ echo ()
 static void
 reverse ()
 {
-  TestServer *server = create_server ();
+  TestServer *server = test_server_create (server_callback);
   RestProxy *proxy = rest_proxy_new (server->url, FALSE);
   RestProxyCall *call;
   GError *error = NULL;
@@ -246,7 +172,7 @@ reverse ()
 static void
 params ()
 {
-  TestServer *server = create_server ();
+  TestServer *server = test_server_create (server_callback);
   RestProxy *proxy = rest_proxy_new (server->url, FALSE);
   RestProxyCall *call;
   GError *error = NULL;
@@ -289,7 +215,7 @@ params ()
 static void
 fail ()
 {
-  TestServer *server = create_server ();
+  TestServer *server = test_server_create (server_callback);
   RestProxy *proxy = rest_proxy_new (server->url, FALSE);
   RestProxyCall *call;
   GError *error = NULL;
@@ -317,7 +243,7 @@ fail ()
 static void
 useragent ()
 {
-  TestServer *server = create_server ();
+  TestServer *server = test_server_create (server_callback);
   RestProxy *proxy = rest_proxy_new (server->url, FALSE);
   RestProxyCall *call;
   GError *error = NULL;
@@ -372,7 +298,7 @@ cancel_cb (GObject      *source_object,
 static void
 cancel ()
 {
-  TestServer *server = create_server ();
+  TestServer *server = test_server_create (server_callback);
   RestProxy *proxy = rest_proxy_new (server->url, FALSE);
   RestProxyCall *call;
   GMainLoop *main_loop;
diff --git a/tests/test-server.c b/tests/test-server.c
new file mode 100644
index 0000000..a033aec
--- /dev/null
+++ b/tests/test-server.c
@@ -0,0 +1,90 @@
+/*
+ * librest - RESTful web services access
+ * Copyright (c) 2009 Intel Corporation.
+ *
+ * Authors: Timm Bäder <mail baedert org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+#include "test-server.h"
+
+TestServer *
+test_server_create (SoupServerCallback server_cb)
+{
+  TestServer *test_server;
+  GMainLoop *main_loop;
+  GMainContext *context;
+  SoupServer *server;
+  GError *error = NULL;
+  GSList *uris;
+  char *url;
+
+  context = g_main_context_new ();
+  g_main_context_push_thread_default (context);
+  main_loop = g_main_loop_new (context, FALSE);
+  server = soup_server_new (NULL);
+
+  soup_server_listen_local (server, 0, 0, &error);
+  g_assert_no_error (error);
+
+  soup_server_add_handler (server, "/", server_cb,
+                           NULL, NULL);
+
+  uris = soup_server_get_uris (server);
+  g_assert (g_slist_length (uris) > 0);
+  url = soup_uri_to_string (uris->data, FALSE);
+
+  test_server = g_slice_alloc (sizeof (TestServer));
+  test_server->server = server;
+  test_server->main_loop = main_loop;
+  test_server->url = url;
+  test_server->thread = NULL;
+
+  g_slist_free_full (uris, (GDestroyNotify)soup_uri_free);
+
+  g_main_context_pop_thread_default (context);
+
+  return test_server;
+}
+
+static void *
+test_server_thread_func (gpointer data)
+{
+  TestServer *server = data;
+
+  g_main_context_push_thread_default (g_main_loop_get_context (server->main_loop));
+  g_main_loop_run (server->main_loop);
+  g_main_context_pop_thread_default (g_main_loop_get_context (server->main_loop));
+
+  return NULL;
+}
+
+void
+test_server_run (TestServer *server)
+{
+  server->thread = g_thread_new ("Server Thread", test_server_thread_func, server);
+}
+
+void
+test_server_stop (TestServer *server)
+{
+  g_assert (server->thread);
+  g_main_loop_quit (server->main_loop);
+  g_thread_join (server->thread);
+  g_object_unref (server->server);
+  g_main_loop_unref (server->main_loop);
+  g_free (server->url);
+  g_slice_free (TestServer, server);
+}
diff --git a/tests/test-server.h b/tests/test-server.h
new file mode 100644
index 0000000..7866edb
--- /dev/null
+++ b/tests/test-server.h
@@ -0,0 +1,38 @@
+/*
+ * librest - RESTful web services access
+ * Copyright (c) 2009 Intel Corporation.
+ *
+ * Authors: Timm Bäder <mail baedert org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+#ifndef __TEST_SERVER_H
+#define __TEST_SERVER_H
+
+#include <libsoup/soup.h>
+
+typedef struct {
+  SoupServer *server;
+  GMainLoop  *main_loop;
+  char *url;
+  GThread *thread;
+} TestServer;
+
+void        test_server_stop   (TestServer *server);
+void        test_server_run    (TestServer *server);
+TestServer *test_server_create (SoupServerCallback server_cb);
+
+#endif
+
diff --git a/tests/threaded.c b/tests/threaded.c
index a251900..39da55e 100644
--- a/tests/threaded.c
+++ b/tests/threaded.c
@@ -26,11 +26,12 @@
 #include <stdlib.h>
 #include <libsoup/soup.h>
 #include <rest/rest-proxy.h>
+#include "test-server.h"
 
 const int N_THREADS = 10;
 
 static volatile int threads_done = 0;
-static const gboolean verbose = FALSE;
+static const gboolean verbose = TRUE;
 
 GMainLoop *main_loop;
 SoupServer *server;
@@ -80,37 +81,23 @@ func (gpointer data)
 
 static void ping ()
 {
+  TestServer *server = test_server_create (server_callback);
   GThread *threads[N_THREADS];
-  GError *error = NULL;
-  char *url;
   int i;
-  GSList *uris;
-
-  server = soup_server_new (NULL);
-  soup_server_listen_local (server, 0, 0, &error);
-  g_assert_no_error (error);
-
-  soup_server_add_handler (server, "/ping", server_callback,
-                           NULL, NULL);
-
-  uris = soup_server_get_uris (server);
-  g_assert (g_slist_length (uris) > 0);
-
-  url = soup_uri_to_string (uris->data, FALSE);
 
   main_loop = g_main_loop_new (NULL, TRUE);
 
+  test_server_run (server);
+
   for (i = 0; i < N_THREADS; i++) {
-    threads[i] = g_thread_new ("client thread", func, url);
+    threads[i] = g_thread_new ("client thread", func, server->url);
     if (verbose)
       g_print ("Starting thread %p\n", threads[i]);
   }
 
   g_main_loop_run (main_loop);
 
-  g_free (url);
-  g_slist_free_full (uris, (GDestroyNotify)soup_uri_free);
-  g_object_unref (server);
+  test_server_stop (server);
   g_main_loop_unref (main_loop);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]