pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk_ticket_info_test.c
Go to the documentation of this file.
1/*
2 * Copyright 2024-2025 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
12#include <crm/cib/internal.h>
14#include <crm/common/xml.h>
15#include <pacemaker.h>
16
17#include <libxml/xpath.h> // xmlXPathObject, etc.
18
19static char *cib_path = NULL;
20
21static int
22setup_test(void **state)
23{
24 cib_path = pcmk__cib_test_copy_cib("tickets.xml");
25
26 if (cib_path == NULL) {
27 return -1;
28 }
29
30 return 0;
31}
32
33static int
34teardown_test(void **state)
35{
36 pcmk__cib_test_cleanup(cib_path);
37 cib_path = NULL;
38 return 0;
39}
40
41static void
42bad_arguments(void **state)
43{
44 assert_int_equal(pcmk_ticket_info(NULL, "ticketA"), EINVAL);
45}
46
47static void
48unknown_ticket(void **state)
49{
50 xmlNode *xml = NULL;
51
52 assert_int_equal(pcmk_ticket_info(&xml, "XYZ"), ENXIO);
54 pcmk__xml_free(xml);
55}
56
57static void
58all_tickets(void **state)
59{
60 xmlNode *node = NULL;
61 xmlXPathObject *xpath_obj = NULL;
62 xmlNode *xml = NULL;
63
64 assert_int_equal(pcmk_ticket_info(&xml, NULL), pcmk_rc_ok);
66
67 /* Verify that the XML result has three <ticket> elements, with the attributes
68 * we expect. The input has four tickets, but when they are loaded into the
69 * scheduler's hash table, the duplicate IDs will collide leaving us with
70 * three.
71 */
72 xpath_obj = pcmk__xpath_search(xml->doc,
75 assert_int_equal(pcmk__xpath_num_results(xpath_obj), 3);
76 xmlXPathFreeObject(xpath_obj);
77
78 xpath_obj = pcmk__xpath_search(xml->doc,
81 "[@" PCMK_XA_ID "=\"ticketA\"]");
82
83 node = pcmk__xpath_result(xpath_obj, 0);
84 assert_non_null(node);
85 assert_string_equal(crm_element_value(node, PCMK_XA_STATUS), PCMK_VALUE_REVOKED);
86 assert_string_equal(crm_element_value(node, PCMK__XA_GRANTED), "false");
87 assert_string_equal(crm_element_value(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE);
88 assert_string_equal(crm_element_value(node, "owner"), "1");
89 xmlXPathFreeObject(xpath_obj);
90
91 xpath_obj = pcmk__xpath_search(xml->doc,
94 "[@" PCMK_XA_ID "=\"ticketB\"]");
95
96 node = pcmk__xpath_result(xpath_obj, 0);
97 assert_non_null(node);
98 assert_string_equal(crm_element_value(node, PCMK_XA_STATUS), PCMK_VALUE_GRANTED);
99 assert_string_equal(crm_element_value(node, PCMK__XA_GRANTED), "true");
100 assert_string_equal(crm_element_value(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE);
101 assert_null(crm_element_value(node, "owner"));
102 xmlXPathFreeObject(xpath_obj);
103
104 xpath_obj = pcmk__xpath_search(xml->doc,
107 "[@" PCMK_XA_ID "=\"ticketC\"]");
108
109 node = pcmk__xpath_result(xpath_obj, 0);
110 assert_non_null(node);
111 assert_string_equal(crm_element_value(node, PCMK_XA_STATUS), PCMK_VALUE_GRANTED);
112 assert_string_equal(crm_element_value(node, PCMK__XA_GRANTED), "true");
113 assert_string_equal(crm_element_value(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE);
114 assert_null(crm_element_value(node, "owner"));
115
116 xmlXPathFreeObject(xpath_obj);
117 pcmk__xml_free(xml);
118}
119
120static void
121single_ticket(void **state)
122{
123 xmlNode *node = NULL;
124 xmlXPathObject *xpath_obj = NULL;
125 xmlNode *xml = NULL;
126
127 assert_int_equal(pcmk_ticket_info(&xml, "ticketA"), pcmk_rc_ok);
129
130 /* Verify that the XML result has only one <ticket>, with the attributes
131 * we expect.
132 */
133 xpath_obj = pcmk__xpath_search(xml->doc,
136 "[@" PCMK_XA_ID "=\"ticketA\"]");
137 assert_int_equal(pcmk__xpath_num_results(xpath_obj), 1);
138
139 node = pcmk__xpath_result(xpath_obj, 0);
140 assert_non_null(node);
141 assert_string_equal(crm_element_value(node, PCMK_XA_STATUS), PCMK_VALUE_REVOKED);
142 assert_string_equal(crm_element_value(node, PCMK__XA_GRANTED), "false");
143 assert_string_equal(crm_element_value(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE);
144 assert_string_equal(crm_element_value(node, "owner"), "1");
145
146 xmlXPathFreeObject(xpath_obj);
147 pcmk__xml_free(xml);
148}
149
151 cmocka_unit_test_setup_teardown(bad_arguments, setup_test, teardown_test),
152 cmocka_unit_test_setup_teardown(unknown_ticket, setup_test, teardown_test),
153 cmocka_unit_test_setup_teardown(all_tickets, setup_test, teardown_test),
154 cmocka_unit_test_setup_teardown(single_ticket, setup_test, teardown_test))
#define PCMK_VALUE_REVOKED
Definition options.h:205
#define PCMK_VALUE_GRANTED
Definition options.h:158
#define PCMK_VALUE_FALSE
Definition options.h:154
High Level API.
int pcmk_ticket_info(xmlNodePtr *xml, const char *ticket_id)
Return information about the given ticket.
@ pcmk_rc_ok
Definition results.h:159
void pcmk__cib_test_cleanup(char *out_path)
Definition unittest.c:148
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__assert_validates(xmlNode *xml)
Definition unittest.c:22
char * pcmk__cib_test_copy_cib(const char *in_file)
Definition unittest.c:113
Wrappers for and extensions to libxml2.
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
void pcmk__xml_free(xmlNode *xml)
Definition xml.c:816
#define PCMK_XE_TICKET
Definition xml_names.h:212
#define PCMK_XA_STATUS
Definition xml_names.h:410
#define PCMK_XA_ID
Definition xml_names.h:301
#define PCMK_XE_TICKETS
Definition xml_names.h:213
#define PCMK_XA_STANDBY
Definition xml_names.h:406
#define PCMK_XE_PACEMAKER_RESULT
Definition xml_names.h:156
#define PCMK__XA_GRANTED
xmlXPathObject * pcmk__xpath_search(xmlDoc *doc, const char *path)
Definition xpath.c:137
xmlNode * pcmk__xpath_result(xmlXPathObject *xpath_obj, int index)
Definition xpath.c:65