1*8e33eff8Schristos #include "test/jemalloc_test.h" 2*8e33eff8Schristos 3*8e33eff8Schristos #define BILLION UINT64_C(1000000000) 4*8e33eff8Schristos 5*8e33eff8Schristos TEST_BEGIN(test_nstime_init) { 6*8e33eff8Schristos nstime_t nst; 7*8e33eff8Schristos 8*8e33eff8Schristos nstime_init(&nst, 42000000043); 9*8e33eff8Schristos assert_u64_eq(nstime_ns(&nst), 42000000043, "ns incorrectly read"); 10*8e33eff8Schristos assert_u64_eq(nstime_sec(&nst), 42, "sec incorrectly read"); 11*8e33eff8Schristos assert_u64_eq(nstime_nsec(&nst), 43, "nsec incorrectly read"); 12*8e33eff8Schristos } 13*8e33eff8Schristos TEST_END 14*8e33eff8Schristos 15*8e33eff8Schristos TEST_BEGIN(test_nstime_init2) { 16*8e33eff8Schristos nstime_t nst; 17*8e33eff8Schristos 18*8e33eff8Schristos nstime_init2(&nst, 42, 43); 19*8e33eff8Schristos assert_u64_eq(nstime_sec(&nst), 42, "sec incorrectly read"); 20*8e33eff8Schristos assert_u64_eq(nstime_nsec(&nst), 43, "nsec incorrectly read"); 21*8e33eff8Schristos } 22*8e33eff8Schristos TEST_END 23*8e33eff8Schristos 24*8e33eff8Schristos TEST_BEGIN(test_nstime_copy) { 25*8e33eff8Schristos nstime_t nsta, nstb; 26*8e33eff8Schristos 27*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 28*8e33eff8Schristos nstime_init(&nstb, 0); 29*8e33eff8Schristos nstime_copy(&nstb, &nsta); 30*8e33eff8Schristos assert_u64_eq(nstime_sec(&nstb), 42, "sec incorrectly copied"); 31*8e33eff8Schristos assert_u64_eq(nstime_nsec(&nstb), 43, "nsec incorrectly copied"); 32*8e33eff8Schristos } 33*8e33eff8Schristos TEST_END 34*8e33eff8Schristos 35*8e33eff8Schristos TEST_BEGIN(test_nstime_compare) { 36*8e33eff8Schristos nstime_t nsta, nstb; 37*8e33eff8Schristos 38*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 39*8e33eff8Schristos nstime_copy(&nstb, &nsta); 40*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, "Times should be equal"); 41*8e33eff8Schristos assert_d_eq(nstime_compare(&nstb, &nsta), 0, "Times should be equal"); 42*8e33eff8Schristos 43*8e33eff8Schristos nstime_init2(&nstb, 42, 42); 44*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 1, 45*8e33eff8Schristos "nsta should be greater than nstb"); 46*8e33eff8Schristos assert_d_eq(nstime_compare(&nstb, &nsta), -1, 47*8e33eff8Schristos "nstb should be less than nsta"); 48*8e33eff8Schristos 49*8e33eff8Schristos nstime_init2(&nstb, 42, 44); 50*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), -1, 51*8e33eff8Schristos "nsta should be less than nstb"); 52*8e33eff8Schristos assert_d_eq(nstime_compare(&nstb, &nsta), 1, 53*8e33eff8Schristos "nstb should be greater than nsta"); 54*8e33eff8Schristos 55*8e33eff8Schristos nstime_init2(&nstb, 41, BILLION - 1); 56*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 1, 57*8e33eff8Schristos "nsta should be greater than nstb"); 58*8e33eff8Schristos assert_d_eq(nstime_compare(&nstb, &nsta), -1, 59*8e33eff8Schristos "nstb should be less than nsta"); 60*8e33eff8Schristos 61*8e33eff8Schristos nstime_init2(&nstb, 43, 0); 62*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), -1, 63*8e33eff8Schristos "nsta should be less than nstb"); 64*8e33eff8Schristos assert_d_eq(nstime_compare(&nstb, &nsta), 1, 65*8e33eff8Schristos "nstb should be greater than nsta"); 66*8e33eff8Schristos } 67*8e33eff8Schristos TEST_END 68*8e33eff8Schristos 69*8e33eff8Schristos TEST_BEGIN(test_nstime_add) { 70*8e33eff8Schristos nstime_t nsta, nstb; 71*8e33eff8Schristos 72*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 73*8e33eff8Schristos nstime_copy(&nstb, &nsta); 74*8e33eff8Schristos nstime_add(&nsta, &nstb); 75*8e33eff8Schristos nstime_init2(&nstb, 84, 86); 76*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 77*8e33eff8Schristos "Incorrect addition result"); 78*8e33eff8Schristos 79*8e33eff8Schristos nstime_init2(&nsta, 42, BILLION - 1); 80*8e33eff8Schristos nstime_copy(&nstb, &nsta); 81*8e33eff8Schristos nstime_add(&nsta, &nstb); 82*8e33eff8Schristos nstime_init2(&nstb, 85, BILLION - 2); 83*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 84*8e33eff8Schristos "Incorrect addition result"); 85*8e33eff8Schristos } 86*8e33eff8Schristos TEST_END 87*8e33eff8Schristos 88*8e33eff8Schristos TEST_BEGIN(test_nstime_iadd) { 89*8e33eff8Schristos nstime_t nsta, nstb; 90*8e33eff8Schristos 91*8e33eff8Schristos nstime_init2(&nsta, 42, BILLION - 1); 92*8e33eff8Schristos nstime_iadd(&nsta, 1); 93*8e33eff8Schristos nstime_init2(&nstb, 43, 0); 94*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 95*8e33eff8Schristos "Incorrect addition result"); 96*8e33eff8Schristos 97*8e33eff8Schristos nstime_init2(&nsta, 42, 1); 98*8e33eff8Schristos nstime_iadd(&nsta, BILLION + 1); 99*8e33eff8Schristos nstime_init2(&nstb, 43, 2); 100*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 101*8e33eff8Schristos "Incorrect addition result"); 102*8e33eff8Schristos } 103*8e33eff8Schristos TEST_END 104*8e33eff8Schristos 105*8e33eff8Schristos TEST_BEGIN(test_nstime_subtract) { 106*8e33eff8Schristos nstime_t nsta, nstb; 107*8e33eff8Schristos 108*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 109*8e33eff8Schristos nstime_copy(&nstb, &nsta); 110*8e33eff8Schristos nstime_subtract(&nsta, &nstb); 111*8e33eff8Schristos nstime_init(&nstb, 0); 112*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 113*8e33eff8Schristos "Incorrect subtraction result"); 114*8e33eff8Schristos 115*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 116*8e33eff8Schristos nstime_init2(&nstb, 41, 44); 117*8e33eff8Schristos nstime_subtract(&nsta, &nstb); 118*8e33eff8Schristos nstime_init2(&nstb, 0, BILLION - 1); 119*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 120*8e33eff8Schristos "Incorrect subtraction result"); 121*8e33eff8Schristos } 122*8e33eff8Schristos TEST_END 123*8e33eff8Schristos 124*8e33eff8Schristos TEST_BEGIN(test_nstime_isubtract) { 125*8e33eff8Schristos nstime_t nsta, nstb; 126*8e33eff8Schristos 127*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 128*8e33eff8Schristos nstime_isubtract(&nsta, 42*BILLION + 43); 129*8e33eff8Schristos nstime_init(&nstb, 0); 130*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 131*8e33eff8Schristos "Incorrect subtraction result"); 132*8e33eff8Schristos 133*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 134*8e33eff8Schristos nstime_isubtract(&nsta, 41*BILLION + 44); 135*8e33eff8Schristos nstime_init2(&nstb, 0, BILLION - 1); 136*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 137*8e33eff8Schristos "Incorrect subtraction result"); 138*8e33eff8Schristos } 139*8e33eff8Schristos TEST_END 140*8e33eff8Schristos 141*8e33eff8Schristos TEST_BEGIN(test_nstime_imultiply) { 142*8e33eff8Schristos nstime_t nsta, nstb; 143*8e33eff8Schristos 144*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 145*8e33eff8Schristos nstime_imultiply(&nsta, 10); 146*8e33eff8Schristos nstime_init2(&nstb, 420, 430); 147*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 148*8e33eff8Schristos "Incorrect multiplication result"); 149*8e33eff8Schristos 150*8e33eff8Schristos nstime_init2(&nsta, 42, 666666666); 151*8e33eff8Schristos nstime_imultiply(&nsta, 3); 152*8e33eff8Schristos nstime_init2(&nstb, 127, 999999998); 153*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 154*8e33eff8Schristos "Incorrect multiplication result"); 155*8e33eff8Schristos } 156*8e33eff8Schristos TEST_END 157*8e33eff8Schristos 158*8e33eff8Schristos TEST_BEGIN(test_nstime_idivide) { 159*8e33eff8Schristos nstime_t nsta, nstb; 160*8e33eff8Schristos 161*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 162*8e33eff8Schristos nstime_copy(&nstb, &nsta); 163*8e33eff8Schristos nstime_imultiply(&nsta, 10); 164*8e33eff8Schristos nstime_idivide(&nsta, 10); 165*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 166*8e33eff8Schristos "Incorrect division result"); 167*8e33eff8Schristos 168*8e33eff8Schristos nstime_init2(&nsta, 42, 666666666); 169*8e33eff8Schristos nstime_copy(&nstb, &nsta); 170*8e33eff8Schristos nstime_imultiply(&nsta, 3); 171*8e33eff8Schristos nstime_idivide(&nsta, 3); 172*8e33eff8Schristos assert_d_eq(nstime_compare(&nsta, &nstb), 0, 173*8e33eff8Schristos "Incorrect division result"); 174*8e33eff8Schristos } 175*8e33eff8Schristos TEST_END 176*8e33eff8Schristos 177*8e33eff8Schristos TEST_BEGIN(test_nstime_divide) { 178*8e33eff8Schristos nstime_t nsta, nstb, nstc; 179*8e33eff8Schristos 180*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 181*8e33eff8Schristos nstime_copy(&nstb, &nsta); 182*8e33eff8Schristos nstime_imultiply(&nsta, 10); 183*8e33eff8Schristos assert_u64_eq(nstime_divide(&nsta, &nstb), 10, 184*8e33eff8Schristos "Incorrect division result"); 185*8e33eff8Schristos 186*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 187*8e33eff8Schristos nstime_copy(&nstb, &nsta); 188*8e33eff8Schristos nstime_imultiply(&nsta, 10); 189*8e33eff8Schristos nstime_init(&nstc, 1); 190*8e33eff8Schristos nstime_add(&nsta, &nstc); 191*8e33eff8Schristos assert_u64_eq(nstime_divide(&nsta, &nstb), 10, 192*8e33eff8Schristos "Incorrect division result"); 193*8e33eff8Schristos 194*8e33eff8Schristos nstime_init2(&nsta, 42, 43); 195*8e33eff8Schristos nstime_copy(&nstb, &nsta); 196*8e33eff8Schristos nstime_imultiply(&nsta, 10); 197*8e33eff8Schristos nstime_init(&nstc, 1); 198*8e33eff8Schristos nstime_subtract(&nsta, &nstc); 199*8e33eff8Schristos assert_u64_eq(nstime_divide(&nsta, &nstb), 9, 200*8e33eff8Schristos "Incorrect division result"); 201*8e33eff8Schristos } 202*8e33eff8Schristos TEST_END 203*8e33eff8Schristos 204*8e33eff8Schristos TEST_BEGIN(test_nstime_monotonic) { 205*8e33eff8Schristos nstime_monotonic(); 206*8e33eff8Schristos } 207*8e33eff8Schristos TEST_END 208*8e33eff8Schristos 209*8e33eff8Schristos TEST_BEGIN(test_nstime_update) { 210*8e33eff8Schristos nstime_t nst; 211*8e33eff8Schristos 212*8e33eff8Schristos nstime_init(&nst, 0); 213*8e33eff8Schristos 214*8e33eff8Schristos assert_false(nstime_update(&nst), "Basic time update failed."); 215*8e33eff8Schristos 216*8e33eff8Schristos /* Only Rip Van Winkle sleeps this long. */ 217*8e33eff8Schristos { 218*8e33eff8Schristos nstime_t addend; 219*8e33eff8Schristos nstime_init2(&addend, 631152000, 0); 220*8e33eff8Schristos nstime_add(&nst, &addend); 221*8e33eff8Schristos } 222*8e33eff8Schristos { 223*8e33eff8Schristos nstime_t nst0; 224*8e33eff8Schristos nstime_copy(&nst0, &nst); 225*8e33eff8Schristos assert_true(nstime_update(&nst), 226*8e33eff8Schristos "Update should detect time roll-back."); 227*8e33eff8Schristos assert_d_eq(nstime_compare(&nst, &nst0), 0, 228*8e33eff8Schristos "Time should not have been modified"); 229*8e33eff8Schristos } 230*8e33eff8Schristos } 231*8e33eff8Schristos TEST_END 232*8e33eff8Schristos 233*8e33eff8Schristos int 234*8e33eff8Schristos main(void) { 235*8e33eff8Schristos return test( 236*8e33eff8Schristos test_nstime_init, 237*8e33eff8Schristos test_nstime_init2, 238*8e33eff8Schristos test_nstime_copy, 239*8e33eff8Schristos test_nstime_compare, 240*8e33eff8Schristos test_nstime_add, 241*8e33eff8Schristos test_nstime_iadd, 242*8e33eff8Schristos test_nstime_subtract, 243*8e33eff8Schristos test_nstime_isubtract, 244*8e33eff8Schristos test_nstime_imultiply, 245*8e33eff8Schristos test_nstime_idivide, 246*8e33eff8Schristos test_nstime_divide, 247*8e33eff8Schristos test_nstime_monotonic, 248*8e33eff8Schristos test_nstime_update); 249*8e33eff8Schristos } 250