pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk__evaluate_date_expression_test.c
Go to the documentation of this file.
1/*
2 * Copyright 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 <stdio.h>
13#include <glib.h>
14
15#include <crm/common/xml.h>
18#include "crmcommon_private.h"
19
34static void
35assert_date_expression(const xmlNode *xml, const char *now_s,
36 const char *next_change_s, const char *reference_s,
37 int reference_rc)
38{
39 crm_time_t *now = NULL;
40 crm_time_t *next_change = NULL;
41 bool check_next_change = (next_change_s != NULL) && (reference_s != NULL);
42
43 if (check_next_change) {
44 next_change = crm_time_new(next_change_s);
45 }
46
47 now = crm_time_new(now_s);
48 assert_int_equal(pcmk__evaluate_date_expression(xml, now, next_change),
49 reference_rc);
50 crm_time_free(now);
51
52 if (check_next_change) {
53 crm_time_t *reference = crm_time_new(reference_s);
54
55 assert_int_equal(crm_time_compare(next_change, reference), 0);
56 crm_time_free(reference);
57 crm_time_free(next_change);
58 }
59}
60
61#define EXPR_LT_VALID \
62 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
63 PCMK_XA_OPERATION "='" PCMK_VALUE_LT "' " \
64 PCMK_XA_END "='2024-02-01 15:00:00' />"
65
66static void
67null_invalid(void **state)
68{
69 xmlNodePtr xml = pcmk__xml_parse(EXPR_LT_VALID);
70 crm_time_t *t = crm_time_new("2024-02-01");
71
72 assert_int_equal(pcmk__evaluate_date_expression(NULL, NULL, NULL), EINVAL);
73 assert_int_equal(pcmk__evaluate_date_expression(xml, NULL, NULL), EINVAL);
74 assert_int_equal(pcmk__evaluate_date_expression(NULL, t, NULL), EINVAL);
75
77 pcmk__xml_free(xml);
78}
79
80static void
81null_next_change_ok(void **state)
82{
83 xmlNodePtr xml = pcmk__xml_parse(EXPR_LT_VALID);
84
85 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_within_range);
86 pcmk__xml_free(xml);
87}
88
89#define EXPR_ID_MISSING \
90 "<" PCMK_XE_DATE_EXPRESSION " " \
91 PCMK_XA_OPERATION "='" PCMK_VALUE_LT "' " \
92 PCMK_XA_END "='2024-02-01 15:00:00' />"
93
94static void
95id_missing(void **state)
96{
97 xmlNodePtr xml = pcmk__xml_parse(EXPR_ID_MISSING);
98
99 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
100 pcmk__xml_free(xml);
101}
102
103#define EXPR_OP_INVALID \
104 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
105 PCMK_XA_OPERATION "='not-a-choice' />"
106
107static void
108op_invalid(void **state)
109{
110 xmlNodePtr xml = pcmk__xml_parse(EXPR_OP_INVALID);
111
112 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
113 pcmk__xml_free(xml);
114}
115
116#define EXPR_LT_MISSING_END \
117 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
118 PCMK_XA_OPERATION "='" PCMK_VALUE_LT "' />"
119
120static void
121lt_missing_end(void **state)
122{
123 xmlNodePtr xml = pcmk__xml_parse(EXPR_LT_MISSING_END);
124
125 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
126 pcmk__xml_free(xml);
127}
128
129#define EXPR_LT_INVALID_END \
130 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
131 PCMK_XA_OPERATION "='" PCMK_VALUE_LT "' " \
132 PCMK_XA_END "='not-a-datetime' />"
133
134static void
135lt_invalid_end(void **state)
136{
137 xmlNodePtr xml = pcmk__xml_parse(EXPR_LT_INVALID_END);
138
139 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
140 pcmk__xml_free(xml);
141}
142
143static void
144lt_valid(void **state)
145{
146 xmlNodePtr xml = pcmk__xml_parse(EXPR_LT_VALID);
147
148 // Now and next change are both before end
149 assert_date_expression(xml, "2023-01-01 05:00:00", "2024-02-01 10:00:00",
150 "2024-02-01 10:00:00", pcmk_rc_within_range);
151
152 // Now is before end, next change is after end
153 assert_date_expression(xml, "2024-02-01 14:59:59", "2024-02-01 18:00:00",
154 "2024-02-01 15:00:00", pcmk_rc_within_range);
155
156 // Now is equal to end, next change is after end
157 assert_date_expression(xml, "2024-02-01 15:00:00", "2024-02-01 20:00:00",
158 "2024-02-01 20:00:00", pcmk_rc_after_range);
159
160 // Now and next change are both after end
161 assert_date_expression(xml, "2024-03-01 12:00:00", "2024-02-01 20:00:00",
162 "2024-02-01 20:00:00", pcmk_rc_after_range);
163
164 pcmk__xml_free(xml);
165}
166
167#define EXPR_GT_MISSING_START \
168 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
169 PCMK_XA_OPERATION "='" PCMK_VALUE_GT "' />"
170
171static void
172gt_missing_start(void **state)
173{
174 xmlNodePtr xml = pcmk__xml_parse(EXPR_GT_MISSING_START);
175
176 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
177 pcmk__xml_free(xml);
178}
179
180#define EXPR_GT_INVALID_START \
181 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
182 PCMK_XA_OPERATION "='" PCMK_VALUE_GT "' " \
183 PCMK_XA_START "='not-a-datetime' />"
184
185static void
186gt_invalid_start(void **state)
187{
188 xmlNodePtr xml = pcmk__xml_parse(EXPR_GT_INVALID_START);
189
190 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
191 pcmk__xml_free(xml);
192}
193
194#define EXPR_GT_VALID \
195 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
196 PCMK_XA_OPERATION "='" PCMK_VALUE_GT "' " \
197 PCMK_XA_START "='2024-02-01 12:00:00' />"
198
199static void
200gt_valid(void **state)
201{
202 xmlNodePtr xml = pcmk__xml_parse(EXPR_GT_VALID);
203
204 // Now and next change are both before start
205 assert_date_expression(xml, "2024-01-01 04:30:05", "2024-01-01 11:00:00",
206 "2024-01-01 11:00:00", pcmk_rc_before_range);
207
208 // Now is before start, next change is after start
209 assert_date_expression(xml, "2024-02-01 11:59:59", "2024-02-01 18:00:00",
210 "2024-02-01 12:00:01", pcmk_rc_before_range);
211
212 // Now is equal to start, next change is after start
213 assert_date_expression(xml, "2024-02-01 12:00:00", "2024-02-01 18:00:00",
214 "2024-02-01 12:00:01", pcmk_rc_before_range);
215
216 // Now is one second after start, next change is after start
217 assert_date_expression(xml, "2024-02-01 12:00:01", "2024-02-01 18:00:00",
218 "2024-02-01 18:00:00", pcmk_rc_within_range);
219
220 // t is after start, next change is after start
221 assert_date_expression(xml, "2024-03-01 05:03:11", "2024-04-04 04:04:04",
222 "2024-04-04 04:04:04", pcmk_rc_within_range);
223
224 pcmk__xml_free(xml);
225}
226
227#define EXPR_RANGE_MISSING \
228 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
229 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' />"
230
231static void
232range_missing(void **state)
233{
234 xmlNodePtr xml = pcmk__xml_parse(EXPR_RANGE_MISSING);
235 crm_time_t *t = crm_time_new("2024-01-01");
236
237 assert_int_equal(pcmk__evaluate_date_expression(xml, t, NULL),
239
240 crm_time_free(t);
241 pcmk__xml_free(xml);
242}
243
244#define EXPR_RANGE_INVALID_START_INVALID_END \
245 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
246 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
247 PCMK_XA_START "='not-a-date' " \
248 PCMK_XA_END "='not-a-date' />"
249
250static void
251range_invalid_start_invalid_end(void **state)
252{
254
255 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
256 pcmk__xml_free(xml);
257}
258
259#define EXPR_RANGE_INVALID_START_ONLY \
260 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
261 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
262 PCMK_XA_START "='not-a-date' />"
263
264static void
265range_invalid_start_only(void **state)
266{
268
269 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
270 pcmk__xml_free(xml);
271}
272
273#define EXPR_RANGE_VALID_START_ONLY \
274 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
275 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
276 PCMK_XA_START "='2024-02-01 12:00:00' />"
277
278static void
279range_valid_start_only(void **state)
280{
282
283 // Now and next change are before start
284 assert_date_expression(xml, "2024-01-01 04:30:05", "2024-01-01 11:00:00",
285 "2024-01-01 11:00:00", pcmk_rc_before_range);
286
287 // Now is before start, next change is after start
288 assert_date_expression(xml, "2024-02-01 11:59:59", "2024-02-01 18:00:00",
289 "2024-02-01 12:00:00", pcmk_rc_before_range);
290
291 // Now is equal to start, next change is after start
292 assert_date_expression(xml, "2024-02-01 12:00:00", "2024-02-01 18:00:00",
293 "2024-02-01 18:00:00", pcmk_rc_within_range);
294
295 // Now and next change are after start
296 assert_date_expression(xml, "2024-03-01 05:03:11", "2024-04-04 04:04:04",
297 "2024-04-04 04:04:04", pcmk_rc_within_range);
298
299 pcmk__xml_free(xml);
300}
301
302#define EXPR_RANGE_INVALID_END_ONLY \
303 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
304 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
305 PCMK_XA_END "='not-a-date' />"
306
307static void
308range_invalid_end_only(void **state)
309{
311
312 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
313 pcmk__xml_free(xml);
314}
315
316#define EXPR_RANGE_VALID_END_ONLY \
317 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
318 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
319 PCMK_XA_END "='2024-02-01 15:00:00' />"
320
321static void
322range_valid_end_only(void **state)
323{
325
326 // Now and next change are before end
327 assert_date_expression(xml, "2024-01-01 04:30:05", "2024-01-01 11:00:00",
328 "2024-01-01 11:00:00", pcmk_rc_within_range);
329
330 // Now is before end, next change is after end
331 assert_date_expression(xml, "2024-02-01 14:59:59", "2024-02-01 18:00:00",
332 "2024-02-01 15:00:01", pcmk_rc_within_range);
333
334 // Now is equal to end, next change is after end
335 assert_date_expression(xml, "2024-02-01 15:00:00", "2024-02-01 18:00:00",
336 "2024-02-01 15:00:01", pcmk_rc_within_range);
337
338 // Now and next change are after end
339 assert_date_expression(xml, "2024-02-01 15:00:01", "2024-04-04 04:04:04",
340 "2024-04-04 04:04:04", pcmk_rc_after_range);
341
342 pcmk__xml_free(xml);
343}
344
345#define EXPR_RANGE_VALID_START_INVALID_END \
346 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
347 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
348 PCMK_XA_START "='2024-02-01 12:00:00' " \
349 PCMK_XA_END "='not-a-date' />"
350
351static void
352range_valid_start_invalid_end(void **state)
353{
355
356 assert_date_expression(xml, "2024-01-01 04:30:05", NULL, NULL,
358 pcmk__xml_free(xml);
359}
360
361#define EXPR_RANGE_INVALID_START_VALID_END \
362 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
363 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
364 PCMK_XA_START "='not-a-date' " \
365 PCMK_XA_END "='2024-02-01 15:00:00' />"
366
367static void
368range_invalid_start_valid_end(void **state)
369{
371
372 assert_date_expression(xml, "2024-01-01 04:30:05", NULL, NULL,
374 pcmk__xml_free(xml);
375}
376
377#define EXPR_RANGE_VALID_START_VALID_END \
378 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
379 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
380 PCMK_XA_START "='2024-02-01 12:00:00' " \
381 PCMK_XA_END "='2024-02-01 15:00:00' />"
382
383static void
384range_valid_start_valid_end(void **state)
385{
387
388 // Now and next change are before start
389 assert_date_expression(xml, "2024-01-01 04:30:05", "2024-01-01 11:00:00",
390 "2024-01-01 11:00:00", pcmk_rc_before_range);
391
392 // Now is before start, next change is between start and end
393 assert_date_expression(xml, "2024-02-01 11:59:59", "2024-02-01 14:00:00",
394 "2024-02-01 12:00:00", pcmk_rc_before_range);
395
396 // Now is equal to start, next change is between start and end
397 assert_date_expression(xml, "2024-02-01 12:00:00", "2024-02-01 14:30:00",
398 "2024-02-01 14:30:00", pcmk_rc_within_range);
399
400 // Now is between start and end, next change is after end
401 assert_date_expression(xml, "2024-02-01 14:03:11", "2024-04-04 04:04:04",
402 "2024-02-01 15:00:01", pcmk_rc_within_range);
403
404 // Now is equal to end, next change is after end
405 assert_date_expression(xml, "2024-02-01 15:00:00", "2028-04-04 04:04:04",
406 "2024-02-01 15:00:01", pcmk_rc_within_range);
407
408 // Now and next change are after end
409 assert_date_expression(xml, "2024-02-01 15:00:01", "2028-04-04 04:04:04",
410 "2028-04-04 04:04:04", pcmk_rc_after_range);
411
412 pcmk__xml_free(xml);
413}
414
415#define EXPR_RANGE_VALID_START_INVALID_DURATION \
416 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
417 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
418 PCMK_XA_START "='2024-02-01 12:00:00'>" \
419 "<" PCMK_XE_DURATION " " PCMK_XA_ID "='d' " \
420 PCMK_XA_HOURS "='not-a-number' />" \
421 "</" PCMK_XE_DATE_EXPRESSION ">"
422
423static void
424range_valid_start_invalid_duration(void **state)
425{
427
428 assert_date_expression(xml, "2024-02-01 04:30:05", NULL, NULL,
430 pcmk__xml_free(xml);
431}
432
433#define EXPR_RANGE_VALID_START_VALID_DURATION \
434 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
435 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
436 PCMK_XA_START "='2024-02-01 12:00:00'>" \
437 "<" PCMK_XE_DURATION " " PCMK_XA_ID "='d' " \
438 PCMK_XA_HOURS "='3' />" \
439 "</" PCMK_XE_DATE_EXPRESSION ">"
440
441static void
442range_valid_start_valid_duration(void **state)
443{
445
446 // Now and next change are before start
447 assert_date_expression(xml, "2024-01-01 04:30:05", "2024-01-01 11:00:00",
448 "2024-01-01 11:00:00", pcmk_rc_before_range);
449
450 // Now is before start, next change is between start and end
451 assert_date_expression(xml, "2024-02-01 11:59:59", "2024-02-01 14:00:00",
452 "2024-02-01 12:00:00", pcmk_rc_before_range);
453
454 // Now is equal to start, next change is between start and end
455 assert_date_expression(xml, "2024-02-01 12:00:00", "2024-02-01 14:30:00",
456 "2024-02-01 14:30:00", pcmk_rc_within_range);
457
458 // Now is between start and end, next change is after end
459 assert_date_expression(xml, "2024-02-01 14:03:11", "2024-04-04 04:04:04",
460 "2024-02-01 15:00:01", pcmk_rc_within_range);
461
462 // Now is equal to end, next change is after end
463 assert_date_expression(xml, "2024-02-01 15:00:00", "2028-04-04 04:04:04",
464 "2024-02-01 15:00:01", pcmk_rc_within_range);
465
466 // Now and next change are after end
467 assert_date_expression(xml, "2024-02-01 15:00:01", "2028-04-04 04:04:04",
468 "2028-04-04 04:04:04", pcmk_rc_after_range);
469
470 pcmk__xml_free(xml);
471}
472
473#define EXPR_RANGE_VALID_START_DURATION_MISSING_ID \
474 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='d' " \
475 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' " \
476 PCMK_XA_START "='2024-02-01 12:00:00'>" \
477 "<" PCMK_XE_DURATION " " PCMK_XA_HOURS "='3' />" \
478 "</" PCMK_XE_DATE_EXPRESSION ">"
479
480static void
481range_valid_start_duration_missing_id(void **state)
482{
483 xmlNodePtr xml = NULL;
484
486
487 assert_date_expression(xml, "2024-02-01 04:30:05", NULL, NULL,
489 pcmk__xml_free(xml);
490}
491
492#define EXPR_SPEC_MISSING \
493 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
494 PCMK_XA_OPERATION "='" PCMK_VALUE_DATE_SPEC "' />"
495
496static void
497spec_missing(void **state)
498{
499 xmlNodePtr xml = pcmk__xml_parse(EXPR_SPEC_MISSING);
500
501 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
502 pcmk__xml_free(xml);
503}
504
505#define EXPR_SPEC_INVALID \
506 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
507 PCMK_XA_OPERATION "='" PCMK_VALUE_DATE_SPEC "'>" \
508 "<" PCMK_XE_DATE_SPEC " " PCMK_XA_ID "='s' " \
509 PCMK_XA_MONTHS "='not-a-number'/>" \
510 "</" PCMK_XE_DATE_EXPRESSION ">"
511
512static void
513spec_invalid(void **state)
514{
515 xmlNodePtr xml = pcmk__xml_parse(EXPR_SPEC_INVALID);
516
517 assert_date_expression(xml, "2024-01-01", NULL, NULL, pcmk_rc_unpack_error);
518 pcmk__xml_free(xml);
519}
520
521#define EXPR_SPEC_VALID \
522 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
523 PCMK_XA_OPERATION "='" PCMK_VALUE_DATE_SPEC "'>" \
524 "<" PCMK_XE_DATE_SPEC " " PCMK_XA_ID "='s' " \
525 PCMK_XA_MONTHS "='2'/>" \
526 "</" PCMK_XE_DATE_EXPRESSION ">"
527
528static void
529spec_valid(void **state)
530{
531 // date_spec does not currently support next_change
532 xmlNodePtr xml = pcmk__xml_parse(EXPR_SPEC_VALID);
533
534 // Now is just before spec start
535 assert_date_expression(xml, "2024-01-01 23:59:59", NULL, NULL,
537
538 // Now matches spec start
539 assert_date_expression(xml, "2024-02-01 00:00:00", NULL, NULL, pcmk_rc_ok);
540
541 // Now is within spec range
542 assert_date_expression(xml, "2024-02-22 22:22:22", NULL, NULL, pcmk_rc_ok);
543
544 // Now matches spec end
545 assert_date_expression(xml, "2024-02-29 23:59:59", NULL, NULL, pcmk_rc_ok);
546
547 // Now is just past spec end
548 assert_date_expression(xml, "2024-03-01 00:00:00", NULL, NULL,
550
551 pcmk__xml_free(xml);
552}
553
554#define EXPR_SPEC_MISSING_ID \
555 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
556 PCMK_XA_OPERATION "='" PCMK_VALUE_DATE_SPEC "'>" \
557 "<" PCMK_XE_DATE_SPEC " " \
558 PCMK_XA_MONTHS "='2'/>" \
559 "</" PCMK_XE_DATE_EXPRESSION ">"
560
561static void
562spec_missing_id(void **state)
563{
564 xmlNodePtr xml = pcmk__xml_parse(EXPR_SPEC_MISSING_ID);
565
566 assert_date_expression(xml, "2024-01-01 23:59:59", NULL, NULL,
568 pcmk__xml_free(xml);
569}
570
572 cmocka_unit_test(null_invalid),
573 cmocka_unit_test(null_next_change_ok),
574 cmocka_unit_test(id_missing),
575 cmocka_unit_test(op_invalid),
576 cmocka_unit_test(lt_missing_end),
577 cmocka_unit_test(lt_invalid_end),
578 cmocka_unit_test(lt_valid),
579 cmocka_unit_test(gt_missing_start),
580 cmocka_unit_test(gt_invalid_start),
581 cmocka_unit_test(gt_valid),
582 cmocka_unit_test(range_missing),
583 cmocka_unit_test(range_invalid_start_invalid_end),
584 cmocka_unit_test(range_invalid_start_only),
585 cmocka_unit_test(range_valid_start_only),
586 cmocka_unit_test(range_invalid_end_only),
587 cmocka_unit_test(range_valid_end_only),
588 cmocka_unit_test(range_valid_start_invalid_end),
589 cmocka_unit_test(range_invalid_start_valid_end),
590 cmocka_unit_test(range_valid_start_valid_end),
591 cmocka_unit_test(range_valid_start_invalid_duration),
592 cmocka_unit_test(range_valid_start_valid_duration),
593 cmocka_unit_test(range_valid_start_duration_missing_id),
594 cmocka_unit_test(spec_missing),
595 cmocka_unit_test(spec_invalid),
596 cmocka_unit_test(spec_valid),
597 cmocka_unit_test(spec_missing_id))
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
int crm_time_compare(const crm_time_t *a, const crm_time_t *b)
Definition iso8601.c:1736
#define EXPR_RANGE_VALID_END_ONLY
#define EXPR_RANGE_INVALID_START_INVALID_END
#define EXPR_RANGE_VALID_START_INVALID_END
#define EXPR_RANGE_VALID_START_ONLY
#define EXPR_RANGE_INVALID_START_VALID_END
#define EXPR_RANGE_INVALID_END_ONLY
#define EXPR_RANGE_VALID_START_DURATION_MISSING_ID
#define EXPR_RANGE_VALID_START_INVALID_DURATION
#define EXPR_RANGE_VALID_START_VALID_DURATION
#define EXPR_RANGE_INVALID_START_ONLY
#define EXPR_RANGE_VALID_START_VALID_END
@ pcmk_rc_before_range
Definition results.h:131
@ pcmk_rc_ok
Definition results.h:159
@ pcmk_rc_within_range
Definition results.h:130
@ pcmk_rc_after_range
Definition results.h:129
@ pcmk_rc_unpack_error
Definition results.h:122
int pcmk__evaluate_date_expression(const xmlNode *date_expression, const crm_time_t *now, crm_time_t *next_change)
Definition rules.c:470
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