[libsoup/carlosgc/logger: 2/4] tests: add a SoupLogger test




commit ec5dc83c8324cd4b156a03a3220182b33c9b8469
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Fri Nov 20 13:56:43 2020 +0100

    tests: add a SoupLogger test

 tests/logger-test.c | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/meson.build   |   1 +
 2 files changed, 239 insertions(+)
---
diff --git a/tests/logger-test.c b/tests/logger-test.c
new file mode 100644
index 00000000..61e67a5a
--- /dev/null
+++ b/tests/logger-test.c
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2020 Igalia S.L.
+ */
+
+#include "test-utils.h"
+
+GUri *base_uri;
+
+typedef struct {
+        GHashTable *request;
+        GHashTable *response;
+} LogData;
+
+static void
+log_data_clear (LogData *data)
+{
+        g_clear_pointer (&data->request, g_hash_table_destroy);
+        g_clear_pointer (&data->response, g_hash_table_destroy);
+}
+
+static void
+printer (SoupLogger         *logger,
+         SoupLoggerLogLevel  level,
+         char                direction,
+         const char         *data,
+         LogData            *log)
+{
+        GHashTable **table;
+
+        if (direction == '>')
+                table = &log->request;
+        else if (direction == '<')
+                table = &log->response;
+        else
+                return;
+
+        if (!*table) {
+                *table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+                g_hash_table_insert (*table, g_strdup ("status-line"), g_strdup (data));
+        } else {
+                char *p;
+
+                p = strstr (data, ":");
+                g_hash_table_insert (*table, g_strndup (data, strlen (data) - strlen (p)), g_strdup (p + 2));
+        }
+}
+
+static void
+do_logger_minimal_test (void)
+{
+        SoupSession *session;
+        SoupLogger *logger;
+        SoupMessage *msg;
+        LogData log = { NULL, NULL };
+
+        session = soup_test_session_new (NULL);
+
+        logger = soup_logger_new (SOUP_LOGGER_LOG_MINIMAL);
+        soup_logger_set_printer (logger, (SoupLoggerPrinter)printer, &log, NULL);
+        soup_session_add_feature (session, SOUP_SESSION_FEATURE (logger));
+        g_object_unref (logger);
+
+        msg = soup_message_new_from_uri ("GET", base_uri);
+        soup_test_session_send_message (session, msg);
+        g_object_unref (msg);
+
+        g_assert_nonnull (log.request);
+        g_assert_cmpuint (g_hash_table_size (log.request), ==, 3);
+        g_assert_true (g_hash_table_contains (log.request, "status-line"));
+        g_assert_true (g_hash_table_contains (log.request, "Soup-Debug-Timestamp"));
+        g_assert_true (g_hash_table_contains (log.request, "Soup-Debug"));
+        g_assert_cmpstr (g_hash_table_lookup (log.request, "status-line"), ==, "GET / HTTP/1.1");
+
+        g_assert_nonnull (log.response);
+        g_assert_cmpuint (g_hash_table_size (log.response), ==, 3);
+        g_assert_true (g_hash_table_contains (log.response, "status-line"));
+        g_assert_true (g_hash_table_contains (log.response, "Soup-Debug-Timestamp"));
+        g_assert_true (g_hash_table_contains (log.response, "Soup-Debug"));
+        g_assert_cmpstr (g_hash_table_lookup (log.response, "status-line"), ==, "HTTP/1.1 200 OK");
+
+        log_data_clear (&log);
+
+        soup_test_session_abort_unref (session);
+}
+
+static void
+do_logger_headers_test (void)
+{
+        SoupSession *session;
+        SoupLogger *logger;
+        SoupMessage *msg;
+        char *host;
+        LogData log = { NULL, NULL };
+
+        session = soup_test_session_new (NULL);
+
+        logger = soup_logger_new (SOUP_LOGGER_LOG_HEADERS);
+        soup_logger_set_printer (logger, (SoupLoggerPrinter)printer, &log, NULL);
+        soup_session_add_feature (session, SOUP_SESSION_FEATURE (logger));
+        g_object_unref (logger);
+
+        msg = soup_message_new_from_uri ("GET", base_uri);
+        soup_test_session_send_message (session, msg);
+        g_object_unref (msg);
+
+        g_assert_nonnull (log.request);
+        g_assert_cmpuint (g_hash_table_size (log.request), ==, 6);
+        g_assert_true (g_hash_table_contains (log.request, "status-line"));
+        g_assert_true (g_hash_table_contains (log.request, "Soup-Debug-Timestamp"));
+        g_assert_true (g_hash_table_contains (log.request, "Soup-Debug"));
+        g_assert_true (g_hash_table_contains (log.request, "Host"));
+        g_assert_true (g_hash_table_contains (log.request, "Accept-Encoding"));
+        g_assert_true (g_hash_table_contains (log.request, "Connection"));
+        g_assert_cmpstr (g_hash_table_lookup (log.request, "status-line"), ==, "GET / HTTP/1.1");
+        host = g_strdup_printf ("127.0.0.1:%d", g_uri_get_port (base_uri));
+        g_assert_cmpstr (g_hash_table_lookup (log.request, "Host"), ==, host);
+        g_free (host);
+        g_assert_cmpstr (g_hash_table_lookup (log.request, "Accept-Encoding"), ==, "gzip, deflate");
+        g_assert_cmpstr (g_hash_table_lookup (log.request, "Connection"), ==, "Keep-Alive");
+
+        g_assert_nonnull (log.response);
+        g_assert_cmpuint (g_hash_table_size (log.response), ==, 6);
+        g_assert_true (g_hash_table_contains (log.response, "status-line"));
+        g_assert_true (g_hash_table_contains (log.response, "Soup-Debug-Timestamp"));
+        g_assert_true (g_hash_table_contains (log.response, "Soup-Debug"));
+        g_assert_true (g_hash_table_contains (log.response, "Date"));
+        g_assert_true (g_hash_table_contains (log.response, "Content-Type"));
+        g_assert_true (g_hash_table_contains (log.response, "Content-Length"));
+        g_assert_cmpstr (g_hash_table_lookup (log.response, "status-line"), ==, "HTTP/1.1 200 OK");
+        g_assert_cmpstr (g_hash_table_lookup (log.response, "Content-Type"), ==, "text/plain");
+        g_assert_cmpstr (g_hash_table_lookup (log.response, "Content-Length"), ==, "5");
+
+        log_data_clear (&log);
+
+        soup_test_session_abort_unref (session);
+}
+
+static SoupLoggerLogLevel
+filter (SoupLogger  *logger,
+        SoupMessage *msg,
+        gpointer     user_data)
+{
+        return GPOINTER_TO_UINT (user_data);
+}
+
+static void
+do_logger_filters_test (void)
+{
+        SoupSession *session;
+        SoupLogger *logger;
+        SoupMessage *msg;
+        LogData log = { NULL, NULL };
+
+        session = soup_test_session_new (NULL);
+
+        logger = soup_logger_new (SOUP_LOGGER_LOG_HEADERS);
+        soup_logger_set_printer (logger, (SoupLoggerPrinter)printer, &log, NULL);
+        soup_session_add_feature (session, SOUP_SESSION_FEATURE (logger));
+
+        /* Only log request with minimal level */
+        soup_logger_set_request_filter (logger, filter, GUINT_TO_POINTER (SOUP_LOGGER_LOG_MINIMAL), NULL);
+        soup_logger_set_response_filter (logger, filter, GUINT_TO_POINTER (SOUP_LOGGER_LOG_NONE), NULL);
+
+        msg = soup_message_new_from_uri ("GET", base_uri);
+        soup_test_session_send_message (session, msg);
+        g_object_unref (msg);
+
+        g_assert_nonnull (log.request);
+        g_assert_cmpuint (g_hash_table_size (log.request), ==, 3);
+        g_assert_null (log.response);
+        log_data_clear (&log);
+
+        /* Log request with headers level and response with minimal */
+        soup_logger_set_request_filter (logger, filter, GUINT_TO_POINTER (SOUP_LOGGER_LOG_HEADERS), NULL);
+        soup_logger_set_response_filter (logger, filter, GUINT_TO_POINTER (SOUP_LOGGER_LOG_MINIMAL), NULL);
+
+        msg = soup_message_new_from_uri ("GET", base_uri);
+        soup_test_session_send_message (session, msg);
+        g_object_unref (msg);
+
+        g_assert_nonnull (log.request);
+        g_assert_cmpuint (g_hash_table_size (log.request), ==, 6);
+        g_assert_nonnull (log.response);
+        g_assert_cmpuint (g_hash_table_size (log.response), ==, 3);
+        log_data_clear (&log);
+
+        /* Only log response with headers level */
+        soup_logger_set_request_filter (logger, filter, GUINT_TO_POINTER (SOUP_LOGGER_LOG_NONE), NULL);
+        soup_logger_set_response_filter (logger, filter, GUINT_TO_POINTER (SOUP_LOGGER_LOG_HEADERS), NULL);
+
+        msg = soup_message_new_from_uri ("GET", base_uri);
+        soup_test_session_send_message (session, msg);
+        g_object_unref (msg);
+
+        g_assert_null (log.request);
+        g_assert_nonnull (log.response);
+        g_assert_cmpuint (g_hash_table_size (log.response), ==, 6);
+        log_data_clear (&log);
+
+        g_object_unref (logger);
+        soup_test_session_abort_unref (session);
+}
+
+static void
+server_callback (SoupServer        *server,
+                 SoupServerMessage *msg,
+                 const char        *path,
+                 GHashTable        *query,
+                 gpointer           data)
+{
+        soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL);
+        soup_server_message_set_response (msg, "text/plain",
+                                          SOUP_MEMORY_STATIC, "index", 5);
+}
+
+int
+main (int argc, char **argv)
+{
+        SoupServer *server;
+        int ret;
+
+        test_init (argc, argv, NULL);
+
+        server = soup_test_server_new (SOUP_TEST_SERVER_IN_THREAD);
+        soup_server_add_handler (server, NULL, server_callback, NULL, NULL);
+        base_uri = soup_test_server_get_uri (server, "http", NULL);
+
+        g_test_add_func ("/logger/minimal", do_logger_minimal_test);
+        g_test_add_func ("/logger/headers", do_logger_headers_test);
+        g_test_add_func ("/logger/filters", do_logger_filters_test);
+
+        ret = g_test_run ();
+
+        soup_test_server_quit_unref (server);
+
+        test_cleanup ();
+        return ret;
+}
diff --git a/tests/meson.build b/tests/meson.build
index c3346ed7..ecb41887 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -45,6 +45,7 @@ tests = [
   ['header-parsing', true, []],
   ['hsts', true, []],
   ['hsts-db', true, []],
+  ['logger', true, []],
   ['misc', true, []],
   ['multipart', true, []],
   ['no-ssl', true, []],


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