From: <svn...@op...> - 2009-03-23 14:48:20
|
Author: bellmich Date: Mon Mar 23 15:48:13 2009 New Revision: 1006 URL: http://libsyncml.opensync.org/changeset/1006 Log: added some code to test the http client of libsyncml Modified: trunk/tests/check_libsoup.c Modified: trunk/tests/check_libsoup.c ============================================================================== --- trunk/tests/check_libsoup.c Mon Mar 23 13:10:01 2009 (r1005) +++ trunk/tests/check_libsoup.c Mon Mar 23 15:48:13 2009 (r1006) @@ -20,6 +20,7 @@ #include "support.h" #include <libsyncml/sml_queue_internals.h> +#include <libsyncml/sml_transport_internals.h> #include <libsoup/soup-session-async.h> #include <libsoup/soup-uri.h> @@ -59,6 +60,7 @@ void transport_dummy_callback(void *message, void *userdata) { /* this function should never be called */ + smlTrace(TRACE_ERROR, "%s", __func__); g_atomic_int_inc(&server_errors); } @@ -94,8 +96,18 @@ } else { g_atomic_int_inc(&server_errors); } - /* glib has problems if it must print NULL on Solaris */ + + /* prepare the response*/ + soup_message_set_status (msg, SOUP_STATUS_OK); + soup_message_set_response ( + msg, SML_ELEMENT_XML, +#ifdef HAVE_LIBSOUP22 + SOUP_BUFFER_STATIC, +#else + SOUP_MEMORY_STATIC, +#endif + "answer", 6); smlTrace(TRACE_EXIT, "%s", __func__); } @@ -119,6 +131,7 @@ SoupServer *server; static void init_server(unsigned int port) { + smlTrace(TRACE_ENTRY, "%s", __func__); SmlError *error = NULL; /* prepare asynchronous runtime environment */ @@ -156,10 +169,13 @@ /* start thread */ smlThreadStart(server_thread); + + smlTrace(TRACE_EXIT, "%s", __func__); } static void cleanup_server() { + smlTrace(TRACE_ENTRY, "%s", __func__); /* wait until message was received by server */ int64_t sleep_max = 5000000000LL; @@ -184,11 +200,107 @@ soup_server_quit(server); g_object_unref(server); smlQueueFree(queue); + smlTrace(TRACE_EXIT, "%s", __func__); + +} + +SmlBool _recv_client_event( + SmlTransport *tsp, + SmlLink *link, + SmlTransportEventType type, + SmlTransportData *data, + SmlError *error, + void *userdata) +{ + smlTrace(TRACE_ENTRY, "%s(%d)", __func__, type); + + sml_fail_unless(GPOINTER_TO_INT(userdata) == 1, NULL); + + switch (type) { + case SML_TRANSPORT_EVENT_CONNECT_DONE: + g_atomic_int_inc(&client_connects); + break; + case SML_TRANSPORT_EVENT_DISCONNECT_DONE: + g_atomic_int_inc(&client_disconnects); + break; + case SML_TRANSPORT_EVENT_DATA: + sml_fail_unless(!strcmp(data->data, "answer"), NULL); + sml_fail_unless(data->size == 6, NULL); + sml_fail_unless(data->type == SML_MIMETYPE_XML, NULL); + g_atomic_int_inc(&client_messages); + break; + case SML_TRANSPORT_EVENT_ERROR: + sml_fail_unless(error != NULL, NULL); + g_atomic_int_inc(&client_errors); + break; + default: + sml_fail_unless(FALSE, "An unexpected transport event %d was received.", type); + break; + } + + smlTrace(TRACE_EXIT, "%s()", __func__); + return TRUE; +} + +static void run_transport_client(const char *url) +{ + smlTrace(TRACE_ENTRY, "%s", __func__); + SmlError *error = NULL; + + /* init client */ + + SmlTransport *client = smlTransportNew(SML_TRANSPORT_HTTP_CLIENT, &error); + sml_fail_unless(smlTransportSetConfigOption(client, "URL", url, &error), NULL); + smlTransportSetEventCallback(client, _recv_client_event, GINT_TO_POINTER(1)); + sml_fail_unless(smlTransportInitialize(client, &error), "%s", smlErrorPrint(&error)); + + /* send test message */ + + SmlTransportData *data = smlTransportDataNew("test", 4, SML_MIMETYPE_XML, FALSE, &error); + sml_fail_unless(data != NULL, NULL); + sml_fail_unless(error == NULL, NULL); + + sml_fail_unless(smlTransportSend(client, NULL, data, &error), NULL); + sml_fail_unless(error == NULL, NULL); + + smlTransportDataDeref(data); + + /* wait for client connect */ + + int64_t sleep_max = 5000000000LL; + int64_t sleep_interval = 50000000; + int64_t sleep_total = 0; + while (client_connects < 1 && sleep_total < sleep_max) + { + sml_sleep(sleep_interval); + sleep_total += sleep_interval; + } + sml_fail_unless(sleep_total < sleep_max, "client connect timed out"); + + /* cleanup client */ + + sml_fail_unless(smlTransportDisconnect(client, NULL, &error), "%s", smlErrorPrint(&error)); + sleep_total = 0; + while (client_disconnects < 1 && sleep_total < sleep_max) + { + sml_sleep(sleep_interval); + sleep_total += sleep_interval; + } + sml_fail_unless(sleep_total < sleep_max, "client disconnect timed out"); + sml_fail_unless(smlTransportFinalize(client, &error), NULL); + smlTransportFree(client); + + /* verify results */ + sml_fail_unless(client_errors == 0, NULL); + // sml_fail_unless(client_messages != 0, NULL); + + smlTrace(TRACE_EXIT, "%s", __func__); } START_TEST (libsoup_async) { + smlTrace(TRACE_ENTRY, "%s", __func__); init_testbed(); SmlError *error = NULL; @@ -228,15 +340,48 @@ soup_session_queue_message(session, msg, client_callback, NULL); #endif - /* cleanup */ + /* test and cleanup server */ cleanup_server(); + + /* wait for client disconnect */ + + int64_t sleep_max = 5000000000LL; + int64_t sleep_interval = 50000000; + int64_t sleep_total = 0; + while (client_messages < 1 && sleep_total < sleep_max) + { + sml_sleep(sleep_interval); + sleep_total += sleep_interval; + } + sml_fail_unless(sleep_total < sleep_max, "client disconnect timed out"); + smlTrace(TRACE_INTERNAL, "%s: aborting session", __func__); soup_session_abort(session); - g_object_unref(session); + // FIXME: This crashes sometimes. + // smlTrace(TRACE_INTERNAL, "%s: unref session", __func__); + // g_object_unref(session); + #ifndef HAVE_LIBSOUP22_SOLARIS + smlTrace(TRACE_INTERNAL, "%s: cleanup client thread", __func__); smlThreadStop(client_thread); smlThreadFree(client_thread); + smlTrace(TRACE_INTERNAL, "%s: cleanup client context", __func__); g_main_context_unref(client_ctx); #endif + + smlTrace(TRACE_EXIT, "%s", __func__); +} +END_TEST + +START_TEST (libsoup_http_client) +{ + smlTrace(TRACE_ENTRY, "%s", __func__); + init_testbed(); + SmlError *error = NULL; + + init_server(13002); + run_transport_client("http://127.0.0.1:13002"); + cleanup_server(); + smlTrace(TRACE_EXIT, "%s", __func__); } END_TEST @@ -246,6 +391,7 @@ //Suite *s2 = suite_create("libsoup validation"); create_case(s, "libsoup_async", libsoup_async); + create_case(s, "libsoup_http_client", libsoup_http_client); return s; } |