[libgdata/offline-testing] tests: UNFINISHED work to factor out common testing code
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgdata/offline-testing] tests: UNFINISHED work to factor out common testing code
- Date: Tue, 30 Jul 2013 08:27:12 +0000 (UTC)
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]