1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4
5/*=====================================================================
6**
7** Source: GetSystemTimeAsFileTime.c
8**
9** Purpose: Tests the PAL implementation of GetSystemTimeAsFileTime
10** Take two times, three seconds apart, and ensure that the time is
11** increasing, and that it has increased at least 3 seconds.
12**
13**
14**
15**===================================================================*/
16
17#include <palsuite.h>
18
19
20int __cdecl main(int argc, char **argv)
21{
22
23 FILETIME TheFirstTime, TheSecondTime;
24 ULONG64 FullFirstTime, FullSecondTime;
25
26 if (0 != PAL_Initialize(argc,argv))
27 {
28 return FAIL;
29 }
30
31 /* Get two times, 3 seconds apart */
32
33 GetSystemTimeAsFileTime( &TheFirstTime );
34
35 Sleep( 3000 );
36
37 GetSystemTimeAsFileTime( &TheSecondTime );
38
39 /* Convert them to ULONG64 to work with */
40
41 FullFirstTime = ((( (ULONG64)TheFirstTime.dwHighDateTime )<<32) |
42 ( (ULONG64)TheFirstTime.dwLowDateTime ));
43
44 FullSecondTime = ((( (ULONG64)TheSecondTime.dwHighDateTime )<<32) |
45 ( (ULONG64)TheSecondTime.dwLowDateTime ));
46
47 /* Test to ensure the second value is larger than the first */
48
49 if( FullSecondTime <= FullFirstTime )
50 {
51 Fail("ERROR: The system time didn't increase in the last "
52 "three seconds. The second time tested was less than "
53 "or equal to the first.");
54 }
55
56 /* Note: The 30000000 magic number is 3 seconds in hundreds of nano
57 seconds. This test checks to ensure at least 3 seconds passed
58 between the readings.
59 */
60
61 if( ( (LONG64)( FullSecondTime - FullFirstTime ) - 30000000 ) < 0 )
62 {
63 ULONG64 TimeError;
64
65 /* Note: This test used to compare the difference between full times
66 in terms of hundreds of nanoseconds. But the x86 clock seems to be
67 precise only to the level of about 10000 nanoseconds, so we would
68 fail the comparison depending on when we took time slices.
69
70 To fix this, we just check that we're within a millisecond of
71 sleeping 3000 milliseconds. We're not currently ensuring that we
72 haven't slept much more than 3000 ms. We may want to do that.
73 */
74 TimeError = 30000000 - ( FullSecondTime - FullFirstTime );
75 if ( TimeError > 10000)
76 {
77 Fail("ERROR: Two system times were tested, with a sleep of 3 "
78 "seconds between. The time passed should have been at least "
79 "3 seconds. But, it was less according to the function.");
80 }
81 }
82
83 PAL_Terminate();
84 return PASS;
85}
86
87