pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk__evaluate_date_spec_test.c
Go to the documentation of this file.
1/*
2 * Copyright 2020-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
12#include <errno.h>
13#include <glib.h>
14
15#include <crm/common/xml.h>
18#include "crmcommon_private.h"
19
20static void
21run_one_test(const char *t, const char *x, int expected)
22{
23 crm_time_t *tm = crm_time_new(t);
24 xmlNodePtr xml = pcmk__xml_parse(x);
25
26 assert_int_equal(pcmk__evaluate_date_spec(xml, tm), expected);
27
28 crm_time_free(tm);
29 pcmk__xml_free(xml);
30}
31
32static void
33null_invalid(void **state)
34{
35 xmlNodePtr xml = pcmk__xml_parse("<" PCMK_XE_DATE_SPEC " "
36 PCMK_XA_ID "='spec' "
37 PCMK_XA_YEARS "='2019'/>");
38 crm_time_t *tm = crm_time_new(NULL);
39
40 assert_int_equal(pcmk__evaluate_date_spec(NULL, NULL), EINVAL);
41 assert_int_equal(pcmk__evaluate_date_spec(xml, NULL), EINVAL);
42 assert_int_equal(pcmk__evaluate_date_spec(NULL, tm), EINVAL);
43
44 crm_time_free(tm);
45 pcmk__xml_free(xml);
46}
47
48static void
49spec_id_missing(void **state)
50{
51 run_one_test("2020-01-01", "<date_spec years='2020'/>",
53}
54
55static void
56invalid_range(void **state)
57{
58 run_one_test("2020-01-01", "<date_spec years='not-a-year' months='1'/>",
60}
61
62static void
63time_satisfies_year_spec(void **state)
64{
65 run_one_test("2020-01-01",
66 "<date_spec " PCMK_XA_ID "='spec' years='2020'/>",
68}
69
70static void
71time_after_year_spec(void **state)
72{
73 run_one_test("2020-01-01",
74 "<" PCMK_XE_DATE_SPEC " "
75 PCMK_XA_ID "='spec' "
76 PCMK_XA_YEARS "='2019'/>",
78}
79
80static void
81time_satisfies_year_range(void **state)
82{
83 run_one_test("2020-01-01",
84 "<" PCMK_XE_DATE_SPEC " "
85 PCMK_XA_ID "='spec' "
86 PCMK_XA_YEARS "='2010-2030'/>",
88}
89
90static void
91time_before_year_range(void **state)
92{
93 run_one_test("2000-01-01",
94 "<" PCMK_XE_DATE_SPEC " "
95 PCMK_XA_ID "='spec' "
96 PCMK_XA_YEARS "='2010-2030'/>",
98}
99
100static void
101time_after_year_range(void **state)
102{
103 run_one_test("2020-01-01",
104 "<" PCMK_XE_DATE_SPEC " "
105 PCMK_XA_ID "='spec' "
106 PCMK_XA_YEARS "='2010-2015'/>",
108}
109
110static void
111range_without_start_year_passes(void **state)
112{
113 run_one_test("2010-01-01",
114 "<" PCMK_XE_DATE_SPEC " "
115 PCMK_XA_ID "='spec' "
116 PCMK_XA_YEARS "='-2020'/>",
117 pcmk_rc_ok);
118}
119
120static void
121range_without_end_year_passes(void **state)
122{
123 run_one_test("2010-01-01",
124 "<" PCMK_XE_DATE_SPEC " "
125 PCMK_XA_ID "='spec' "
126 PCMK_XA_YEARS "='2000-'/>",
127 pcmk_rc_ok);
128 run_one_test("2000-10-01",
129 "<" PCMK_XE_DATE_SPEC " "
130 PCMK_XA_ID "='spec' "
131 PCMK_XA_YEARS "='2000-'/>",
132 pcmk_rc_ok);
133}
134
135static void
136yeardays_satisfies(void **state)
137{
138 run_one_test("2020-01-30",
139 "<" PCMK_XE_DATE_SPEC " "
140 PCMK_XA_ID "='spec' "
141 PCMK_XA_YEARDAYS "='30'/>",
142 pcmk_rc_ok);
143}
144
145static void
146time_after_yeardays_spec(void **state)
147{
148 run_one_test("2020-02-15",
149 "<" PCMK_XE_DATE_SPEC " "
150 PCMK_XA_ID "='spec' "
151 PCMK_XA_YEARDAYS "='40'/>",
153}
154
155static void
156yeardays_feb_29_satisfies(void **state)
157{
158 run_one_test("2016-02-29",
159 "<" PCMK_XE_DATE_SPEC " "
160 PCMK_XA_ID "='spec' "
161 PCMK_XA_YEARDAYS "='60'/>",
162 pcmk_rc_ok);
163}
164
165static void
166exact_ymd_satisfies(void **state)
167{
168 run_one_test("2001-12-31",
169 "<" PCMK_XE_DATE_SPEC " "
170 PCMK_XA_ID "='spec' "
171 PCMK_XA_YEARS "='2001' "
172 PCMK_XA_MONTHS "='12' "
173 PCMK_XA_MONTHDAYS "='31'/>",
174 pcmk_rc_ok);
175}
176
177static void
178range_in_month_satisfies(void **state)
179{
180 run_one_test("2001-06-10",
181 "<" PCMK_XE_DATE_SPEC " "
182 PCMK_XA_ID "='spec' "
183 PCMK_XA_YEARS "='2001' "
184 PCMK_XA_MONTHS "='6' "
185 PCMK_XA_MONTHDAYS "='1-10'/>",
186 pcmk_rc_ok);
187}
188
189static void
190exact_ymd_after_range(void **state)
191{
192 run_one_test("2001-12-31",
193 "<" PCMK_XE_DATE_SPEC " "
194 PCMK_XA_ID "='spec' "
195 PCMK_XA_YEARS "='2001' "
196 PCMK_XA_MONTHS "='12' "
197 PCMK_XA_MONTHDAYS "='30'/>",
199}
200
201static void
202time_after_monthdays_range(void **state)
203{
204 run_one_test("2001-06-10",
205 "<" PCMK_XE_DATE_SPEC " "
206 PCMK_XA_ID "='spec' "
207 PCMK_XA_YEARS "='2001' "
208 PCMK_XA_MONTHS "='6' "
209 PCMK_XA_MONTHDAYS "='11-15'/>",
211}
212
214 cmocka_unit_test(null_invalid),
215 cmocka_unit_test(spec_id_missing),
216 cmocka_unit_test(invalid_range),
217 cmocka_unit_test(time_satisfies_year_spec),
218 cmocka_unit_test(time_after_year_spec),
219 cmocka_unit_test(time_satisfies_year_range),
220 cmocka_unit_test(time_before_year_range),
221 cmocka_unit_test(time_after_year_range),
222 cmocka_unit_test(range_without_start_year_passes),
223 cmocka_unit_test(range_without_end_year_passes),
224 cmocka_unit_test(yeardays_satisfies),
225 cmocka_unit_test(time_after_yeardays_spec),
226 cmocka_unit_test(yeardays_feb_29_satisfies),
227 cmocka_unit_test(exact_ymd_satisfies),
228 cmocka_unit_test(range_in_month_satisfies),
229 cmocka_unit_test(exact_ymd_after_range),
230 cmocka_unit_test(time_after_monthdays_range))
G_GNUC_INTERNAL int pcmk__evaluate_date_spec(const xmlNode *date_spec, const crm_time_t *now)
Definition rules.c:155
void crm_time_free(crm_time_t *dt)
Definition iso8601.c:150
crm_time_t * crm_time_new(const char *string)
Definition iso8601.c:112
struct crm_time_s crm_time_t
Definition iso8601.h:32
@ pcmk_rc_before_range
Definition results.h:131
@ pcmk_rc_ok
Definition results.h:159
@ pcmk_rc_after_range
Definition results.h:129
@ pcmk_rc_unpack_error
Definition results.h:122
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
Wrappers for and extensions to libxml2.
void pcmk__xml_free(xmlNode *xml)
Definition xml.c:816
xmlNode * pcmk__xml_parse(const char *input)
Definition xml_io.c:167
#define PCMK_XA_MONTHS
Definition xml_names.h:328
#define PCMK_XA_YEARS
Definition xml_names.h:456
#define PCMK_XA_ID
Definition xml_names.h:301
#define PCMK_XE_DATE_SPEC
Definition xml_names.h:97
#define PCMK_XA_YEARDAYS
Definition xml_names.h:455
#define PCMK_XA_MONTHDAYS
Definition xml_names.h:327