12
12
#include <zephyr/sys/timeutil.h>
13
13
#include <zephyr/sys/util.h>
14
14
15
- BUILD_ASSERT (sizeof (time_t ) == sizeof (int64_t ), "time_t must be 64-bit" );
16
-
17
15
#undef CORRECTABLE
18
16
#define CORRECTABLE true
19
17
@@ -80,37 +78,39 @@ static const struct ts_test_spec ts_tests[] = {
80
78
DECL_VALID_TS_TEST (-1 , 0 ),
81
79
DECL_VALID_TS_TEST (-1 , 1 ),
82
80
DECL_VALID_TS_TEST (-1 , NSEC_PER_SEC - 1 ),
83
- DECL_VALID_TS_TEST (INT64_MIN , 0 ),
84
- DECL_VALID_TS_TEST (INT64_MIN , NSEC_PER_SEC - 1 ),
85
- DECL_VALID_TS_TEST (INT64_MAX , 0 ),
86
- DECL_VALID_TS_TEST (INT64_MAX , NSEC_PER_SEC - 1 ),
81
+ DECL_VALID_TS_TEST (SYS_TIME_T_MIN , 0 ),
82
+ DECL_VALID_TS_TEST (SYS_TIME_T_MIN , NSEC_PER_SEC - 1 ),
83
+ DECL_VALID_TS_TEST (SYS_TIME_T_MAX , 0 ),
84
+ DECL_VALID_TS_TEST (SYS_TIME_T_MAX , NSEC_PER_SEC - 1 ),
87
85
88
86
/* Correctable, invalid cases */
89
- DECL_INVALID_TS_TEST (0 , -2 * NSEC_PER_SEC + 1 , -2 , 1 , CORRECTABLE ),
90
- DECL_INVALID_TS_TEST (0 , -2 * NSEC_PER_SEC - 1 , -3 , NSEC_PER_SEC - 1 , CORRECTABLE ),
91
- DECL_INVALID_TS_TEST (0 , - NSEC_PER_SEC - 1 , -2 , NSEC_PER_SEC - 1 , CORRECTABLE ),
87
+ DECL_INVALID_TS_TEST (0 , -2LL * NSEC_PER_SEC + 1 , -2 , 1 , CORRECTABLE ),
88
+ DECL_INVALID_TS_TEST (0 , -2LL * NSEC_PER_SEC - 1 , -3 , NSEC_PER_SEC - 1 , CORRECTABLE ),
89
+ DECL_INVALID_TS_TEST (0 , -1LL * NSEC_PER_SEC - 1 , -2 , NSEC_PER_SEC - 1 , CORRECTABLE ),
92
90
DECL_INVALID_TS_TEST (0 , -1 , -1 , NSEC_PER_SEC - 1 , CORRECTABLE ),
93
91
DECL_INVALID_TS_TEST (0 , NSEC_PER_SEC , 1 , 0 , CORRECTABLE ),
94
- DECL_INVALID_TS_TEST (0 , NSEC_PER_SEC + 1 , 1 , 0 , CORRECTABLE ),
92
+ DECL_INVALID_TS_TEST (0 , NSEC_PER_SEC + 1 , 1 , 1 , CORRECTABLE ),
95
93
DECL_INVALID_TS_TEST (1 , -1 , 0 , NSEC_PER_SEC - 1 , CORRECTABLE ),
96
94
DECL_INVALID_TS_TEST (1 , NSEC_PER_SEC , 2 , 0 , CORRECTABLE ),
97
95
DECL_INVALID_TS_TEST (-1 , -1 , -2 , NSEC_PER_SEC - 1 , CORRECTABLE ),
98
96
DECL_INVALID_TS_TEST (0 , NSEC_PER_SEC , 1 , 0 , CORRECTABLE ),
99
97
DECL_INVALID_TS_TEST (1 , -1 , 0 , NSEC_PER_SEC - 1 , CORRECTABLE ),
100
98
DECL_INVALID_TS_TEST (1 , NSEC_PER_SEC , 2 , 0 , CORRECTABLE ),
101
- DECL_INVALID_TS_TEST (INT64_MIN , NSEC_PER_SEC , INT64_MIN + 1 , 0 , CORRECTABLE ),
102
- DECL_INVALID_TS_TEST (INT64_MAX , -1 , INT64_MAX - 1 , NSEC_PER_SEC - 1 , CORRECTABLE ),
103
- DECL_INVALID_TS_TEST (0 , LONG_MIN , LONG_MAX / NSEC_PER_SEC , 145224192 , CORRECTABLE ),
99
+ DECL_INVALID_TS_TEST (SYS_TIME_T_MIN , NSEC_PER_SEC , SYS_TIME_T_MIN + 1 , 0 , CORRECTABLE ),
100
+ DECL_INVALID_TS_TEST (SYS_TIME_T_MAX , -1 , SYS_TIME_T_MAX - 1 , NSEC_PER_SEC - 1 , CORRECTABLE ),
101
+ DECL_INVALID_TS_TEST (0 , LONG_MIN , (int64_t )LONG_MIN / NSEC_PER_SEC - 1 ,
102
+ NSEC_PER_SEC + LONG_MIN % (long long )NSEC_PER_SEC , CORRECTABLE ),
104
103
DECL_INVALID_TS_TEST (0 , LONG_MAX , LONG_MAX / NSEC_PER_SEC , LONG_MAX % NSEC_PER_SEC ,
105
104
CORRECTABLE ),
106
105
107
106
/* Uncorrectable, invalid cases */
108
- DECL_INVALID_TS_TEST (INT64_MIN + 2 , -2 * (int64_t )NSEC_PER_SEC - 1 , 0 , 0 , UNCORRECTABLE ),
109
- DECL_INVALID_TS_TEST (INT64_MIN + 1 , - (int64_t )NSEC_PER_SEC - 1 , 0 , 0 , UNCORRECTABLE ),
110
- DECL_INVALID_TS_TEST (INT64_MIN + 1 , - (int64_t )NSEC_PER_SEC - 1 , 0 , 0 , UNCORRECTABLE ),
111
- DECL_INVALID_TS_TEST (INT64_MIN , -1 , 0 , 0 , UNCORRECTABLE ),
112
- DECL_INVALID_TS_TEST (INT64_MAX , (int64_t )NSEC_PER_SEC , 0 , 0 , UNCORRECTABLE ),
113
- DECL_INVALID_TS_TEST (INT64_MAX - 1 , 2 * (int64_t )NSEC_PER_SEC , 0 , 0 , UNCORRECTABLE ),
107
+ DECL_INVALID_TS_TEST (SYS_TIME_T_MIN + 2 , -2 * (int64_t )NSEC_PER_SEC - 1 , 0 , 0 ,
108
+ UNCORRECTABLE ),
109
+ DECL_INVALID_TS_TEST (SYS_TIME_T_MIN + 1 , - (int64_t )NSEC_PER_SEC - 1 , 0 , 0 , UNCORRECTABLE ),
110
+ DECL_INVALID_TS_TEST (SYS_TIME_T_MIN + 1 , - (int64_t )NSEC_PER_SEC - 1 , 0 , 0 , UNCORRECTABLE ),
111
+ DECL_INVALID_TS_TEST (SYS_TIME_T_MIN , -1 , 0 , 0 , UNCORRECTABLE ),
112
+ DECL_INVALID_TS_TEST (SYS_TIME_T_MAX , (int64_t )NSEC_PER_SEC , 0 , 0 , UNCORRECTABLE ),
113
+ DECL_INVALID_TS_TEST (SYS_TIME_T_MAX - 1 , 2 * (int64_t )NSEC_PER_SEC , 0 , 0 , UNCORRECTABLE ),
114
114
};
115
115
116
116
ZTEST (timeutil_api , test_timespec_is_valid )
@@ -129,7 +129,7 @@ ZTEST(timeutil_api, test_timespec_is_valid)
129
129
ZTEST (timeutil_api , test_timespec_normalize )
130
130
{
131
131
ARRAY_FOR_EACH (ts_tests , i ) {
132
- bool different ;
132
+ bool different , corrected ;
133
133
bool overflow ;
134
134
const struct ts_test_spec * const tspec = & ts_tests [i ];
135
135
struct timespec norm = tspec -> invalid_ts ;
@@ -146,13 +146,16 @@ ZTEST(timeutil_api, test_timespec_normalize)
146
146
147
147
if (!tspec -> expect_valid && tspec -> correctable ) {
148
148
different = !timespec_equal (& tspec -> invalid_ts , & norm );
149
- zexpect_true (different ,
150
- "%d: {%lld, %lld} and {%lld, %lld} are unexpectedly %s" , i ,
149
+ corrected = timespec_equal (& tspec -> valid_ts , & norm );
150
+ zexpect_true (different && corrected ,
151
+ "%d: {%lld, %lld} is not properly corrected:"
152
+ "{%lld, %lld} != {%lld, %lld}" , i ,
151
153
(long long )tspec -> invalid_ts .tv_sec ,
152
- (long long )tspec -> invalid_ts .tv_nsec , ( long long ) norm . tv_sec ,
154
+ (long long )tspec -> invalid_ts .tv_nsec ,
153
155
(long long )tspec -> valid_ts .tv_sec ,
154
- (tspec -> expect_valid || tspec -> correctable ) ? "different"
155
- : "equal" );
156
+ (long long )tspec -> valid_ts .tv_nsec ,
157
+ (long long )norm .tv_sec ,
158
+ (long long )norm .tv_nsec );
156
159
}
157
160
}
158
161
}
@@ -173,10 +176,10 @@ ZTEST(timeutil_api, test_timespec_add)
173
176
{.a = {-1 , 1 }, .b = {-1 , 1 }, .result = {-2 , 2 }, .expect = false},
174
177
{.a = {-1 , NSEC_PER_SEC - 1 }, .b = {0 , 1 }, .result = {0 , 0 }, .expect = false},
175
178
/* overflow cases */
176
- {.a = {INT64_MAX , 0 }, .b = {1 , 0 }, .result = {0 }, .expect = true},
177
- {.a = {INT64_MIN , 0 }, .b = {-1 , 0 }, .result = {0 }, .expect = true},
178
- {.a = {INT64_MAX , NSEC_PER_SEC - 1 }, .b = {1 , 1 }, .result = {0 }, .expect = true},
179
- {.a = {INT64_MIN , NSEC_PER_SEC - 1 }, .b = {-1 , 0 }, .result = {0 }, .expect = true},
179
+ {.a = {SYS_TIME_T_MAX , 0 }, .b = {1 , 0 }, .result = {0 }, .expect = true},
180
+ {.a = {SYS_TIME_T_MIN , 0 }, .b = {-1 , 0 }, .result = {0 }, .expect = true},
181
+ {.a = {SYS_TIME_T_MAX , NSEC_PER_SEC - 1 }, .b = {1 , 1 }, .result = {0 }, .expect = true},
182
+ {.a = {SYS_TIME_T_MIN , NSEC_PER_SEC - 1 }, .b = {-1 , 0 }, .result = {0 }, .expect = true},
180
183
};
181
184
182
185
ARRAY_FOR_EACH (tspecs , i ) {
@@ -210,9 +213,9 @@ ZTEST(timeutil_api, test_timespec_negate)
210
213
{.ts = {0 , 0 }, .result = {0 , 0 }, .expect_failure = false},
211
214
{.ts = {1 , 1 }, .result = {-2 , NSEC_PER_SEC - 1 }, .expect_failure = false},
212
215
{.ts = {-1 , 1 }, .result = {0 , NSEC_PER_SEC - 1 }, .expect_failure = false},
213
- {.ts = {INT64_MAX , 0 }, .result = {INT64_MIN + 1 , 0 }, .expect_failure = false},
216
+ {.ts = {SYS_TIME_T_MAX , 0 }, .result = {SYS_TIME_T_MIN + 1 , 0 }, .expect_failure = false},
214
217
/* overflow cases */
215
- {.ts = {INT64_MIN , 0 }, .result = {0 }, .expect_failure = true},
218
+ {.ts = {SYS_TIME_T_MIN , 0 }, .result = {0 }, .expect_failure = true},
216
219
};
217
220
218
221
ARRAY_FOR_EACH (tspecs , i ) {
@@ -280,16 +283,21 @@ ZTEST(timeutil_api, test_K_TICKS_TO_SECS)
280
283
zexpect_equal (K_TICKS_TO_SECS (0 ), 0 );
281
284
zexpect_equal (K_TICKS_TO_SECS (CONFIG_SYS_CLOCK_TICKS_PER_SEC ), 1 );
282
285
zexpect_equal (K_TICKS_TO_SECS (2 * CONFIG_SYS_CLOCK_TICKS_PER_SEC ), 2 );
283
- zexpect_equal (K_TICKS_TO_SECS (K_TICK_MAX ), K_TIMESPEC_MAX .tv_sec );
284
- zexpect_equal (K_TICKS_TO_SECS (K_TICKS_FOREVER ), INT64_MAX );
286
+ zexpect_equal (K_TICKS_TO_SECS (K_TICKS_FOREVER ), SYS_TIME_T_MAX );
285
287
288
+ if (SYS_TIME_T_MAX >= 92233720368547758LL ) {
289
+ /* These checks should only be done if time_t has enough bits to hold K_TS_MAX without overflowing */
290
+ zexpect_equal (K_TICKS_TO_SECS (K_TICK_MAX ), K_TIMESPEC_MAX .tv_sec );
286
291
#if defined(CONFIG_TIMEOUT_64BIT ) && (CONFIG_SYS_CLOCK_TICKS_PER_SEC == 100 )
287
- zexpect_equal (K_TIMESPEC_MAX .tv_sec , 92233720368547758LL );
292
+ zexpect_equal (K_TIMESPEC_MAX .tv_sec , 92233720368547758LL );
288
293
#endif
294
+ }
289
295
290
296
#if (CONFIG_SYS_CLOCK_TICKS_PER_SEC == 32768 )
291
297
#if defined(CONFIG_TIMEOUT_64BIT )
292
- zexpect_equal (K_TIMESPEC_MAX .tv_sec , 281474976710655LL );
298
+ if (SYS_TIME_T_MAX >= 281474976710655LL ) {
299
+ zexpect_equal (K_TIMESPEC_MAX .tv_sec , 281474976710655LL );
300
+ }
293
301
#else
294
302
zexpect_equal (K_TIMESPEC_MAX .tv_sec , 131071 );
295
303
#endif
@@ -347,7 +355,7 @@ static const struct tospec {
347
355
bool roundup ;
348
356
} tospecs [] = {
349
357
/* negative timespecs should round-up to K_NO_WAIT */
350
- DECL_TOSPEC_NEGATIVE_TEST (K_TIMESPEC (INT64_MIN , 0 )),
358
+ DECL_TOSPEC_NEGATIVE_TEST (K_TIMESPEC (SYS_TIME_T_MIN , 0 )),
351
359
DECL_TOSPEC_NEGATIVE_TEST (K_TIMESPEC (-1 , 0 )),
352
360
DECL_TOSPEC_NEGATIVE_TEST (K_TIMESPEC (-1 , NSEC_PER_SEC - 1 )),
353
361
@@ -410,12 +418,9 @@ static const struct tospec {
410
418
411
419
/* round down toward K_TICK_MAX */
412
420
DECL_PSAT_TOSPEC_TEST (K_TICKS_TO_TIMESPEC (K_TICK_MAX )),
413
- #if defined(CONFIG_TIMEOUT_64BIT ) && (CONFIG_SYS_CLOCK_TICKS_PER_SEC > 1 )
414
- DECL_PSAT_TOSPEC_TEST (K_TICKS_TO_TIMESPEC ((uint64_t )K_TICK_MAX + 1 )),
415
- #endif
416
421
417
422
/* K_FOREVER <=> K_TIMESPEC_FOREVER */
418
- DECL_TOSPEC_TEST (K_FOREVER , K_TIMESPEC (INT64_MAX , NSEC_PER_SEC - 1 ), 0 , false, false),
423
+ DECL_TOSPEC_TEST (K_FOREVER , K_TIMESPEC (SYS_TIME_T_MAX , NSEC_PER_SEC - 1 ), 0 , false, false),
419
424
};
420
425
421
426
ZTEST (timeutil_api , test_timespec_from_timeout )
0 commit comments