[libgdata/offline-testing] tests: UNFINISHED fixes to mock server/resolver support
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgdata/offline-testing] tests: UNFINISHED fixes to mock server/resolver support
- Date: Wed, 31 Jul 2013 07:21:14 +0000 (UTC)
commit 3d6a40f8ac5a2579a699ee457a28b1c0c227ae25
Author: Philip Withnall <philip tecnocode co uk>
Date: Tue Jul 30 13:49:14 2013 +0200
tests: UNFINISHED fixes to mock server/resolver support
One of these days I’ll tidy up these commit messages.
gdata/tests/common.c | 18 +++++++++++++-
gdata/tests/mock-server.c | 56 +++++++++++++++++++++++++++++++++++---------
gdata/tests/mock-server.h | 4 +++
3 files changed, 64 insertions(+), 14 deletions(-)
---
diff --git a/gdata/tests/common.c b/gdata/tests/common.c
index f1d7c61..0d05a61 100644
--- a/gdata/tests/common.c
+++ b/gdata/tests/common.c
@@ -121,8 +121,8 @@ gdata_test_init (int argc, char **argv)
/* Set handler for printerr */
g_set_printerr_handler ((GPrintFunc) gdata_test_assert_handler);
- /* Enable full debugging */
- g_setenv ("LIBGDATA_DEBUG", "4" /* GDATA_LOG_FULL */, FALSE); /* TODO */
+ /* Enable full debugging. These options are seriously unsafe, but we don't care for test cases. */
+ g_setenv ("LIBGDATA_DEBUG", "4" /* GDATA_LOG_FULL_UNREDACTED */, FALSE);
g_setenv ("G_MESSAGES_DEBUG", "libgdata", FALSE);
g_setenv ("LIBGDATA_LAX_SSL_CERTIFICATES", "1", FALSE);
@@ -791,8 +791,22 @@ gdata_test_set_https_port (GDataMockServer *server)
void
gdata_test_mock_server_start_trace (GDataMockServer *server, const gchar *trace_filename)
{
+ const gchar *ip_address;
+ GDataMockResolver *resolver;
+
gdata_mock_server_start_trace (server, trace_filename);
gdata_test_set_https_port (server);
+
+ /* Set up the expected domain names here. This should technically be split up between
+ * the different unit test suites, but that's too much effort. */
+ ip_address = soup_address_get_physical (gdata_mock_server_get_address (server));
+ resolver = gdata_mock_server_get_resolver (server);
+
+ gdata_mock_resolver_add_A (resolver, "www.google.com", ip_address);
+ gdata_mock_resolver_add_A (resolver, "gdata.youtube.com", ip_address);
+ gdata_mock_resolver_add_A (resolver, "uploads.gdata.youtube.com", ip_address);
+ gdata_mock_resolver_add_A (resolver, "picasaweb.google.com", ip_address);
+ gdata_mock_resolver_add_A (resolver, "docs.google.com", ip_address);
}
/**
diff --git a/gdata/tests/mock-server.c b/gdata/tests/mock-server.c
index 600b844..e6bb10c 100644
--- a/gdata/tests/mock-server.c
+++ b/gdata/tests/mock-server.c
@@ -93,6 +93,7 @@ enum {
PROP_ENABLE_LOGGING,
PROP_ADDRESS,
PROP_PORT,
+ PROP_RESOLVER,
};
enum {
@@ -161,7 +162,7 @@ gdata_mock_server_class_init (GDataMockServerClass *klass)
* gdata_mock_server_stop().
*
* This should not normally need to be passed into client code under test, unless the code references
IP addresses specifically. The mock server
- * runs a DNS resolver which automatically redirects client requests for known domain names to this
address.
+ * runs a DNS resolver which automatically redirects client requests for known domain names to this
address (#GDataMockServer:resolver).
*/
g_object_class_install_property (gobject_class, PROP_ADDRESS,
g_param_spec_object ("address",
@@ -185,6 +186,22 @@ gdata_mock_server_class_init (GDataMockServerClass *klass)
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
+ * GDataMockServer:resolver:
+ *
+ * Mock resolver used to redirect HTTP requests from specified domain names to the local mock server
instance. This will always be set while the
+ * server is running (between calls to gdata_mock_server_run() and gdata_mock_server_stop()), and is
%NULL otherwise.
+ *
+ * Use the resolver specified in this property to add domain names which are expected to be requested
by the current trace. Domain names not added
+ * to the resolver will be rejected by the mock server. The set of domain names in the resolver will
be reset when gdata_mock_server_stop() is
+ * called.
+ */
+ g_object_class_install_property (gobject_class, PROP_RESOLVER,
+ g_param_spec_object ("resolver",
+ "Resolver", "Mock resolver used to redirect
HTTP requests to the local mock server instance.",
+ GDATA_TYPE_MOCK_RESOLVER,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ /**
* GDataMockServer::handle-message:
*
* Emitted whenever the mock server is running and receives a request from a client. Test code may
connect to this signal and implement a handler
@@ -251,6 +268,9 @@ gdata_mock_server_get_property (GObject *object, guint property_id, GValue *valu
case PROP_PORT:
g_value_set_uint (value, priv->port);
break;
+ case PROP_RESOLVER:
+ g_value_set_object (value, priv->resolver);
+ break;
default:
/* We don't have any other property... */
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -275,6 +295,7 @@ gdata_mock_server_set_property (GObject *object, guint property_id, const GValue
break;
case PROP_ADDRESS:
case PROP_PORT:
+ case PROP_RESOLVER:
/* Read-only. */
default:
/* We don't have any other property... */
@@ -1050,7 +1071,7 @@ server_thread_cb (gpointer user_data)
*
* Runs the mock server, binding to a loopback TCP/IP interface and preparing a HTTPS server which is ready
to accept requests.
* The TCP/IP address and port number are chosen randomly out of the loopback addresses, and are exposed as
#GDataMockServer:address and #GDataMockServer:port
- * once this function has returned.
+ * once this function has returned. A #GDataMockResolver (exposed as #GDataMockServer:resolver) is set as
the default #GResolver while the server is running.
*
* The server is started in a worker thread, so this function returns immediately and the server continues
to run in the background. Use gdata_mock_server_stop()
* to shut it down.
@@ -1064,7 +1085,6 @@ gdata_mock_server_run (GDataMockServer *self)
struct sockaddr_in sock;
SoupAddress *addr;
GMainContext *thread_context;
- const gchar *ip_address;
g_return_if_fail (GDATA_IS_MOCK_SERVER (self));
g_return_if_fail (priv->resolver == NULL);
@@ -1102,15 +1122,10 @@ gdata_mock_server_run (GDataMockServer *self)
g_object_notify (G_OBJECT (self), "port");
g_object_thaw_notify (G_OBJECT (self));
- ip_address = soup_address_get_physical (priv->address);
-
- /* Set up the resolver, adding some expected hostnames. TODO: Do this dynamically. */
+ /* Set up the resolver. It is expected that callers will grab the resolver (by calling
gdata_mock_server_get_resolver())
+ * immediately after this function returns, and add some expected hostnames by calling
gdata_mock_resolver_add_A() one or
+ * more times, before starting the next test. */
priv->resolver = gdata_mock_resolver_new ();
- gdata_mock_resolver_add_A (priv->resolver, "www.google.com", ip_address);
- gdata_mock_resolver_add_A (priv->resolver, "gdata.youtube.com", ip_address);
- gdata_mock_resolver_add_A (priv->resolver, "uploads.gdata.youtube.com", ip_address);
- gdata_mock_resolver_add_A (priv->resolver, "picasaweb.google.com", ip_address);
-
g_resolver_set_default (G_RESOLVER (priv->resolver));
/* Start the network thread. */
@@ -1123,7 +1138,8 @@ gdata_mock_server_run (GDataMockServer *self)
*
* Stops a mock server started by calling gdata_mock_server_run(). This shuts down the server's worker
thread and unbinds it from its TCP/IP socket.
*
- * This unloads any trace file loaded by calling gdata_mock_server_load_trace() (or its asynchronous
counterpart).
+ * This unloads any trace file loaded by calling gdata_mock_server_load_trace() (or its asynchronous
counterpart). It also resets the set of domain
+ * names loaded into the #GDataMockServer:resolver.
*
* This function always succeeds.
*/
@@ -1503,3 +1519,19 @@ gdata_mock_server_get_port (GDataMockServer *self)
return self->priv->port;
}
+
+/**
+ * gdata_mock_server_get_resolver:
+ * @self: a #GDataMockServer
+ *
+ * Gets the value of the #GDataMockServer:resolver property.
+ *
+ * Return value: (allow-none) (transfer none): the mock resolver in use by the mock server, or %NULL if no
resolver is active
+ */
+GDataMockResolver *
+gdata_mock_server_get_resolver (GDataMockServer *self)
+{
+ g_return_val_if_fail (GDATA_IS_MOCK_SERVER (self), NULL);
+
+ return self->priv->resolver;
+}
diff --git a/gdata/tests/mock-server.h b/gdata/tests/mock-server.h
index bc175a0..a3afd57 100644
--- a/gdata/tests/mock-server.h
+++ b/gdata/tests/mock-server.h
@@ -24,6 +24,8 @@
#include <glib-object.h>
#include <gio/gio.h>
+#include "mock-resolver.h"
+
G_BEGIN_DECLS
#define GDATA_TYPE_MOCK_SERVER (gdata_mock_server_get_type ())
@@ -83,6 +85,8 @@ void gdata_mock_server_received_message_chunk (GDataMockServer *self, const gcha
SoupAddress *gdata_mock_server_get_address (GDataMockServer *self);
guint gdata_mock_server_get_port (GDataMockServer *self);
+GDataMockResolver *gdata_mock_server_get_resolver (GDataMockServer *self) G_GNUC_WARN_UNUSED_RESULT;
+
G_END_DECLS
#endif /* !GDATA_MOCK_SERVER_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]