pacemaker  3.0.0-d8340737c4
Scalable High-Availability cluster resource manager
pcmk__unpack_duration_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 <glib.h>
13 
15 
16 #include <crm/common/iso8601.h>
17 #include <crm/common/xml.h>
18 #include "../../crmcommon_private.h"
19 
20 #define MONTHS_TO_SECONDS "months=\"2\" weeks=\"3\" days=\"-1\" " \
21  "hours=\"1\" minutes=\"1\" seconds=\"1\" />"
22 
23 #define ALL_VALID "<duration id=\"duration1\" years=\"1\" " MONTHS_TO_SECONDS
24 
25 #define NO_ID "<duration years=\"1\" " MONTHS_TO_SECONDS
26 
27 #define YEARS_INVALID "<duration id=\"duration1\" years=\"not-a-number\" " \
28  MONTHS_TO_SECONDS
29 
30 static void
31 null_invalid(void **state)
32 {
33  xmlNode *duration = pcmk__xml_parse(ALL_VALID);
34  crm_time_t *start = crm_time_new("2024-01-01 15:00:00");
35  crm_time_t *end = NULL;
36 
37  assert_int_equal(pcmk__unpack_duration(NULL, NULL, NULL), EINVAL);
38  assert_int_equal(pcmk__unpack_duration(duration, NULL, NULL), EINVAL);
39  assert_int_equal(pcmk__unpack_duration(duration, start, NULL), EINVAL);
40  assert_int_equal(pcmk__unpack_duration(duration, NULL, &end), EINVAL);
41  assert_int_equal(pcmk__unpack_duration(NULL, start, NULL), EINVAL);
42  assert_int_equal(pcmk__unpack_duration(NULL, start, &end), EINVAL);
43  assert_int_equal(pcmk__unpack_duration(NULL, NULL, &end), EINVAL);
44 
45  crm_time_free(start);
46  pcmk__xml_free(duration);
47 }
48 
49 static void
50 nonnull_end_invalid(void **state)
51 {
52  xmlNode *duration = pcmk__xml_parse(ALL_VALID);
53  crm_time_t *start = crm_time_new("2024-01-01 15:00:00");
54  crm_time_t *end = crm_time_new("2024-01-01 15:00:01");
55 
56  assert_int_equal(pcmk__unpack_duration(duration, start, &end), EINVAL);
57 
58  crm_time_free(start);
59  crm_time_free(end);
60  pcmk__xml_free(duration);
61 }
62 
63 static void
64 no_id(void **state)
65 {
66  xmlNode *duration = pcmk__xml_parse(NO_ID);
67  crm_time_t *start = crm_time_new("2024-01-01 15:00:00");
68  crm_time_t *end = NULL;
69 
70  assert_int_equal(pcmk__unpack_duration(duration, start, &end),
72  assert_null(end);
73 
74  crm_time_free(start);
75  pcmk__xml_free(duration);
76 }
77 
78 static void
79 years_invalid(void **state)
80 {
81  xmlNode *duration = pcmk__xml_parse(YEARS_INVALID);
82  crm_time_t *start = crm_time_new("2024-01-01 15:00:00");
83  crm_time_t *end = NULL;
84 
85  assert_int_equal(pcmk__unpack_duration(duration, start, &end),
87  assert_null(end);
88 
89  crm_time_free(start);
90  pcmk__xml_free(duration);
91 }
92 
93 static void
94 all_valid(void **state)
95 {
96  xmlNode *duration = pcmk__xml_parse(ALL_VALID);
97  crm_time_t *start = crm_time_new("2024-01-01 15:00:00");
98  crm_time_t *end = NULL;
99  crm_time_t *reference = crm_time_new("2025-03-21 16:01:01");
100 
101  assert_int_equal(pcmk__unpack_duration(duration, start, &end), pcmk_rc_ok);
102  assert_int_equal(crm_time_compare(end, reference), 0);
103 
104  crm_time_free(start);
105  crm_time_free(end);
106  crm_time_free(reference);
107  pcmk__xml_free(duration);
108 }
109 
111  cmocka_unit_test(null_invalid),
112  cmocka_unit_test(nonnull_end_invalid),
113  cmocka_unit_test(no_id),
114  cmocka_unit_test(years_invalid),
115  cmocka_unit_test(all_valid))
struct crm_time_s crm_time_t
Definition: iso8601.h:32
#define ALL_VALID
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
void pcmk__xml_free(xmlNode *xml)
Definition: xml.c:789
#define YEARS_INVALID
int pcmk__xml_test_setup_group(void **state)
Definition: unittest.c:85
Wrappers for and extensions to libxml2.
ISO_8601 Date handling.
G_GNUC_INTERNAL int pcmk__unpack_duration(const xmlNode *duration, const crm_time_t *start, crm_time_t **end)
Definition: rules.c:245
int pcmk__xml_test_teardown_group(void **state)
Definition: unittest.c:104
xmlNode * pcmk__xml_parse(const char *input)
Definition: xml_io.c:168
int crm_time_compare(const crm_time_t *a, const crm_time_t *b)
Definition: iso8601.c:1736
crm_time_t * crm_time_new(const char *string)
Definition: iso8601.c:112
#define NO_ID
void crm_time_free(crm_time_t *dt)
Definition: iso8601.c:150