pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk_ticket_get_attr_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
16#include <libxml/xpath.h> // xmlXPathObject, etc.
17
18#include <pacemaker.h>
19
20static char *cib_path = NULL;
21
22static int
23setup_test(void **state)
24{
25 cib_path = pcmk__cib_test_copy_cib("tickets.xml");
26
27 if (cib_path == NULL) {
28 return -1;
29 }
30
31 return 0;
32}
33
34static int
35teardown_test(void **state)
36{
37 pcmk__cib_test_cleanup(cib_path);
38 cib_path = NULL;
39 return 0;
40}
41
42static void
43bad_arguments(void **state)
44{
45 xmlNode *xml = NULL;
46
47 assert_int_equal(pcmk_ticket_get_attr(NULL, "ticketA", "XYZ", NULL), EINVAL);
48
49 assert_int_equal(pcmk_ticket_get_attr(&xml, NULL, "attrA", NULL), EINVAL);
51 pcmk__xml_free(xml);
52 xml = NULL;
53
54 assert_int_equal(pcmk_ticket_get_attr(&xml, "ticketA", NULL, NULL), EINVAL);
56 pcmk__xml_free(xml);
57}
58
59static void
60unknown_ticket(void **state)
61{
62 xmlNode *xml = NULL;
63
64 /* Both an unknown ticket and an unknown attribute on a known ticket
65 * return ENXIO so we can't really differentiate between the two here.
66 * Still, we'd better test both.
67 */
68 assert_int_equal(pcmk_ticket_get_attr(&xml, "XYZ", "attrA", NULL), ENXIO);
70 pcmk__xml_free(xml);
71 xml = NULL;
72
73 assert_int_equal(pcmk_ticket_get_attr(&xml, "ticketA", "XYZ", NULL), ENXIO);
75 pcmk__xml_free(xml);
76}
77
78static void
79verify_results(xmlNode *xml, const char *ticket_id, const char *attr_name,
80 const char *attr_value)
81{
82 xmlNode *node = NULL;
83 xmlXPathObject *xpath_obj = NULL;
84
85 /* Verify that the XML result has only one <ticket>, and that its ID is
86 * what we asked for.
87 */
88 xpath_obj = pcmk__xpath_search(xml->doc,
91 assert_int_equal(pcmk__xpath_num_results(xpath_obj), 1);
92
93 node = pcmk__xpath_result(xpath_obj, 0);
94 assert_non_null(node);
95 assert_string_equal(crm_element_value(node, PCMK_XA_ID), ticket_id);
96 xmlXPathFreeObject(xpath_obj);
97
98 /* Verify that it has an <attribute> child whose name and value are what
99 * we expect.
100 */
101 xpath_obj = pcmk__xpath_search(xml->doc,
105 assert_int_equal(pcmk__xpath_num_results(xpath_obj), 1);
106
107 node = pcmk__xpath_result(xpath_obj, 0);
108 assert_non_null(node);
109 assert_string_equal(crm_element_value(node, PCMK_XA_NAME), attr_name);
110 assert_string_equal(crm_element_value(node, PCMK_XA_VALUE), attr_value);
111
112 xmlXPathFreeObject(xpath_obj);
113}
114
115static void
116attribute_exists(void **state)
117{
118 xmlNode *xml = NULL;
119
120 assert_int_equal(pcmk_ticket_get_attr(&xml, "ticketA", "owner", NULL), pcmk_rc_ok);
122
123 verify_results(xml, "ticketA", "owner", "1");
124
125 pcmk__xml_free(xml);
126}
127
128static void
129default_no_ticket(void **state)
130{
131 xmlNode *xml = NULL;
132
133 assert_int_equal(pcmk_ticket_get_attr(&xml, "ticketX", "ABC", "DEFAULT"), pcmk_rc_ok);
135
136 verify_results(xml, "ticketX", "ABC", "DEFAULT");
137
138 pcmk__xml_free(xml);
139}
140
141static void
142default_no_attribute(void **state)
143{
144 xmlNode *xml = NULL;
145
146 assert_int_equal(pcmk_ticket_get_attr(&xml, "ticketA", "ABC", "DEFAULT"), pcmk_rc_ok);
148
149 verify_results(xml, "ticketA", "ABC", "DEFAULT");
150
151 pcmk__xml_free(xml);
152}
153
155 cmocka_unit_test_setup_teardown(bad_arguments, setup_test, teardown_test),
156 cmocka_unit_test_setup_teardown(unknown_ticket, setup_test, teardown_test),
157 cmocka_unit_test_setup_teardown(attribute_exists, setup_test, teardown_test),
158 cmocka_unit_test_setup_teardown(default_no_ticket, setup_test, teardown_test),
159 cmocka_unit_test_setup_teardown(default_no_attribute, setup_test, teardown_test))
High Level API.
int pcmk_ticket_get_attr(xmlNodePtr *xml, const char *ticket_id, const char *attr_name, const char *attr_default)
Return the value of a ticket's attribute.
@ 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_ID
Definition xml_names.h:301
#define PCMK_XE_ATTRIBUTE
Definition xml_names.h:69
#define PCMK_XE_TICKETS
Definition xml_names.h:213
#define PCMK_XA_VALUE
Definition xml_names.h:442
#define PCMK_XE_PACEMAKER_RESULT
Definition xml_names.h:156
#define PCMK_XA_NAME
Definition xml_names.h:330
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