1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
/*
* 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>
const int N_THREADS = 10;
static volatile int threads_done = 0;
static const gboolean verbose = FALSE;
GMainLoop *main_loop;
SoupServer *server;
static void
#ifdef WITH_SOUP_2
server_callback (SoupServer *server, SoupMessage *msg,
const char *path, GHashTable *query,
SoupClientContext *client, gpointer user_data)
#else
server_callback (SoupServer *server, SoupServerMessage *msg,
const char *path, GHashTable *query, gpointer user_data)
#endif
{
g_assert_cmpstr (path, ==, "/ping");
#ifdef WITH_SOUP_2
soup_message_set_status (msg, SOUP_STATUS_OK);
#else
soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL);
#endif
g_atomic_int_add (&threads_done, 1);
if (threads_done == N_THREADS) {
g_main_loop_quit (main_loop);
}
}
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");
g_assert (rest_proxy_call_sync (call, &error));
g_assert_no_error (error);
g_assert_cmpint (rest_proxy_call_get_status_code (call), ==, SOUP_STATUS_OK);
if (verbose)
g_print ("Thread %p done\n", g_thread_self ());
g_object_unref (call);
g_object_unref (proxy);
return NULL;
}
static void ping ()
{
GThread *threads[N_THREADS];
GError *error = NULL;
char *url;
int i;
GSList *uris;
server = soup_server_new (NULL, NULL);
soup_server_listen_local (server, 0, SOUP_SERVER_LISTEN_IPV4_ONLY, &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);
#ifdef WITH_SOUP_2
url = soup_uri_to_string (uris->data, FALSE);
#else
url = g_uri_to_string (uris->data);
#endif
main_loop = g_main_loop_new (NULL, TRUE);
for (i = 0; i < N_THREADS; i++) {
threads[i] = g_thread_new ("client thread", func, url);
if (verbose)
g_print ("Starting thread %p\n", threads[i]);
}
g_main_loop_run (main_loop);
g_free (url);
#ifdef WITH_SOUP_2
g_slist_free_full (uris, (GDestroyNotify)soup_uri_free);
#else
g_slist_free_full (uris, (GDestroyNotify)g_uri_unref);
#endif
g_object_unref (server);
g_main_loop_unref (main_loop);
}
int
main (int argc, char **argv)
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/threaded/ping", ping);
return g_test_run ();
}
|