diff options
author | Ross Burton <ross@linux.intel.com> | 2009-05-29 16:57:36 +0100 |
---|---|---|
committer | Ross Burton <ross@linux.intel.com> | 2009-05-29 16:57:36 +0100 |
commit | 0266c22844c7f770863440d8e8b4215c3b7467f5 (patch) | |
tree | f4f41ed49fd4cae4168bc5ad888899e9000e8251 | |
parent | 3ee0889aaf55c24aa8be7e14ccfc8bd6923bb10c (diff) |
Add basic test case for threaded ops
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 3 | ||||
-rw-r--r-- | tests/threaded.c | 109 |
3 files changed, 112 insertions, 1 deletions
@@ -40,4 +40,5 @@ examples/test-facebook tests/oauth tests/proxy tests/flickr +tests/threaded rest/test-runner diff --git a/tests/Makefile.am b/tests/Makefile.am index 7a930d9..5e48c8a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,4 +1,4 @@ -TESTS = proxy oauth flickr +TESTS = proxy threaded oauth flickr AM_CPPFLAGS = $(SOUP_CFLAGS) -I$(top_srcdir) AM_LDFLAGS = $(SOUP_LIBS) ../rest/librest.la @@ -6,5 +6,6 @@ AM_LDFLAGS = $(SOUP_LIBS) ../rest/librest.la check_PROGRAMS = $(TESTS) proxy_SOURCES = proxy.c +threaded_SOURCES = threaded.c oauth_SOURCES = oauth.c flickr_SOURCES = flickr.c diff --git a/tests/threaded.c b/tests/threaded.c new file mode 100644 index 0000000..2ecfe49 --- /dev/null +++ b/tests/threaded.c @@ -0,0 +1,109 @@ +/* + * librest - RESTful web services access + * Copyright (c) 2009 Intel Corporation. + * + * Authors: Rob Bradford <rob@linux.intel.com> + * Ross Burton <ross@linux.intel.com> + * + * 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 <config.h> + +#include <string.h> +#include <stdlib.h> +#include <libsoup/soup.h> +#include <rest/rest-proxy.h> + +static volatile int errors = 0; + +static void +server_callback (SoupServer *server, SoupMessage *msg, + const char *path, GHashTable *query, + SoupClientContext *client, gpointer user_data) +{ + if (g_str_equal (path, "/ping")) { + soup_message_set_status (msg, SOUP_STATUS_OK); + } else { + soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED); + } +} + +static gpointer +func (gpointer data) +{ + RestProxy *proxy; + RestProxyCall *call; + const char *url = data; + GError *error = NULL; + + proxy = rest_proxy_new (url, FALSE); + call = rest_proxy_new_call (proxy); + rest_proxy_call_set_function (call, "ping"); + + if (!rest_proxy_call_sync (call, &error)) { + g_printerr ("Call failed: %s\n", error->message); + g_error_free (error); + g_atomic_int_add (&errors, 1); + goto done; + } + + if (rest_proxy_call_get_status_code (call) != SOUP_STATUS_OK) { + g_printerr ("Wrong response code, got %d\n", rest_proxy_call_get_status_code (call)); + g_atomic_int_add (&errors, 1); + goto done; + } + + g_print ("Thread %p done\n", g_thread_self ()); + + done: + g_object_unref (call); + g_object_unref (proxy); + return NULL; +} + +int +main (int argc, char **argv) +{ + SoupSession *session; + SoupServer *server; + GThread *threads[10]; + char *url; + int i; + + g_thread_init (NULL); + g_type_init (); + + session = soup_session_sync_new (); + + server = soup_server_new (NULL); + soup_server_add_handler (server, NULL, server_callback, NULL, NULL); + g_thread_create (soup_server_run, server, FALSE, NULL); + + url = g_strdup_printf ("http://localhost:%d/", soup_server_get_port (server)); + + for (i = 0; i < G_N_ELEMENTS (threads); i++) { + threads[i] = g_thread_create (func, url, TRUE, NULL); + g_print ("Starting thread %p\n", threads[i]); + } + + for (i = 0; i < G_N_ELEMENTS (threads); i++) { + g_thread_join (threads[i]); + } + + g_free (url); + + return errors != 0; +} |