This source file includes following definitions.
- invalid_args
- with_rules
- without_overwrite
- with_overwrite
- attributes_child
1
2
3
4
5
6
7
8
9
10 #include <crm_internal.h>
11
12 #include <crm/common/unittest_internal.h>
13 #include <crm/common/xml_internal.h>
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
43 static void
44 invalid_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
57 pcmk__assert_asserts(pcmk__unpack_nvpair_block(NULL, NULL));
58 pcmk__assert_asserts(pcmk__unpack_nvpair_block(NULL, &unpack_data));
59 pcmk__assert_asserts(pcmk__unpack_nvpair_block(xml, NULL));
60 pcmk__assert_asserts(pcmk__unpack_nvpair_block(xml, &unpack_data));
61
62 unpack_data.values = g_hash_table_new(NULL, NULL);
63 pcmk__assert_asserts(pcmk__unpack_nvpair_block(NULL, &unpack_data));
64 g_hash_table_destroy(unpack_data.values);
65
66 pcmk__xml_free(xml);
67 }
68
69 static void
70 with_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
102 static void
103 without_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
132 static void
133 with_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
162 static void
163 attributes_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"
170 XML_NVPAIRS_1
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
182 PCMK__UNIT_TEST(pcmk__xml_test_setup_group, pcmk__xml_test_teardown_group,
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))