diff --git a/lib/common/tests/xml/Makefile.am b/lib/common/tests/xml/Makefile.am index 08485dab19..da8aecd31d 100644 --- a/lib/common/tests/xml/Makefile.am +++ b/lib/common/tests/xml/Makefile.am @@ -1,18 +1,19 @@ # -# Copyright 2022-2023 the Pacemaker project contributors +# Copyright 2022-2024 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 $(top_srcdir)/mk/tap.mk include $(top_srcdir)/mk/unittest.mk # Add "_test" to the end of all test program names to simplify .gitignore. check_PROGRAMS = crm_xml_init_test \ pcmk__xe_foreach_child_test \ - pcmk__xe_match_test + pcmk__xe_match_test \ + pcmk__xml_escape_test TESTS = $(check_PROGRAMS) diff --git a/lib/common/tests/xml/pcmk__xml_escape_test.c b/lib/common/tests/xml/pcmk__xml_escape_test.c new file mode 100644 index 0000000000..4e8ba151f2 --- /dev/null +++ b/lib/common/tests/xml/pcmk__xml_escape_test.c @@ -0,0 +1,145 @@ +/* + * Copyright 2024 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 +#include + +// @TODO Add tests for Unicode characters + +static void +null_empty(void **state) +{ + char *str = NULL; + + str = pcmk__xml_escape(NULL, false); + assert_null(str); + + str = pcmk__xml_escape(NULL, true); + assert_null(str); + + str = pcmk__xml_escape("", false); + assert_string_equal(str, ""); + free(str); + + str = pcmk__xml_escape("", true); + assert_string_equal(str, ""); + free(str); +} + +static void +escape_unchanged(void **state) +{ + // No escaped characters (note: this string includes single quote at end) + const char *unchanged = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "\n\t`~!@#$%^*()-_=+/|\\[]{}?.,'"; + char *str = NULL; + + str = pcmk__xml_escape(unchanged, false); + assert_string_equal(str, unchanged); + free(str); + + str = pcmk__xml_escape(unchanged, true); + assert_string_equal(str, unchanged); + free(str); +} + +// Ensure special characters get escaped at start, middle, and end + +static void +escape_left_angle(void **state) +{ + const char *l_angle = "