1 /* $NetBSD: bug-2803.c,v 1.2 2020/05/25 20:47:37 christos Exp $ */
2
3 #include <config.h>
4
5 #include <stdio.h>
6 #include <sys/time.h>
7
8 #include <ntp_fp.h>
9 #include <timevalops.h>
10
11 /* microseconds per second */
12 #define MICROSECONDS 1000000
13
14
15 static int verbose = 1; // if not 0, also print results if test passed
16 static int exit_on_err = 0; // if not 0, exit if test failed
17
18
19 /*
20 * Test function calling the old and new code mentioned in
21 * http://bugs.ntp.org/show_bug.cgi?id=2803#c22
22 */
23 static
do_test(struct timeval timetv,struct timeval tvlast)24 int do_test( struct timeval timetv, struct timeval tvlast )
25 {
26 struct timeval tvdiff_old;
27 struct timeval tvdiff_new;
28
29 int cond_old;
30 int cond_new;
31 int failed;
32
33 cond_old = 0;
34 cond_new = 0;
35
36 // Here is the old code:
37 tvdiff_old = abs_tval(sub_tval(timetv, tvlast));
38 if (tvdiff_old.tv_sec > 0) {
39 cond_old = 1;
40 }
41
42 // Here is the new code:
43 tvdiff_new = sub_tval(timetv, tvlast);
44 if (tvdiff_new.tv_sec != 0) {
45 cond_new = 1;
46 }
47
48 failed = cond_new != cond_old;
49
50 if ( failed || verbose )
51 printf( "timetv %lli|%07li, tvlast %lli|%07li: tvdiff_old: %lli|%07li -> %i, tvdiff_new: %lli|%07li -> %i, same cond: %s\n",
52 (long long) timetv.tv_sec, timetv.tv_usec,
53 (long long) tvlast.tv_sec, tvlast.tv_usec,
54 (long long) tvdiff_old.tv_sec, tvdiff_old.tv_usec, cond_old,
55 (long long) tvdiff_new.tv_sec, tvdiff_new.tv_usec, cond_new,
56 failed ? "NO <<" : "yes" );
57
58 return failed ? -1 : 0;
59 }
60
61
62
63 /*
64 * Call the test function in a loop for a given set of parameters.
65 * Both timetv and tvlast iterate over the given range, in all combinations.
66 */
67 static
test_loop(long long start_sec,long start_usec,long long stop_sec,long stop_usec,long long step_sec,long step_usec)68 int test_loop( long long start_sec, long start_usec,
69 long long stop_sec, long stop_usec,
70 long long step_sec, long step_usec )
71 {
72 struct timeval timetv;
73 struct timeval tvlast;
74
75 for ( timetv.tv_sec = start_sec; timetv.tv_sec <= stop_sec; timetv.tv_sec += step_sec )
76 for ( timetv.tv_usec = start_usec; timetv.tv_usec <= stop_usec; timetv.tv_usec += step_usec )
77 for ( tvlast.tv_sec = start_sec; tvlast.tv_sec <= stop_sec; tvlast.tv_sec += step_sec )
78 for ( tvlast.tv_usec = start_usec; tvlast.tv_usec <= stop_usec; tvlast.tv_usec += step_usec )
79 {
80 int rc = do_test( timetv, tvlast );
81 if (rc < 0 && exit_on_err )
82 return rc;
83 }
84
85 return 0;
86 }
87
88
89
main2(void)90 int main2( void )
91 {
92
93 // loop from {0.0} to {1.1000000} stepping by tv_sec by 1 and tv_usec by 100000
94 test_loop( 0, 0, 1, MICROSECONDS, 1, MICROSECONDS / 10 );
95
96 // test_loop( 0, 0, 5, MICROSECONDS, 1, MICROSECONDS / 1000 );
97 // test_loop( 0, 0, -5, -MICROSECONDS, -1, -MICROSECONDS / 1000 );
98
99 return 0;
100 }
101
102