35assert_date_expression(
const xmlNode *xml,
const char *now_s,
36 const char *next_change_s,
const char *reference_s,
41 bool check_next_change = (next_change_s != NULL) && (reference_s != NULL);
43 if (check_next_change) {
52 if (check_next_change) {
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' />"
67null_invalid(
void **state)
81null_next_change_ok(
void **state)
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' />"
95id_missing(
void **state)
103#define EXPR_OP_INVALID \
104 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
105 PCMK_XA_OPERATION "='not-a-choice' />"
108op_invalid(
void **state)
116#define EXPR_LT_MISSING_END \
117 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
118 PCMK_XA_OPERATION "='" PCMK_VALUE_LT "' />"
121lt_missing_end(
void **state)
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' />"
135lt_invalid_end(
void **state)
144lt_valid(
void **state)
149 assert_date_expression(xml,
"2023-01-01 05:00:00",
"2024-02-01 10:00:00",
153 assert_date_expression(xml,
"2024-02-01 14:59:59",
"2024-02-01 18:00:00",
157 assert_date_expression(xml,
"2024-02-01 15:00:00",
"2024-02-01 20:00:00",
161 assert_date_expression(xml,
"2024-03-01 12:00:00",
"2024-02-01 20:00:00",
167#define EXPR_GT_MISSING_START \
168 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
169 PCMK_XA_OPERATION "='" PCMK_VALUE_GT "' />"
172gt_missing_start(
void **state)
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' />"
186gt_invalid_start(
void **state)
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' />"
200gt_valid(
void **state)
205 assert_date_expression(xml,
"2024-01-01 04:30:05",
"2024-01-01 11:00:00",
209 assert_date_expression(xml,
"2024-02-01 11:59:59",
"2024-02-01 18:00:00",
213 assert_date_expression(xml,
"2024-02-01 12:00:00",
"2024-02-01 18:00:00",
217 assert_date_expression(xml,
"2024-02-01 12:00:01",
"2024-02-01 18:00:00",
221 assert_date_expression(xml,
"2024-03-01 05:03:11",
"2024-04-04 04:04:04",
227#define EXPR_RANGE_MISSING \
228 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
229 PCMK_XA_OPERATION "='" PCMK_VALUE_IN_RANGE "' />"
232range_missing(
void **state)
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' />"
251range_invalid_start_invalid_end(
void **state)
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' />"
265range_invalid_start_only(
void **state)
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' />"
279range_valid_start_only(
void **state)
284 assert_date_expression(xml,
"2024-01-01 04:30:05",
"2024-01-01 11:00:00",
288 assert_date_expression(xml,
"2024-02-01 11:59:59",
"2024-02-01 18:00:00",
292 assert_date_expression(xml,
"2024-02-01 12:00:00",
"2024-02-01 18:00:00",
296 assert_date_expression(xml,
"2024-03-01 05:03:11",
"2024-04-04 04:04:04",
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' />"
308range_invalid_end_only(
void **state)
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' />"
322range_valid_end_only(
void **state)
327 assert_date_expression(xml,
"2024-01-01 04:30:05",
"2024-01-01 11:00:00",
331 assert_date_expression(xml,
"2024-02-01 14:59:59",
"2024-02-01 18:00:00",
335 assert_date_expression(xml,
"2024-02-01 15:00:00",
"2024-02-01 18:00:00",
339 assert_date_expression(xml,
"2024-02-01 15:00:01",
"2024-04-04 04:04:04",
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' />"
352range_valid_start_invalid_end(
void **state)
356 assert_date_expression(xml,
"2024-01-01 04:30:05", NULL, NULL,
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' />"
368range_invalid_start_valid_end(
void **state)
372 assert_date_expression(xml,
"2024-01-01 04:30:05", NULL, NULL,
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' />"
384range_valid_start_valid_end(
void **state)
389 assert_date_expression(xml,
"2024-01-01 04:30:05",
"2024-01-01 11:00:00",
393 assert_date_expression(xml,
"2024-02-01 11:59:59",
"2024-02-01 14:00:00",
397 assert_date_expression(xml,
"2024-02-01 12:00:00",
"2024-02-01 14:30:00",
401 assert_date_expression(xml,
"2024-02-01 14:03:11",
"2024-04-04 04:04:04",
405 assert_date_expression(xml,
"2024-02-01 15:00:00",
"2028-04-04 04:04:04",
409 assert_date_expression(xml,
"2024-02-01 15:00:01",
"2028-04-04 04:04:04",
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 ">"
424range_valid_start_invalid_duration(
void **state)
428 assert_date_expression(xml,
"2024-02-01 04:30:05", NULL, NULL,
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 ">"
442range_valid_start_valid_duration(
void **state)
447 assert_date_expression(xml,
"2024-01-01 04:30:05",
"2024-01-01 11:00:00",
451 assert_date_expression(xml,
"2024-02-01 11:59:59",
"2024-02-01 14:00:00",
455 assert_date_expression(xml,
"2024-02-01 12:00:00",
"2024-02-01 14:30:00",
459 assert_date_expression(xml,
"2024-02-01 14:03:11",
"2024-04-04 04:04:04",
463 assert_date_expression(xml,
"2024-02-01 15:00:00",
"2028-04-04 04:04:04",
467 assert_date_expression(xml,
"2024-02-01 15:00:01",
"2028-04-04 04:04:04",
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 ">"
481range_valid_start_duration_missing_id(
void **state)
483 xmlNodePtr xml = NULL;
487 assert_date_expression(xml,
"2024-02-01 04:30:05", NULL, NULL,
492#define EXPR_SPEC_MISSING \
493 "<" PCMK_XE_DATE_EXPRESSION " " PCMK_XA_ID "='e' " \
494 PCMK_XA_OPERATION "='" PCMK_VALUE_DATE_SPEC "' />"
497spec_missing(
void **state)
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 ">"
513spec_invalid(
void **state)
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 ">"
529spec_valid(
void **state)
535 assert_date_expression(xml,
"2024-01-01 23:59:59", NULL, NULL,
539 assert_date_expression(xml,
"2024-02-01 00:00:00", NULL, NULL,
pcmk_rc_ok);
542 assert_date_expression(xml,
"2024-02-22 22:22:22", NULL, NULL,
pcmk_rc_ok);
545 assert_date_expression(xml,
"2024-02-29 23:59:59", NULL, NULL,
pcmk_rc_ok);
548 assert_date_expression(xml,
"2024-03-01 00:00:00", NULL, NULL,
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 ">"
562spec_missing_id(
void **state)
566 assert_date_expression(xml,
"2024-01-01 23:59:59", NULL, NULL,
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)
crm_time_t * crm_time_new(const char *string)
struct crm_time_s crm_time_t
int crm_time_compare(const crm_time_t *a, const crm_time_t *b)
#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_LT_MISSING_END
#define EXPR_RANGE_INVALID_START_VALID_END
#define EXPR_RANGE_INVALID_END_ONLY
#define EXPR_RANGE_VALID_START_DURATION_MISSING_ID
#define EXPR_RANGE_MISSING
#define EXPR_SPEC_MISSING_ID
#define EXPR_LT_INVALID_END
#define EXPR_SPEC_MISSING
#define EXPR_RANGE_VALID_START_INVALID_DURATION
#define EXPR_SPEC_INVALID
#define EXPR_RANGE_VALID_START_VALID_DURATION
#define EXPR_GT_INVALID_START
#define EXPR_RANGE_INVALID_START_ONLY
#define EXPR_RANGE_VALID_START_VALID_END
#define EXPR_GT_MISSING_START
int pcmk__evaluate_date_expression(const xmlNode *date_expression, const crm_time_t *now, crm_time_t *next_change)
int pcmk__xml_test_teardown_group(void **state)
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
int pcmk__xml_test_setup_group(void **state)
Wrappers for and extensions to libxml2.
void pcmk__xml_free(xmlNode *xml)
xmlNode * pcmk__xml_parse(const char *input)