pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
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
24static pcmk__nvpair_unpack_t unpack_data = {
25 .first_id = FIRST_ID,
26};
27
28static void
29null_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
52static void
53special_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
88static void
89null_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
111static void
112highest_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
133static void
134invalid_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))
gint pcmk__cmp_nvpair_blocks(gconstpointer a, gconstpointer b, gpointer user_data)
Definition nvpair.c:582
#define XML_NO_ID
#define XML_FIRST_ID
const char * first_id
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