diff --git a/lib/common/tests/strings/pcmk__parse_bool_test.c b/lib/common/tests/strings/pcmk__parse_bool_test.c index f44a5fcd97..ad431701b0 100644 --- a/lib/common/tests/strings/pcmk__parse_bool_test.c +++ b/lib/common/tests/strings/pcmk__parse_bool_test.c @@ -1,108 +1,120 @@ /* * Copyright 2021-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU General Public License version 2 * or later (GPLv2+) WITHOUT ANY WARRANTY. */ #include #include +/*! + * \internal + * \brief Check a call with given input against expected return value and result + * + * \param[in] input Input string + * \param[in] expected_rc Expected return code + * \param[in] expected_result Expected parsed value (ignored unless + * \p expected_rc is \c pcmk_rc_ok) + */ static void -bad_input(void **state) { - // Dumps core via CRM_CHECK() - assert_int_equal(pcmk__parse_bool(NULL, NULL), EINVAL); +assert_parse_bool(const char *input, int expected_rc, bool expected_result) +{ + bool result = false; - assert_int_equal(pcmk__parse_bool("", NULL), pcmk_rc_bad_input); - assert_int_equal(pcmk__parse_bool("blahblah", NULL), pcmk_rc_bad_input); -} + // Ensure we still validate the string with a NULL result argument + assert_int_equal(pcmk__parse_bool(input, NULL), expected_rc); -static void -is_true(void **state) { - bool result; + if (expected_rc != pcmk_rc_ok) { + // Make sure the value of result does not change on failure + expected_result = result; + } + + assert_int_equal(pcmk__parse_bool(input, &result), expected_rc); + if (expected_result) { + assert_true(result); + } else { + assert_false(result); + } - assert_int_equal(pcmk__parse_bool("true", &result), pcmk_rc_ok); - assert_true(result); - assert_int_equal(pcmk__parse_bool("TrUe", &result), pcmk_rc_ok); - assert_true(result); - assert_int_equal(pcmk__parse_bool("on", &result), pcmk_rc_ok); - assert_true(result); - assert_int_equal(pcmk__parse_bool("ON", &result), pcmk_rc_ok); - assert_true(result); - assert_int_equal(pcmk__parse_bool("yes", &result), pcmk_rc_ok); - assert_true(result); - assert_int_equal(pcmk__parse_bool("yES", &result), pcmk_rc_ok); - assert_true(result); - assert_int_equal(pcmk__parse_bool("y", &result), pcmk_rc_ok); - assert_true(result); - assert_int_equal(pcmk__parse_bool("Y", &result), pcmk_rc_ok); - assert_true(result); - assert_int_equal(pcmk__parse_bool("1", &result), pcmk_rc_ok); - assert_true(result); + // Repeat with result initially set to true + result = true; + if (expected_rc != pcmk_rc_ok) { + expected_result = result; + } - // Ensure it still validates the string with a NULL result argument - assert_int_equal(pcmk__parse_bool("true", NULL), pcmk_rc_ok); - assert_int_equal(pcmk__parse_bool("on", NULL), pcmk_rc_ok); - assert_int_equal(pcmk__parse_bool("yes", NULL), pcmk_rc_ok); - assert_int_equal(pcmk__parse_bool("y", NULL), pcmk_rc_ok); - assert_int_equal(pcmk__parse_bool("1", NULL), pcmk_rc_ok); + assert_int_equal(pcmk__parse_bool(input, &result), expected_rc); + if (expected_result) { + assert_true(result); + } else { + assert_false(result); + } } static void -is_not_true(void **state) { - assert_int_equal(pcmk__parse_bool("truedat", NULL), pcmk_rc_bad_input); - assert_int_equal(pcmk__parse_bool("onnn", NULL), pcmk_rc_bad_input); - assert_int_equal(pcmk__parse_bool("yep", NULL), pcmk_rc_bad_input); - assert_int_equal(pcmk__parse_bool("Y!", NULL), pcmk_rc_bad_input); - assert_int_equal(pcmk__parse_bool("100", NULL), pcmk_rc_bad_input); +bad_input(void **state) +{ + // Dumps core via CRM_CHECK() + assert_parse_bool(NULL, EINVAL, false); + + assert_parse_bool("", pcmk_rc_bad_input, false); + assert_parse_bool("blahblah", pcmk_rc_bad_input, false); } static void -is_false(void **state) { - bool result; +is_true(void **state) +{ + assert_parse_bool("true", pcmk_rc_ok, true); + assert_parse_bool("TrUe", pcmk_rc_ok, true); + assert_parse_bool("on", pcmk_rc_ok, true); + assert_parse_bool("ON", pcmk_rc_ok, true); + assert_parse_bool("yes", pcmk_rc_ok, true); + assert_parse_bool("yES", pcmk_rc_ok, true); + assert_parse_bool("y", pcmk_rc_ok, true); + assert_parse_bool("Y", pcmk_rc_ok, true); + assert_parse_bool("1", pcmk_rc_ok, true); +} - assert_int_equal(pcmk__parse_bool("false", &result), pcmk_rc_ok); - assert_false(result); - assert_int_equal(pcmk__parse_bool("fAlSe", &result), pcmk_rc_ok); - assert_false(result); - assert_int_equal(pcmk__parse_bool(PCMK_VALUE_OFF, &result), pcmk_rc_ok); - assert_false(result); - assert_int_equal(pcmk__parse_bool("OFF", &result), pcmk_rc_ok); - assert_false(result); - assert_int_equal(pcmk__parse_bool("no", &result), pcmk_rc_ok); - assert_false(result); - assert_int_equal(pcmk__parse_bool("No", &result), pcmk_rc_ok); - assert_false(result); - assert_int_equal(pcmk__parse_bool("n", &result), pcmk_rc_ok); - assert_false(result); - assert_int_equal(pcmk__parse_bool("N", &result), pcmk_rc_ok); - assert_false(result); - assert_int_equal(pcmk__parse_bool("0", &result), pcmk_rc_ok); - assert_false(result); +static void +is_not_true(void **state) +{ + assert_parse_bool("truedat", pcmk_rc_bad_input, false); + assert_parse_bool("onnn", pcmk_rc_bad_input, false); + assert_parse_bool("yep", pcmk_rc_bad_input, false); + assert_parse_bool("Y!", pcmk_rc_bad_input, false); + assert_parse_bool("100", pcmk_rc_bad_input, false); +} - // Ensure it still validates the string with a NULL result argument - assert_int_equal(pcmk__parse_bool("false", NULL), pcmk_rc_ok); - assert_int_equal(pcmk__parse_bool(PCMK_VALUE_OFF, NULL), pcmk_rc_ok); - assert_int_equal(pcmk__parse_bool("no", NULL), pcmk_rc_ok); - assert_int_equal(pcmk__parse_bool("n", NULL), pcmk_rc_ok); - assert_int_equal(pcmk__parse_bool("0", NULL), pcmk_rc_ok); +static void +is_false(void **state) +{ + assert_parse_bool("false", pcmk_rc_ok, false); + assert_parse_bool("fAlSe", pcmk_rc_ok, false); + assert_parse_bool("off", pcmk_rc_ok, false); + assert_parse_bool("OFF", pcmk_rc_ok, false); + assert_parse_bool("no", pcmk_rc_ok, false); + assert_parse_bool("No", pcmk_rc_ok, false); + assert_parse_bool("n", pcmk_rc_ok, false); + assert_parse_bool("N", pcmk_rc_ok, false); + assert_parse_bool("0", pcmk_rc_ok, false); } static void -is_not_false(void **state) { - assert_int_equal(pcmk__parse_bool("falseee", NULL), pcmk_rc_bad_input); - assert_int_equal(pcmk__parse_bool("of", NULL), pcmk_rc_bad_input); - assert_int_equal(pcmk__parse_bool("nope", NULL), pcmk_rc_bad_input); - assert_int_equal(pcmk__parse_bool("N!", NULL), pcmk_rc_bad_input); - assert_int_equal(pcmk__parse_bool("000", NULL), pcmk_rc_bad_input); +is_not_false(void **state) +{ + assert_parse_bool("falseee", pcmk_rc_bad_input, false); + assert_parse_bool("of", pcmk_rc_bad_input, false); + assert_parse_bool("nope", pcmk_rc_bad_input, false); + assert_parse_bool("N!", pcmk_rc_bad_input, false); + assert_parse_bool("000", pcmk_rc_bad_input, false); } PCMK__UNIT_TEST(NULL, NULL, cmocka_unit_test(bad_input), cmocka_unit_test(is_true), cmocka_unit_test(is_not_true), cmocka_unit_test(is_false), cmocka_unit_test(is_not_false))