1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
/*
* Copyright 2024 the Pacemaker project contributors
*
* The version control history for this file may have further details.
*
* This source code is licensed under the GNU General Public License version 2
* or later (GPLv2+) WITHOUT ANY WARRANTY.
*/
#include <crm_internal.h>
#include <errno.h>
#include <libxml/tree.h>
#include <crm/common/unittest_internal.h>
#include <crm/common/iso8601.h>
#include <crm/common/xml.h>
#include <crm/common/nvpair_internal.h>
#define REFERENCE_ISO8601 "2024-001"
#define ATTR_PRESENT "start"
#define ATTR_MISSING "end"
#define REFERENCE_XML "<date_expression id=\"id1\" " \
ATTR_PRESENT "=\"" REFERENCE_ISO8601 "\"" \
" operation=\"gt\">"
#define BAD_XML "<date_expression id=\"id1\" " \
ATTR_PRESENT "=\"not_a_time\"" \
" operation=\"gt\">"
static void
null_invalid(void **state)
{
xmlNode *xml = pcmk__xml_parse(REFERENCE_XML);
crm_time_t *t = NULL;
assert_int_equal(pcmk__xe_get_datetime(NULL, NULL, NULL), EINVAL);
assert_int_equal(pcmk__xe_get_datetime(xml, NULL, NULL), EINVAL);
assert_int_equal(pcmk__xe_get_datetime(xml, ATTR_PRESENT, NULL), EINVAL);
assert_int_equal(pcmk__xe_get_datetime(xml, NULL, &t), EINVAL);
assert_null(t);
assert_int_equal(pcmk__xe_get_datetime(NULL, ATTR_PRESENT, NULL), EINVAL);
assert_int_equal(pcmk__xe_get_datetime(NULL, ATTR_PRESENT, &t), EINVAL);
assert_null(t);
assert_int_equal(pcmk__xe_get_datetime(NULL, NULL, &t), EINVAL);
assert_null(t);
free_xml(xml);
}
static void
nonnull_time_invalid(void **state)
{
xmlNode *xml = pcmk__xml_parse(REFERENCE_XML);
crm_time_t *t = crm_time_new_undefined();
assert_int_equal(pcmk__xe_get_datetime(xml, ATTR_PRESENT, &t), EINVAL);
crm_time_free(t);
free_xml(xml);
}
static void
attr_missing(void **state)
{
xmlNode *xml = pcmk__xml_parse(REFERENCE_XML);
crm_time_t *t = NULL;
assert_int_equal(pcmk__xe_get_datetime(xml, ATTR_MISSING, &t), pcmk_rc_ok);
assert_null(t);
free_xml(xml);
}
static void
attr_valid(void **state)
{
xmlNode *xml = pcmk__xml_parse(REFERENCE_XML);
crm_time_t *t = NULL;
crm_time_t *reference = crm_time_new(REFERENCE_ISO8601);
assert_int_equal(pcmk__xe_get_datetime(xml, ATTR_PRESENT, &t), pcmk_rc_ok);
assert_int_equal(crm_time_compare(t, reference), 0);
crm_time_free(t);
crm_time_free(reference);
free_xml(xml);
}
static void
attr_invalid(void **state)
{
xmlNode *xml = pcmk__xml_parse(BAD_XML);
crm_time_t *t = NULL;
assert_int_equal(pcmk__xe_get_datetime(xml, ATTR_PRESENT, &t),
pcmk_rc_unpack_error);
assert_null(t);
free_xml(xml);
}
PCMK__UNIT_TEST(pcmk__xml_test_setup_group, NULL,
cmocka_unit_test(null_invalid),
cmocka_unit_test(nonnull_time_invalid),
cmocka_unit_test(attr_missing),
cmocka_unit_test(attr_valid),
cmocka_unit_test(attr_invalid))
|