diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2020-11-20 13:56:43 +0100 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2020-11-20 14:04:36 +0100 |
commit | ec5dc83c8324cd4b156a03a3220182b33c9b8469 (patch) | |
tree | 878afed2caa733176f7a47af0b672623face5665 | |
parent | a4622fa9217a7213786a2b0c09de1488b41b4eea (diff) | |
download | libsoup-ec5dc83c8324cd4b156a03a3220182b33c9b8469.tar.gz |
tests: add a SoupLogger test
-rw-r--r-- | tests/logger-test.c | 238 | ||||
-rw-r--r-- | tests/meson.build | 1 |
2 files changed, 239 insertions, 0 deletions
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, []], |