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