#include #include /* Test g_warn macros */ static void test_warnings (void) { if (!g_test_undefined ()) return; if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { g_warn_if_reached (); } g_test_trap_assert_failed(); g_test_trap_assert_stderr ("*WARNING*test_warnings*should not be reached*"); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { g_warn_if_fail (FALSE); } g_test_trap_assert_failed(); g_test_trap_assert_stderr ("*WARNING*test_warnings*runtime check failed*"); } static guint log_count = 0; static void log_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data) { g_assert_cmpstr (log_domain, ==, "bu"); g_assert_cmpint (log_level, ==, G_LOG_LEVEL_INFO); log_count++; } /* test that custom log handlers only get called for * their domain and level */ static void test_set_handler (void) { guint id; id = g_log_set_handler ("bu", G_LOG_LEVEL_INFO, log_handler, NULL); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) { g_log ("bu", G_LOG_LEVEL_DEBUG, "message"); g_log ("ba", G_LOG_LEVEL_DEBUG, "message"); g_log ("bu", G_LOG_LEVEL_INFO, "message"); g_log ("ba", G_LOG_LEVEL_INFO, "message"); g_assert_cmpint (log_count, ==, 1); exit (0); } g_test_trap_assert_passed (); g_log_remove_handler ("bu", id); } static void test_default_handler (void) { if (g_test_undefined ()) { if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { g_error ("message1"); exit (0); } g_test_trap_assert_failed (); g_test_trap_assert_stderr ("*ERROR*message1*"); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { g_critical ("message2"); exit (0); } g_test_trap_assert_failed (); g_test_trap_assert_stderr ("*CRITICAL*message2*"); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { g_warning ("message3"); exit (0); } g_test_trap_assert_failed (); g_test_trap_assert_stderr ("*WARNING*message3*"); } if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { g_message ("message4"); exit (0); } g_test_trap_assert_passed (); g_test_trap_assert_stderr ("*Message*message4*"); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) { g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "message5"); exit (0); } g_test_trap_assert_passed (); g_test_trap_assert_stdout_unmatched ("*INFO*message5*"); g_setenv ("G_MESSAGES_DEBUG", "foo bar baz", TRUE); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) { g_log ("bar", G_LOG_LEVEL_INFO, "message5"); exit (0); } g_test_trap_assert_passed (); g_test_trap_assert_stdout ("*INFO*message5*"); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) { g_log ("baz", G_LOG_LEVEL_DEBUG, "message6"); exit (0); } g_test_trap_assert_passed (); g_test_trap_assert_stdout ("*DEBUG*message6*"); g_setenv ("G_MESSAGES_DEBUG", "all", TRUE); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) { g_log ("foo", G_LOG_LEVEL_DEBUG, "6"); g_log ("bar", G_LOG_LEVEL_DEBUG, "6"); g_log ("baz", G_LOG_LEVEL_DEBUG, "6"); exit (0); } g_test_trap_assert_passed (); g_test_trap_assert_stdout ("*DEBUG*6*6*6*"); g_unsetenv ("G_MESSAGES_DEBUG"); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) { g_log (G_LOG_DOMAIN, 1<<10, "message7"); exit (0); } g_test_trap_assert_passed (); g_test_trap_assert_stdout ("*LOG-0x400*message7*"); } /* test that setting levels as fatal works */ static void test_fatal_log_mask (void) { GLogLevelFlags flags; if (!g_test_undefined ()) return; flags = g_log_set_fatal_mask ("bu", G_LOG_LEVEL_INFO); if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) g_log ("bu", G_LOG_LEVEL_INFO, "fatal"); g_test_trap_assert_failed (); g_log_set_fatal_mask ("bu", flags); } static gint my_print_count = 0; static void my_print_handler (const gchar *text) { my_print_count++; } static void test_print_handler (void) { GPrintFunc old_print_handler; old_print_handler = g_set_print_handler (my_print_handler); g_assert (old_print_handler == NULL); my_print_count = 0; g_print ("bu ba"); g_assert_cmpint (my_print_count, ==, 1); g_set_print_handler (NULL); } static void test_printerr_handler (void) { GPrintFunc old_printerr_handler; old_printerr_handler = g_set_printerr_handler (my_print_handler); g_assert (old_printerr_handler == NULL); my_print_count = 0; g_printerr ("bu ba"); g_assert_cmpint (my_print_count, ==, 1); g_set_printerr_handler (NULL); } static char *fail_str = "foo"; static char *log_str = "bar"; static gboolean good_failure_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *msg, gpointer user_data) { g_test_message ("The Good Fail Message Handler\n"); g_assert ((char *)user_data != log_str); g_assert ((char *)user_data == fail_str); return FALSE; } static gboolean bad_failure_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *msg, gpointer user_data) { g_test_message ("The Bad Fail Message Handler\n"); g_assert ((char *)user_data == log_str); g_assert ((char *)user_data != fail_str); return FALSE; } static void test_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *msg, gpointer user_data) { g_test_message ("The Log Message Handler\n"); g_assert ((char *)user_data != fail_str); g_assert ((char *)user_data == log_str); } static void bug653052 (void) { if (!g_test_undefined ()) return; g_test_bug ("653052"); g_test_log_set_fatal_handler (good_failure_handler, fail_str); g_log_set_default_handler (test_handler, log_str); g_return_if_fail (0); g_test_log_set_fatal_handler (bad_failure_handler, fail_str); g_log_set_default_handler (test_handler, log_str); g_return_if_fail (0); } int main (int argc, char *argv[]) { g_test_init (&argc, &argv, NULL); g_test_bug_base ("http://bugzilla.gnome.org/"); g_test_add_func ("/logging/default-handler", test_default_handler); g_test_add_func ("/logging/warnings", test_warnings); g_test_add_func ("/logging/fatal-log-mask", test_fatal_log_mask); g_test_add_func ("/logging/set-handler", test_set_handler); g_test_add_func ("/logging/print-handler", test_print_handler); g_test_add_func ("/logging/printerr-handler", test_printerr_handler); g_test_add_func ("/logging/653052", bug653052); return g_test_run (); }