From f4c30feb9598e09d1d32805bad96e216c1a21786 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Sun, 10 Nov 2013 15:44:06 -0500 Subject: [PATCH] gtestutils: fix g_test_set_nonfatal_assertions() g_test_set_nonfatal_assertions() was a no-op, because g_assertion_message() wasn't actually checking the test_nonfatal_assertions flag. Fix that and add a test. Also, g_test_set_nonfatal_assertions() has to set test_mode_fatal to FALSE as well, or else a failed assertion will cause the test program to abort at the end of the failed test. Also, belatedly add this and the new g_assert_* methods to the docs. https://bugzilla.gnome.org/show_bug.cgi?id=711800 --- docs/reference/glib/glib-sections.txt | 5 +++++ glib/gtestutils.c | 19 +++++++++++++++---- glib/tests/testing.c | 22 ++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index ae5df60..4b25549 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -2966,6 +2966,7 @@ g_test_rand_double_range g_assert g_assert_not_reached + g_assert_cmpstr g_assert_cmpint g_assert_cmpuint @@ -2973,6 +2974,10 @@ g_assert_cmphex g_assert_cmpfloat g_assert_no_error g_assert_error +g_assert_true +g_assert_false +g_assert_null +g_test_set_nonfatal_assertions GTestCase GTestSuite diff --git a/glib/gtestutils.c b/glib/gtestutils.c index 34cee4d..7da2fc0 100644 --- a/glib/gtestutils.c +++ b/glib/gtestutils.c @@ -1754,7 +1754,9 @@ g_test_failed (void) * g_assert_true(), g_assert_false(), g_assert_null(), g_assert_no_error(), * g_assert_error(), g_test_assert_expected_messages() and the various * g_test_trap_assert_*() macros to not abort to program, but instead - * call g_test_fail() and continue. + * call g_test_fail() and continue. (This also changes the behavior of + * g_test_fail() so that it will not cause the test program to abort + * after completing the failed test.) * * Note that the g_assert_not_reached() and g_assert() are not * affected by this. @@ -1769,6 +1771,7 @@ g_test_set_nonfatal_assertions (void) if (!g_test_config_vars->test_initialized) g_error ("g_test_set_nonfatal_assertions called without g_test_init"); test_nonfatal_assertions = TRUE; + test_mode_fatal = FALSE; } /** @@ -2271,15 +2274,23 @@ g_assertion_message (const char *domain, " ", message, NULL); g_printerr ("**\n%s\n", s); + g_test_log (G_TEST_LOG_ERROR, s, NULL, 0, NULL); + + if (test_nonfatal_assertions) + { + g_free (s); + g_test_fail (); + return; + } + /* store assertion message in global variable, so that it can be found in a * core dump */ if (__glib_assert_msg != NULL) - /* free the old one */ - free (__glib_assert_msg); + /* free the old one */ + free (__glib_assert_msg); __glib_assert_msg = (char*) malloc (strlen (s) + 1); strcpy (__glib_assert_msg, s); - g_test_log (G_TEST_LOG_ERROR, s, NULL, 0, NULL); g_free (s); _g_log_abort (); } diff --git a/glib/tests/testing.c b/glib/tests/testing.c index 90f11bb..3a89370 100644 --- a/glib/tests/testing.c +++ b/glib/tests/testing.c @@ -563,6 +563,25 @@ test_dash_p (void) g_test_trap_assert_stdout_unmatched ("*Test /misc/dash-p/subprocess/hidden*"); } +static void +test_nonfatal_subprocess (void) +{ + g_test_set_nonfatal_assertions (); + + g_assert_cmpint (4, ==, 5); + + g_print ("The End\n"); +} + +static void +test_nonfatal (void) +{ + g_test_trap_subprocess ("/misc/nonfatal/subprocess", 0, 0); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*assertion failed*4 == 5*"); + g_test_trap_assert_stdout ("*The End*"); +} + int main (int argc, char *argv[]) @@ -624,5 +643,8 @@ main (int argc, g_test_add_func ("/misc/dash-p/subprocess/hidden", test_dash_p_hidden); g_test_add_func ("/misc/dash-p/subprocess/hidden/sub", test_dash_p_hidden_sub); + g_test_add_func ("/misc/nonfatal", test_nonfatal); + g_test_add_func ("/misc/nonfatal/subprocess", test_nonfatal_subprocess); + return g_test_run(); } -- 2.7.4