pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk__scan_nvpair_test.c
Go to the documentation of this file.
1/*
2 * Copyright 2025 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU General Public License version 2
7 * or later (GPLv2+) WITHOUT ANY WARRANTY.
8 */
9
10#include <crm_internal.h>
11
12#include <glib.h> // gchar, g_free
13
15
16static void
17assert_scan_nvpair(const gchar *input, int expected_rc,
18 const gchar *expected_name, const gchar *expected_value)
19{
20 gchar *name = NULL;
21 gchar *value = NULL;
22
23 assert_int_equal(pcmk__scan_nvpair(input, &name, &value),
24 expected_rc);
25
26 if (expected_name == NULL) {
27 assert_null(name);
28 } else {
29 assert_string_equal(name, expected_name);
30 }
31
32 if (expected_value == NULL) {
33 assert_null(value);
34 } else {
35 assert_string_equal(value, expected_value);
36 }
37
38 g_free(name);
39 g_free(value);
40}
41
42static void
43null_asserts(void **state)
44{
45 const gchar *input = "key=value";
46 gchar *name = NULL;
47 gchar *value = NULL;
48
52}
53
54static void
55already_allocated_asserts(void **state)
56{
57 const gchar *input = "key=value";
58 gchar *buf_null = NULL;
59 gchar *buf_allocated = g_strdup("allocated string");
60
61 pcmk__assert_asserts(pcmk__scan_nvpair(input, &buf_allocated, &buf_null));
62 pcmk__assert_asserts(pcmk__scan_nvpair(input, &buf_null, &buf_allocated));
63
64 g_free(buf_allocated);
65}
66
67static void
68empty_input(void **state)
69{
70 assert_scan_nvpair("", pcmk_rc_bad_nvpair, NULL, NULL);
71}
72
73static void
74equal_sign_only(void **state)
75{
76 assert_scan_nvpair("=", pcmk_rc_bad_nvpair, NULL, NULL);
77}
78
79static void
80name_only(void **state)
81{
82 assert_scan_nvpair("name", pcmk_rc_bad_nvpair, NULL, NULL);
83 assert_scan_nvpair("name=", pcmk_rc_bad_nvpair, NULL, NULL);
84}
85
86static void
87value_only(void **state)
88{
89 assert_scan_nvpair("=value", pcmk_rc_bad_nvpair, NULL, NULL);
90}
91
92static void
93valid(void **state)
94{
95 assert_scan_nvpair("name=value", pcmk_rc_ok, "name", "value");
96
97 // Trailing newlines are discarded
98 assert_scan_nvpair("name=value\n\n", pcmk_rc_ok, "name", "value");
99 assert_scan_nvpair("\nname=value\n", pcmk_rc_ok, "\nname", "value");
100 assert_scan_nvpair("name\n=value\n", pcmk_rc_ok, "name\n", "value");
101 assert_scan_nvpair("name=\nvalue\n", pcmk_rc_ok, "name", "\nvalue");
102 assert_scan_nvpair("name=val\nue\n", pcmk_rc_ok, "name", "val\nue");
103
104 // Other whitespace is kept (checking only space characters here)
105 assert_scan_nvpair(" name=value", pcmk_rc_ok, " name", "value");
106 assert_scan_nvpair("name =value", pcmk_rc_ok, "name ", "value");
107 assert_scan_nvpair("name= value", pcmk_rc_ok, "name", " value");
108 assert_scan_nvpair("name=value ", pcmk_rc_ok, "name", "value ");
109 assert_scan_nvpair("name = value", pcmk_rc_ok, "name ", " value");
110
111 // Other trailing characters are kept
112 assert_scan_nvpair("name=value=", pcmk_rc_ok, "name", "value=");
113 assert_scan_nvpair("name=value=\n\n", pcmk_rc_ok, "name", "value=");
114 assert_scan_nvpair("name=value=e", pcmk_rc_ok, "name", "value=e");
115 assert_scan_nvpair("name=value=e\n\n", pcmk_rc_ok, "name", "value=e");
116
117 // Quotes are not treated specially
118 assert_scan_nvpair("name='value'", pcmk_rc_ok, "name", "'value'");
119 assert_scan_nvpair("'name'=value", pcmk_rc_ok, "'name'", "value");
120 assert_scan_nvpair("'name=value'", pcmk_rc_ok, "'name", "value'");
121 assert_scan_nvpair("name=\"value\"", pcmk_rc_ok, "name", "\"value\"");
122 assert_scan_nvpair("\"name\"=value", pcmk_rc_ok, "\"name\"", "value");
123 assert_scan_nvpair("\"name=value\"", pcmk_rc_ok, "\"name", "value\"");
124
125 // Other special characters are not treated specially (small sample)
126 assert_scan_nvpair("!@#$%=^&*()", pcmk_rc_ok, "!@#$%", "^&*()");
127 assert_scan_nvpair("name=$value", pcmk_rc_ok, "name", "$value");
128}
129
130PCMK__UNIT_TEST(NULL, NULL,
131 cmocka_unit_test(null_asserts),
132 cmocka_unit_test(already_allocated_asserts),
133 cmocka_unit_test(empty_input),
134 cmocka_unit_test(equal_sign_only),
135 cmocka_unit_test(name_only),
136 cmocka_unit_test(value_only),
137 cmocka_unit_test(valid))
const char * name
Definition cib.c:26
int pcmk__scan_nvpair(const gchar *input, gchar **name, gchar **value)
Definition nvpair.c:126
xmlNode * input
@ pcmk_rc_bad_nvpair
Definition results.h:151
@ pcmk_rc_ok
Definition results.h:159
#define pcmk__assert_asserts(stmt)
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)