summaryrefslogtreecommitdiff
path: root/tests/cached-resolver-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/cached-resolver-test.c')
-rw-r--r--tests/cached-resolver-test.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/tests/cached-resolver-test.c b/tests/cached-resolver-test.c
new file mode 100644
index 00000000..54540363
--- /dev/null
+++ b/tests/cached-resolver-test.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2019 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "test-utils.h"
+
+static void
+test_cached_resolver (void)
+{
+ GResolver *default_resolver = g_resolver_get_default ();
+ GResolver *cached_resolver;
+ GList *results;
+ double default_time, cached_time;
+ guint i;
+
+ /* Just verify caching works at a basic level by being faster */
+
+ g_assert_false (SOUP_IS_CACHED_RESOLVER (default_resolver));
+
+ /* Warm any DNS cache */
+ results = g_resolver_lookup_by_name (default_resolver, "gnome.org", NULL, NULL);
+ g_assert_nonnull (results);
+ g_resolver_free_addresses (results);
+
+ g_test_timer_start ();
+
+ for (i = 0; i < 100; ++i) {
+ results = g_resolver_lookup_by_name (default_resolver, "gnome.org", NULL, NULL);
+ g_assert_nonnull (results);
+ g_resolver_free_addresses (results);
+ }
+ default_time = g_test_timer_elapsed ();
+
+ soup_cached_resolver_ensure_default ();
+ /* Test that its safe to call multiple times */
+ soup_cached_resolver_ensure_default ();
+
+ cached_resolver = g_resolver_get_default ();
+ g_assert_true (SOUP_IS_CACHED_RESOLVER (cached_resolver));
+
+
+ /* Warm the DNS cache */
+ results = g_resolver_lookup_by_name (cached_resolver, "gnome.org", NULL, NULL);
+ g_assert_nonnull (results);
+ g_resolver_free_addresses (results);
+
+ g_test_timer_start ();
+
+ for (i = 0; i < 100; ++i) {
+ results = g_resolver_lookup_by_name (cached_resolver, "gnome.org", NULL, NULL);
+ g_assert_nonnull (results);
+ g_resolver_free_addresses (results);
+ }
+ cached_time = g_test_timer_elapsed ();
+
+ /* Cached will always be faster or else whats the point */
+ g_assert_cmpfloat (default_time, >, cached_time);
+ g_info ("%f > %f", default_time, cached_time);
+
+ g_resolver_set_default (default_resolver);
+ g_object_unref (default_resolver);
+ g_object_unref (cached_resolver);
+}
+
+static void
+on_lookup_by_name_finish (GResolver *resolver,
+ GAsyncResult *result,
+ gboolean *done)
+{
+ GError *error = NULL;
+ GList *addresses;
+
+ addresses = g_resolver_lookup_by_name_finish (resolver, result, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (addresses);
+ g_resolver_free_addresses (addresses);
+ *done = TRUE;
+}
+
+static void
+test_cached_resolver_async (void)
+{
+ GResolver *default_resolver = g_resolver_get_default ();
+ GResolver *cached_resolver;
+ gboolean done = FALSE;
+
+ soup_cached_resolver_ensure_default ();
+ cached_resolver = g_resolver_get_default ();
+
+ /* Just sanity check it works */
+ g_resolver_lookup_by_name_async (cached_resolver, "gnome.org", NULL, (GAsyncReadyCallback) on_lookup_by_name_finish, &done);
+
+ while (done != TRUE)
+ g_main_context_iteration (NULL, TRUE);
+
+ /* And again cached */
+ done = FALSE;
+ g_resolver_lookup_by_name_async (cached_resolver, "gnome.org", NULL, (GAsyncReadyCallback) on_lookup_by_name_finish, &done);
+
+ while (done != TRUE)
+ g_main_context_iteration (NULL, TRUE);
+
+ g_resolver_set_default (default_resolver);
+ g_object_unref (default_resolver);
+ g_object_unref (cached_resolver);
+}
+
+int
+main (int argc, char **argv)
+{
+ int ret;
+
+ test_init (argc, argv, NULL);
+
+ g_test_add_func ("/cached-resolver", test_cached_resolver);
+ g_test_add_func ("/cached-resolver/async", test_cached_resolver_async);
+
+ ret = g_test_run ();
+
+ test_cleanup ();
+ return ret;
+}