pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk__xe_copy_attrs_test.c
Go to the documentation of this file.
1 /*
2 * Copyright 2022-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
13
14#include <glib.h>
15
16static void
17null_args(void **state)
18{
19 // This test dumps core via CRM_CHECK()
20 xmlNode *xml = pcmk__xe_create(NULL, "test");
21
22 assert_int_equal(pcmk__xe_copy_attrs(NULL, NULL, pcmk__xaf_none), EINVAL);
23 assert_int_equal(pcmk__xe_copy_attrs(NULL, xml, pcmk__xaf_none), EINVAL);
24 assert_int_equal(pcmk__xe_copy_attrs(xml, NULL, pcmk__xaf_none), EINVAL);
25 assert_ptr_equal(xml->properties, NULL);
26
27 pcmk__xml_free(xml);
28}
29
30static void
31no_source_attrs(void **state)
32{
33 xmlNode *src = pcmk__xe_create(NULL, "test");
34 xmlNode *target = pcmk__xe_create(NULL, "test");
35
36 // Ensure copying from empty source doesn't create target properties
37 assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none),
39 assert_ptr_equal(target->properties, NULL);
40
41 // Ensure copying from empty source doesn't delete target attributes
42 crm_xml_add(target, "attr", "value");
43 assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none),
45 assert_string_equal(crm_element_value(target, "attr"), "value");
46
47 pcmk__xml_free(src);
49}
50
51static void
52copy_one(void **state)
53{
54 xmlNode *src = pcmk__xe_create(NULL, "test");
55 xmlNode *target = pcmk__xe_create(NULL, "test");
56
57 crm_xml_add(src, "attr", "value");
58
59 assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none),
61 assert_string_equal(crm_element_value(src, "attr"),
62 crm_element_value(target, "attr"));
63
64 pcmk__xml_free(src);
66}
67
68static void
69copy_multiple(void **state)
70{
71 xmlNode *src = pcmk__xe_create(NULL, "test");
72 xmlNode *target = pcmk__xe_create(NULL, "test");
73
75 "attr1", "value1",
76 "attr2", "value2",
77 "attr3", "value3",
78 NULL);
79
80 assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none),
82 assert_string_equal(crm_element_value(src, "attr1"),
83 crm_element_value(target, "attr1"));
84 assert_string_equal(crm_element_value(src, "attr2"),
85 crm_element_value(target, "attr2"));
86 assert_string_equal(crm_element_value(src, "attr3"),
87 crm_element_value(target, "attr3"));
88
89 pcmk__xml_free(src);
91}
92
93static void
94overwrite(void **state)
95{
96 xmlNode *src = pcmk__xe_create(NULL, "test");
97 xmlNode *target = pcmk__xe_create(NULL, "test");
98
99 crm_xml_add(src, "attr", "src_value");
100 crm_xml_add(target, "attr", "target_value");
101
102 // Overwrite enabled by default
103 assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none),
104 pcmk_rc_ok);
105 assert_string_equal(crm_element_value(src, "attr"),
106 crm_element_value(target, "attr"));
107 pcmk__xml_free(src);
109}
110
111static void
112no_overwrite(void **state)
113{
114 xmlNode *src = pcmk__xe_create(NULL, "test");
115 xmlNode *target = pcmk__xe_create(NULL, "test");
116
117 crm_xml_add(src, "attr", "src_value");
118 crm_xml_add(target, "attr", "target_value");
119
120 assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_no_overwrite),
121 pcmk_rc_ok);
122 assert_string_not_equal(crm_element_value(src, "attr"),
123 crm_element_value(target, "attr"));
124
125 // no_overwrite doesn't prevent copy if there's no conflict
127
128 assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_no_overwrite),
129 pcmk_rc_ok);
130 assert_string_equal(crm_element_value(src, "attr"),
131 crm_element_value(target, "attr"));
132
133 pcmk__xml_free(src);
135}
136
137static void
138score_update(void **state)
139{
140 xmlNode *src = pcmk__xe_create(NULL, "test");
141 xmlNode *target = pcmk__xe_create(NULL, "test");
142
143 crm_xml_add(src, "plus_plus_attr", "plus_plus_attr++");
144 crm_xml_add(src, "plus_two_attr", "plus_two_attr+=2");
145 crm_xml_add(target, "plus_plus_attr", "1");
146 crm_xml_add(target, "plus_two_attr", "1");
147
148 assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_score_update),
149 pcmk_rc_ok);
150 assert_string_equal(crm_element_value(target, "plus_plus_attr"), "2");
151 assert_string_equal(crm_element_value(target, "plus_two_attr"), "3");
152
153 pcmk__xml_free(src);
155}
156
157static void
158no_score_update(void **state)
159{
160 xmlNode *src = pcmk__xe_create(NULL, "test");
161 xmlNode *target = pcmk__xe_create(NULL, "test");
162
163 crm_xml_add(src, "plus_plus_attr", "plus_plus_attr++");
164 crm_xml_add(src, "plus_two_attr", "plus_two_attr+=2");
165 crm_xml_add(target, "plus_plus_attr", "1");
166 crm_xml_add(target, "plus_two_attr", "1");
167
168 // Score update disabled by default
169 assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none),
170 pcmk_rc_ok);
171 assert_string_equal(crm_element_value(target, "plus_plus_attr"),
172 "plus_plus_attr++");
173 assert_string_equal(crm_element_value(target, "plus_two_attr"),
174 "plus_two_attr+=2");
175
176 pcmk__xml_free(src);
178}
179
181 cmocka_unit_test(null_args),
182 cmocka_unit_test(no_source_attrs),
183 cmocka_unit_test(copy_one),
184 cmocka_unit_test(copy_multiple),
185 cmocka_unit_test(overwrite),
186 cmocka_unit_test(no_overwrite),
187 cmocka_unit_test(score_update),
188 cmocka_unit_test(no_score_update));
const char * target
Definition pcmk_fence.c:31
@ pcmk_rc_ok
Definition results.h:159
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
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
void pcmk__xe_remove_attr(xmlNode *element, const char *name)
int pcmk__xe_copy_attrs(xmlNode *target, const xmlNode *src, uint32_t flags)
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__xe_set_props(xmlNodePtr node,...) G_GNUC_NULL_TERMINATED
@ pcmk__xaf_none
Flag has no effect.
@ pcmk__xaf_no_overwrite
Don't overwrite existing values.
@ pcmk__xaf_score_update
void pcmk__xml_free(xmlNode *xml)
Definition xml.c:816