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 } 124