15#include <libxml/tree.h>
16#include <libxml/xmlstring.h>
33assert_order(xmlNode *test_xml,
const xmlNode *reference_xml)
36 xmlAttr *test_attr = NULL;
37 xmlAttr *ref_attr = NULL;
40 for (xmlAttr *attr = pcmk__xe_first_attr(test_xml); attr != NULL;
46 g_hash_table_insert(attr_flags,
48 GUINT_TO_POINTER((guint)
flags));
53 test_attr = pcmk__xe_first_attr(test_xml);
54 ref_attr = pcmk__xe_first_attr(reference_xml);
56 for (; (test_attr != NULL) && (ref_attr != NULL);
57 test_attr = test_attr->next, ref_attr = ref_attr->next) {
59 const char *test_name = (
const char *) test_attr->name;
63 gpointer old_flags_ptr = g_hash_table_lookup(attr_flags, test_name);
66 if (old_flags_ptr != NULL) {
67 old_flags = GPOINTER_TO_UINT(old_flags_ptr);
71 assert_true(
flags == old_flags);
74 assert_string_equal(test_name, (
const char *) ref_attr->name);
75 assert_string_equal(pcmk__xml_attr_value(test_attr),
76 pcmk__xml_attr_value(ref_attr));
80 assert_null(test_attr);
81 assert_null(ref_attr);
83 g_hash_table_destroy(attr_flags);
94nothing_to_sort(
void **state)
97 xmlNode *reference_xml = NULL;
101 assert_order(test_xml, reference_xml);
107 assert_order(test_xml, reference_xml);
114already_sorted(
void **state)
119 xmlAttr *attr = NULL;
126 attr = xmlHasProp(test_xml, (
const xmlChar *)
"admin");
130 if (nodepriv != NULL) {
135 attr = xmlHasProp(test_xml, (
const xmlChar *)
"location");
139 if (nodepriv != NULL) {
150 assert_order(test_xml, reference_xml);
157need_sort(
void **state)
162 xmlAttr *attr = NULL;
169 attr = xmlHasProp(test_xml, (
const xmlChar *)
"location");
173 if (nodepriv != NULL) {
178 attr = xmlHasProp(test_xml, (
const xmlChar *)
"admin");
182 if (nodepriv != NULL) {
193 assert_order(test_xml, reference_xml);
200 cmocka_unit_test(null_arg),
201 cmocka_unit_test(nothing_to_sort),
202 cmocka_unit_test(already_sorted),
203 cmocka_unit_test(need_sort))
#define pcmk__set_xml_flags(xml_priv, flags_to_set)
#define pcmk__clear_xml_flags(xml_priv, flags_to_clear)
GHashTable * pcmk__strkey_table(GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func)
#define pcmk__str_copy(str)
uint32_t flags
Group of enum pcmk__xml_flags
int pcmk__xml_test_teardown_group(void **state)
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
int pcmk__xml_test_setup_group(void **state)
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__xe_set_props(xmlNodePtr node,...) G_GNUC_NULL_TERMINATED
void pcmk__xe_sort_attrs(xmlNode *xml)
xmlNode * pcmk__xml_copy(xmlNode *parent, xmlNode *src)
@ pcmk__xf_created
Node was created.
@ pcmk__xf_ignore_attr_pos
Ignore attribute moves within an element (set for document only)
@ pcmk__xf_none
This flag has no effect.
void pcmk__xml_free(xmlNode *xml)