Home | History | Annotate | Line # | Download | only in libntp
timespecops.c revision 1.1.1.2
      1  1.1.1.2  christos /*	$NetBSD: timespecops.c,v 1.1.1.2 2015/07/10 13:11:14 christos Exp $	*/
      2  1.1.1.2  christos 
      3      1.1  christos #include "config.h"
      4      1.1  christos 
      5      1.1  christos #include "ntp_types.h"
      6      1.1  christos #include "ntp_fp.h"
      7      1.1  christos 
      8      1.1  christos #include <math.h>
      9      1.1  christos #include "timespecops.h"
     10      1.1  christos 
     11      1.1  christos #include "unity.h"
     12      1.1  christos 
     13      1.1  christos 
     14      1.1  christos #include <string.h>
     15      1.1  christos 
     16      1.1  christos //in unity_helper.h :
     17      1.1  christos #define TEST_ASSERT_EQUAL_timespec(a, b) { \
     18      1.1  christos     TEST_ASSERT_EQUAL_MESSAGE(a.tv_sec, b.tv_sec, "Field tv_sec"); \
     19      1.1  christos     TEST_ASSERT_EQUAL_MESSAGE(a.tv_nsec, b.tv_nsec, "Field tv_nsec");	\
     20      1.1  christos }
     21      1.1  christos 
     22      1.1  christos //what about l_fp.l_ui  ??? it's a union so it's either l_fp.l_ui or l_fp.l_i?
     23      1.1  christos #define TEST_ASSERT_EQUAL_l_fp(a, b) { \
     24      1.1  christos     TEST_ASSERT_EQUAL_MESSAGE(a.l_i, b.l_i, "Field l_i"); \
     25      1.1  christos     TEST_ASSERT_EQUAL_UINT_MESSAGE(a.l_uf, b.l_uf, "Field l_uf");	\
     26      1.1  christos }
     27      1.1  christos 
     28      1.1  christos //timespec has time_t, long, and time_t is basically long uint, 4 or 8 bytes size, depending on 32/64bit
     29      1.1  christos 
     30      1.1  christos static u_int32 my_tick_to_tsf(u_int32 ticks);
     31      1.1  christos static u_int32 my_tsf_to_tick(u_int32 tsf);
     32      1.1  christos 
     33      1.1  christos // that's it...
     34      1.1  christos struct lfpfracdata {
     35      1.1  christos 	long	nsec;
     36      1.1  christos 	u_int32 frac;
     37      1.1  christos };
     38      1.1  christos 
     39      1.1  christos //******************************************MY CUSTOM FUNCTIONS*******************************
     40      1.1  christos 
     41      1.1  christos typedef int bool; //TRUE and FALSE are already defined somewhere, so I can't do typedef enum { FALSE, TRUE } boolean;
     42      1.1  christos 
     43      1.1  christos const bool timespec_isValid(struct timespec V)
     44      1.1  christos 		{ return V.tv_nsec >= 0 && V.tv_nsec < 1000000000; }
     45      1.1  christos 
     46      1.1  christos struct timespec timespec_init(time_t hi, long lo){
     47      1.1  christos 	struct timespec V;
     48      1.1  christos 	V.tv_sec = hi;
     49      1.1  christos 	V.tv_nsec = lo;
     50      1.1  christos 	return V;
     51      1.1  christos }
     52      1.1  christos 
     53      1.1  christos //taken from lfpfunc.c -> maybe remove this from timevalops.c and lfpfunc. and put in c_timstructs.h ????!!!!!
     54      1.1  christos l_fp l_fp_init(int32 i, u_int32 f)
     55      1.1  christos {
     56      1.1  christos 	l_fp temp;
     57      1.1  christos 	temp.l_i  = i;
     58      1.1  christos 	temp.l_uf = f;
     59      1.1  christos 
     60      1.1  christos 	return temp;
     61      1.1  christos }
     62      1.1  christos 
     63      1.1  christos //also in timelalops.c!!!!!!
     64      1.1  christos bool AssertFpClose(const l_fp m,const l_fp n, const l_fp limit)
     65      1.1  christos {
     66      1.1  christos 	l_fp diff;
     67      1.1  christos 
     68      1.1  christos 	if (L_ISGEQ(&m, &n)) {
     69      1.1  christos 		diff = m;
     70      1.1  christos 		L_SUB(&diff, &n);
     71      1.1  christos 	} else {
     72      1.1  christos 		diff = n;
     73      1.1  christos 		L_SUB(&diff, &m);
     74      1.1  christos 	}
     75      1.1  christos 	if (L_ISGEQ(&limit, &diff)){
     76      1.1  christos 		return TRUE;
     77      1.1  christos 	}
     78      1.1  christos 	else {
     79      1.1  christos 		//<< m_expr << " which is " << l_fp_wrap(m)
     80      1.1  christos 		//<< "\nand\n"
     81      1.1  christos 		//<< n_expr << " which is " << l_fp_wrap(n)
     82      1.1  christos 		//<< "\nare not close; diff=" << l_fp_wrap(diff);
     83      1.1  christos 		return FALSE;
     84      1.1  christos 	}
     85      1.1  christos }
     86      1.1  christos 
     87      1.1  christos 
     88      1.1  christos bool AssertTimespecClose(const struct timespec m,const struct timespec n, const struct timespec limit)
     89      1.1  christos {
     90      1.1  christos 	struct timespec diff;
     91      1.1  christos 
     92      1.1  christos 	diff = abs_tspec(sub_tspec(m, n));
     93      1.1  christos 	if (cmp_tspec(limit, diff) >= 0)
     94      1.1  christos 		return TRUE;
     95      1.1  christos 	else
     96      1.1  christos 	{
     97      1.1  christos 		//<< m_expr << " which is " << timespec_wrap(m)
     98      1.1  christos 		//<< "\nand\n"
     99      1.1  christos 		//<< n_expr << " which is " << timespec_wrap(n)
    100      1.1  christos 		//<< "\nare not close; diff=" << timespec_wrap(diff);
    101      1.1  christos 		return FALSE;
    102      1.1  christos 	}
    103      1.1  christos }
    104      1.1  christos 
    105      1.1  christos //-----------------------------------------------
    106      1.1  christos 
    107      1.1  christos static const struct lfpfracdata fdata[] = {
    108      1.1  christos 	{	  0, 0x00000000 }, {   2218896, 0x00916ae6 },
    109      1.1  christos 	{  16408100, 0x0433523d }, { 125000000, 0x20000000 },
    110      1.1  christos 	{ 250000000, 0x40000000 }, { 287455871, 0x4996b53d },
    111      1.1  christos 	{ 375000000, 0x60000000 }, { 500000000, 0x80000000 },
    112      1.1  christos 	{ 518978897, 0x84dbcd0e }, { 563730222, 0x90509fb3 },
    113      1.1  christos 	{ 563788007, 0x9054692c }, { 583289882, 0x95527c57 },
    114      1.1  christos 	{ 607074509, 0x9b693c2a }, { 625000000, 0xa0000000 },
    115      1.1  christos 	{ 645184059, 0xa52ac851 }, { 676497788, 0xad2ef583 },
    116      1.1  christos 	{ 678910895, 0xadcd1abb }, { 679569625, 0xadf84663 },
    117      1.1  christos 	{ 690926741, 0xb0e0932d }, { 705656483, 0xb4a5e73d },
    118      1.1  christos 	{ 723553854, 0xb93ad34c }, { 750000000, 0xc0000000 },
    119      1.1  christos 	{ 763550253, 0xc3780785 }, { 775284917, 0xc6791284 },
    120      1.1  christos 	{ 826190764, 0xd3813ce8 }, { 875000000, 0xe0000000 },
    121      1.1  christos 	{ 956805507, 0xf4f134a9 }, { 982570733, 0xfb89c16c }
    122      1.1  christos 	};
    123      1.1  christos 
    124      1.1  christos 
    125      1.1  christos u_int32 my_tick_to_tsf(u_int32 ticks)
    126      1.1  christos {
    127      1.1  christos 	// convert nanoseconds to l_fp fractional units, using double
    128      1.1  christos 	// precision float calculations or, if available, 64bit integer
    129      1.1  christos 	// arithmetic. This should give the precise fraction, rounded to
    130      1.1  christos 	// the nearest representation.
    131      1.1  christos #ifdef HAVE_U_INT64
    132      1.1  christos 	return (u_int32)((( ((u_int64)(ticks)) << 32) + 500000000) / 1000000000);
    133      1.1  christos #else
    134      1.1  christos 	return (u_int32)((double(ticks)) * 4.294967296 + 0.5);
    135      1.1  christos #endif
    136      1.1  christos 	// And before you ask: if ticks >= 1000000000, the result is
    137      1.1  christos 	// truncated nonsense, so don't use it out-of-bounds.
    138      1.1  christos }
    139      1.1  christos 
    140      1.1  christos u_int32 my_tsf_to_tick(u_int32 tsf)
    141      1.1  christos {
    142      1.1  christos 	// Inverse operation: converts fraction to microseconds.
    143      1.1  christos #ifdef HAVE_U_INT64
    144      1.1  christos 	return (u_int32)(( ((u_int64)(tsf)) * 1000000000 + 0x80000000) >> 32);
    145      1.1  christos #else
    146      1.1  christos 	return (u_int32)(double(tsf) / 4.294967296 + 0.5);
    147      1.1  christos #endif
    148      1.1  christos 	// Beware: The result might be 10^9 due to rounding!
    149      1.1  christos }
    150      1.1  christos 
    151      1.1  christos 
    152      1.1  christos 
    153      1.1  christos // ---------------------------------------------------------------------
    154      1.1  christos // test support stuff -- part 1
    155      1.1  christos // ---------------------------------------------------------------------
    156      1.1  christos 
    157      1.1  christos void test_Helpers1() {
    158      1.1  christos 	struct timespec x;
    159      1.1  christos 
    160      1.1  christos 	for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++) {
    161      1.1  christos 		x.tv_nsec = -1;
    162      1.1  christos 		TEST_ASSERT_FALSE(timespec_isValid(x));
    163      1.1  christos 		x.tv_nsec = 0;
    164      1.1  christos 		TEST_ASSERT_TRUE(timespec_isValid(x));
    165      1.1  christos 		x.tv_nsec = 999999999;
    166      1.1  christos 		TEST_ASSERT_TRUE(timespec_isValid(x));
    167      1.1  christos 		x.tv_nsec = 1000000000;
    168      1.1  christos 		TEST_ASSERT_FALSE(timespec_isValid(x));
    169      1.1  christos 	}
    170      1.1  christos }
    171      1.1  christos 
    172      1.1  christos 
    173      1.1  christos //----------------------------------------------------------------------
    174      1.1  christos // test normalisation
    175      1.1  christos //----------------------------------------------------------------------
    176      1.1  christos 
    177      1.1  christos void test_Normalise() {
    178      1.1  christos 	long ns;
    179      1.1  christos 	for ( ns = -2000000000; ns <= 2000000000; ns += 10000000) {
    180      1.1  christos 		struct timespec x = timespec_init(0, ns);
    181      1.1  christos 
    182      1.1  christos 		x = normalize_tspec(x);
    183      1.1  christos 		TEST_ASSERT_TRUE(timespec_isValid(x));
    184      1.1  christos 	}
    185      1.1  christos }
    186      1.1  christos 
    187      1.1  christos //----------------------------------------------------------------------
    188      1.1  christos // test classification
    189      1.1  christos //----------------------------------------------------------------------
    190      1.1  christos 
    191      1.1  christos void test_SignNoFrac() {
    192      1.1  christos 	// sign test, no fraction
    193      1.1  christos 	int i;
    194      1.1  christos 	for (i = -4; i <= 4; ++i) {
    195      1.1  christos 		struct timespec a = timespec_init(i, 0);
    196      1.1  christos 		int E = (i > 0) - (i < 0);
    197      1.1  christos 		int r = test_tspec(a);
    198      1.1  christos 
    199      1.1  christos 		TEST_ASSERT_EQUAL(E, r);
    200      1.1  christos 	}
    201      1.1  christos }
    202      1.1  christos 
    203      1.1  christos void test_SignWithFrac() {
    204      1.1  christos 	// sign test, with fraction
    205      1.1  christos 	int i;
    206      1.1  christos 	for (i = -4; i <= 4; ++i) {
    207      1.1  christos 		struct timespec a = timespec_init(i, 10);
    208      1.1  christos 		int E = (i >= 0) - (i < 0);
    209      1.1  christos 		int r = test_tspec(a);
    210      1.1  christos 		TEST_ASSERT_EQUAL(E, r);
    211      1.1  christos 	}
    212      1.1  christos }
    213      1.1  christos 
    214      1.1  christos //----------------------------------------------------------------------
    215      1.1  christos // test compare
    216      1.1  christos //----------------------------------------------------------------------
    217      1.1  christos void test_CmpFracEQ() {
    218      1.1  christos 	// fractions are equal
    219      1.1  christos 	int i,j;
    220      1.1  christos 	for (i = -4; i <= 4; ++i)
    221      1.1  christos 		for (j = -4; j <= 4; ++j) {
    222      1.1  christos 			struct timespec a = timespec_init( i , 200);
    223      1.1  christos 			struct timespec b = timespec_init( j , 200);
    224      1.1  christos 			int   E = (i > j) - (i < j);
    225      1.1  christos 			int   r = cmp_tspec_denorm(a, b);
    226      1.1  christos 			TEST_ASSERT_EQUAL(E, r);
    227      1.1  christos 		}
    228      1.1  christos }
    229      1.1  christos 
    230      1.1  christos void test_CmpFracGT() {
    231      1.1  christos 	// fraction a bigger fraction b
    232      1.1  christos 	int i,j;
    233      1.1  christos 	for (i = -4; i <= 4; ++i)
    234      1.1  christos 		for (j = -4; j <= 4; ++j) {
    235      1.1  christos 			struct timespec a = timespec_init(i, 999999800);
    236      1.1  christos 			struct timespec b = timespec_init(j, 200);
    237      1.1  christos 			int   E = (i >= j) - (i < j);
    238      1.1  christos 			int   r = cmp_tspec_denorm(a, b);
    239      1.1  christos 			TEST_ASSERT_EQUAL(E, r);
    240      1.1  christos 		}
    241      1.1  christos }
    242      1.1  christos 
    243      1.1  christos void test_CmpFracLT() {
    244      1.1  christos 	// fraction a less fraction b
    245      1.1  christos 	int i,j;
    246      1.1  christos 	for (i = -4; i <= 4; ++i)
    247      1.1  christos 		for (j = -4; j <= 4; ++j) {
    248      1.1  christos 			struct timespec a = timespec_init(i, 200);
    249      1.1  christos 			struct timespec b = timespec_init(j, 999999800);
    250      1.1  christos 			int   E = (i > j) - (i <= j);
    251      1.1  christos 			int   r = cmp_tspec_denorm(a, b);
    252      1.1  christos 			TEST_ASSERT_EQUAL(E, r);
    253      1.1  christos 		}
    254      1.1  christos }
    255      1.1  christos 
    256      1.1  christos //----------------------------------------------------------------------
    257      1.1  christos // Test addition (sum)
    258      1.1  christos //----------------------------------------------------------------------
    259      1.1  christos 
    260      1.1  christos void test_AddFullNorm() {
    261      1.1  christos 	int i,j;
    262      1.1  christos 	for (i = -4; i <= 4; ++i)
    263      1.1  christos 		for (j = -4; j <= 4; ++j) {
    264      1.1  christos 			struct timespec a = timespec_init(i, 200);
    265      1.1  christos 			struct timespec b = timespec_init(j, 400);
    266      1.1  christos 			struct timespec E = timespec_init(i + j, 200 + 400);
    267      1.1  christos 			struct timespec c;
    268      1.1  christos 
    269      1.1  christos 			c = add_tspec(a, b);
    270      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    271      1.1  christos 		}
    272      1.1  christos }
    273      1.1  christos 
    274      1.1  christos void test_AddFullOflow1() {
    275      1.1  christos 	int i,j;
    276      1.1  christos 	for (i = -4; i <= 4; ++i)
    277      1.1  christos 		for (j = -4; j <= 4; ++j) {
    278      1.1  christos 			struct timespec a = timespec_init(i, 200);
    279      1.1  christos 			struct timespec b = timespec_init(j, 999999900);
    280      1.1  christos 			struct timespec E = timespec_init(i + j + 1, 100);
    281      1.1  christos 			struct timespec c;
    282      1.1  christos 
    283      1.1  christos 			c = add_tspec(a, b);
    284      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    285      1.1  christos 		}
    286      1.1  christos }
    287      1.1  christos 
    288      1.1  christos void test_AddNsecNorm() {
    289      1.1  christos 	int i;
    290      1.1  christos 	for (i = -4; i <= 4; ++i) {
    291      1.1  christos 		struct timespec a = timespec_init(i, 200);
    292      1.1  christos 		struct timespec E = timespec_init(i, 600);
    293      1.1  christos 		struct timespec c;
    294      1.1  christos 
    295      1.1  christos 		c = add_tspec_ns(a, 600 - 200);
    296      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    297      1.1  christos 	}
    298      1.1  christos }
    299      1.1  christos 
    300      1.1  christos void test_AddNsecOflow1() {
    301      1.1  christos 	int i;
    302      1.1  christos 	for (i = -4; i <= 4; ++i) {
    303      1.1  christos 		struct timespec a = timespec_init(i, 200);
    304      1.1  christos 		struct timespec E = timespec_init(i + 1, 100);
    305      1.1  christos 		struct timespec c;
    306      1.1  christos 
    307      1.1  christos 		c = add_tspec_ns(a, NANOSECONDS - 100);
    308      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    309      1.1  christos 	}
    310      1.1  christos }
    311      1.1  christos 
    312      1.1  christos //----------------------------------------------------------------------
    313      1.1  christos // test subtraction (difference)
    314      1.1  christos //----------------------------------------------------------------------
    315      1.1  christos 
    316      1.1  christos void test_SubFullNorm() {
    317      1.1  christos 	int i,j;
    318      1.1  christos 	for (i = -4; i <= 4; ++i)
    319      1.1  christos 		for (j = -4; j <= 4; ++j) {
    320      1.1  christos 			struct timespec a = timespec_init( i , 600);
    321      1.1  christos 			struct timespec b = timespec_init( j , 400);
    322      1.1  christos 			struct timespec E = timespec_init(i-j, 200);
    323      1.1  christos 			struct timespec c;
    324      1.1  christos 
    325      1.1  christos 			c = sub_tspec(a, b);
    326      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    327      1.1  christos 		}
    328      1.1  christos }
    329      1.1  christos 
    330      1.1  christos void test_SubFullOflow() {
    331      1.1  christos 	int i,j;
    332      1.1  christos 	for (i = -4; i <= 4; ++i)
    333      1.1  christos 		for (j = -4; j <= 4; ++j) {
    334      1.1  christos 			struct timespec a = timespec_init(  i  , 100);
    335      1.1  christos 			struct timespec b = timespec_init(  j  , 999999900);
    336      1.1  christos 			struct timespec E = timespec_init(i-j-1, 200);
    337      1.1  christos 			struct timespec c;
    338      1.1  christos 
    339      1.1  christos 			c = sub_tspec(a, b);
    340      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    341      1.1  christos 		}
    342      1.1  christos }
    343      1.1  christos 
    344      1.1  christos void test_SubNsecNorm() {
    345      1.1  christos 	int i;
    346      1.1  christos 	for (i = -4; i <= 4; ++i) {
    347      1.1  christos 		struct timespec a = timespec_init(i, 600);
    348      1.1  christos 		struct timespec E = timespec_init(i, 200);
    349      1.1  christos 		struct timespec c;
    350      1.1  christos 
    351      1.1  christos 		c = sub_tspec_ns(a, 600 - 200);
    352      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    353      1.1  christos 	}
    354      1.1  christos }
    355      1.1  christos 
    356      1.1  christos void test_SubNsecOflow() {
    357      1.1  christos 	int i;
    358      1.1  christos 	for (i = -4; i <= 4; ++i) {
    359      1.1  christos 		struct timespec a = timespec_init( i , 100);
    360      1.1  christos 		struct timespec E = timespec_init(i-1, 200);
    361      1.1  christos 		struct timespec c;
    362      1.1  christos 
    363      1.1  christos 		c = sub_tspec_ns(a, NANOSECONDS - 100);
    364      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    365      1.1  christos 	}
    366      1.1  christos }
    367      1.1  christos 
    368      1.1  christos //----------------------------------------------------------------------
    369      1.1  christos // test negation
    370      1.1  christos //----------------------------------------------------------------------
    371      1.1  christos 
    372      1.1  christos void test_Neg() {
    373      1.1  christos 	int i;
    374      1.1  christos 	for (i = -4; i <= 4; ++i) {
    375      1.1  christos 		struct timespec a = timespec_init(i, 100);
    376      1.1  christos 		struct timespec b;
    377      1.1  christos 		struct timespec c;
    378      1.1  christos 
    379      1.1  christos 		b = neg_tspec(a);
    380      1.1  christos 		c = add_tspec(a, b);
    381      1.1  christos 		TEST_ASSERT_EQUAL(0, test_tspec(c));
    382      1.1  christos 	}
    383      1.1  christos }
    384      1.1  christos 
    385      1.1  christos //----------------------------------------------------------------------
    386      1.1  christos // test abs value
    387      1.1  christos //----------------------------------------------------------------------
    388      1.1  christos 
    389      1.1  christos void test_AbsNoFrac() {
    390      1.1  christos 	int i;
    391      1.1  christos 	for (i = -4; i <= 4; ++i) {
    392      1.1  christos 		struct timespec a = timespec_init(i , 0);
    393      1.1  christos 		struct timespec b;
    394      1.1  christos 
    395      1.1  christos 		b = abs_tspec(a);
    396      1.1  christos 		TEST_ASSERT_EQUAL((i != 0), test_tspec(b));
    397      1.1  christos 	}
    398      1.1  christos }
    399      1.1  christos 
    400      1.1  christos void test_AbsWithFrac() {
    401      1.1  christos 	int i;
    402      1.1  christos 	for (i = -4; i <= 4; ++i) {
    403      1.1  christos 		struct timespec a = timespec_init(i, 100);
    404      1.1  christos 		struct timespec b;
    405      1.1  christos 
    406      1.1  christos 		b = abs_tspec(a);
    407      1.1  christos 		TEST_ASSERT_EQUAL(1, test_tspec(b));
    408      1.1  christos 	}
    409      1.1  christos }
    410      1.1  christos 
    411      1.1  christos // ---------------------------------------------------------------------
    412      1.1  christos // test support stuff -- part 2
    413      1.1  christos // ---------------------------------------------------------------------
    414      1.1  christos 
    415      1.1  christos void test_Helpers2() {
    416      1.1  christos 	struct timespec limit = timespec_init(0,2);
    417      1.1  christos 
    418      1.1  christos 	struct timespec x, y;
    419      1.1  christos 	long i;
    420      1.1  christos 
    421      1.1  christos 	for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++)
    422      1.1  christos 		for (x.tv_nsec = 1;
    423      1.1  christos 		     x.tv_nsec < 1000000000;
    424      1.1  christos 		     x.tv_nsec += 499999999) {
    425      1.1  christos 			for (i = -4; i < 5; i++) {
    426      1.1  christos 				y = x;
    427      1.1  christos 				y.tv_nsec += i;
    428      1.1  christos 				if (i >= -2 && i <= 2){
    429      1.1  christos 					TEST_ASSERT_TRUE(AssertTimespecClose(x,y,limit));//ASSERT_PRED_FORMAT2(isClose, x, y);
    430      1.1  christos 				}
    431      1.1  christos 				else
    432      1.1  christos 				{
    433      1.1  christos 					TEST_ASSERT_FALSE(AssertTimespecClose(x,y,limit));//ASSERT_PRED_FORMAT2(!isClose, x, y);
    434      1.1  christos 				}
    435      1.1  christos 			}
    436      1.1  christos 		}
    437      1.1  christos }
    438      1.1  christos 
    439      1.1  christos // global predicate instances we're using here
    440      1.1  christos //static l_fp lfpClose =  l_fp_init(0,1); //static AssertFpClose FpClose(0, 1);
    441      1.1  christos //static struct timespec limit = timespec_init(0,2); //static AssertTimespecClose TimespecClose(0, 2);
    442      1.1  christos 
    443      1.1  christos //----------------------------------------------------------------------
    444      1.1  christos // conversion to l_fp
    445      1.1  christos //----------------------------------------------------------------------
    446      1.1  christos 
    447      1.1  christos void test_ToLFPbittest() {
    448      1.1  christos 	l_fp lfpClose =  l_fp_init(0,1);
    449      1.1  christos 	u_int32 i;
    450      1.1  christos 	for (i = 0; i < 1000000000; i+=1000) {
    451      1.1  christos 		struct timespec a = timespec_init(1, i);
    452      1.1  christos 		l_fp E= l_fp_init(1, my_tick_to_tsf(i));
    453      1.1  christos 		l_fp r;
    454      1.1  christos 
    455      1.1  christos 		r = tspec_intv_to_lfp(a);
    456      1.1  christos 		TEST_ASSERT_TRUE(AssertFpClose(E,r,lfpClose)); //ASSERT_PRED_FORMAT2(FpClose, E, r);
    457      1.1  christos 	}
    458      1.1  christos }
    459      1.1  christos 
    460      1.1  christos void test_ToLFPrelPos() {
    461      1.1  christos 	int i;
    462      1.1  christos 	for (i = 0; i < COUNTOF(fdata); i++) {
    463      1.1  christos 		struct timespec a = timespec_init(1, fdata[i].nsec);
    464      1.1  christos 		l_fp E = l_fp_init(1, fdata[i].frac);
    465      1.1  christos 		l_fp r;
    466      1.1  christos 
    467      1.1  christos 		r = tspec_intv_to_lfp(a);
    468      1.1  christos 		TEST_ASSERT_EQUAL_l_fp(E, r);
    469      1.1  christos 	}
    470      1.1  christos }
    471      1.1  christos 
    472      1.1  christos void test_ToLFPrelNeg() {
    473      1.1  christos 	int i;
    474      1.1  christos 	for (i = 0; i < COUNTOF(fdata); i++) {
    475      1.1  christos 		struct timespec a = timespec_init(-1, fdata[i].nsec);
    476      1.1  christos 		l_fp E = l_fp_init(~0, fdata[i].frac);
    477      1.1  christos 		l_fp r;
    478      1.1  christos 
    479      1.1  christos 		r = tspec_intv_to_lfp(a);
    480      1.1  christos 		TEST_ASSERT_EQUAL_l_fp(E, r);
    481      1.1  christos 	}
    482      1.1  christos }
    483      1.1  christos 
    484      1.1  christos void test_ToLFPabs() {
    485      1.1  christos 	int i;
    486      1.1  christos 	for (i = 0; i < COUNTOF(fdata); i++) {
    487      1.1  christos 		struct timespec a = timespec_init(1, fdata[i].nsec);
    488      1.1  christos 		l_fp E = l_fp_init(1 + JAN_1970, fdata[i].frac);
    489      1.1  christos 		l_fp r;
    490      1.1  christos 
    491      1.1  christos 		r = tspec_stamp_to_lfp(a);
    492      1.1  christos 		TEST_ASSERT_EQUAL_l_fp(E, r);
    493      1.1  christos 	}
    494      1.1  christos }
    495      1.1  christos 
    496      1.1  christos //----------------------------------------------------------------------
    497      1.1  christos // conversion from l_fp
    498      1.1  christos //----------------------------------------------------------------------
    499      1.1  christos void test_FromLFPbittest() {
    500      1.1  christos 	struct timespec limit = timespec_init(0,2);
    501      1.1  christos 
    502      1.1  christos 	// Not *exactly* a bittest, because 2**32 tests would take a
    503      1.1  christos 	// really long time even on very fast machines! So we do test
    504      1.1  christos 	// every 1000 fractional units.
    505      1.1  christos 	u_int32 tsf;
    506      1.1  christos 	for (tsf = 0; tsf < ~((u_int32)(1000)); tsf += 1000) {
    507      1.1  christos 		struct timespec E = timespec_init(1, my_tsf_to_tick(tsf));
    508      1.1  christos 		l_fp a = l_fp_init(1, tsf);
    509      1.1  christos 		struct timespec r;
    510      1.1  christos 
    511      1.1  christos 		r = lfp_intv_to_tspec(a);
    512      1.1  christos 		// The conversion might be off by one nanosecond when
    513      1.1  christos 		// comparing to calculated value.
    514      1.1  christos 		TEST_ASSERT_TRUE(AssertTimespecClose(E,r,limit)); //ASSERT_PRED_FORMAT2(TimespecClose, E, r);
    515      1.1  christos 	}
    516      1.1  christos }
    517      1.1  christos 
    518      1.1  christos void test_FromLFPrelPos() {
    519      1.1  christos 	struct timespec limit = timespec_init(0,2);
    520      1.1  christos 	int i;
    521      1.1  christos 	for (i = 0; i < COUNTOF(fdata); i++) {
    522      1.1  christos 		l_fp a = l_fp_init(1, fdata[i].frac);
    523      1.1  christos 		struct timespec E = timespec_init(1, fdata[i].nsec);
    524      1.1  christos 		struct timespec r;
    525      1.1  christos 
    526      1.1  christos 		r = lfp_intv_to_tspec(a);
    527      1.1  christos 		TEST_ASSERT_TRUE(AssertTimespecClose(E,r,limit)); //ASSERT_PRED_FORMAT2(TimespecClose, E, r);
    528      1.1  christos 	}
    529      1.1  christos }
    530      1.1  christos 
    531      1.1  christos void test_FromLFPrelNeg() {
    532      1.1  christos 	struct timespec limit = timespec_init(0,2);
    533      1.1  christos 	int i;
    534      1.1  christos 	for (i = 0; i < COUNTOF(fdata); i++) {
    535      1.1  christos 		l_fp a = l_fp_init(~0, fdata[i].frac);
    536      1.1  christos 		struct timespec E = timespec_init(-1, fdata[i].nsec);
    537      1.1  christos 		struct timespec r;
    538      1.1  christos 
    539      1.1  christos 		r = lfp_intv_to_tspec(a);
    540      1.1  christos 		TEST_ASSERT_TRUE(AssertTimespecClose(E,r,limit)); //ASSERT_PRED_FORMAT2(TimespecClose, E, r);
    541      1.1  christos 	}
    542      1.1  christos }
    543      1.1  christos 
    544      1.1  christos 
    545      1.1  christos // nsec -> frac -> nsec roundtrip, using a prime start and increment
    546      1.1  christos void test_LFProundtrip() {
    547      1.1  christos 	int32_t t;
    548      1.1  christos 	u_int32 i;
    549      1.1  christos 	for (t = -1; t < 2; ++t)
    550      1.1  christos 		for (i = 4999; i < 1000000000; i+=10007) {
    551      1.1  christos 			struct timespec E = timespec_init(t, i);
    552      1.1  christos 			l_fp a;
    553      1.1  christos 			struct timespec r;
    554      1.1  christos 
    555      1.1  christos 			a = tspec_intv_to_lfp(E);
    556      1.1  christos 			r = lfp_intv_to_tspec(a);
    557      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, r);
    558      1.1  christos 		}
    559      1.1  christos }
    560      1.1  christos 
    561      1.1  christos //----------------------------------------------------------------------
    562      1.1  christos // string formatting
    563      1.1  christos //----------------------------------------------------------------------
    564      1.1  christos 
    565      1.1  christos void test_ToString() {
    566      1.1  christos 	static const struct {
    567      1.1  christos 		time_t		sec;
    568      1.1  christos 		long		nsec;
    569      1.1  christos 		const char *	repr;
    570      1.1  christos 	} data [] = {
    571      1.1  christos 		{ 0, 0,	 "0.000000000" },
    572      1.1  christos 		{ 2, 0,	 "2.000000000" },
    573      1.1  christos 		{-2, 0, "-2.000000000" },
    574      1.1  christos 		{ 0, 1,	 "0.000000001" },
    575      1.1  christos 		{ 0,-1,	"-0.000000001" },
    576      1.1  christos 		{ 1,-1,	 "0.999999999" },
    577      1.1  christos 		{-1, 1, "-0.999999999" },
    578      1.1  christos 		{-1,-1, "-1.000000001" },
    579      1.1  christos 	};
    580      1.1  christos 	int i;
    581      1.1  christos 	for (i = 0; i < COUNTOF(data); i++) {
    582      1.1  christos 		struct timespec a = timespec_init(data[i].sec, data[i].nsec);
    583      1.1  christos 		const char * E = data[i].repr;
    584      1.1  christos 		const char * r = tspectoa(a);
    585      1.1  christos 		TEST_ASSERT_EQUAL_STRING(E, r);
    586      1.1  christos 	}
    587      1.1  christos }
    588      1.1  christos 
    589      1.1  christos // -*- EOF -*-
    590