Home | History | Annotate | Line # | Download | only in libntp
timespecops.c revision 1.1.1.5
      1  1.1.1.5  christos /*	$NetBSD: timespecops.c,v 1.1.1.5 2016/01/08 21:21:33 christos Exp $	*/
      2  1.1.1.5  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 #include "timespecops.h"
      8      1.1  christos 
      9      1.1  christos #include "unity.h"
     10      1.1  christos 
     11  1.1.1.3  christos #include <math.h>
     12      1.1  christos #include <string.h>
     13      1.1  christos 
     14  1.1.1.3  christos 
     15  1.1.1.4  christos #define TEST_ASSERT_EQUAL_timespec(a, b) {				\
     16  1.1.1.4  christos     TEST_ASSERT_EQUAL_MESSAGE(a.tv_sec, b.tv_sec, "Field tv_sec");	\
     17      1.1  christos     TEST_ASSERT_EQUAL_MESSAGE(a.tv_nsec, b.tv_nsec, "Field tv_nsec");	\
     18      1.1  christos }
     19      1.1  christos 
     20  1.1.1.3  christos 
     21  1.1.1.4  christos #define TEST_ASSERT_EQUAL_l_fp(a, b) {					\
     22  1.1.1.4  christos     TEST_ASSERT_EQUAL_MESSAGE(a.l_i, b.l_i, "Field l_i");		\
     23      1.1  christos     TEST_ASSERT_EQUAL_UINT_MESSAGE(a.l_uf, b.l_uf, "Field l_uf");	\
     24      1.1  christos }
     25      1.1  christos 
     26      1.1  christos 
     27      1.1  christos static u_int32 my_tick_to_tsf(u_int32 ticks);
     28      1.1  christos static u_int32 my_tsf_to_tick(u_int32 tsf);
     29      1.1  christos 
     30  1.1.1.3  christos 
     31      1.1  christos // that's it...
     32      1.1  christos struct lfpfracdata {
     33      1.1  christos 	long	nsec;
     34      1.1  christos 	u_int32 frac;
     35      1.1  christos };
     36      1.1  christos 
     37  1.1.1.3  christos 
     38  1.1.1.4  christos void setUp(void);
     39  1.1.1.3  christos void test_Helpers1(void);
     40  1.1.1.3  christos void test_Normalise(void);
     41  1.1.1.3  christos void test_SignNoFrac(void);
     42  1.1.1.3  christos void test_SignWithFrac(void);
     43  1.1.1.3  christos void test_CmpFracEQ(void);
     44  1.1.1.3  christos void test_CmpFracGT(void);
     45  1.1.1.3  christos void test_CmpFracLT(void);
     46  1.1.1.3  christos void test_AddFullNorm(void);
     47  1.1.1.3  christos void test_AddFullOflow1(void);
     48  1.1.1.3  christos void test_AddNsecNorm(void);
     49  1.1.1.3  christos void test_AddNsecOflow1(void);
     50  1.1.1.3  christos void test_SubFullNorm(void);
     51  1.1.1.3  christos void test_SubFullOflow(void);
     52  1.1.1.3  christos void test_SubNsecNorm(void);
     53  1.1.1.3  christos void test_SubNsecOflow(void);
     54  1.1.1.3  christos void test_Neg(void);
     55  1.1.1.3  christos void test_AbsNoFrac(void);
     56  1.1.1.3  christos void test_AbsWithFrac(void);
     57  1.1.1.3  christos void test_Helpers2(void);
     58  1.1.1.3  christos void test_ToLFPbittest(void);
     59  1.1.1.3  christos void test_ToLFPrelPos(void);
     60  1.1.1.3  christos void test_ToLFPrelNeg(void);
     61  1.1.1.3  christos void test_ToLFPabs(void);
     62  1.1.1.3  christos void test_FromLFPbittest(void);
     63  1.1.1.3  christos void test_FromLFPrelPos(void);
     64  1.1.1.3  christos void test_FromLFPrelNeg(void);
     65  1.1.1.3  christos void test_LFProundtrip(void);
     66  1.1.1.3  christos void test_ToString(void);
     67  1.1.1.3  christos 
     68  1.1.1.3  christos typedef int bool;
     69  1.1.1.3  christos 
     70  1.1.1.4  christos const bool	timespec_isValid(struct timespec V);
     71  1.1.1.3  christos struct timespec timespec_init(time_t hi, long lo);
     72  1.1.1.4  christos l_fp		l_fp_init(int32 i, u_int32 f);
     73  1.1.1.4  christos bool		AssertFpClose(const l_fp m, const l_fp n, const l_fp limit);
     74  1.1.1.4  christos bool		AssertTimespecClose(const struct timespec m,
     75  1.1.1.4  christos 				    const struct timespec n,
     76  1.1.1.4  christos 				    const struct timespec limit);
     77  1.1.1.4  christos 
     78  1.1.1.3  christos 
     79  1.1.1.4  christos //***************************MY CUSTOM FUNCTIONS***************************
     80  1.1.1.3  christos 
     81      1.1  christos 
     82  1.1.1.4  christos void
     83  1.1.1.4  christos setUp(void)
     84  1.1.1.4  christos {
     85  1.1.1.4  christos 	init_lib();
     86  1.1.1.4  christos 
     87  1.1.1.4  christos 	return;
     88  1.1.1.4  christos }
     89      1.1  christos 
     90      1.1  christos 
     91  1.1.1.3  christos const bool
     92  1.1.1.4  christos timespec_isValid(struct timespec V)
     93  1.1.1.4  christos {
     94  1.1.1.4  christos 
     95  1.1.1.3  christos 	return V.tv_nsec >= 0 && V.tv_nsec < 1000000000;
     96  1.1.1.3  christos }
     97  1.1.1.3  christos 
     98  1.1.1.3  christos 
     99  1.1.1.3  christos struct timespec
    100  1.1.1.4  christos timespec_init(time_t hi, long lo)
    101  1.1.1.4  christos {
    102  1.1.1.4  christos 	struct timespec V;
    103  1.1.1.4  christos 
    104      1.1  christos 	V.tv_sec = hi;
    105      1.1  christos 	V.tv_nsec = lo;
    106  1.1.1.4  christos 
    107      1.1  christos 	return V;
    108      1.1  christos }
    109      1.1  christos 
    110  1.1.1.3  christos 
    111  1.1.1.3  christos l_fp
    112  1.1.1.4  christos l_fp_init(int32 i, u_int32 f)
    113  1.1.1.4  christos {
    114      1.1  christos 	l_fp temp;
    115  1.1.1.4  christos 
    116      1.1  christos 	temp.l_i  = i;
    117      1.1  christos 	temp.l_uf = f;
    118      1.1  christos 
    119      1.1  christos 	return temp;
    120      1.1  christos }
    121      1.1  christos 
    122  1.1.1.3  christos 
    123  1.1.1.3  christos bool
    124  1.1.1.4  christos AssertFpClose(const l_fp m, const l_fp n, const l_fp limit)
    125  1.1.1.4  christos {
    126      1.1  christos 	l_fp diff;
    127      1.1  christos 
    128      1.1  christos 	if (L_ISGEQ(&m, &n)) {
    129      1.1  christos 		diff = m;
    130      1.1  christos 		L_SUB(&diff, &n);
    131      1.1  christos 	} else {
    132      1.1  christos 		diff = n;
    133      1.1  christos 		L_SUB(&diff, &m);
    134      1.1  christos 	}
    135  1.1.1.4  christos 	if (L_ISGEQ(&limit, &diff)) {
    136      1.1  christos 		return TRUE;
    137      1.1  christos 	}
    138      1.1  christos 	else {
    139  1.1.1.3  christos 		printf("m_expr which is %s \nand\nn_expr which is %s\nare not close; diff=%susec\n", lfptoa(&m, 10), lfptoa(&n, 10), lfptoa(&diff, 10));
    140      1.1  christos 		return FALSE;
    141      1.1  christos 	}
    142      1.1  christos }
    143      1.1  christos 
    144      1.1  christos 
    145  1.1.1.3  christos bool
    146  1.1.1.4  christos AssertTimespecClose(const struct timespec m, const struct timespec n,
    147  1.1.1.4  christos 	const struct timespec limit)
    148  1.1.1.4  christos {
    149      1.1  christos 	struct timespec diff;
    150      1.1  christos 
    151      1.1  christos 	diff = abs_tspec(sub_tspec(m, n));
    152      1.1  christos 	if (cmp_tspec(limit, diff) >= 0)
    153      1.1  christos 		return TRUE;
    154      1.1  christos 	else
    155      1.1  christos 	{
    156  1.1.1.3  christos 		printf("m_expr which is %ld.%lu \nand\nn_expr which is %ld.%lu\nare not close; diff=%ld.%lunsec\n", m.tv_sec, m.tv_nsec, n.tv_sec, n.tv_nsec, diff.tv_sec, diff.tv_nsec);
    157      1.1  christos 		return FALSE;
    158      1.1  christos 	}
    159      1.1  christos }
    160      1.1  christos 
    161      1.1  christos //-----------------------------------------------
    162      1.1  christos 
    163      1.1  christos static const struct lfpfracdata fdata[] = {
    164      1.1  christos 	{	  0, 0x00000000 }, {   2218896, 0x00916ae6 },
    165      1.1  christos 	{  16408100, 0x0433523d }, { 125000000, 0x20000000 },
    166      1.1  christos 	{ 250000000, 0x40000000 }, { 287455871, 0x4996b53d },
    167      1.1  christos 	{ 375000000, 0x60000000 }, { 500000000, 0x80000000 },
    168      1.1  christos 	{ 518978897, 0x84dbcd0e }, { 563730222, 0x90509fb3 },
    169      1.1  christos 	{ 563788007, 0x9054692c }, { 583289882, 0x95527c57 },
    170      1.1  christos 	{ 607074509, 0x9b693c2a }, { 625000000, 0xa0000000 },
    171      1.1  christos 	{ 645184059, 0xa52ac851 }, { 676497788, 0xad2ef583 },
    172      1.1  christos 	{ 678910895, 0xadcd1abb }, { 679569625, 0xadf84663 },
    173      1.1  christos 	{ 690926741, 0xb0e0932d }, { 705656483, 0xb4a5e73d },
    174      1.1  christos 	{ 723553854, 0xb93ad34c }, { 750000000, 0xc0000000 },
    175      1.1  christos 	{ 763550253, 0xc3780785 }, { 775284917, 0xc6791284 },
    176      1.1  christos 	{ 826190764, 0xd3813ce8 }, { 875000000, 0xe0000000 },
    177      1.1  christos 	{ 956805507, 0xf4f134a9 }, { 982570733, 0xfb89c16c }
    178      1.1  christos 	};
    179      1.1  christos 
    180      1.1  christos 
    181  1.1.1.3  christos u_int32
    182  1.1.1.4  christos my_tick_to_tsf(u_int32 ticks)
    183  1.1.1.4  christos {
    184      1.1  christos 	// convert nanoseconds to l_fp fractional units, using double
    185      1.1  christos 	// precision float calculations or, if available, 64bit integer
    186      1.1  christos 	// arithmetic. This should give the precise fraction, rounded to
    187      1.1  christos 	// the nearest representation.
    188  1.1.1.4  christos 
    189      1.1  christos #ifdef HAVE_U_INT64
    190      1.1  christos 	return (u_int32)((( ((u_int64)(ticks)) << 32) + 500000000) / 1000000000);
    191      1.1  christos #else
    192      1.1  christos 	return (u_int32)((double(ticks)) * 4.294967296 + 0.5);
    193      1.1  christos #endif
    194      1.1  christos 	// And before you ask: if ticks >= 1000000000, the result is
    195      1.1  christos 	// truncated nonsense, so don't use it out-of-bounds.
    196      1.1  christos }
    197      1.1  christos 
    198  1.1.1.3  christos 
    199  1.1.1.3  christos u_int32
    200  1.1.1.4  christos my_tsf_to_tick(u_int32 tsf)
    201  1.1.1.4  christos {
    202  1.1.1.4  christos 
    203      1.1  christos 	// Inverse operation: converts fraction to microseconds.
    204      1.1  christos #ifdef HAVE_U_INT64
    205      1.1  christos 	return (u_int32)(( ((u_int64)(tsf)) * 1000000000 + 0x80000000) >> 32);
    206      1.1  christos #else
    207      1.1  christos 	return (u_int32)(double(tsf) / 4.294967296 + 0.5);
    208      1.1  christos #endif
    209      1.1  christos 	// Beware: The result might be 10^9 due to rounding!
    210      1.1  christos }
    211      1.1  christos 
    212      1.1  christos 
    213      1.1  christos 
    214      1.1  christos // ---------------------------------------------------------------------
    215      1.1  christos // test support stuff -- part 1
    216      1.1  christos // ---------------------------------------------------------------------
    217      1.1  christos 
    218  1.1.1.3  christos void
    219  1.1.1.4  christos test_Helpers1(void)
    220  1.1.1.4  christos {
    221      1.1  christos 	struct timespec x;
    222      1.1  christos 
    223      1.1  christos 	for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++) {
    224      1.1  christos 		x.tv_nsec = -1;
    225      1.1  christos 		TEST_ASSERT_FALSE(timespec_isValid(x));
    226      1.1  christos 		x.tv_nsec = 0;
    227      1.1  christos 		TEST_ASSERT_TRUE(timespec_isValid(x));
    228      1.1  christos 		x.tv_nsec = 999999999;
    229      1.1  christos 		TEST_ASSERT_TRUE(timespec_isValid(x));
    230      1.1  christos 		x.tv_nsec = 1000000000;
    231      1.1  christos 		TEST_ASSERT_FALSE(timespec_isValid(x));
    232      1.1  christos 	}
    233  1.1.1.4  christos 
    234  1.1.1.4  christos 	return;
    235      1.1  christos }
    236      1.1  christos 
    237      1.1  christos 
    238      1.1  christos //----------------------------------------------------------------------
    239      1.1  christos // test normalisation
    240      1.1  christos //----------------------------------------------------------------------
    241      1.1  christos 
    242  1.1.1.3  christos void
    243  1.1.1.4  christos test_Normalise(void)
    244  1.1.1.4  christos {
    245      1.1  christos 	long ns;
    246  1.1.1.4  christos 
    247      1.1  christos 	for ( ns = -2000000000; ns <= 2000000000; ns += 10000000) {
    248      1.1  christos 		struct timespec x = timespec_init(0, ns);
    249      1.1  christos 
    250      1.1  christos 		x = normalize_tspec(x);
    251      1.1  christos 		TEST_ASSERT_TRUE(timespec_isValid(x));
    252      1.1  christos 	}
    253  1.1.1.4  christos 
    254  1.1.1.4  christos 	return;
    255      1.1  christos }
    256      1.1  christos 
    257      1.1  christos //----------------------------------------------------------------------
    258      1.1  christos // test classification
    259      1.1  christos //----------------------------------------------------------------------
    260      1.1  christos 
    261  1.1.1.3  christos void
    262  1.1.1.4  christos test_SignNoFrac(void)
    263  1.1.1.4  christos {
    264      1.1  christos 	// sign test, no fraction
    265      1.1  christos 	int i;
    266  1.1.1.4  christos 
    267      1.1  christos 	for (i = -4; i <= 4; ++i) {
    268      1.1  christos 		struct timespec a = timespec_init(i, 0);
    269      1.1  christos 		int E = (i > 0) - (i < 0);
    270      1.1  christos 		int r = test_tspec(a);
    271      1.1  christos 
    272      1.1  christos 		TEST_ASSERT_EQUAL(E, r);
    273      1.1  christos 	}
    274  1.1.1.4  christos 
    275  1.1.1.4  christos 	return;
    276      1.1  christos }
    277      1.1  christos 
    278  1.1.1.3  christos 
    279  1.1.1.3  christos void
    280  1.1.1.4  christos test_SignWithFrac(void)
    281  1.1.1.4  christos {
    282      1.1  christos 	// sign test, with fraction
    283      1.1  christos 	int i;
    284  1.1.1.4  christos 
    285      1.1  christos 	for (i = -4; i <= 4; ++i) {
    286      1.1  christos 		struct timespec a = timespec_init(i, 10);
    287      1.1  christos 		int E = (i >= 0) - (i < 0);
    288      1.1  christos 		int r = test_tspec(a);
    289  1.1.1.4  christos 
    290      1.1  christos 		TEST_ASSERT_EQUAL(E, r);
    291      1.1  christos 	}
    292  1.1.1.4  christos 
    293  1.1.1.4  christos 	return;
    294      1.1  christos }
    295      1.1  christos 
    296      1.1  christos //----------------------------------------------------------------------
    297      1.1  christos // test compare
    298      1.1  christos //----------------------------------------------------------------------
    299  1.1.1.3  christos void
    300  1.1.1.4  christos test_CmpFracEQ(void)
    301  1.1.1.4  christos {
    302      1.1  christos 	// fractions are equal
    303  1.1.1.3  christos 	int i, j;
    304      1.1  christos 	for (i = -4; i <= 4; ++i)
    305      1.1  christos 		for (j = -4; j <= 4; ++j) {
    306      1.1  christos 			struct timespec a = timespec_init( i , 200);
    307      1.1  christos 			struct timespec b = timespec_init( j , 200);
    308      1.1  christos 			int   E = (i > j) - (i < j);
    309      1.1  christos 			int   r = cmp_tspec_denorm(a, b);
    310  1.1.1.4  christos 
    311      1.1  christos 			TEST_ASSERT_EQUAL(E, r);
    312      1.1  christos 		}
    313  1.1.1.4  christos 
    314  1.1.1.4  christos 	return;
    315      1.1  christos }
    316      1.1  christos 
    317  1.1.1.3  christos 
    318  1.1.1.3  christos void
    319  1.1.1.4  christos test_CmpFracGT(void)
    320  1.1.1.4  christos {
    321      1.1  christos 	// fraction a bigger fraction b
    322  1.1.1.3  christos 	int i, j;
    323  1.1.1.4  christos 
    324      1.1  christos 	for (i = -4; i <= 4; ++i)
    325      1.1  christos 		for (j = -4; j <= 4; ++j) {
    326      1.1  christos 			struct timespec a = timespec_init(i, 999999800);
    327      1.1  christos 			struct timespec b = timespec_init(j, 200);
    328      1.1  christos 			int   E = (i >= j) - (i < j);
    329      1.1  christos 			int   r = cmp_tspec_denorm(a, b);
    330  1.1.1.4  christos 
    331      1.1  christos 			TEST_ASSERT_EQUAL(E, r);
    332      1.1  christos 		}
    333  1.1.1.4  christos 
    334  1.1.1.4  christos 	return;
    335      1.1  christos }
    336      1.1  christos 
    337  1.1.1.3  christos 
    338  1.1.1.3  christos void
    339  1.1.1.4  christos test_CmpFracLT(void)
    340  1.1.1.4  christos {
    341      1.1  christos 	// fraction a less fraction b
    342  1.1.1.3  christos 	int i, j;
    343  1.1.1.4  christos 
    344      1.1  christos 	for (i = -4; i <= 4; ++i)
    345      1.1  christos 		for (j = -4; j <= 4; ++j) {
    346      1.1  christos 			struct timespec a = timespec_init(i, 200);
    347      1.1  christos 			struct timespec b = timespec_init(j, 999999800);
    348      1.1  christos 			int   E = (i > j) - (i <= j);
    349      1.1  christos 			int   r = cmp_tspec_denorm(a, b);
    350  1.1.1.4  christos 
    351      1.1  christos 			TEST_ASSERT_EQUAL(E, r);
    352      1.1  christos 		}
    353  1.1.1.4  christos 
    354  1.1.1.4  christos 	return;
    355      1.1  christos }
    356      1.1  christos 
    357      1.1  christos //----------------------------------------------------------------------
    358      1.1  christos // Test addition (sum)
    359      1.1  christos //----------------------------------------------------------------------
    360      1.1  christos 
    361  1.1.1.3  christos void
    362  1.1.1.4  christos test_AddFullNorm(void)
    363  1.1.1.4  christos {
    364  1.1.1.3  christos 	int i, j;
    365  1.1.1.4  christos 
    366      1.1  christos 	for (i = -4; i <= 4; ++i)
    367      1.1  christos 		for (j = -4; j <= 4; ++j) {
    368      1.1  christos 			struct timespec a = timespec_init(i, 200);
    369      1.1  christos 			struct timespec b = timespec_init(j, 400);
    370      1.1  christos 			struct timespec E = timespec_init(i + j, 200 + 400);
    371      1.1  christos 			struct timespec c;
    372      1.1  christos 
    373      1.1  christos 			c = add_tspec(a, b);
    374      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    375      1.1  christos 		}
    376  1.1.1.4  christos 
    377  1.1.1.4  christos 	return;
    378      1.1  christos }
    379      1.1  christos 
    380  1.1.1.3  christos 
    381  1.1.1.3  christos void
    382  1.1.1.4  christos test_AddFullOflow1(void)
    383  1.1.1.4  christos {
    384  1.1.1.3  christos 	int i, j;
    385  1.1.1.4  christos 
    386      1.1  christos 	for (i = -4; i <= 4; ++i)
    387      1.1  christos 		for (j = -4; j <= 4; ++j) {
    388      1.1  christos 			struct timespec a = timespec_init(i, 200);
    389      1.1  christos 			struct timespec b = timespec_init(j, 999999900);
    390      1.1  christos 			struct timespec E = timespec_init(i + j + 1, 100);
    391      1.1  christos 			struct timespec c;
    392      1.1  christos 
    393      1.1  christos 			c = add_tspec(a, b);
    394      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    395      1.1  christos 		}
    396  1.1.1.4  christos 
    397  1.1.1.4  christos 	return;
    398      1.1  christos }
    399      1.1  christos 
    400  1.1.1.3  christos 
    401  1.1.1.3  christos void
    402  1.1.1.3  christos test_AddNsecNorm(void) {
    403      1.1  christos 	int i;
    404  1.1.1.4  christos 
    405      1.1  christos 	for (i = -4; i <= 4; ++i) {
    406      1.1  christos 		struct timespec a = timespec_init(i, 200);
    407      1.1  christos 		struct timespec E = timespec_init(i, 600);
    408      1.1  christos 		struct timespec c;
    409      1.1  christos 
    410      1.1  christos 		c = add_tspec_ns(a, 600 - 200);
    411      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    412      1.1  christos 	}
    413  1.1.1.4  christos 
    414  1.1.1.4  christos 	return;
    415      1.1  christos }
    416      1.1  christos 
    417  1.1.1.3  christos 
    418  1.1.1.3  christos void
    419  1.1.1.4  christos test_AddNsecOflow1(void)
    420  1.1.1.4  christos {
    421      1.1  christos 	int i;
    422  1.1.1.4  christos 
    423      1.1  christos 	for (i = -4; i <= 4; ++i) {
    424      1.1  christos 		struct timespec a = timespec_init(i, 200);
    425      1.1  christos 		struct timespec E = timespec_init(i + 1, 100);
    426      1.1  christos 		struct timespec c;
    427      1.1  christos 
    428      1.1  christos 		c = add_tspec_ns(a, NANOSECONDS - 100);
    429      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    430      1.1  christos 	}
    431  1.1.1.4  christos 
    432  1.1.1.4  christos 	return;
    433      1.1  christos }
    434      1.1  christos 
    435      1.1  christos //----------------------------------------------------------------------
    436      1.1  christos // test subtraction (difference)
    437      1.1  christos //----------------------------------------------------------------------
    438      1.1  christos 
    439  1.1.1.3  christos void
    440  1.1.1.4  christos test_SubFullNorm(void)
    441  1.1.1.4  christos {
    442  1.1.1.3  christos 	int i, j;
    443  1.1.1.4  christos 
    444      1.1  christos 	for (i = -4; i <= 4; ++i)
    445      1.1  christos 		for (j = -4; j <= 4; ++j) {
    446      1.1  christos 			struct timespec a = timespec_init( i , 600);
    447      1.1  christos 			struct timespec b = timespec_init( j , 400);
    448      1.1  christos 			struct timespec E = timespec_init(i-j, 200);
    449      1.1  christos 			struct timespec c;
    450      1.1  christos 
    451      1.1  christos 			c = sub_tspec(a, b);
    452      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    453      1.1  christos 		}
    454  1.1.1.4  christos 
    455  1.1.1.4  christos 	return;
    456      1.1  christos }
    457      1.1  christos 
    458  1.1.1.3  christos 
    459  1.1.1.3  christos void
    460  1.1.1.4  christos test_SubFullOflow(void)
    461  1.1.1.4  christos {
    462  1.1.1.3  christos 	int i, j;
    463  1.1.1.4  christos 
    464      1.1  christos 	for (i = -4; i <= 4; ++i)
    465      1.1  christos 		for (j = -4; j <= 4; ++j) {
    466  1.1.1.3  christos 			struct timespec a = timespec_init(i, 100);
    467  1.1.1.3  christos 			struct timespec b = timespec_init(j, 999999900);
    468  1.1.1.3  christos 			struct timespec E = timespec_init(i - j - 1, 200);
    469      1.1  christos 			struct timespec c;
    470      1.1  christos 
    471      1.1  christos 			c = sub_tspec(a, b);
    472      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    473      1.1  christos 		}
    474  1.1.1.4  christos 
    475  1.1.1.4  christos 	return;
    476      1.1  christos }
    477      1.1  christos 
    478  1.1.1.3  christos 
    479  1.1.1.3  christos void
    480  1.1.1.4  christos test_SubNsecNorm(void)
    481  1.1.1.4  christos {
    482      1.1  christos 	int i;
    483  1.1.1.4  christos 
    484      1.1  christos 	for (i = -4; i <= 4; ++i) {
    485      1.1  christos 		struct timespec a = timespec_init(i, 600);
    486      1.1  christos 		struct timespec E = timespec_init(i, 200);
    487      1.1  christos 		struct timespec c;
    488      1.1  christos 
    489      1.1  christos 		c = sub_tspec_ns(a, 600 - 200);
    490      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    491      1.1  christos 	}
    492  1.1.1.4  christos 
    493  1.1.1.4  christos 	return;
    494      1.1  christos }
    495      1.1  christos 
    496  1.1.1.3  christos 
    497  1.1.1.3  christos void
    498  1.1.1.4  christos test_SubNsecOflow(void)
    499  1.1.1.4  christos {
    500      1.1  christos 	int i;
    501  1.1.1.4  christos 
    502      1.1  christos 	for (i = -4; i <= 4; ++i) {
    503      1.1  christos 		struct timespec a = timespec_init( i , 100);
    504      1.1  christos 		struct timespec E = timespec_init(i-1, 200);
    505      1.1  christos 		struct timespec c;
    506      1.1  christos 
    507      1.1  christos 		c = sub_tspec_ns(a, NANOSECONDS - 100);
    508      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    509      1.1  christos 	}
    510  1.1.1.4  christos 
    511  1.1.1.4  christos 	return;
    512      1.1  christos }
    513      1.1  christos 
    514      1.1  christos //----------------------------------------------------------------------
    515      1.1  christos // test negation
    516      1.1  christos //----------------------------------------------------------------------
    517      1.1  christos 
    518  1.1.1.3  christos 
    519  1.1.1.3  christos void
    520  1.1.1.4  christos test_Neg(void)
    521  1.1.1.4  christos {
    522      1.1  christos 	int i;
    523  1.1.1.4  christos 
    524      1.1  christos 	for (i = -4; i <= 4; ++i) {
    525      1.1  christos 		struct timespec a = timespec_init(i, 100);
    526      1.1  christos 		struct timespec b;
    527      1.1  christos 		struct timespec c;
    528      1.1  christos 
    529      1.1  christos 		b = neg_tspec(a);
    530      1.1  christos 		c = add_tspec(a, b);
    531      1.1  christos 		TEST_ASSERT_EQUAL(0, test_tspec(c));
    532      1.1  christos 	}
    533  1.1.1.4  christos 
    534  1.1.1.4  christos 	return;
    535      1.1  christos }
    536      1.1  christos 
    537      1.1  christos //----------------------------------------------------------------------
    538      1.1  christos // test abs value
    539      1.1  christos //----------------------------------------------------------------------
    540      1.1  christos 
    541  1.1.1.3  christos void
    542  1.1.1.4  christos test_AbsNoFrac(void)
    543  1.1.1.4  christos {
    544      1.1  christos 	int i;
    545  1.1.1.4  christos 
    546      1.1  christos 	for (i = -4; i <= 4; ++i) {
    547      1.1  christos 		struct timespec a = timespec_init(i , 0);
    548      1.1  christos 		struct timespec b;
    549      1.1  christos 
    550      1.1  christos 		b = abs_tspec(a);
    551      1.1  christos 		TEST_ASSERT_EQUAL((i != 0), test_tspec(b));
    552      1.1  christos 	}
    553  1.1.1.4  christos 
    554  1.1.1.4  christos 	return;
    555      1.1  christos }
    556      1.1  christos 
    557  1.1.1.3  christos 
    558  1.1.1.3  christos void
    559  1.1.1.4  christos test_AbsWithFrac(void)
    560  1.1.1.4  christos {
    561      1.1  christos 	int i;
    562  1.1.1.4  christos 
    563      1.1  christos 	for (i = -4; i <= 4; ++i) {
    564      1.1  christos 		struct timespec a = timespec_init(i, 100);
    565      1.1  christos 		struct timespec b;
    566      1.1  christos 
    567      1.1  christos 		b = abs_tspec(a);
    568      1.1  christos 		TEST_ASSERT_EQUAL(1, test_tspec(b));
    569      1.1  christos 	}
    570  1.1.1.4  christos 
    571  1.1.1.4  christos 	return;
    572      1.1  christos }
    573      1.1  christos 
    574      1.1  christos // ---------------------------------------------------------------------
    575      1.1  christos // test support stuff -- part 2
    576      1.1  christos // ---------------------------------------------------------------------
    577      1.1  christos 
    578  1.1.1.3  christos void
    579  1.1.1.4  christos test_Helpers2(void)
    580  1.1.1.4  christos {
    581  1.1.1.3  christos 	struct timespec limit = timespec_init(0, 2);
    582      1.1  christos 	struct timespec x, y;
    583      1.1  christos 	long i;
    584      1.1  christos 
    585      1.1  christos 	for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++)
    586      1.1  christos 		for (x.tv_nsec = 1;
    587      1.1  christos 		     x.tv_nsec < 1000000000;
    588      1.1  christos 		     x.tv_nsec += 499999999) {
    589  1.1.1.3  christos 			for (i = -4; i < 5; ++i) {
    590      1.1  christos 				y = x;
    591      1.1  christos 				y.tv_nsec += i;
    592  1.1.1.4  christos 				if (i >= -2 && i <= 2) {
    593  1.1.1.3  christos 					TEST_ASSERT_TRUE(AssertTimespecClose(x, y, limit));
    594      1.1  christos 				}
    595      1.1  christos 				else
    596      1.1  christos 				{
    597  1.1.1.3  christos 					TEST_ASSERT_FALSE(AssertTimespecClose(x, y, limit));
    598      1.1  christos 				}
    599      1.1  christos 			}
    600      1.1  christos 		}
    601  1.1.1.4  christos 
    602  1.1.1.4  christos 	return;
    603      1.1  christos }
    604      1.1  christos 
    605      1.1  christos //----------------------------------------------------------------------
    606      1.1  christos // conversion to l_fp
    607      1.1  christos //----------------------------------------------------------------------
    608      1.1  christos 
    609  1.1.1.3  christos void
    610  1.1.1.4  christos test_ToLFPbittest(void)
    611  1.1.1.4  christos {
    612  1.1.1.3  christos 	l_fp lfpClose =  l_fp_init(0, 1);
    613      1.1  christos 	u_int32 i;
    614  1.1.1.4  christos 
    615      1.1  christos 	for (i = 0; i < 1000000000; i+=1000) {
    616      1.1  christos 		struct timespec a = timespec_init(1, i);
    617      1.1  christos 		l_fp E= l_fp_init(1, my_tick_to_tsf(i));
    618      1.1  christos 		l_fp r;
    619      1.1  christos 
    620      1.1  christos 		r = tspec_intv_to_lfp(a);
    621  1.1.1.3  christos 		TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose));
    622      1.1  christos 	}
    623  1.1.1.4  christos 
    624  1.1.1.4  christos 	return;
    625      1.1  christos }
    626      1.1  christos 
    627  1.1.1.3  christos 
    628  1.1.1.3  christos void
    629  1.1.1.4  christos test_ToLFPrelPos(void)
    630  1.1.1.4  christos {
    631      1.1  christos 	int i;
    632  1.1.1.4  christos 
    633  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    634      1.1  christos 		struct timespec a = timespec_init(1, fdata[i].nsec);
    635      1.1  christos 		l_fp E = l_fp_init(1, fdata[i].frac);
    636      1.1  christos 		l_fp r;
    637      1.1  christos 
    638      1.1  christos 		r = tspec_intv_to_lfp(a);
    639      1.1  christos 		TEST_ASSERT_EQUAL_l_fp(E, r);
    640      1.1  christos 	}
    641  1.1.1.4  christos 
    642  1.1.1.4  christos 	return;
    643      1.1  christos }
    644      1.1  christos 
    645  1.1.1.3  christos 
    646  1.1.1.3  christos void
    647  1.1.1.4  christos test_ToLFPrelNeg(void)
    648  1.1.1.4  christos {
    649      1.1  christos 	int i;
    650  1.1.1.4  christos 
    651  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    652      1.1  christos 		struct timespec a = timespec_init(-1, fdata[i].nsec);
    653      1.1  christos 		l_fp E = l_fp_init(~0, fdata[i].frac);
    654      1.1  christos 		l_fp r;
    655      1.1  christos 
    656      1.1  christos 		r = tspec_intv_to_lfp(a);
    657      1.1  christos 		TEST_ASSERT_EQUAL_l_fp(E, r);
    658      1.1  christos 	}
    659  1.1.1.4  christos 
    660  1.1.1.4  christos 	return;
    661      1.1  christos }
    662      1.1  christos 
    663  1.1.1.3  christos 
    664  1.1.1.3  christos void
    665  1.1.1.4  christos test_ToLFPabs(void)
    666  1.1.1.4  christos {
    667      1.1  christos 	int i;
    668  1.1.1.4  christos 
    669  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    670      1.1  christos 		struct timespec a = timespec_init(1, fdata[i].nsec);
    671      1.1  christos 		l_fp E = l_fp_init(1 + JAN_1970, fdata[i].frac);
    672      1.1  christos 		l_fp r;
    673      1.1  christos 
    674      1.1  christos 		r = tspec_stamp_to_lfp(a);
    675      1.1  christos 		TEST_ASSERT_EQUAL_l_fp(E, r);
    676      1.1  christos 	}
    677  1.1.1.4  christos 
    678  1.1.1.4  christos 	return;
    679      1.1  christos }
    680      1.1  christos 
    681      1.1  christos //----------------------------------------------------------------------
    682      1.1  christos // conversion from l_fp
    683      1.1  christos //----------------------------------------------------------------------
    684  1.1.1.3  christos 
    685  1.1.1.3  christos void
    686  1.1.1.4  christos test_FromLFPbittest(void)
    687  1.1.1.4  christos {
    688  1.1.1.3  christos 	struct timespec limit = timespec_init(0, 2);
    689      1.1  christos 
    690      1.1  christos 	// Not *exactly* a bittest, because 2**32 tests would take a
    691      1.1  christos 	// really long time even on very fast machines! So we do test
    692      1.1  christos 	// every 1000 fractional units.
    693      1.1  christos 	u_int32 tsf;
    694      1.1  christos 	for (tsf = 0; tsf < ~((u_int32)(1000)); tsf += 1000) {
    695      1.1  christos 		struct timespec E = timespec_init(1, my_tsf_to_tick(tsf));
    696      1.1  christos 		l_fp a = l_fp_init(1, tsf);
    697      1.1  christos 		struct timespec r;
    698      1.1  christos 
    699      1.1  christos 		r = lfp_intv_to_tspec(a);
    700      1.1  christos 		// The conversion might be off by one nanosecond when
    701      1.1  christos 		// comparing to calculated value.
    702  1.1.1.3  christos 		TEST_ASSERT_TRUE(AssertTimespecClose(E, r, limit));
    703      1.1  christos 	}
    704  1.1.1.4  christos 
    705  1.1.1.4  christos 	return;
    706      1.1  christos }
    707      1.1  christos 
    708  1.1.1.3  christos 
    709  1.1.1.3  christos void
    710  1.1.1.4  christos test_FromLFPrelPos(void)
    711  1.1.1.4  christos {
    712  1.1.1.3  christos 	struct timespec limit = timespec_init(0, 2);
    713      1.1  christos 	int i;
    714  1.1.1.4  christos 
    715  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    716      1.1  christos 		l_fp a = l_fp_init(1, fdata[i].frac);
    717      1.1  christos 		struct timespec E = timespec_init(1, fdata[i].nsec);
    718      1.1  christos 		struct timespec r;
    719      1.1  christos 
    720      1.1  christos 		r = lfp_intv_to_tspec(a);
    721  1.1.1.3  christos 		TEST_ASSERT_TRUE(AssertTimespecClose(E, r, limit));
    722      1.1  christos 	}
    723  1.1.1.4  christos 
    724  1.1.1.4  christos 	return;
    725      1.1  christos }
    726      1.1  christos 
    727  1.1.1.3  christos 
    728  1.1.1.3  christos void
    729  1.1.1.4  christos test_FromLFPrelNeg(void)
    730  1.1.1.4  christos {
    731  1.1.1.3  christos 	struct timespec limit = timespec_init(0, 2);
    732      1.1  christos 	int i;
    733  1.1.1.4  christos 
    734  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    735      1.1  christos 		l_fp a = l_fp_init(~0, fdata[i].frac);
    736      1.1  christos 		struct timespec E = timespec_init(-1, fdata[i].nsec);
    737      1.1  christos 		struct timespec r;
    738      1.1  christos 
    739      1.1  christos 		r = lfp_intv_to_tspec(a);
    740  1.1.1.3  christos 		TEST_ASSERT_TRUE(AssertTimespecClose(E, r, limit));
    741      1.1  christos 	}
    742  1.1.1.4  christos 
    743  1.1.1.4  christos 	return;
    744      1.1  christos }
    745      1.1  christos 
    746      1.1  christos 
    747      1.1  christos // nsec -> frac -> nsec roundtrip, using a prime start and increment
    748  1.1.1.3  christos void
    749  1.1.1.4  christos test_LFProundtrip(void)
    750  1.1.1.4  christos {
    751      1.1  christos 	int32_t t;
    752      1.1  christos 	u_int32 i;
    753  1.1.1.4  christos 
    754      1.1  christos 	for (t = -1; t < 2; ++t)
    755  1.1.1.3  christos 		for (i = 4999; i < 1000000000; i += 10007) {
    756      1.1  christos 			struct timespec E = timespec_init(t, i);
    757      1.1  christos 			l_fp a;
    758      1.1  christos 			struct timespec r;
    759      1.1  christos 
    760      1.1  christos 			a = tspec_intv_to_lfp(E);
    761      1.1  christos 			r = lfp_intv_to_tspec(a);
    762      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, r);
    763      1.1  christos 		}
    764  1.1.1.4  christos 
    765  1.1.1.4  christos 	return;
    766      1.1  christos }
    767      1.1  christos 
    768      1.1  christos //----------------------------------------------------------------------
    769      1.1  christos // string formatting
    770      1.1  christos //----------------------------------------------------------------------
    771      1.1  christos 
    772  1.1.1.3  christos void
    773  1.1.1.4  christos test_ToString(void)
    774  1.1.1.4  christos {
    775      1.1  christos 	static const struct {
    776      1.1  christos 		time_t		sec;
    777      1.1  christos 		long		nsec;
    778      1.1  christos 		const char *	repr;
    779      1.1  christos 	} data [] = {
    780      1.1  christos 		{ 0, 0,	 "0.000000000" },
    781      1.1  christos 		{ 2, 0,	 "2.000000000" },
    782      1.1  christos 		{-2, 0, "-2.000000000" },
    783      1.1  christos 		{ 0, 1,	 "0.000000001" },
    784      1.1  christos 		{ 0,-1,	"-0.000000001" },
    785      1.1  christos 		{ 1,-1,	 "0.999999999" },
    786      1.1  christos 		{-1, 1, "-0.999999999" },
    787      1.1  christos 		{-1,-1, "-1.000000001" },
    788      1.1  christos 	};
    789      1.1  christos 	int i;
    790  1.1.1.4  christos 
    791  1.1.1.3  christos 	for (i = 0; i < COUNTOF(data); ++i) {
    792      1.1  christos 		struct timespec a = timespec_init(data[i].sec, data[i].nsec);
    793      1.1  christos 		const char * E = data[i].repr;
    794      1.1  christos 		const char * r = tspectoa(a);
    795      1.1  christos 		TEST_ASSERT_EQUAL_STRING(E, r);
    796      1.1  christos 	}
    797  1.1.1.4  christos 
    798  1.1.1.4  christos 	return;
    799      1.1  christos }
    800      1.1  christos 
    801      1.1  christos // -*- EOF -*-
    802