Blame glib/tests/logging.c

Packit ae235b
#include <stdlib.h>
Packit ae235b
#include <string.h>
Packit ae235b
#define G_LOG_USE_STRUCTURED 1
Packit ae235b
#include <glib.h>
Packit ae235b
Packit ae235b
/* Test g_warn macros */
Packit ae235b
static void
Packit ae235b
test_warnings (void)
Packit ae235b
{
Packit ae235b
  g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
Packit ae235b
                         "*test_warnings*should not be reached*");
Packit ae235b
  g_warn_if_reached ();
Packit ae235b
  g_test_assert_expected_messages ();
Packit ae235b
Packit ae235b
  g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
Packit ae235b
                         "*test_warnings*runtime check failed*");
Packit ae235b
  g_warn_if_fail (FALSE);
Packit ae235b
  g_test_assert_expected_messages ();
Packit ae235b
}
Packit ae235b
Packit ae235b
static guint log_count = 0;
Packit ae235b
Packit ae235b
static void
Packit ae235b
log_handler (const gchar    *log_domain,
Packit ae235b
             GLogLevelFlags  log_level,
Packit ae235b
             const gchar    *message,
Packit ae235b
             gpointer        user_data)
Packit ae235b
{
Packit ae235b
  g_assert_cmpstr (log_domain, ==, "bu");
Packit ae235b
  g_assert_cmpint (log_level, ==, G_LOG_LEVEL_INFO);
Packit ae235b
Packit ae235b
  log_count++;
Packit ae235b
}
Packit ae235b
Packit ae235b
/* test that custom log handlers only get called for
Packit ae235b
 * their domain and level
Packit ae235b
 */
Packit ae235b
static void
Packit ae235b
test_set_handler (void)
Packit ae235b
{
Packit ae235b
  guint id;
Packit ae235b
Packit ae235b
  id = g_log_set_handler ("bu", G_LOG_LEVEL_INFO, log_handler, NULL);
Packit ae235b
Packit ae235b
  g_log ("bu", G_LOG_LEVEL_DEBUG, "message");
Packit ae235b
  g_log ("ba", G_LOG_LEVEL_DEBUG, "message");
Packit ae235b
  g_log ("bu", G_LOG_LEVEL_INFO, "message");
Packit ae235b
  g_log ("ba", G_LOG_LEVEL_INFO, "message");
Packit ae235b
Packit ae235b
  g_assert_cmpint (log_count, ==, 1);
Packit ae235b
Packit ae235b
  g_log_remove_handler ("bu", id);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler_error (void)
Packit ae235b
{
Packit ae235b
  g_log_set_default_handler (g_log_default_handler, NULL);
Packit ae235b
  g_error ("message1");
Packit ae235b
  exit (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler_critical (void)
Packit ae235b
{
Packit ae235b
  g_log_set_default_handler (g_log_default_handler, NULL);
Packit ae235b
  g_critical ("message2");
Packit ae235b
  exit (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler_warning (void)
Packit ae235b
{
Packit ae235b
  g_log_set_default_handler (g_log_default_handler, NULL);
Packit ae235b
  g_warning ("message3");
Packit ae235b
  exit (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler_message (void)
Packit ae235b
{
Packit ae235b
  g_log_set_default_handler (g_log_default_handler, NULL);
Packit ae235b
  g_message ("message4");
Packit ae235b
  exit (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler_info (void)
Packit ae235b
{
Packit ae235b
  g_log_set_default_handler (g_log_default_handler, NULL);
Packit ae235b
  g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "message5");
Packit ae235b
  exit (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler_bar_info (void)
Packit ae235b
{
Packit ae235b
  g_log_set_default_handler (g_log_default_handler, NULL);
Packit ae235b
Packit ae235b
  g_setenv ("G_MESSAGES_DEBUG", "foo bar baz", TRUE);
Packit ae235b
Packit ae235b
  g_log ("bar", G_LOG_LEVEL_INFO, "message5");
Packit ae235b
  exit (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler_baz_debug (void)
Packit ae235b
{
Packit ae235b
  g_log_set_default_handler (g_log_default_handler, NULL);
Packit ae235b
Packit ae235b
  g_setenv ("G_MESSAGES_DEBUG", "foo bar baz", TRUE);
Packit ae235b
Packit ae235b
  g_log ("baz", G_LOG_LEVEL_DEBUG, "message6");
Packit ae235b
  exit (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler_debug (void)
Packit ae235b
{
Packit ae235b
  g_log_set_default_handler (g_log_default_handler, NULL);
Packit ae235b
Packit ae235b
  g_setenv ("G_MESSAGES_DEBUG", "all", TRUE);
Packit ae235b
Packit ae235b
  g_log ("foo", G_LOG_LEVEL_DEBUG, "6");
Packit ae235b
  g_log ("bar", G_LOG_LEVEL_DEBUG, "6");
Packit ae235b
  g_log ("baz", G_LOG_LEVEL_DEBUG, "6");
Packit ae235b
  exit (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler_0x400 (void)
Packit ae235b
{
Packit ae235b
  g_log_set_default_handler (g_log_default_handler, NULL);
Packit ae235b
  g_log (G_LOG_DOMAIN, 1<<10, "message7");
Packit ae235b
  exit (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_default_handler (void)
Packit ae235b
{
Packit ae235b
  g_test_trap_subprocess ("/logging/default-handler/subprocess/error", 0, 0);
Packit ae235b
  g_test_trap_assert_failed ();
Packit ae235b
  g_test_trap_assert_stderr ("*ERROR*message1*");
Packit ae235b
Packit ae235b
  g_test_trap_subprocess ("/logging/default-handler/subprocess/critical", 0, 0);
Packit ae235b
  g_test_trap_assert_failed ();
Packit ae235b
  g_test_trap_assert_stderr ("*CRITICAL*message2*");
Packit ae235b
Packit ae235b
  g_test_trap_subprocess ("/logging/default-handler/subprocess/warning", 0, 0);
Packit ae235b
  g_test_trap_assert_failed ();
Packit ae235b
  g_test_trap_assert_stderr ("*WARNING*message3*");
Packit ae235b
Packit ae235b
  g_test_trap_subprocess ("/logging/default-handler/subprocess/message", 0, 0);
Packit ae235b
  g_test_trap_assert_passed ();
Packit ae235b
  g_test_trap_assert_stderr ("*Message*message4*");
Packit ae235b
Packit ae235b
  g_test_trap_subprocess ("/logging/default-handler/subprocess/info", 0, 0);
Packit ae235b
  g_test_trap_assert_passed ();
Packit ae235b
  g_test_trap_assert_stdout_unmatched ("*INFO*message5*");
Packit ae235b
Packit ae235b
  g_test_trap_subprocess ("/logging/default-handler/subprocess/bar-info", 0, 0);
Packit ae235b
  g_test_trap_assert_passed ();
Packit ae235b
  g_test_trap_assert_stdout ("*INFO*message5*");
Packit ae235b
Packit ae235b
  g_test_trap_subprocess ("/logging/default-handler/subprocess/baz-debug", 0, 0);
Packit ae235b
  g_test_trap_assert_passed ();
Packit ae235b
  g_test_trap_assert_stdout ("*DEBUG*message6*");
Packit ae235b
Packit ae235b
  g_test_trap_subprocess ("/logging/default-handler/subprocess/debug", 0, 0);
Packit ae235b
  g_test_trap_assert_passed ();
Packit ae235b
  g_test_trap_assert_stdout ("*DEBUG*6*6*6*");
Packit ae235b
Packit ae235b
  g_test_trap_subprocess ("/logging/default-handler/subprocess/0x400", 0, 0);
Packit ae235b
  g_test_trap_assert_passed ();
Packit ae235b
  g_test_trap_assert_stdout ("*LOG-0x400*message7*");
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_fatal_log_mask (void)
Packit ae235b
{
Packit ae235b
  if (g_test_subprocess ())
Packit ae235b
    {
Packit ae235b
      g_log_set_fatal_mask ("bu", G_LOG_LEVEL_INFO);
Packit ae235b
      g_log ("bu", G_LOG_LEVEL_INFO, "fatal");
Packit ae235b
      return;
Packit ae235b
    }
Packit ae235b
  g_test_trap_subprocess (NULL, 0, 0);
Packit ae235b
  g_test_trap_assert_failed ();
Packit ae235b
  /* G_LOG_LEVEL_INFO isn't printed by default */
Packit ae235b
  g_test_trap_assert_stdout_unmatched ("*fatal*");
Packit ae235b
}
Packit ae235b
Packit ae235b
static gint my_print_count = 0;
Packit ae235b
static void
Packit ae235b
my_print_handler (const gchar *text)
Packit ae235b
{
Packit ae235b
  my_print_count++;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_print_handler (void)
Packit ae235b
{
Packit ae235b
  GPrintFunc old_print_handler;
Packit ae235b
Packit ae235b
  old_print_handler = g_set_print_handler (my_print_handler);
Packit ae235b
  g_assert (old_print_handler == NULL);
Packit ae235b
Packit ae235b
  my_print_count = 0;
Packit ae235b
  g_print ("bu ba");
Packit ae235b
  g_assert_cmpint (my_print_count, ==, 1);
Packit ae235b
Packit ae235b
  g_set_print_handler (NULL);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_printerr_handler (void)
Packit ae235b
{
Packit ae235b
  GPrintFunc old_printerr_handler;
Packit ae235b
Packit ae235b
  old_printerr_handler = g_set_printerr_handler (my_print_handler);
Packit ae235b
  g_assert (old_printerr_handler == NULL);
Packit ae235b
Packit ae235b
  my_print_count = 0;
Packit ae235b
  g_printerr ("bu ba");
Packit ae235b
  g_assert_cmpint (my_print_count, ==, 1);
Packit ae235b
Packit ae235b
  g_set_printerr_handler (NULL);
Packit ae235b
}
Packit ae235b
Packit ae235b
static char *fail_str = "foo";
Packit ae235b
static char *log_str = "bar";
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
good_failure_handler (const gchar    *log_domain,
Packit ae235b
                      GLogLevelFlags  log_level,
Packit ae235b
                      const gchar    *msg,
Packit ae235b
                      gpointer        user_data)
Packit ae235b
{
Packit ae235b
  g_test_message ("The Good Fail Message Handler\n");
Packit ae235b
  g_assert ((char *)user_data != log_str);
Packit ae235b
  g_assert ((char *)user_data == fail_str);
Packit ae235b
Packit ae235b
  return FALSE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
bad_failure_handler (const gchar    *log_domain,
Packit ae235b
                     GLogLevelFlags  log_level,
Packit ae235b
                     const gchar    *msg,
Packit ae235b
                     gpointer        user_data)
Packit ae235b
{
Packit ae235b
  g_test_message ("The Bad Fail Message Handler\n");
Packit ae235b
  g_assert ((char *)user_data == log_str);
Packit ae235b
  g_assert ((char *)user_data != fail_str);
Packit ae235b
Packit ae235b
  return FALSE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_handler (const gchar    *log_domain,
Packit ae235b
              GLogLevelFlags  log_level,
Packit ae235b
              const gchar    *msg,
Packit ae235b
              gpointer        user_data)
Packit ae235b
{
Packit ae235b
  g_test_message ("The Log Message Handler\n");
Packit ae235b
  g_assert ((char *)user_data != fail_str);
Packit ae235b
  g_assert ((char *)user_data == log_str);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
bug653052 (void)
Packit ae235b
{
Packit ae235b
  g_test_bug ("653052");
Packit ae235b
Packit ae235b
  g_test_log_set_fatal_handler (good_failure_handler, fail_str);
Packit ae235b
  g_log_set_default_handler (test_handler, log_str);
Packit ae235b
Packit ae235b
  g_return_if_fail (0);
Packit ae235b
Packit ae235b
  g_test_log_set_fatal_handler (bad_failure_handler, fail_str);
Packit ae235b
  g_log_set_default_handler (test_handler, log_str);
Packit ae235b
Packit ae235b
  g_return_if_fail (0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_gibberish (void)
Packit ae235b
{
Packit ae235b
  if (g_test_subprocess ())
Packit ae235b
    {
Packit ae235b
      g_warning ("bla bla \236\237\190");
Packit ae235b
      return;
Packit ae235b
    }
Packit ae235b
  g_test_trap_subprocess (NULL, 0, 0);
Packit ae235b
  g_test_trap_assert_failed ();
Packit ae235b
  g_test_trap_assert_stderr ("*bla bla \\x9e\\x9f\\u000190*");
Packit ae235b
}
Packit ae235b
Packit ae235b
static GLogWriterOutput
Packit ae235b
null_log_writer (GLogLevelFlags   log_level,
Packit ae235b
                 const GLogField *fields,
Packit ae235b
                 gsize            n_fields,
Packit ae235b
                 gpointer         user_data)
Packit ae235b
{
Packit ae235b
  log_count++;
Packit ae235b
  return G_LOG_WRITER_HANDLED;
Packit ae235b
}
Packit ae235b
Packit ae235b
typedef struct {
Packit ae235b
  const GLogField *fields;
Packit ae235b
  gsize n_fields;
Packit ae235b
} ExpectedMessage;
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
compare_field (const GLogField *f1, const GLogField *f2)
Packit ae235b
{
Packit ae235b
  if (strcmp (f1->key, f2->key) != 0)
Packit ae235b
    return FALSE;
Packit ae235b
  if (f1->length != f2->length)
Packit ae235b
    return FALSE;
Packit ae235b
Packit ae235b
  if (f1->length == -1)
Packit ae235b
    return strcmp (f1->value, f2->value) == 0;
Packit ae235b
  else
Packit ae235b
    return memcmp (f1->value, f2->value, f1->length) == 0;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
compare_fields (const GLogField *f1, gsize n1, const GLogField *f2, gsize n2)
Packit ae235b
{
Packit ae235b
  int i, j;
Packit ae235b
Packit ae235b
  for (i = 0; i < n1; i++)
Packit ae235b
    {
Packit ae235b
      for (j = 0; j < n2; j++)
Packit ae235b
        {
Packit ae235b
          if (compare_field (&f1[i], &f2[j]))
Packit ae235b
            break;
Packit ae235b
        }
Packit ae235b
      if (j == n2)
Packit ae235b
        return FALSE;
Packit ae235b
    }
Packit ae235b
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static GSList *expected_messages = NULL;
Packit ae235b
static const guchar binary_field[] = {1, 2, 3, 4, 5};
Packit ae235b
Packit ae235b
Packit ae235b
static GLogWriterOutput
Packit ae235b
expect_log_writer (GLogLevelFlags   log_level,
Packit ae235b
                   const GLogField *fields,
Packit ae235b
                   gsize            n_fields,
Packit ae235b
                   gpointer         user_data)
Packit ae235b
{
Packit ae235b
  ExpectedMessage *expected = expected_messages->data;
Packit ae235b
Packit ae235b
  if (compare_fields (fields, n_fields, expected->fields, expected->n_fields))
Packit ae235b
    {
Packit ae235b
      expected_messages = g_slist_delete_link (expected_messages, expected_messages);
Packit ae235b
    }
Packit ae235b
  else if ((log_level & G_LOG_LEVEL_DEBUG) != G_LOG_LEVEL_DEBUG)
Packit ae235b
    {
Packit ae235b
      char *str;
Packit ae235b
Packit ae235b
      str = g_log_writer_format_fields (log_level, fields, n_fields, FALSE);
Packit ae235b
      g_test_message ("Unexpected message: %s", str);
Packit ae235b
      g_free (str);
Packit ae235b
      g_test_fail ();
Packit ae235b
    }
Packit ae235b
Packit ae235b
  return G_LOG_WRITER_HANDLED;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_structured_logging_no_state (void)
Packit ae235b
{
Packit ae235b
  gpointer some_pointer = GUINT_TO_POINTER (0x100);
Packit ae235b
  guint some_integer = 123;
Packit ae235b
Packit ae235b
  log_count = 0;
Packit ae235b
  g_log_set_writer_func (null_log_writer, NULL, NULL);
Packit ae235b
Packit ae235b
  g_log_structured ("some-domain", G_LOG_LEVEL_MESSAGE,
Packit ae235b
                    "MESSAGE_ID", "06d4df59e6c24647bfe69d2c27ef0b4e",
Packit ae235b
                    "MY_APPLICATION_CUSTOM_FIELD", "some debug string",
Packit ae235b
                    "MESSAGE", "This is a debug message about pointer %p and integer %u.",
Packit ae235b
                    some_pointer, some_integer);
Packit ae235b
Packit ae235b
  g_assert_cmpint (log_count, ==, 1);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_structured_logging_some_state (void)
Packit ae235b
{
Packit ae235b
  gpointer state_object = NULL;  /* this must not be dereferenced */
Packit ae235b
  const GLogField fields[] = {
Packit ae235b
    { "MESSAGE", "This is a debug message.", -1 },
Packit ae235b
    { "MESSAGE_ID", "fcfb2e1e65c3494386b74878f1abf893", -1 },
Packit ae235b
    { "MY_APPLICATION_CUSTOM_FIELD", "some debug string", -1 },
Packit ae235b
    { "MY_APPLICATION_STATE", state_object, 0 },
Packit ae235b
  };
Packit ae235b
Packit ae235b
  log_count = 0;
Packit ae235b
  g_log_set_writer_func (null_log_writer, NULL, NULL);
Packit ae235b
Packit ae235b
  g_log_structured_array (G_LOG_LEVEL_DEBUG, fields, G_N_ELEMENTS (fields));
Packit ae235b
Packit ae235b
  g_assert_cmpint (log_count, ==, 1);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_structured_logging_robustness (void)
Packit ae235b
{
Packit ae235b
  log_count = 0;
Packit ae235b
  g_log_set_writer_func (null_log_writer, NULL, NULL);
Packit ae235b
Packit ae235b
  /* NULL log_domain shouldn't crash */
Packit ae235b
  g_log (NULL, G_LOG_LEVEL_MESSAGE, "Test");
Packit ae235b
  g_log_structured (NULL, G_LOG_LEVEL_MESSAGE, "MESSAGE", "Test");
Packit ae235b
Packit ae235b
  g_assert_cmpint (log_count, ==, 1);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_structured_logging_roundtrip1 (void)
Packit ae235b
{
Packit ae235b
  gpointer some_pointer = GUINT_TO_POINTER (0x100);
Packit ae235b
  gint some_integer = 123;
Packit ae235b
  const GLogField fields[] = {
Packit ae235b
    { "GLIB_DOMAIN", "some-domain", -1 },
Packit ae235b
    { "PRIORITY", "5", -1 },
Packit ae235b
    { "MESSAGE", "This is a debug message about pointer 0x100 and integer 123.", -1 },
Packit ae235b
    { "MESSAGE_ID", "fcfb2e1e65c3494386b74878f1abf893", -1 },
Packit ae235b
    { "MY_APPLICATION_CUSTOM_FIELD", "some debug string", -1 }
Packit ae235b
  };
Packit ae235b
  ExpectedMessage expected = { fields, 5 };
Packit ae235b
Packit ae235b
  expected_messages = g_slist_append (NULL, &expected);
Packit ae235b
  g_log_set_writer_func (expect_log_writer, NULL, NULL);
Packit ae235b
Packit ae235b
  g_log_structured ("some-domain", G_LOG_LEVEL_MESSAGE,
Packit ae235b
                    "MESSAGE_ID", "fcfb2e1e65c3494386b74878f1abf893",
Packit ae235b
                    "MY_APPLICATION_CUSTOM_FIELD", "some debug string",
Packit ae235b
                    "MESSAGE", "This is a debug message about pointer %p and integer %u.",
Packit ae235b
                    some_pointer, some_integer);
Packit ae235b
Packit ae235b
  if (expected_messages != NULL)
Packit ae235b
    {
Packit ae235b
      char *str;
Packit ae235b
      ExpectedMessage *expected = expected_messages->data;
Packit ae235b
Packit ae235b
      str = g_log_writer_format_fields (0, expected->fields, expected->n_fields, FALSE);
Packit ae235b
      g_test_message ("Unexpected message: %s", str);
Packit ae235b
      g_free (str);
Packit ae235b
      g_test_fail ();
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_structured_logging_roundtrip2 (void)
Packit ae235b
{
Packit ae235b
  const gchar *some_string = "abc";
Packit ae235b
  const GLogField fields[] = {
Packit ae235b
    { "GLIB_DOMAIN", "some-domain", -1 },
Packit ae235b
    { "PRIORITY", "5", -1 },
Packit ae235b
    { "MESSAGE", "This is a debug message about string 'abc'.", -1 },
Packit ae235b
    { "MESSAGE_ID", "fcfb2e1e65c3494386b74878f1abf893", -1 },
Packit ae235b
    { "MY_APPLICATION_CUSTOM_FIELD", "some debug string", -1 }
Packit ae235b
  };
Packit ae235b
  ExpectedMessage expected = { fields, 5 };
Packit ae235b
Packit ae235b
  expected_messages = g_slist_append (NULL, &expected);
Packit ae235b
  g_log_set_writer_func (expect_log_writer, NULL, NULL);
Packit ae235b
Packit ae235b
  g_log_structured ("some-domain", G_LOG_LEVEL_MESSAGE,
Packit ae235b
                    "MESSAGE_ID", "fcfb2e1e65c3494386b74878f1abf893",
Packit ae235b
                    "MY_APPLICATION_CUSTOM_FIELD", "some debug string",
Packit ae235b
                    "MESSAGE", "This is a debug message about string '%s'.",
Packit ae235b
                    some_string);
Packit ae235b
Packit ae235b
  g_assert (expected_messages == NULL);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_structured_logging_roundtrip3 (void)
Packit ae235b
{
Packit ae235b
  const GLogField fields[] = {
Packit ae235b
    { "GLIB_DOMAIN", "some-domain", -1 },
Packit ae235b
    { "PRIORITY", "4", -1 },
Packit ae235b
    { "MESSAGE", "Test test test.", -1 }
Packit ae235b
  };
Packit ae235b
  ExpectedMessage expected = { fields, 3 };
Packit ae235b
Packit ae235b
  expected_messages = g_slist_append (NULL, &expected);
Packit ae235b
  g_log_set_writer_func (expect_log_writer, NULL, NULL);
Packit ae235b
Packit ae235b
  g_log_structured ("some-domain", G_LOG_LEVEL_WARNING,
Packit ae235b
                    "MESSAGE", "Test test test.");
Packit ae235b
Packit ae235b
  g_assert (expected_messages == NULL);
Packit ae235b
}
Packit ae235b
Packit ae235b
static GVariant *
Packit ae235b
create_variant_fields (void)
Packit ae235b
{
Packit ae235b
  GVariant *binary;
Packit ae235b
  GVariantBuilder builder;
Packit ae235b
Packit ae235b
  binary = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, binary_field, G_N_ELEMENTS (binary_field), sizeof (binary_field[0]));
Packit ae235b
Packit ae235b
  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
Packit ae235b
  g_variant_builder_add (&builder, "{sv}", "MESSAGE_ID", g_variant_new_string ("06d4df59e6c24647bfe69d2c27ef0b4e"));
Packit ae235b
  g_variant_builder_add (&builder, "{sv}", "MESSAGE", g_variant_new_string ("This is a debug message"));
Packit ae235b
  g_variant_builder_add (&builder, "{sv}", "MY_APPLICATION_CUSTOM_FIELD", g_variant_new_string ("some debug string"));
Packit ae235b
  g_variant_builder_add (&builder, "{sv}", "MY_APPLICATION_CUSTOM_FIELD_BINARY", binary);
Packit ae235b
Packit ae235b
  return g_variant_builder_end (&builder);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_structured_logging_variant1 (void)
Packit ae235b
{
Packit ae235b
  GVariant *v = create_variant_fields ();
Packit ae235b
Packit ae235b
  log_count = 0;
Packit ae235b
  g_log_set_writer_func (null_log_writer, NULL, NULL);
Packit ae235b
Packit ae235b
  g_log_variant ("some-domain", G_LOG_LEVEL_MESSAGE, v);
Packit ae235b
  g_variant_unref (v);
Packit ae235b
  g_assert_cmpint (log_count, ==, 1);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_structured_logging_variant2 (void)
Packit ae235b
{
Packit ae235b
  const GLogField fields[] = {
Packit ae235b
    { "GLIB_DOMAIN", "some-domain", -1 },
Packit ae235b
    { "PRIORITY", "5", -1 },
Packit ae235b
    { "MESSAGE", "This is a debug message", -1 },
Packit ae235b
    { "MESSAGE_ID", "06d4df59e6c24647bfe69d2c27ef0b4e", -1 },
Packit ae235b
    { "MY_APPLICATION_CUSTOM_FIELD", "some debug string", -1 },
Packit ae235b
    { "MY_APPLICATION_CUSTOM_FIELD_BINARY", binary_field, sizeof (binary_field) }
Packit ae235b
  };
Packit ae235b
  ExpectedMessage expected = { fields, 6 };
Packit ae235b
  GVariant *v = create_variant_fields ();
Packit ae235b
Packit ae235b
  expected_messages = g_slist_append (NULL, &expected);
Packit ae235b
  g_log_set_writer_func (expect_log_writer, NULL, NULL);
Packit ae235b
Packit ae235b
  g_log_variant ("some-domain", G_LOG_LEVEL_MESSAGE, v);
Packit ae235b
  g_variant_unref (v);
Packit ae235b
  g_assert (expected_messages == NULL);
Packit ae235b
}
Packit ae235b
Packit ae235b
int
Packit ae235b
main (int argc, char *argv[])
Packit ae235b
{
Packit ae235b
  g_unsetenv ("G_MESSAGES_DEBUG");
Packit ae235b
Packit ae235b
  g_test_init (&argc, &argv, NULL);
Packit ae235b
  g_test_bug_base ("http://bugzilla.gnome.org/");
Packit ae235b
Packit ae235b
  g_test_add_func ("/logging/default-handler", test_default_handler);
Packit ae235b
  g_test_add_func ("/logging/default-handler/subprocess/error", test_default_handler_error);
Packit ae235b
  g_test_add_func ("/logging/default-handler/subprocess/critical", test_default_handler_critical);
Packit ae235b
  g_test_add_func ("/logging/default-handler/subprocess/warning", test_default_handler_warning);
Packit ae235b
  g_test_add_func ("/logging/default-handler/subprocess/message", test_default_handler_message);
Packit ae235b
  g_test_add_func ("/logging/default-handler/subprocess/info", test_default_handler_info);
Packit ae235b
  g_test_add_func ("/logging/default-handler/subprocess/bar-info", test_default_handler_bar_info);
Packit ae235b
  g_test_add_func ("/logging/default-handler/subprocess/baz-debug", test_default_handler_baz_debug);
Packit ae235b
  g_test_add_func ("/logging/default-handler/subprocess/debug", test_default_handler_debug);
Packit ae235b
  g_test_add_func ("/logging/default-handler/subprocess/0x400", test_default_handler_0x400);
Packit ae235b
  g_test_add_func ("/logging/warnings", test_warnings);
Packit ae235b
  g_test_add_func ("/logging/fatal-log-mask", test_fatal_log_mask);
Packit ae235b
  g_test_add_func ("/logging/set-handler", test_set_handler);
Packit ae235b
  g_test_add_func ("/logging/print-handler", test_print_handler);
Packit ae235b
  g_test_add_func ("/logging/printerr-handler", test_printerr_handler);
Packit ae235b
  g_test_add_func ("/logging/653052", bug653052);
Packit ae235b
  g_test_add_func ("/logging/gibberish", test_gibberish);
Packit ae235b
  g_test_add_func ("/structured-logging/no-state", test_structured_logging_no_state);
Packit ae235b
  g_test_add_func ("/structured-logging/some-state", test_structured_logging_some_state);
Packit ae235b
  g_test_add_func ("/structured-logging/robustness", test_structured_logging_robustness);
Packit ae235b
  g_test_add_func ("/structured-logging/roundtrip1", test_structured_logging_roundtrip1);
Packit ae235b
  g_test_add_func ("/structured-logging/roundtrip2", test_structured_logging_roundtrip2);
Packit ae235b
  g_test_add_func ("/structured-logging/roundtrip3", test_structured_logging_roundtrip3);
Packit ae235b
  g_test_add_func ("/structured-logging/variant1", test_structured_logging_variant1);
Packit ae235b
  g_test_add_func ("/structured-logging/variant2", test_structured_logging_variant2);
Packit ae235b
Packit ae235b
  return g_test_run ();
Packit ae235b
}