pacemaker  3.0.0-d8340737c4
Scalable High-Availability cluster resource manager
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 
20 static void
21 run_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 
32 static void
33 null_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 
48 static void
49 spec_id_missing(void **state)
50 {
51  run_one_test("2020-01-01", "<date_spec years='2020'/>",
53 }
54 
55 static void
56 invalid_range(void **state)
57 {
58  run_one_test("2020-01-01", "<date_spec years='not-a-year' months='1'/>",
60 }
61 
62 static void
63 time_satisfies_year_spec(void **state)
64 {
65  run_one_test("2020-01-01",
66  "<date_spec " PCMK_XA_ID "='spec' years='2020'/>",
67  pcmk_rc_ok);
68 }
69 
70 static void
71 time_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 
80 static void
81 time_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'/>",
87  pcmk_rc_ok);
88 }
89 
90 static void
91 time_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 
100 static void
101 time_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 
110 static void
111 range_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 
120 static void
121 range_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 
135 static void
136 yeardays_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 
145 static void
146 time_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 
155 static void
156 yeardays_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 
165 static void
166 exact_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 
177 static void
178 range_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 
189 static void
190 exact_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 
201 static void
202 time_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))
#define PCMK_XA_YEARS
Definition: xml_names.h:456
G_GNUC_INTERNAL int pcmk__evaluate_date_spec(const xmlNode *date_spec, const crm_time_t *now)
Definition: rules.c:154
#define PCMK_XA_YEARDAYS
Definition: xml_names.h:455
struct crm_time_s crm_time_t
Definition: iso8601.h:32
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
void pcmk__xml_free(xmlNode *xml)
Definition: xml.c:789
#define PCMK_XE_DATE_SPEC
Definition: xml_names.h:97
int pcmk__xml_test_setup_group(void **state)
Definition: unittest.c:85
Wrappers for and extensions to libxml2.
#define PCMK_XA_ID
Definition: xml_names.h:301
int pcmk__xml_test_teardown_group(void **state)
Definition: unittest.c:104
xmlNode * pcmk__xml_parse(const char *input)
Definition: xml_io.c:168
#define PCMK_XA_MONTHDAYS
Definition: xml_names.h:327
crm_time_t * crm_time_new(const char *string)
Definition: iso8601.c:112
#define PCMK_XA_MONTHS
Definition: xml_names.h:328
void crm_time_free(crm_time_t *dt)
Definition: iso8601.c:150