pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk__unpack_nvpair_block_test.c
Go to the documentation of this file.
1/*
2 * Copyright 2024 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
14
15#define XML_PASSING_RULE \
16 "<" PCMK_XE_RULE " " PCMK_XA_ID "='rp' >\n" \
17 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='ep' " \
18 PCMK_XA_OPERATION "='" PCMK_VALUE_GT "' " \
19 PCMK_XA_START "='1950-01-01 00:00:00' />\n" \
20 "</" PCMK_XE_RULE ">\n"
21
22#define XML_FAILING_RULE \
23 "<" PCMK_XE_RULE " " PCMK_XA_ID "='rf' >\n" \
24 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='ef' " \
25 PCMK_XA_OPERATION "='" PCMK_VALUE_LT "' " \
26 PCMK_XA_END "='1950-01-01 00:00:00' />\n" \
27 "</" PCMK_XE_RULE ">\n"
28
29#define XML_NVPAIRS_1 \
30 "<" PCMK_XE_NVPAIR " " PCMK_XA_ID "='nvp1-1' " \
31 PCMK_XA_NAME "='name1' " PCMK_XA_VALUE "='1' />\n" \
32 "<" PCMK_XE_NVPAIR " " PCMK_XA_ID "='nvp1-2' " \
33 PCMK_XA_NAME "='name2' " PCMK_XA_VALUE "='1' />\n"
34
35#define XML_NVPAIRS_2 \
36 "<" PCMK_XE_NVPAIR " " PCMK_XA_ID "='nvp2-1' " \
37 PCMK_XA_NAME "='name1' " PCMK_XA_VALUE "='2' />\n" \
38 "<" PCMK_XE_NVPAIR " " PCMK_XA_ID "='nvp2-2' " \
39 PCMK_XA_NAME "='name2' " PCMK_XA_VALUE "='2' />\n" \
40 "<" PCMK_XE_NVPAIR " " PCMK_XA_ID "='nvp2-3' " \
41 PCMK_XA_NAME "='name3' " PCMK_XA_VALUE "='2' />\n"
42
43static void
44invalid_args(void **state)
45{
46 pcmk__nvpair_unpack_t unpack_data = {
47 .values = NULL,
48 .rule_input = {
49 .now = NULL,
50 },
51 };
52
53 xmlNode *xml = pcmk__xml_parse("<xml/>");
54
55 assert_non_null(xml);
56
61
62 unpack_data.values = g_hash_table_new(NULL, NULL);
64 g_hash_table_destroy(unpack_data.values);
65
66 pcmk__xml_free(xml);
67}
68
69static void
70with_rules(void **state) {
71 crm_time_t *now = crm_time_new("2024-01-01 15:00:00");
72 pcmk__nvpair_unpack_t unpack_data = {
73 .values = pcmk__strkey_table(free, free),
74 .rule_input = {
75 .now = now,
76 },
77 };
78
79 xmlNode *xml = NULL;
80
81 xml = pcmk__xml_parse("<xml>\n" XML_NVPAIRS_1 XML_PASSING_RULE "</xml>\n");
82 assert_non_null(xml);
83 pcmk__unpack_nvpair_block(xml, &unpack_data);
84 assert_int_equal(g_hash_table_size(unpack_data.values), 2);
85 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name1"), "1");
86 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name2"), "1");
87 pcmk__xml_free(xml);
88
89 xml = pcmk__xml_parse("<xml>\n" XML_NVPAIRS_2 XML_FAILING_RULE "</xml>\n");
90 assert_non_null(xml);
91 pcmk__unpack_nvpair_block(xml, &unpack_data);
92 assert_int_equal(g_hash_table_size(unpack_data.values), 2);
93 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name1"), "1");
94 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name2"), "1");
95 assert_null(g_hash_table_lookup(unpack_data.values, "name3"));
96
97 pcmk__xml_free(xml);
98 crm_time_free(now);
99 g_hash_table_destroy(unpack_data.values);
100}
101
102static void
103without_overwrite(void **state)
104{
105 pcmk__nvpair_unpack_t unpack_data = {
106 .values = pcmk__strkey_table(free, free),
107 .overwrite = false,
108 };
109
110 xmlNode *xml = NULL;
111
112 xml = pcmk__xml_parse("<xml>\n" XML_NVPAIRS_1 "</xml>\n");
113 assert_non_null(xml);
114 pcmk__unpack_nvpair_block(xml, &unpack_data);
115 assert_int_equal(g_hash_table_size(unpack_data.values), 2);
116 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name1"), "1");
117 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name2"), "1");
118 pcmk__xml_free(xml);
119
120 xml = pcmk__xml_parse("<xml>\n" XML_NVPAIRS_2 "</xml>\n");
121 assert_non_null(xml);
122 pcmk__unpack_nvpair_block(xml, &unpack_data);
123 assert_int_equal(g_hash_table_size(unpack_data.values), 3);
124 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name1"), "1");
125 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name2"), "1");
126 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name3"), "2");
127 pcmk__xml_free(xml);
128
129 g_hash_table_destroy(unpack_data.values);
130}
131
132static void
133with_overwrite(void **state)
134{
135 pcmk__nvpair_unpack_t unpack_data = {
136 .values = pcmk__strkey_table(free, free),
137 .overwrite = true,
138 };
139
140 xmlNode *xml = NULL;
141
142 xml = pcmk__xml_parse("<xml>\n" XML_NVPAIRS_1 "</xml>\n");
143 assert_non_null(xml);
144 pcmk__unpack_nvpair_block(xml, &unpack_data);
145 assert_int_equal(g_hash_table_size(unpack_data.values), 2);
146 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name1"), "1");
147 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name2"), "1");
148 pcmk__xml_free(xml);
149
150 xml = pcmk__xml_parse("<xml>\n" XML_NVPAIRS_2 "</xml>\n");
151 assert_non_null(xml);
152 pcmk__unpack_nvpair_block(xml, &unpack_data);
153 assert_int_equal(g_hash_table_size(unpack_data.values), 3);
154 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name1"), "2");
155 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name2"), "2");
156 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name3"), "2");
157 pcmk__xml_free(xml);
158
159 g_hash_table_destroy(unpack_data.values);
160}
161
162static void
163attributes_child(void **state)
164{
165 pcmk__nvpair_unpack_t unpack_data = {
166 .values = pcmk__strkey_table(free, free),
167 };
168
169 xmlNode *xml = pcmk__xml_parse("<xml>\n<" PCMK__XE_ATTRIBUTES ">\n"
171 "</" PCMK__XE_ATTRIBUTES ">\n</xml>\n");
172 assert_non_null(xml);
173 pcmk__unpack_nvpair_block(xml, &unpack_data);
174 assert_int_equal(g_hash_table_size(unpack_data.values), 2);
175 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name1"), "1");
176 assert_string_equal(g_hash_table_lookup(unpack_data.values, "name2"), "1");
177 pcmk__xml_free(xml);
178
179 g_hash_table_destroy(unpack_data.values);
180}
181
183 cmocka_unit_test(invalid_args),
184 cmocka_unit_test(with_rules),
185 cmocka_unit_test(without_overwrite),
186 cmocka_unit_test(with_overwrite),
187 cmocka_unit_test(attributes_child))
void crm_time_free(crm_time_t *dt)
Definition iso8601.c:150
crm_time_t * crm_time_new(const char *string)
Definition iso8601.c:112
struct crm_time_s crm_time_t
Definition iso8601.h:32
void pcmk__unpack_nvpair_block(gpointer data, gpointer user_data)
Definition nvpair.c:445
#define XML_NVPAIRS_1
#define XML_FAILING_RULE
#define XML_NVPAIRS_2
#define XML_PASSING_RULE
GHashTable * pcmk__strkey_table(GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func)
Definition strings.c:685
GHashTable * values
#define pcmk__assert_asserts(stmt)
int pcmk__xml_test_teardown_group(void **state)
Definition unittest.c:105
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
int pcmk__xml_test_setup_group(void **state)
Definition unittest.c:87
void pcmk__xml_free(xmlNode *xml)
Definition xml.c:816
xmlNode * pcmk__xml_parse(const char *input)
Definition xml_io.c:167
#define PCMK__XE_ATTRIBUTES