pacemaker 2.1.8-2.1.8
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
crm_time_parse_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
13
14#include <crm/common/iso8601.h>
15#include "crmcommon_private.h"
16
17static void
18empty_arg(void **state)
19{
20 assert_null(crm_time_parse_duration(NULL));
21 assert_null(crm_time_parse_duration(""));
22}
23
24static void
25invalid_arg(void **state)
26{
27 // Valid except doesn't start with P
28 assert_null(crm_time_parse_duration("X3Y6M4DT12H30M5S"));
29
30 // Illegal character after P
31 assert_null(crm_time_parse_duration("P"));
32 assert_null(crm_time_parse_duration("P 3Y6M4DT12H30M5S"));
33 assert_null(crm_time_parse_duration("PX3Y6M4DT12H30M5S"));
34
35 // Integer overflow
36 assert_null(crm_time_parse_duration("P2147483648Y6M4DT12H30M5S"));
37 assert_null(crm_time_parse_duration("P3Y2147483648M4DT12H30M5S"));
38 assert_null(crm_time_parse_duration("P3Y6M2147483648DT12H30M5S"));
39 assert_null(crm_time_parse_duration("P3Y6M4DT2147483648H30M5S"));
40 assert_null(crm_time_parse_duration("P3Y6M4DT12H2147483648M5S"));
41 assert_null(crm_time_parse_duration("P3Y6M4DT12H30MP2147483648S"));
42
43 // Missing or invalid units
44 assert_null(crm_time_parse_duration("P3Y6M4DT12H30M5"));
45 assert_null(crm_time_parse_duration("P3Y6M4DT12H30M5X"));
46 assert_null(crm_time_parse_duration("P3X6M4DT12H30M5S"));
47 assert_null(crm_time_parse_duration("PT"));
48 assert_null(crm_time_parse_duration("P/"));
49
50#if 0
51 // @TODO The current implementation treats these as valid
52
53 // Units out of order
54 assert_null(crm_time_parse_duration("P6M3Y4DT12H30M5S"));
55 assert_null(crm_time_parse_duration("P6M3DT12HY430M5S"));
56
57 // Same unit specified multiple times
58 assert_null(crm_time_parse_duration("P6Y4M3D1MT12H30M5S"));
59
60 // Weeks mixed with other units
61 assert_null(crm_time_parse_duration("P6Y4M3W3D1MT12H30M5S"));
62 assert_null(crm_time_parse_duration("P3WT12H30M5S"));
63#endif
64}
65
66static void
67valid_arg(void **state)
68{
69 // @TODO Check result value
70 assert_non_null(crm_time_parse_duration("P3Y6M4DT12H30M5S"));
71 assert_non_null(crm_time_parse_duration("P3Y6M4DT12H30M"));
72 assert_non_null(crm_time_parse_duration("P3Y6M4D"));
73 assert_non_null(crm_time_parse_duration("P1M")); // 1 month
74 assert_non_null(crm_time_parse_duration("PT1M")); // 1 minute
75 assert_non_null(crm_time_parse_duration("P7W"));
76
77#if 0
78 // @TODO Current implementation can't handle these cases
79
80 // Fractional value for last unit
81 assert_non_null(crm_time_parse_duration("P3Y6M4DT12H30.5M"));
82 assert_non_null(crm_time_parse_duration("P3Y6M4DT12H30,5M"));
83
84 // P<YYYY>-<MM>-<DD>T<hh>:<mm>:<ss> format
85 assert_non_null(crm_time_parse_duration("P0003-02-01T11:10:09");
86#endif
87}
88
89PCMK__UNIT_TEST(NULL, NULL,
90 cmocka_unit_test(empty_arg),
91 cmocka_unit_test(invalid_arg),
92 cmocka_unit_test(valid_arg));
ISO_8601 Date handling.
crm_time_t * crm_time_parse_duration(const char *duration_str)
Parse a time duration from an ISO 8601 duration specification.
Definition iso8601.c:1086
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)