[libgdata/offline-testing] tests: UNFINISHED fixes to mock server/resolver support



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]