VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTTimeSpec.cpp@ 72150

Last change on this file since 72150 was 72140, checked in by vboxsync, 7 years ago

IPRT/time: misc fixes (incorrect offUTC conversion sign, forgotten storing of offUTC, incorrect month/day calculation for first day of month, avoiding assertions when leap year needs to be recalulated) for local time, make RTTimeImplode process local time correctly, plus an implementation of RTTimeLocalNormalize and RTTimeConvertToZulu. Much improved testcase exercising overflow handling in the local time case.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 33.8 KB
Line 
1/* $Id: tstRTTimeSpec.cpp 72140 2018-05-07 14:21:31Z vboxsync $ */
2/** @file
3 * IPRT - RTTimeSpec and PRTTIME tests.
4 */
5
6/*
7 * Copyright (C) 2006-2017 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#if !defined(RT_OS_WINDOWS)
32# define RTTIME_INCL_TIMEVAL
33# define RTTIME_INCL_TIMESPEC
34# include <time.h>
35# include <sys/time.h>
36#endif
37#include <iprt/time.h>
38
39#include <iprt/test.h>
40#include <iprt/string.h>
41
42
43/**
44 * Format the time into a string using a static buffer.
45 */
46char *ToString(PRTTIME pTime)
47{
48 static char szBuf[128];
49 RTStrPrintf(szBuf, sizeof(szBuf), "%04d-%02d-%02dT%02u:%02u:%02u.%09u [YD%u WD%u UO%d F%#x]",
50 pTime->i32Year,
51 pTime->u8Month,
52 pTime->u8MonthDay,
53 pTime->u8Hour,
54 pTime->u8Minute,
55 pTime->u8Second,
56 pTime->u32Nanosecond,
57 pTime->u16YearDay,
58 pTime->u8WeekDay,
59 pTime->offUTC,
60 pTime->fFlags);
61 return szBuf;
62}
63
64#define CHECK_NZ(expr) do { if (!(expr)) { RTTestIFailed("at line %d: %#x\n", __LINE__, #expr); return RTTestSummaryAndDestroy(hTest); } } while (0)
65
66#define TEST_NS(ns) do {\
67 CHECK_NZ(RTTimeExplode(&T1, RTTimeSpecSetNano(&Ts1, ns))); \
68 RTTestIPrintf(RTTESTLVL_ALWAYS, "%RI64 ns - %s\n", ns, ToString(&T1)); \
69 CHECK_NZ(RTTimeImplode(&Ts2, &T1)); \
70 if (!RTTimeSpecIsEqual(&Ts2, &Ts1)) \
71 RTTestIFailed("FAILURE - %RI64 != %RI64, line no. %d\n", \
72 RTTimeSpecGetNano(&Ts2), RTTimeSpecGetNano(&Ts1), __LINE__); \
73 } while (0)
74
75#define TEST_NS_LOCAL(ns) do {\
76 CHECK_NZ(RTTimeLocalExplode(&T1, RTTimeSpecSetNano(&Ts1, ns))); \
77 RTTestIPrintf(RTTESTLVL_ALWAYS, "%RI64 ns - %s\n", ns, ToString(&T1)); \
78 CHECK_NZ(RTTimeImplode(&Ts2, &T1)); \
79 if (!RTTimeSpecIsEqual(&Ts2, &Ts1)) \
80 RTTestIFailed("FAILURE - %RI64 != %RI64, line no. %d\n", \
81 RTTimeSpecGetNano(&Ts2), RTTimeSpecGetNano(&Ts1), __LINE__); \
82 } while (0)
83
84#define TEST_SEC(sec) do {\
85 CHECK_NZ(RTTimeExplode(&T1, RTTimeSpecSetSeconds(&Ts1, sec))); \
86 RTTestIPrintf(RTTESTLVL_ALWAYS, "%RI64 sec - %s\n", sec, ToString(&T1)); \
87 CHECK_NZ(RTTimeImplode(&Ts2, &T1)); \
88 if (!RTTimeSpecIsEqual(&Ts2, &Ts1)) \
89 RTTestIFailed("FAILURE - %RI64 != %RI64, line no. %d\n", \
90 RTTimeSpecGetNano(&Ts2), RTTimeSpecGetNano(&Ts1), __LINE__); \
91 } while (0)
92
93#define CHECK_TIME_EX(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags, _Silent)\
94 do { \
95 if ( (pTime)->i32Year != (_i32Year) \
96 || (pTime)->u8Month != (_u8Month) \
97 || (pTime)->u8WeekDay != (_u8WeekDay) \
98 || (pTime)->u16YearDay != (_u16YearDay) \
99 || (pTime)->u8MonthDay != (_u8MonthDay) \
100 || (pTime)->u8Hour != (_u8Hour) \
101 || (pTime)->u8Minute != (_u8Minute) \
102 || (pTime)->u8Second != (_u8Second) \
103 || (pTime)->u32Nanosecond != (_u32Nanosecond) \
104 || (pTime)->offUTC != (_offUTC) \
105 || (pTime)->fFlags != (_fFlags) \
106 ) \
107 { \
108 RTTestIFailed(" %s ; line no %d\n" \
109 "!= %04d-%02d-%02dT%02u:%02u:%02u.%09u [YD%u WD%u UO%d F%#x]\n", \
110 ToString(pTime), __LINE__, (_i32Year), (_u8Month), (_u8MonthDay), (_u8Hour), (_u8Minute), \
111 (_u8Second), (_u32Nanosecond), (_u16YearDay), (_u8WeekDay), (_offUTC), (_fFlags)); \
112 } \
113 else if (!_Silent) \
114 RTTestIPrintf(RTTESTLVL_ALWAYS, "=> %s\n", ToString(pTime)); \
115 } while (0)
116#define CHECK_TIME(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags) CHECK_TIME_EX(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags, false)
117#define CHECK_TIME_SILENT(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags) CHECK_TIME_EX(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags, true)
118
119#define CHECK_TIME_LOCAL_EX(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags, _Silent)\
120 do { \
121 uint32_t fOrigFlags = (pTime)->fFlags; \
122 CHECK_NZ(RTTimeConvertToZulu(pTime)); \
123 if ( (pTime)->i32Year != (_i32Year) \
124 || (pTime)->u8Month != (_u8Month) \
125 || (pTime)->u8WeekDay != (_u8WeekDay) \
126 || (pTime)->u16YearDay != (_u16YearDay) \
127 || (pTime)->u8MonthDay != (_u8MonthDay) \
128 || (pTime)->u8Hour != (_u8Hour) \
129 || (pTime)->u8Minute != (_u8Minute) \
130 || (pTime)->u8Second != (_u8Second) \
131 || (pTime)->u32Nanosecond != (_u32Nanosecond) \
132 || (pTime)->offUTC != (_offUTC) \
133 || (fOrigFlags & RTTIME_FLAGS_TYPE_MASK) != RTTIME_FLAGS_TYPE_LOCAL \
134 || (pTime)->fFlags != (_fFlags) \
135 ) \
136 { \
137 RTTestIFailed(" %s ; line no %d\n" \
138 "!= %04d-%02d-%02dT%02u:%02u:%02u.%09u [YD%u WD%u UO%d F%#x]\n", \
139 ToString(pTime), __LINE__, (_i32Year), (_u8Month), (_u8MonthDay), (_u8Hour), (_u8Minute), \
140 (_u8Second), (_u32Nanosecond), (_u16YearDay), (_u8WeekDay), (_offUTC), (_fFlags)); \
141 } \
142 else if (!_Silent) \
143 RTTestIPrintf(RTTESTLVL_ALWAYS, "=> %s\n", ToString(pTime)); \
144 } while (0)
145#define CHECK_TIME_LOCAL(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags) CHECK_TIME_LOCAL_EX(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags, false)
146#define CHECK_TIME_LOCAL_SILENT(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags) CHECK_TIME_LOCAL_EX(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags, true)
147
148#define SET_TIME(pTime, _i32Year, _u8Month, _u8MonthDay, _u8Hour, _u8Minute, _u8Second, _u32Nanosecond, _u16YearDay, _u8WeekDay, _offUTC, _fFlags)\
149 do { \
150 (pTime)->i32Year = (_i32Year); \
151 (pTime)->u8Month = (_u8Month); \
152 (pTime)->u8WeekDay = (_u8WeekDay); \
153 (pTime)->u16YearDay = (_u16YearDay); \
154 (pTime)->u8MonthDay = (_u8MonthDay); \
155 (pTime)->u8Hour = (_u8Hour); \
156 (pTime)->u8Minute = (_u8Minute); \
157 (pTime)->u8Second = (_u8Second); \
158 (pTime)->u32Nanosecond = (_u32Nanosecond); \
159 (pTime)->offUTC = (_offUTC); \
160 (pTime)->fFlags = (_fFlags); \
161 RTTestIPrintf(RTTESTLVL_ALWAYS, " %s\n", ToString(pTime)); \
162 } while (0)
163
164
165int main()
166{
167 RTTIMESPEC Now;
168 RTTIMESPEC Ts1;
169 RTTIMESPEC Ts2;
170 RTTIME T1;
171 RTTIME T2;
172#ifdef RTTIME_INCL_TIMEVAL
173 struct timeval Tv1;
174 struct timeval Tv2;
175 struct timespec Tsp1;
176 struct timespec Tsp2;
177#endif
178 RTTEST hTest;
179
180 int rc = RTTestInitAndCreate("tstRTTimeSpec", &hTest);
181 if (rc)
182 return rc;
183
184 /*
185 * Simple test with current time.
186 */
187 RTTestSub(hTest, "Current time (UTC)");
188 CHECK_NZ(RTTimeNow(&Now));
189 CHECK_NZ(RTTimeExplode(&T1, &Now));
190 RTTestIPrintf(RTTESTLVL_ALWAYS, " %RI64 ns - %s\n", RTTimeSpecGetNano(&Now), ToString(&T1));
191 CHECK_NZ(RTTimeImplode(&Ts1, &T1));
192 if (!RTTimeSpecIsEqual(&Ts1, &Now))
193 RTTestIFailed("%RI64 != %RI64\n", RTTimeSpecGetNano(&Ts1), RTTimeSpecGetNano(&Now));
194
195 /*
196 * Simple test with current local time.
197 */
198 RTTestSub(hTest, "Current time (local)");
199 CHECK_NZ(RTTimeLocalNow(&Now));
200 CHECK_NZ(RTTimeExplode(&T1, &Now));
201 RTTestIPrintf(RTTESTLVL_ALWAYS, " %RI64 ns - %s\n", RTTimeSpecGetNano(&Now), ToString(&T1));
202 CHECK_NZ(RTTimeImplode(&Ts1, &T1));
203 if (!RTTimeSpecIsEqual(&Ts1, &Now))
204 RTTestIFailed("%RI64 != %RI64\n", RTTimeSpecGetNano(&Ts1), RTTimeSpecGetNano(&Now));
205
206 /*
207 * Some simple tests with fixed dates (just checking for smoke).
208 */
209 RTTestSub(hTest, "Smoke");
210 TEST_NS(INT64_C(0));
211 CHECK_TIME(&T1, 1970,01,01, 00,00,00, 0, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
212 TEST_NS(INT64_C(86400000000000));
213 CHECK_TIME(&T1, 1970,01,02, 00,00,00, 0, 2, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
214
215 TEST_NS(INT64_C(1));
216 CHECK_TIME(&T1, 1970,01,01, 00,00,00, 1, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
217 TEST_NS(INT64_C(-1));
218 CHECK_TIME(&T1, 1969,12,31, 23,59,59,999999999, 365, 2, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
219
220 /*
221 * Some local time tests with dates triggering unexpected wraparound bugs in previous code version
222 * (on 2nd of a month). Test every hour to cover any TZ of the host OS.
223 */
224 RTTestSub(hTest, "Wraparound (local)");
225 TEST_NS_LOCAL(INT64_C(1522576800000000000));
226 CHECK_TIME_LOCAL(&T1, 2018,04,01, 10,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
227 TEST_NS_LOCAL(INT64_C(1522580400000000000));
228 CHECK_TIME_LOCAL(&T1, 2018,04,01, 11,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
229 TEST_NS_LOCAL(INT64_C(1522584000000000000));
230 CHECK_TIME_LOCAL(&T1, 2018,04,01, 12,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
231 TEST_NS_LOCAL(INT64_C(1522587600000000000));
232 CHECK_TIME_LOCAL(&T1, 2018,04,01, 13,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
233 TEST_NS_LOCAL(INT64_C(1522591200000000000));
234 CHECK_TIME_LOCAL(&T1, 2018,04,01, 14,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
235 TEST_NS_LOCAL(INT64_C(1522594800000000000));
236 CHECK_TIME_LOCAL(&T1, 2018,04,01, 15,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
237 TEST_NS_LOCAL(INT64_C(1522598400000000000));
238 CHECK_TIME_LOCAL(&T1, 2018,04,01, 16,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
239 TEST_NS_LOCAL(INT64_C(1522602000000000000));
240 CHECK_TIME_LOCAL(&T1, 2018,04,01, 17,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
241 TEST_NS_LOCAL(INT64_C(1522605600000000000));
242 CHECK_TIME_LOCAL(&T1, 2018,04,01, 18,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
243 TEST_NS_LOCAL(INT64_C(1522609200000000000));
244 CHECK_TIME_LOCAL(&T1, 2018,04,01, 19,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
245 TEST_NS_LOCAL(INT64_C(1522612800000000000));
246 CHECK_TIME_LOCAL(&T1, 2018,04,01, 20,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
247 TEST_NS_LOCAL(INT64_C(1522616400000000000));
248 CHECK_TIME_LOCAL(&T1, 2018,04,01, 21,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
249 TEST_NS_LOCAL(INT64_C(1522620000000000000));
250 CHECK_TIME_LOCAL(&T1, 2018,04,01, 22,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
251 TEST_NS_LOCAL(INT64_C(1522623600000000000));
252 CHECK_TIME_LOCAL(&T1, 2018,04,01, 23,00,00, 0, 91, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
253 TEST_NS_LOCAL(INT64_C(1522627200000000000));
254 CHECK_TIME_LOCAL(&T1, 2018,04,02, 0,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
255 TEST_NS_LOCAL(INT64_C(1522630800000000000));
256 CHECK_TIME_LOCAL(&T1, 2018,04,02, 1,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
257 TEST_NS_LOCAL(INT64_C(1522634400000000000));
258 CHECK_TIME_LOCAL(&T1, 2018,04,02, 2,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
259 TEST_NS_LOCAL(INT64_C(1522638000000000000));
260 CHECK_TIME_LOCAL(&T1, 2018,04,02, 3,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
261 TEST_NS_LOCAL(INT64_C(1522641600000000000));
262 CHECK_TIME_LOCAL(&T1, 2018,04,02, 4,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
263 TEST_NS_LOCAL(INT64_C(1522645200000000000));
264 CHECK_TIME_LOCAL(&T1, 2018,04,02, 5,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
265 TEST_NS_LOCAL(INT64_C(1522648800000000000));
266 CHECK_TIME_LOCAL(&T1, 2018,04,02, 6,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
267 TEST_NS_LOCAL(INT64_C(1522652400000000000));
268 CHECK_TIME_LOCAL(&T1, 2018,04,02, 7,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
269 TEST_NS_LOCAL(INT64_C(1522656000000000000));
270 CHECK_TIME_LOCAL(&T1, 2018,04,02, 8,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
271 TEST_NS_LOCAL(INT64_C(1522659600000000000));
272 CHECK_TIME_LOCAL(&T1, 2018,04,02, 9,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
273 TEST_NS_LOCAL(INT64_C(1522663200000000000));
274 CHECK_TIME_LOCAL(&T1, 2018,04,02, 10,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
275 TEST_NS_LOCAL(INT64_C(1522666800000000000));
276 CHECK_TIME_LOCAL(&T1, 2018,04,02, 11,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
277 TEST_NS_LOCAL(INT64_C(1522670400000000000));
278 CHECK_TIME_LOCAL(&T1, 2018,04,02, 12,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
279 TEST_NS_LOCAL(INT64_C(1522674000000000000));
280 CHECK_TIME_LOCAL(&T1, 2018,04,02, 13,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
281 TEST_NS_LOCAL(INT64_C(1522677600000000000));
282 CHECK_TIME_LOCAL(&T1, 2018,04,02, 14,00,00, 0, 92, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
283
284 /*
285 * Test the limits.
286 */
287 RTTestSub(hTest, "Extremes");
288 TEST_NS(INT64_MAX);
289 TEST_NS(INT64_MIN);
290 TEST_SEC(1095379198);
291 CHECK_TIME(&T1, 2004, 9,16, 23,59,58, 0, 260, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
292 TEST_SEC(1095379199);
293 CHECK_TIME(&T1, 2004, 9,16, 23,59,59, 0, 260, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
294 TEST_SEC(1095379200);
295 CHECK_TIME(&T1, 2004, 9,17, 00,00,00, 0, 261, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
296 TEST_SEC(1095379201);
297 CHECK_TIME(&T1, 2004, 9,17, 00,00,01, 0, 261, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
298
299 /*
300 * Test normalization (UTC).
301 */
302 RTTestSub(hTest, "Normalization (UTC)");
303 /* simple */
304 CHECK_NZ(RTTimeNow(&Now));
305 CHECK_NZ(RTTimeExplode(&T1, &Now));
306 T2 = T1;
307 CHECK_NZ(RTTimeNormalize(&T1));
308 if (memcmp(&T1, &T2, sizeof(T1)))
309 RTTestIFailed("simple normalization failed\n");
310 CHECK_NZ(RTTimeImplode(&Ts1, &T1));
311 CHECK_NZ(RTTimeSpecIsEqual(&Ts1, &Now));
312
313 /* a few partial dates. */
314 memset(&T1, 0, sizeof(T1));
315 SET_TIME( &T1, 1970,01,01, 00,00,00, 0, 0, 0, 0, 0);
316 CHECK_NZ(RTTimeNormalize(&T1));
317 CHECK_TIME(&T1, 1970,01,01, 00,00,00, 0, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
318
319 SET_TIME( &T1, 1970,00,00, 00,00,00, 1, 1, 0, 0, 0);
320 CHECK_NZ(RTTimeNormalize(&T1));
321 CHECK_TIME(&T1, 1970,01,01, 00,00,00, 1, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
322
323 SET_TIME( &T1, 2007,12,06, 02,15,23, 1, 0, 0, 0, 0);
324 CHECK_NZ(RTTimeNormalize(&T1));
325 CHECK_TIME(&T1, 2007,12,06, 02,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
326
327 SET_TIME( &T1, 1968,01,30, 00,19,24, 5, 0, 0, 0, 0);
328 CHECK_NZ(RTTimeNormalize(&T1));
329 CHECK_TIME(&T1, 1968,01,30, 00,19,24, 5, 30, 1, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
330
331 SET_TIME( &T1, 1969,01,31, 00, 9, 2, 7, 0, 0, 0, 0);
332 CHECK_NZ(RTTimeNormalize(&T1));
333 CHECK_TIME(&T1, 1969,01,31, 00, 9, 2, 7, 31, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
334
335 SET_TIME( &T1, 1969,03,31, 00, 9, 2, 7, 0, 0, 0, 0);
336 CHECK_NZ(RTTimeNormalize(&T1));
337 CHECK_TIME(&T1, 1969,03,31, 00, 9, 2, 7, 90, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
338
339 SET_TIME( &T1, 1969,12,31, 00,00,00, 9, 0, 0, 0, 0);
340 CHECK_NZ(RTTimeNormalize(&T1));
341 CHECK_TIME(&T1, 1969,12,31, 00,00,00, 9, 365, 2, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
342
343 SET_TIME( &T1, 1969,12,30, 00,00,00, 30, 0, 0, 0, 0);
344 CHECK_NZ(RTTimeNormalize(&T1));
345 CHECK_TIME(&T1, 1969,12,30, 00,00,00, 30, 364, 1, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
346
347 SET_TIME( &T1, 1969,00,00, 00,00,00, 30, 363, 0, 0, 0);
348 CHECK_NZ(RTTimeNormalize(&T1));
349 CHECK_TIME(&T1, 1969,12,29, 00,00,00, 30, 363, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
350
351 SET_TIME( &T1, 1969,00,00, 00,00,00, 30, 362, 6, 0, 0);
352 CHECK_NZ(RTTimeNormalize(&T1));
353 CHECK_TIME(&T1, 1969,12,28, 00,00,00, 30, 362, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
354
355 SET_TIME( &T1, 1969,12,27, 00,00,00, 30, 0, 5, 0, 0);
356 CHECK_NZ(RTTimeNormalize(&T1));
357 CHECK_TIME(&T1, 1969,12,27, 00,00,00, 30, 361, 5, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
358
359 SET_TIME( &T1, 1969,00,00, 00,00,00, 30, 360, 0, 0, 0);
360 CHECK_NZ(RTTimeNormalize(&T1));
361 CHECK_TIME(&T1, 1969,12,26, 00,00,00, 30, 360, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
362
363 SET_TIME( &T1, 1969,12,25, 00,00,00, 12, 0, 0, 0, 0);
364 CHECK_NZ(RTTimeNormalize(&T1));
365 CHECK_TIME(&T1, 1969,12,25, 00,00,00, 12, 359, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
366
367 SET_TIME( &T1, 1969,12,24, 00,00,00, 16, 0, 0, 0, 0);
368 CHECK_NZ(RTTimeNormalize(&T1));
369 CHECK_TIME(&T1, 1969,12,24, 00,00,00, 16, 358, 2, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
370
371 /* outside the year table range */
372 SET_TIME( &T1, 1200,01,30, 00,00,00, 2, 0, 0, 0, 0);
373 CHECK_NZ(RTTimeNormalize(&T1));
374 CHECK_TIME(&T1, 1200,01,30, 00,00,00, 2, 30, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
375
376 SET_TIME( &T1, 2555,11,29, 00,00,00, 2, 0, 0, 0, 0);
377 CHECK_NZ(RTTimeNormalize(&T1));
378 CHECK_TIME(&T1, 2555,11,29, 00,00,00, 2, 333, 5, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
379
380 SET_TIME( &T1, 2555,00,00, 00,00,00, 3, 333, 0, 0, 0);
381 CHECK_NZ(RTTimeNormalize(&T1));
382 CHECK_TIME(&T1, 2555,11,29, 00,00,00, 3, 333, 5, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
383
384 /* time overflow */
385 SET_TIME( &T1, 1969,12,30, 255,255,255, UINT32_MAX, 364, 0, 0, 0);
386 CHECK_NZ(RTTimeNormalize(&T1));
387 CHECK_TIME(&T1, 1970,01, 9, 19,19,19,294967295, 9, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
388
389 /* date overflow */
390 SET_TIME( &T1, 2007,11,36, 02,15,23, 1, 0, 0, 0, 0);
391 CHECK_NZ(RTTimeNormalize(&T1));
392 CHECK_TIME(&T1, 2007,12,06, 02,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
393
394 SET_TIME( &T1, 2007,10,67, 02,15,23, 1, 0, 0, 0, 0);
395 CHECK_NZ(RTTimeNormalize(&T1));
396 CHECK_TIME(&T1, 2007,12,06, 02,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
397
398 SET_TIME( &T1, 2007,10,98, 02,15,23, 1, 0, 0, 0, 0);
399 CHECK_NZ(RTTimeNormalize(&T1));
400 CHECK_TIME(&T1, 2008,01,06, 02,15,23, 1, 6, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
401
402 SET_TIME( &T1, 2006,24,06, 02,15,23, 1, 0, 0, 0, 0);
403 CHECK_NZ(RTTimeNormalize(&T1));
404 CHECK_TIME(&T1, 2007,12,06, 02,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
405
406 SET_TIME( &T1, 2003,60,37, 02,15,23, 1, 0, 0, 0, 0);
407 CHECK_NZ(RTTimeNormalize(&T1));
408 CHECK_TIME(&T1, 2008,01,06, 02,15,23, 1, 6, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
409
410 SET_TIME( &T1, 2003,00,00, 02,15,23, 1,1801, 0, 0, 0);
411 CHECK_NZ(RTTimeNormalize(&T1));
412 CHECK_TIME(&T1, 2007,12,06, 02,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
413
414 /*
415 * Test normalization (local).
416 */
417 RTTestSub(hTest, "Normalization (local)");
418 /* simple */
419 CHECK_NZ(RTTimeNow(&Now));
420 CHECK_NZ(RTTimeLocalExplode(&T1, &Now));
421 T2 = T1;
422 CHECK_NZ(RTTimeLocalNormalize(&T1));
423 if (memcmp(&T1, &T2, sizeof(T1)))
424 RTTestIFailed("simple normalization failed\n");
425 CHECK_NZ(RTTimeImplode(&Ts1, &T1));
426 CHECK_NZ(RTTimeSpecIsEqual(&Ts1, &Now));
427
428 /* a few partial dates. */
429 memset(&T1, 0, sizeof(T1));
430 SET_TIME( &T1, 1970,01,01, 00,00,00, 0, 0, 0, -60, 0);
431 CHECK_NZ(RTTimeLocalNormalize(&T1));
432 CHECK_TIME_LOCAL(&T1, 1970,01,01, 01,00,00, 0, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
433
434 SET_TIME( &T1, 1970,00,00, 00,00,00, 1, 1, 0, -120, 0);
435 CHECK_NZ(RTTimeLocalNormalize(&T1));
436 CHECK_TIME_LOCAL(&T1, 1970,01,01, 02,00,00, 1, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
437
438 SET_TIME( &T1, 2007,12,06, 02,15,23, 1, 0, 0, 120, 0);
439 CHECK_NZ(RTTimeLocalNormalize(&T1));
440 CHECK_TIME_LOCAL(&T1, 2007,12,06, 00,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
441
442 SET_TIME( &T1, 1968,01,30, 00,19,24, 5, 0, 0, -480, 0);
443 CHECK_NZ(RTTimeLocalNormalize(&T1));
444 CHECK_TIME_LOCAL(&T1, 1968,01,30, 8,19,24, 5, 30, 1, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
445
446 SET_TIME( &T1, 1969,01,31, 03, 9, 2, 7, 0, 0, 180, 0);
447 CHECK_NZ(RTTimeLocalNormalize(&T1));
448 CHECK_TIME_LOCAL(&T1, 1969,01,31, 00, 9, 2, 7, 31, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
449
450 SET_TIME( &T1, 1969,03,31, 00, 9, 2, 7, 0, 0, -60, 0);
451 CHECK_NZ(RTTimeLocalNormalize(&T1));
452 CHECK_TIME_LOCAL(&T1, 1969,03,31, 01, 9, 2, 7, 90, 0, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
453
454 SET_TIME( &T1, 1969,12,30, 18,00,00, 9, 0, 0, -360, 0);
455 CHECK_NZ(RTTimeLocalNormalize(&T1));
456 CHECK_TIME_LOCAL(&T1, 1969,12,31, 00,00,00, 9, 365, 2, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
457
458 SET_TIME( &T1, 1969,12,29, 12,00,00, 30, 0, 0, -720, 0);
459 CHECK_NZ(RTTimeLocalNormalize(&T1));
460 CHECK_TIME_LOCAL(&T1, 1969,12,30, 00,00,00, 30, 364, 1, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
461
462 SET_TIME( &T1, 1969,00,00, 00,00,00, 30, 363, 0, 30, 0);
463 CHECK_NZ(RTTimeLocalNormalize(&T1));
464 CHECK_TIME_LOCAL(&T1, 1969,12,28, 23,30,00, 30, 362, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
465
466 SET_TIME( &T1, 1969,00,00, 00,00,00, 30, 362, 6, -60, 0);
467 CHECK_NZ(RTTimeLocalNormalize(&T1));
468 CHECK_TIME_LOCAL(&T1, 1969,12,28, 01,00,00, 30, 362, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
469
470 SET_TIME( &T1, 1969,12,27, 00,00,00, 30, 0, 5, -120, 0);
471 CHECK_NZ(RTTimeLocalNormalize(&T1));
472 CHECK_TIME_LOCAL(&T1, 1969,12,27, 02,00,00, 30, 361, 5, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
473
474 SET_TIME( &T1, 1969,00,00, 00,00,00, 30, 360, 0, -120, 0);
475 CHECK_NZ(RTTimeLocalNormalize(&T1));
476 CHECK_TIME_LOCAL(&T1, 1969,12,26, 02,00,00, 30, 360, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
477
478 SET_TIME( &T1, 1969,12,25, 00,00,00, 12, 0, 0, 15, 0);
479 CHECK_NZ(RTTimeLocalNormalize(&T1));
480 CHECK_TIME_LOCAL(&T1, 1969,12,24, 23,45,00, 12, 358, 2, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
481
482 SET_TIME( &T1, 1969,12,24, 00,00,00, 16, 0, 0, -15, 0);
483 CHECK_NZ(RTTimeLocalNormalize(&T1));
484 CHECK_TIME_LOCAL(&T1, 1969,12,24, 00,15,00, 16, 358, 2, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
485
486 /* outside the year table range */
487 SET_TIME( &T1, 1200,01,30, 00,00,00, 2, 0, 0, -720, 0);
488 CHECK_NZ(RTTimeLocalNormalize(&T1));
489 CHECK_TIME_LOCAL(&T1, 1200,01,30, 12,00,00, 2, 30, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
490
491 SET_TIME( &T1, 2555,11,29, 00,00,00, 2, 0, 0, -480, 0);
492 CHECK_NZ(RTTimeLocalNormalize(&T1));
493 CHECK_TIME_LOCAL(&T1, 2555,11,29, 8,00,00, 2, 333, 5, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
494
495 SET_TIME( &T1, 2555,00,00, 00,00,00, 3, 333, 0, 60, 0);
496 CHECK_NZ(RTTimeLocalNormalize(&T1));
497 CHECK_TIME_LOCAL(&T1, 2555,11,28, 23,00,00, 3, 332, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
498
499 /* time overflow */
500 SET_TIME( &T1, 1969,12,30, 255,255,255, UINT32_MAX, 364, 0, 60, 0);
501 CHECK_NZ(RTTimeLocalNormalize(&T1));
502 CHECK_TIME_LOCAL(&T1, 1970,01, 9, 18,19,19,294967295, 9, 4, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
503
504 /* date overflow */
505 SET_TIME( &T1, 2007,11,36, 02,15,23, 1, 0, 0, 60, 0);
506 CHECK_NZ(RTTimeLocalNormalize(&T1));
507 CHECK_TIME_LOCAL(&T1, 2007,12,06, 01,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
508
509 SET_TIME( &T1, 2007,10,67, 02,15,23, 1, 0, 0, 60, 0);
510 CHECK_NZ(RTTimeLocalNormalize(&T1));
511 CHECK_TIME_LOCAL(&T1, 2007,12,06, 01,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
512
513 SET_TIME( &T1, 2007,10,98, 02,15,23, 1, 0, 0, 60, 0);
514 CHECK_NZ(RTTimeLocalNormalize(&T1));
515 CHECK_TIME_LOCAL(&T1, 2008,01,06, 01,15,23, 1, 6, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
516
517 SET_TIME( &T1, 2006,24,06, 02,15,23, 1, 0, 0, 60, 0);
518 CHECK_NZ(RTTimeLocalNormalize(&T1));
519 CHECK_TIME_LOCAL(&T1, 2007,12,06, 01,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
520
521 SET_TIME( &T1, 2003,60,37, 02,15,23, 1, 0, 0, -60, 0);
522 CHECK_NZ(RTTimeLocalNormalize(&T1));
523 CHECK_TIME_LOCAL(&T1, 2008,01,06, 03,15,23, 1, 6, 6, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
524
525 SET_TIME( &T1, 2003,00,00, 02,15,23, 1,1801, 0, -60, 0);
526 CHECK_NZ(RTTimeLocalNormalize(&T1));
527 CHECK_TIME_LOCAL(&T1, 2007,12,06, 03,15,23, 1, 340, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
528
529 /*
530 * Test UTC and local time explode/implode round trips every 29 minutes for 3 years.
531 * Relies heavily on correct behavior of RTTimeNormalize and does limited sanity checking.
532 */
533 RTTestSub(hTest, "Wraparound 3 year (UTC+local), silent");
534 RTTimeSpecSetNano(&Ts1, 1420070400000000000);
535 RTTIME Tcheck;
536 memset(&Tcheck, 0, sizeof(Tcheck));
537 Tcheck.i32Year = 2015;
538 Tcheck.u16YearDay = 1;
539 CHECK_NZ(RTTimeNormalize(&Tcheck));
540 while (Tcheck.i32Year <= 2017)
541 {
542 if (RTTimeIsLeapYear(Tcheck.i32Year))
543 {
544 if (!(Tcheck.fFlags & RTTIME_FLAGS_LEAP_YEAR))
545 RTTestIFailed("FAILURE - %d is not marked as a leap year, line no. %d\n",
546 Tcheck.i32Year, __LINE__);
547 }
548 else
549 {
550 if (!(Tcheck.fFlags & RTTIME_FLAGS_COMMON_YEAR))
551 RTTestIFailed("FAILURE - %d is not marked as a common year, line no. %d\n",
552 Tcheck.i32Year, __LINE__);
553 }
554
555 CHECK_NZ(RTTimeExplode(&T1, &Ts1));
556 CHECK_NZ(RTTimeImplode(&Ts2, &T1));
557 if (!RTTimeSpecIsEqual(&Ts2, &Ts1))
558 RTTestIFailed("FAILURE - %RI64 != %RI64, line no. %d\n",
559 RTTimeSpecGetNano(&Ts2), RTTimeSpecGetNano(&Ts1), __LINE__);
560 CHECK_TIME_SILENT(&T1, Tcheck.i32Year, Tcheck.u8Month, Tcheck.u8MonthDay, Tcheck.u8Hour, Tcheck.u8Minute, Tcheck.u8Second, Tcheck.u32Nanosecond, Tcheck.u16YearDay, Tcheck.u8WeekDay, Tcheck.offUTC, Tcheck.fFlags);
561
562 CHECK_NZ(RTTimeLocalExplode(&T1, &Ts1));
563 CHECK_NZ(RTTimeImplode(&Ts2, &T1));
564 if (!RTTimeSpecIsEqual(&Ts2, &Ts1))
565 RTTestIFailed("FAILURE - %RI64 != %RI64, line no. %d\n",
566 RTTimeSpecGetNano(&Ts2), RTTimeSpecGetNano(&Ts1), __LINE__);
567 CHECK_TIME_LOCAL_SILENT(&T1, Tcheck.i32Year, Tcheck.u8Month, Tcheck.u8MonthDay, Tcheck.u8Hour, Tcheck.u8Minute, Tcheck.u8Second, Tcheck.u32Nanosecond, Tcheck.u16YearDay, Tcheck.u8WeekDay, Tcheck.offUTC, Tcheck.fFlags);
568
569 RTTimeSpecAddNano(&Ts1, 29 * RT_NS_1MIN);
570 Tcheck.u8Minute += 29;
571 CHECK_NZ(RTTimeNormalize(&Tcheck));
572 }
573
574 /*
575 * Conversions.
576 */
577#define CHECK_NSEC(Ts1, T2) \
578 do { \
579 RTTIMESPEC TsTmp; \
580 RTTESTI_CHECK_MSG( RTTimeSpecGetNano(&(Ts1)) == RTTimeSpecGetNano(RTTimeImplode(&TsTmp, &(T2))), \
581 ("line %d: %RI64, %RI64\n", __LINE__, \
582 RTTimeSpecGetNano(&(Ts1)), RTTimeSpecGetNano(RTTimeImplode(&TsTmp, &(T2)))) ); \
583 } while (0)
584 RTTestSub(hTest, "Conversions, positive");
585 SET_TIME(&T1, 1980,01,01, 00,00,00, 0, 1, 1, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
586 RTTESTI_CHECK(RTTimeSpecSetDosSeconds(&Ts2, 0) == &Ts2);
587 RTTESTI_CHECK(RTTimeSpecGetDosSeconds(&Ts2) == 0);
588 CHECK_NSEC(Ts2, T1);
589
590 SET_TIME(&T1, 1980,01,01, 00,00,00, 0, 1, 1, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_LEAP_YEAR);
591 RTTESTI_CHECK(RTTimeSpecSetNtTime(&Ts2, INT64_C(119600064000000000)) == &Ts2);
592 RTTESTI_CHECK(RTTimeSpecGetNtTime(&Ts2) == INT64_C(119600064000000000));
593 CHECK_NSEC(Ts2, T1);
594
595 SET_TIME(&T1, 1970,01,01, 00,00,01, 0, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
596 RTTESTI_CHECK(RTTimeSpecSetSeconds(&Ts2, 1) == &Ts2);
597 RTTESTI_CHECK(RTTimeSpecGetSeconds(&Ts2) == 1);
598 CHECK_NSEC(Ts2, T1);
599
600 SET_TIME(&T1, 1970,01,01, 00,00,01, 0, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
601 RTTESTI_CHECK(RTTimeSpecSetMilli(&Ts2, 1000) == &Ts2);
602 RTTESTI_CHECK(RTTimeSpecGetMilli(&Ts2) == 1000);
603 CHECK_NSEC(Ts2, T1);
604
605 SET_TIME(&T1, 1970,01,01, 00,00,01, 0, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
606 RTTESTI_CHECK(RTTimeSpecSetMicro(&Ts2, 1000000) == &Ts2);
607 RTTESTI_CHECK(RTTimeSpecGetMicro(&Ts2) == 1000000);
608 CHECK_NSEC(Ts2, T1);
609
610 SET_TIME(&T1, 1970,01,01, 00,00,01, 0, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
611 RTTESTI_CHECK(RTTimeSpecSetNano(&Ts2, 1000000000) == &Ts2);
612 RTTESTI_CHECK(RTTimeSpecGetNano(&Ts2) == 1000000000);
613 CHECK_NSEC(Ts2, T1);
614
615#ifdef RTTIME_INCL_TIMEVAL
616 SET_TIME(&T1, 1970,01,01, 00,00,01, 5000, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
617 Tv1.tv_sec = 1;
618 Tv1.tv_usec = 5;
619 RTTESTI_CHECK(RTTimeSpecSetTimeval(&Ts2, &Tv1) == &Ts2);
620 RTTESTI_CHECK(RTTimeSpecGetMicro(&Ts2) == 1000005);
621 CHECK_NSEC(Ts2, T1);
622 RTTESTI_CHECK(RTTimeSpecGetTimeval(&Ts2, &Tv2) == &Tv2);
623 RTTESTI_CHECK(Tv1.tv_sec == Tv2.tv_sec); RTTESTI_CHECK(Tv1.tv_usec == Tv2.tv_usec);
624#endif
625
626#ifdef RTTIME_INCL_TIMESPEC
627 SET_TIME(&T1, 1970,01,01, 00,00,01, 5, 1, 3, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
628 Tsp1.tv_sec = 1;
629 Tsp1.tv_nsec = 5;
630 RTTESTI_CHECK(RTTimeSpecSetTimespec(&Ts2, &Tsp1) == &Ts2);
631 RTTESTI_CHECK(RTTimeSpecGetNano(&Ts2) == 1000000005);
632 CHECK_NSEC(Ts2, T1);
633 RTTESTI_CHECK(RTTimeSpecGetTimespec(&Ts2, &Tsp2) == &Tsp2);
634 RTTESTI_CHECK(Tsp1.tv_sec == Tsp2.tv_sec); RTTESTI_CHECK(Tsp1.tv_nsec == Tsp2.tv_nsec);
635#endif
636
637
638 RTTestSub(hTest, "Conversions, negative");
639
640#ifdef RTTIME_INCL_TIMEVAL
641 SET_TIME(&T1, 1969,12,31, 23,59,58,999995000, 365, 2, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
642 Tv1.tv_sec = -2;
643 Tv1.tv_usec = 999995;
644 RTTESTI_CHECK(RTTimeSpecSetTimeval(&Ts2, &Tv1) == &Ts2);
645 RTTESTI_CHECK_MSG(RTTimeSpecGetMicro(&Ts2) == -1000005, ("%RI64\n", RTTimeSpecGetMicro(&Ts2)));
646 CHECK_NSEC(Ts2, T1);
647 RTTESTI_CHECK(RTTimeSpecGetTimeval(&Ts2, &Tv2) == &Tv2);
648 RTTESTI_CHECK(Tv1.tv_sec == Tv2.tv_sec); RTTESTI_CHECK(Tv1.tv_usec == Tv2.tv_usec);
649#endif
650
651#ifdef RTTIME_INCL_TIMESPEC
652 SET_TIME(&T1, 1969,12,31, 23,59,58,999999995, 365, 2, 0, RTTIME_FLAGS_TYPE_UTC | RTTIME_FLAGS_COMMON_YEAR);
653 Tsp1.tv_sec = -2;
654 Tsp1.tv_nsec = 999999995;
655 RTTESTI_CHECK(RTTimeSpecSetTimespec(&Ts2, &Tsp1) == &Ts2);
656 RTTESTI_CHECK_MSG(RTTimeSpecGetNano(&Ts2) == -1000000005, ("%RI64\n", RTTimeSpecGetMicro(&Ts2)));
657 CHECK_NSEC(Ts2, T1);
658 RTTESTI_CHECK(RTTimeSpecGetTimespec(&Ts2, &Tsp2) == &Tsp2);
659 RTTESTI_CHECK(Tsp1.tv_sec == Tsp2.tv_sec); RTTESTI_CHECK(Tsp1.tv_nsec == Tsp2.tv_nsec);
660#endif
661
662 /*
663 * Summary
664 */
665 return RTTestSummaryAndDestroy(hTest);
666}
667
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette