pacemaker 2.1.4-dc6eb4362e
Scalable High-Availability cluster resource manager
pe_cron_range_satisfied_test.c
Go to the documentation of this file.
1/*
2 * Copyright 2020-2021 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 Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9
10#include <glib.h>
11
12#include <crm/common/xml.h>
14
15#include <stdarg.h>
16#include <stddef.h>
17#include <stdint.h>
18#include <setjmp.h>
19#include <cmocka.h>
20
21static void
22run_one_test(const char *t, const char *x, int expected) {
23 crm_time_t *tm = crm_time_new(t);
24 xmlNodePtr xml = string2xml(x);
25
26 assert_int_equal(pe_cron_range_satisfied(tm, xml), expected);
27
28 crm_time_free(tm);
29 free_xml(xml);
30}
31
32static void
33no_time_given(void **state) {
34 assert_int_equal(pe_cron_range_satisfied(NULL, NULL), pcmk_rc_op_unsatisfied);
35}
36
37static void
38any_time_satisfies_empty_spec(void **state) {
39 crm_time_t *tm = crm_time_new(NULL);
40
41 assert_int_equal(pe_cron_range_satisfied(tm, NULL), pcmk_rc_ok);
42
43 crm_time_free(tm);
44}
45
46static void
47time_satisfies_year_spec(void **state) {
48 run_one_test("2020-01-01", "<date_spec id='spec' years='2020'/>", pcmk_rc_ok);
49}
50
51static void
52time_after_year_spec(void **state) {
53 run_one_test("2020-01-01", "<date_spec id='spec' years='2019'/>", pcmk_rc_after_range);
54}
55
56static void
57time_satisfies_year_range(void **state) {
58 run_one_test("2020-01-01", "<date_spec id='spec' years='2010-2030'/>", pcmk_rc_ok);
59}
60
61static void
62time_before_year_range(void **state) {
63 run_one_test("2000-01-01", "<date_spec id='spec' years='2010-2030'/>", pcmk_rc_before_range);
64}
65
66static void
67time_after_year_range(void **state) {
68 run_one_test("2020-01-01", "<date_spec id='spec' years='2010-2015'/>", pcmk_rc_after_range);
69}
70
71static void
72range_without_start_year_passes(void **state) {
73 run_one_test("2010-01-01", "<date_spec id='spec' years='-2020'/>", pcmk_rc_ok);
74}
75
76static void
77range_without_end_year_passes(void **state) {
78 run_one_test("2010-01-01", "<date_spec id='spec' years='2000-'/>", pcmk_rc_ok);
79 run_one_test("2000-10-01", "<date_spec id='spec' years='2000-'/>", pcmk_rc_ok);
80}
81
82static void
83yeardays_satisfies(void **state) {
84 run_one_test("2020-01-30", "<date_spec id='spec' yeardays='30'/>", pcmk_rc_ok);
85}
86
87static void
88time_after_yeardays_spec(void **state) {
89 run_one_test("2020-02-15", "<date_spec id='spec' yeardays='40'/>", pcmk_rc_after_range);
90}
91
92static void
93yeardays_feb_29_satisfies(void **state) {
94 run_one_test("2016-02-29", "<date_spec id='spec' yeardays='60'/>", pcmk_rc_ok);
95}
96
97static void
98exact_ymd_satisfies(void **state) {
99 run_one_test("2001-12-31", "<date_spec id='spec' years='2001' months='12' monthdays='31'/>", pcmk_rc_ok);
100}
101
102static void
103range_in_month_satisfies(void **state) {
104 run_one_test("2001-06-10", "<date_spec id='spec' years='2001' months='6' monthdays='1-10'/>", pcmk_rc_ok);
105}
106
107static void
108exact_ymd_after_range(void **state) {
109 run_one_test("2001-12-31", "<date_spec id='spec' years='2001' months='12' monthdays='30'/>", pcmk_rc_after_range);
110}
111
112static void
113time_after_monthdays_range(void **state) {
114 run_one_test("2001-06-10", "<date_spec id='spec' years='2001' months='6' monthdays='11-15'/>", pcmk_rc_before_range);
115}
116
117int main(int argc, char **argv) {
118 const struct CMUnitTest tests[] = {
119 cmocka_unit_test(no_time_given),
120 cmocka_unit_test(any_time_satisfies_empty_spec),
121 cmocka_unit_test(time_satisfies_year_spec),
122 cmocka_unit_test(time_after_year_spec),
123 cmocka_unit_test(time_satisfies_year_range),
124 cmocka_unit_test(time_before_year_range),
125 cmocka_unit_test(time_after_year_range),
126 cmocka_unit_test(range_without_start_year_passes),
127 cmocka_unit_test(range_without_end_year_passes),
128
129 cmocka_unit_test(yeardays_satisfies),
130 cmocka_unit_test(time_after_yeardays_spec),
131 cmocka_unit_test(yeardays_feb_29_satisfies),
132
133 cmocka_unit_test(exact_ymd_satisfies),
134 cmocka_unit_test(range_in_month_satisfies),
135 cmocka_unit_test(exact_ymd_after_range),
136 cmocka_unit_test(time_after_monthdays_range),
137 };
138
139 cmocka_set_message_output(CM_OUTPUT_TAP);
140 return cmocka_run_group_tests(tests, NULL, NULL);
141}
void crm_time_free(crm_time_t *dt)
Definition: iso8601.c:140
crm_time_t * crm_time_new(const char *string)
Definition: iso8601.c:92
struct crm_time_s crm_time_t
Definition: iso8601.h:32
int main(int argc, char **argv)
@ pcmk_rc_before_range
Definition: results.h:119
@ pcmk_rc_op_unsatisfied
Definition: results.h:121
@ pcmk_rc_ok
Definition: results.h:146
@ pcmk_rc_after_range
Definition: results.h:117
int pe_cron_range_satisfied(crm_time_t *now, xmlNode *cron_spec)
Definition: rules.c:243
Wrappers for and extensions to libxml2.
xmlNode * string2xml(const char *input)
Definition: xml.c:869
void free_xml(xmlNode *child)
Definition: xml.c:824