pacemaker  3.0.0-d8340737c4
Scalable High-Availability cluster resource manager
pcmk__cmp_nvpair_blocks_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 FIRST_ID "foo"
16 
17 #define XML_FIRST_ID "<block " PCMK_XA_ID "=\"" FIRST_ID "\" " \
18  PCMK_XA_SCORE "=\"0\" />"
19 #define XML_NO_ID "<block " PCMK_XA_SCORE "=\"5\" />"
20 #define XML_LOW "<block " PCMK_XA_ID "=\"low\" " PCMK_XA_SCORE "=\"1\" />"
21 #define XML_HIGH "<block " PCMK_XA_ID "=\"high\" " PCMK_XA_SCORE "=\"100\" />"
22 #define XML_BAD "<block " PCMK_XA_ID "=\"high\" " PCMK_XA_SCORE "=\"x\" />"
23 
24 static pcmk__nvpair_unpack_t unpack_data = {
25  .first_id = FIRST_ID,
26 };
27 
28 static void
29 null_lowest(void **state)
30 {
31  xmlNode *block = pcmk__xml_parse(XML_LOW);
32 
33  assert_non_null(block);
34 
35  assert_int_equal(pcmk__cmp_nvpair_blocks(NULL, block, NULL), 1);
36  assert_int_equal(pcmk__cmp_nvpair_blocks(block, NULL, NULL), -1);
37  assert_int_equal(pcmk__cmp_nvpair_blocks(NULL, NULL, NULL), 0);
38 
39  unpack_data.overwrite = false;
40  assert_int_equal(pcmk__cmp_nvpair_blocks(NULL, block, &unpack_data), 1);
41  assert_int_equal(pcmk__cmp_nvpair_blocks(block, NULL, &unpack_data), -1);
42  assert_int_equal(pcmk__cmp_nvpair_blocks(NULL, NULL, &unpack_data), 0);
43 
44  unpack_data.overwrite = true;
45  assert_int_equal(pcmk__cmp_nvpair_blocks(NULL, block, &unpack_data), -1);
46  assert_int_equal(pcmk__cmp_nvpair_blocks(block, NULL, &unpack_data), 1);
47  assert_int_equal(pcmk__cmp_nvpair_blocks(NULL, NULL, &unpack_data), 0);
48 
49  pcmk__xml_free(block);
50 }
51 
52 static void
53 special_id_highest(void **state)
54 {
55  xmlNode *first_id = pcmk__xml_parse(XML_FIRST_ID);
56  xmlNode *not_first_id = pcmk__xml_parse(XML_HIGH);
57  xmlNode *no_id = pcmk__xml_parse(XML_NO_ID);
58 
59  assert_non_null(first_id);
60  assert_non_null(not_first_id);
61  assert_non_null(no_id);
62 
63  unpack_data.overwrite = false;
64  assert_int_equal(pcmk__cmp_nvpair_blocks(first_id, not_first_id,
65  &unpack_data), -1);
66  assert_int_equal(pcmk__cmp_nvpair_blocks(not_first_id, first_id,
67  &unpack_data), 1);
68  assert_int_equal(pcmk__cmp_nvpair_blocks(first_id, no_id,
69  &unpack_data), -1);
70  assert_int_equal(pcmk__cmp_nvpair_blocks(no_id, first_id,
71  &unpack_data), 1);
72 
73  unpack_data.overwrite = true;
74  assert_int_equal(pcmk__cmp_nvpair_blocks(first_id, not_first_id,
75  &unpack_data), 1);
76  assert_int_equal(pcmk__cmp_nvpair_blocks(not_first_id, first_id,
77  &unpack_data), -1);
78  assert_int_equal(pcmk__cmp_nvpair_blocks(first_id, no_id,
79  &unpack_data), 1);
80  assert_int_equal(pcmk__cmp_nvpair_blocks(no_id, first_id,
81  &unpack_data), -1);
82 
83  pcmk__xml_free(first_id);
84  pcmk__xml_free(not_first_id);
85  pcmk__xml_free(no_id);
86 }
87 
88 static void
89 null_special_id_ignored(void **state)
90 {
91  xmlNode *no_id = pcmk__xml_parse(XML_NO_ID);
92  xmlNode *high = pcmk__xml_parse(XML_HIGH);
93 
94  assert_non_null(no_id);
95  assert_non_null(high);
96 
97  unpack_data.first_id = NULL;
98 
99  unpack_data.overwrite = false;
100  assert_int_equal(pcmk__cmp_nvpair_blocks(no_id, high, &unpack_data), 1);
101 
102  unpack_data.overwrite = true;
103  assert_int_equal(pcmk__cmp_nvpair_blocks(no_id, high, &unpack_data), -1);
104 
105  unpack_data.first_id = FIRST_ID;
106 
107  pcmk__xml_free(no_id);
108  pcmk__xml_free(high);
109 }
110 
111 static void
112 highest_score_wins(void **state)
113 {
114  xmlNode *low = pcmk__xml_parse(XML_LOW);
115  xmlNode *low2 = pcmk__xml_parse(XML_LOW);
116  xmlNode *high = pcmk__xml_parse(XML_HIGH);
117 
118  assert_non_null(low);
119  assert_non_null(high);
120 
121  unpack_data.overwrite = false;
122  assert_int_equal(pcmk__cmp_nvpair_blocks(low, high, &unpack_data), 1);
123  assert_int_equal(pcmk__cmp_nvpair_blocks(low, low2, &unpack_data), 0);
124 
125  unpack_data.overwrite = true;
126  assert_int_equal(pcmk__cmp_nvpair_blocks(low, high, &unpack_data), -1);
127  assert_int_equal(pcmk__cmp_nvpair_blocks(low, low2, &unpack_data), 0);
128 
129  pcmk__xml_free(low);
130  pcmk__xml_free(high);
131 }
132 
133 static void
134 invalid_score_is_0(void **state)
135 {
136  xmlNode *zero = pcmk__xml_parse(XML_FIRST_ID);
137  xmlNode *bad = pcmk__xml_parse(XML_BAD);
138 
139  assert_non_null(zero);
140  assert_non_null(bad);
141 
142  assert_int_equal(pcmk__cmp_nvpair_blocks(zero, bad, NULL), 0);
143  assert_int_equal(pcmk__cmp_nvpair_blocks(bad, zero, NULL), 0);
144 
145  pcmk__xml_free(zero);
146  pcmk__xml_free(bad);
147 }
148 
150  cmocka_unit_test(null_lowest),
151  cmocka_unit_test(special_id_highest),
152  cmocka_unit_test(null_special_id_ignored),
153  cmocka_unit_test(highest_score_wins),
154  cmocka_unit_test(invalid_score_is_0))
#define XML_FIRST_ID
#define XML_HIGH
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
gint pcmk__cmp_nvpair_blocks(gconstpointer a, gconstpointer b, gpointer user_data)
Definition: nvpair.c:464
const char * first_id
void pcmk__xml_free(xmlNode *xml)
Definition: xml.c:789
#define XML_BAD
int pcmk__xml_test_setup_group(void **state)
Definition: unittest.c:85
int pcmk__xml_test_teardown_group(void **state)
Definition: unittest.c:104
xmlNode * pcmk__xml_parse(const char *input)
Definition: xml_io.c:168
#define XML_NO_ID
#define FIRST_ID
#define XML_LOW