[libgdata/offline-testing] tests: UNFINISHED work to factor out common testing code



commit f75c864655135c94b12c79a28dd086a91f3ee35e
Author: Philip Withnall <philip tecnocode co uk>
Date:   Mon Jul 8 16:00:18 2013 +0100

    tests: UNFINISHED work to factor out common testing code

 gdata/tests/common.c  |   82 ++++++++++++++++++++++++++++++++++++++++++++
 gdata/tests/common.h  |   29 +++++++++++++++
 gdata/tests/youtube.c |   91 +++++-------------------------------------------
 3 files changed, 121 insertions(+), 81 deletions(-)
---
diff --git a/gdata/tests/common.c b/gdata/tests/common.c
index 11a6054..27d96be 100644
--- a/gdata/tests/common.c
+++ b/gdata/tests/common.c
@@ -768,3 +768,85 @@ gdata_test_assert_handler (const gchar *message)
        gdata_test_debug_output ();
        printf ("%s", (gchar*) message);
 }
+
+/**
+ * gdata_test_set_https_port:
+ * @server: a #GDataMockServer
+ *
+ * Sets the HTTPS port used for all future libgdata requests to that used by the given mock @server,
+ * effectively redirecting all client requests to the mock server.
+ *
+ * Since: 0.13.4
+ */
+void
+gdata_test_set_https_port (GDataMockServer *server)
+{
+       gchar *port_string = g_strdup_printf ("%u", gdata_mock_server_get_port (server));
+       g_setenv ("LIBGDATA_HTTPS_PORT", port_string, TRUE);
+       g_free (port_string);
+}
+
+/**
+ * gdata_test_mock_server_start_trace:
+ * @server: a #GDataMockServer
+ * @trace_filename: filename of the trace to load
+ *
+ * Wrapper around gdata_mock_server_start_trace() which additionally sets the <code 
class="literal">LIBGDATA_HTTPS_PORT</code>
+ * environment variable to redirect all libgdata requests to the mock server.
+ *
+ * Since: 0.13.4
+ */
+void
+gdata_test_mock_server_start_trace (GDataMockServer *server, const gchar *trace_filename)
+{
+       gdata_mock_server_start_trace (server, trace_filename);
+       gdata_test_set_https_port (server);
+}
+
+/**
+ * gdata_test_mock_server_handle_message_error:
+ * @server: a #GDataMockServer
+ * @message: the message whose response should be filled
+ * @client: the currently connected client
+ * @user_data: user data provided when connecting the signal
+ *
+ * Handler for #GDataMockServer::handle-message which sets the HTTP response for @message to the HTTP error 
status
+ * specified in a #GDataTestRequestErrorData structure passed to @user_data.
+ *
+ * Since: 0.13.4
+ */
+gboolean
+gdata_test_mock_server_handle_message_error (GDataMockServer *server, SoupMessage *message, 
SoupClientContext *client, gpointer user_data)
+{
+       const GDataTestRequestErrorData *data = user_data;
+
+       soup_message_set_status_full (message, data->status_code, data->reason_phrase);
+       soup_message_body_append (message->response_body, SOUP_MEMORY_STATIC, data->message_body, strlen 
(data->message_body));
+
+       return TRUE;
+}
+
+/**
+ * gdata_test_mock_server_handle_message_timeout:
+ * @server: a #GDataMockServer
+ * @message: the message whose response should be filled
+ * @client: the currently connected client
+ * @user_data: user data provided when connecting the signal
+ *
+ * Handler for #GDataMockServer::handle-message which waits for 2 seconds before returning a 
%SOUP_STATUS_REQUEST_TIMEOUT status
+ * and appropriate error message body. If used in conjunction with a 1 second timeout in the client code 
under test, this can
+ * simulate network error conditions and timeouts, in order to test the error handling code for such 
conditions.
+ *
+ * Since: 0.13.4
+ */
+gboolean
+gdata_test_mock_server_handle_message_timeout (GDataMockServer *server, SoupMessage *message, 
SoupClientContext *client, gpointer user_data)
+{
+       /* Sleep for longer than the timeout set on the client. */
+       g_usleep (2 * G_USEC_PER_SEC);
+
+       soup_message_set_status_full (message, SOUP_STATUS_REQUEST_TIMEOUT, "Request Timeout");
+       soup_message_body_append (message->response_body, SOUP_MEMORY_STATIC, "Request timed out.", strlen 
("Request timed out."));
+
+       return TRUE;
+}
diff --git a/gdata/tests/common.h b/gdata/tests/common.h
index 0d76af9..7f22065 100644
--- a/gdata/tests/common.h
+++ b/gdata/tests/common.h
@@ -291,6 +291,35 @@ void gdata_tear_down_async_test_data (GDataAsyncTestData *async_data, gconstpoin
 /* Debugging output in case of assert failure */
 void gdata_test_debug_output (void);
 
+/**
+ * GDataTestRequestErrorData:
+ * @status_code: HTTP response status code
+ * @reason_phrase: HTTP response status phrase
+ * @message_body: HTTP response message body
+ * @error_domain_func: constant function returning the #GQuark for the expected error domain
+ * @error_code: expected error code
+ *
+ * A mapping between a HTTP response emitted by a #GDataMockServer and the error expected to be thrown by 
the HTTP client.
+ * This is designed for testing error handling in the client code, typically by running a single request 
through an array
+ * of these such mappings and testing the client code throws the correct error in each case.
+ *
+ * Since: 0.13.4
+ */
+typedef struct {
+       /* HTTP response. */
+       guint status_code;
+       const gchar *reason_phrase;
+       const gchar *message_body;
+       /* Expected GData error. */
+       GQuark (*error_domain_func) (void); /* typically gdata_service_error_quark */
+       gint error_code;
+} GDataTestRequestErrorData;
+
+void gdata_test_set_https_port (GDataMockServer *server);
+void gdata_test_mock_server_start_trace (GDataMockServer *server, const gchar *trace_filename);
+gboolean gdata_test_mock_server_handle_message_error (GDataMockServer *server, SoupMessage *message, 
SoupClientContext *client, gpointer user_data);
+gboolean gdata_test_mock_server_handle_message_timeout (GDataMockServer *server, SoupMessage *message, 
SoupClientContext *client, gpointer user_data);
+
 G_END_DECLS
 
 #endif /* !GDATA_TEST_COMMON_H */
diff --git a/gdata/tests/youtube.c b/gdata/tests/youtube.c
index efff441..6bd7f20 100644
--- a/gdata/tests/youtube.c
+++ b/gdata/tests/youtube.c
@@ -29,21 +29,6 @@
 static GDataMockServer *mock_server = NULL;
 
 static void
-gdata_test_set_https_port (GDataMockServer *server)
-{
-       gchar *port_string = g_strdup_printf ("%u", gdata_mock_server_get_port (server));
-       g_setenv ("LIBGDATA_HTTPS_PORT", port_string, TRUE);
-       g_free (port_string);
-}
-
-static void
-gdata_test_mock_server_start_trace (GDataMockServer *server, const gchar *trace_filename)
-{
-       gdata_mock_server_start_trace (server, trace_filename);
-       gdata_test_set_https_port (server);
-}
-
-static void
 test_authentication (void)
 {
        gboolean retval;
@@ -75,16 +60,8 @@ test_authentication (void)
        gdata_mock_server_end_trace (mock_server);
 }
 
-/* TODO: Document me. */
-typedef struct {
-       guint status_code;
-       const gchar *reason_phrase;
-       const gchar *message_body;
-       GQuark (*error_domain_func) (void); /* typically gdata_service_error_quark */
-       gint error_code;
-} RequestErrorData;
-
-static const RequestErrorData authentication_errors[] = {
+/* HTTP message responses and the expected associated GData error domain/code. */
+static const GDataTestRequestErrorData authentication_errors[] = {
        /* Generic network errors. */
        { SOUP_STATUS_BAD_REQUEST, "Bad Request", "Invalid parameter ‘foobar’.",
          gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
@@ -130,17 +107,6 @@ static const RequestErrorData authentication_errors[] = {
          gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
 };
 
-static gboolean
-authentication_error_cb (GDataMockServer *self, SoupMessage *message, SoupClientContext *client, gpointer 
user_data)
-{
-       const RequestErrorData *data = user_data;
-
-       soup_message_set_status_full (message, data->status_code, data->reason_phrase);
-       soup_message_body_append (message->response_body, SOUP_MEMORY_STATIC, data->message_body, strlen 
(data->message_body));
-
-       return TRUE;
-}
-
 static void
 test_authentication_error (void)
 {
@@ -159,9 +125,9 @@ test_authentication_error (void)
        }
 
        for (i = 0; i < G_N_ELEMENTS (authentication_errors); i++) {
-               const RequestErrorData *data = &authentication_errors[i];
+               const GDataTestRequestErrorData *data = &authentication_errors[i];
 
-               handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) 
authentication_error_cb, (gpointer) data);
+               handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) 
gdata_test_mock_server_handle_message_error, (gpointer) data);
                gdata_mock_server_run (mock_server);
                gdata_test_set_https_port (mock_server);
 
@@ -190,18 +156,6 @@ test_authentication_error (void)
        }
 }
 
-static gboolean
-authentication_timeout_cb (GDataMockServer *self, SoupMessage *message, SoupClientContext *client, gpointer 
user_data)
-{
-       /* Sleep for longer than the timeout, set below. */
-       g_usleep (2 * G_USEC_PER_SEC);
-
-       soup_message_set_status_full (message, SOUP_STATUS_REQUEST_TIMEOUT, "Request Timeout");
-       soup_message_body_append (message->response_body, SOUP_MEMORY_STATIC, "Request timed out.", strlen 
("Request timed out."));
-
-       return TRUE;
-}
-
 static void
 test_authentication_timeout (void)
 {
@@ -218,7 +172,7 @@ test_authentication_timeout (void)
                return;
        }
 
-       handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) authentication_timeout_cb, 
NULL);
+       handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) 
gdata_test_mock_server_handle_message_timeout, NULL);
        gdata_mock_server_run (mock_server);
        gdata_test_set_https_port (mock_server);
 
@@ -390,8 +344,8 @@ test_query_standard_feed_with_query (gconstpointer service)
        gdata_mock_server_end_trace (mock_server);
 }
 
-/* TODO: Document me. */
-static const RequestErrorData query_standard_feed_errors[] = {
+/* HTTP message responses and the expected associated GData error domain/code. */
+static const GDataTestRequestErrorData query_standard_feed_errors[] = {
        /* Generic network errors. */
        { SOUP_STATUS_BAD_REQUEST, "Bad Request", "Invalid parameter ‘foobar’.",
          gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
@@ -441,18 +395,6 @@ static const RequestErrorData query_standard_feed_errors[] = {
          gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
 };
 
-/* TODO: Factor this out */
-static gboolean
-query_standard_feed_error_cb (GDataMockServer *self, SoupMessage *message, SoupClientContext *client, 
gpointer user_data)
-{
-       const RequestErrorData *data = user_data;
-
-       soup_message_set_status_full (message, data->status_code, data->reason_phrase);
-       soup_message_body_append (message->response_body, SOUP_MEMORY_STATIC, data->message_body, strlen 
(data->message_body));
-
-       return TRUE;
-}
-
 static void
 test_query_standard_feed_error (gconstpointer service)
 {
@@ -470,9 +412,9 @@ test_query_standard_feed_error (gconstpointer service)
        }
 
        for (i = 0; i < G_N_ELEMENTS (query_standard_feed_errors); i++) {
-               const RequestErrorData *data = &query_standard_feed_errors[i];
+               const GDataTestRequestErrorData *data = &query_standard_feed_errors[i];
 
-               handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) 
query_standard_feed_error_cb, (gpointer) data);
+               handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) 
gdata_test_mock_server_handle_message_error, (gpointer) data);
                gdata_mock_server_run (mock_server);
                gdata_test_set_https_port (mock_server);
 
@@ -487,19 +429,6 @@ test_query_standard_feed_error (gconstpointer service)
        }
 }
 
-/* TODO: factor this out */
-static gboolean
-query_standard_feed_timeout_cb (GDataMockServer *self, SoupMessage *message, SoupClientContext *client, 
gpointer user_data)
-{
-       /* Sleep for longer than the timeout, set below. */
-       g_usleep (2 * G_USEC_PER_SEC);
-
-       soup_message_set_status_full (message, SOUP_STATUS_REQUEST_TIMEOUT, "Request Timeout");
-       soup_message_body_append (message->response_body, SOUP_MEMORY_STATIC, "Request timed out.", strlen 
("Request timed out."));
-
-       return TRUE;
-}
-
 static void
 test_query_standard_feed_timeout (gconstpointer service)
 {
@@ -515,7 +444,7 @@ test_query_standard_feed_timeout (gconstpointer service)
                return;
        }
 
-       handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) 
query_standard_feed_timeout_cb, NULL);
+       handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) 
gdata_test_mock_server_handle_message_timeout, NULL);
        gdata_mock_server_run (mock_server);
        gdata_test_set_https_port (mock_server);
 


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