VirtualBox

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

Last change on this file since 86669 was 86239, checked in by vboxsync, 4 years ago

IPRT: Some fixes to RTTimeZoneGetCurrent-posix.cpp and a basic testcase: ':' prefix in TZ value shouldn't be returned if we want. Don't read the /etc/localtime symlink, just pass it directly to RTPathReal (the symlink is often self-relative, i.e. ../usr/share/zoneinfo/x/y). Must terminate line buffer when reading /etc/timezone before using it. Share buffers to save stack space.

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

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