1a0698ed9Schristos #include "test/jemalloc_test.h" 2a0698ed9Schristos 3*7bdf38e5Schristos TEST_BEGIN(test_prng_lg_range_u32) { 4*7bdf38e5Schristos uint32_t sa, sb; 5a0698ed9Schristos uint32_t ra, rb; 6a0698ed9Schristos unsigned lg_range; 7a0698ed9Schristos 8*7bdf38e5Schristos sa = 42; 9*7bdf38e5Schristos ra = prng_lg_range_u32(&sa, 32); 10*7bdf38e5Schristos sa = 42; 11*7bdf38e5Schristos rb = prng_lg_range_u32(&sa, 32); 12*7bdf38e5Schristos expect_u32_eq(ra, rb, 13a0698ed9Schristos "Repeated generation should produce repeated results"); 14a0698ed9Schristos 15*7bdf38e5Schristos sb = 42; 16*7bdf38e5Schristos rb = prng_lg_range_u32(&sb, 32); 17*7bdf38e5Schristos expect_u32_eq(ra, rb, 18a0698ed9Schristos "Equivalent generation should produce equivalent results"); 19a0698ed9Schristos 20*7bdf38e5Schristos sa = 42; 21*7bdf38e5Schristos ra = prng_lg_range_u32(&sa, 32); 22*7bdf38e5Schristos rb = prng_lg_range_u32(&sa, 32); 23*7bdf38e5Schristos expect_u32_ne(ra, rb, 24a0698ed9Schristos "Full-width results must not immediately repeat"); 25a0698ed9Schristos 26*7bdf38e5Schristos sa = 42; 27*7bdf38e5Schristos ra = prng_lg_range_u32(&sa, 32); 28a0698ed9Schristos for (lg_range = 31; lg_range > 0; lg_range--) { 29*7bdf38e5Schristos sb = 42; 30*7bdf38e5Schristos rb = prng_lg_range_u32(&sb, lg_range); 31*7bdf38e5Schristos expect_u32_eq((rb & (UINT32_C(0xffffffff) << lg_range)), 32a0698ed9Schristos 0, "High order bits should be 0, lg_range=%u", lg_range); 33*7bdf38e5Schristos expect_u32_eq(rb, (ra >> (32 - lg_range)), 34a0698ed9Schristos "Expected high order bits of full-width result, " 35a0698ed9Schristos "lg_range=%u", lg_range); 36a0698ed9Schristos } 37a0698ed9Schristos 38*7bdf38e5Schristos } 39*7bdf38e5Schristos TEST_END 40*7bdf38e5Schristos 41*7bdf38e5Schristos TEST_BEGIN(test_prng_lg_range_u64) { 42a0698ed9Schristos uint64_t sa, sb, ra, rb; 43a0698ed9Schristos unsigned lg_range; 44a0698ed9Schristos 45a0698ed9Schristos sa = 42; 46a0698ed9Schristos ra = prng_lg_range_u64(&sa, 64); 47a0698ed9Schristos sa = 42; 48a0698ed9Schristos rb = prng_lg_range_u64(&sa, 64); 49*7bdf38e5Schristos expect_u64_eq(ra, rb, 50a0698ed9Schristos "Repeated generation should produce repeated results"); 51a0698ed9Schristos 52a0698ed9Schristos sb = 42; 53a0698ed9Schristos rb = prng_lg_range_u64(&sb, 64); 54*7bdf38e5Schristos expect_u64_eq(ra, rb, 55a0698ed9Schristos "Equivalent generation should produce equivalent results"); 56a0698ed9Schristos 57a0698ed9Schristos sa = 42; 58a0698ed9Schristos ra = prng_lg_range_u64(&sa, 64); 59a0698ed9Schristos rb = prng_lg_range_u64(&sa, 64); 60*7bdf38e5Schristos expect_u64_ne(ra, rb, 61a0698ed9Schristos "Full-width results must not immediately repeat"); 62a0698ed9Schristos 63a0698ed9Schristos sa = 42; 64a0698ed9Schristos ra = prng_lg_range_u64(&sa, 64); 65a0698ed9Schristos for (lg_range = 63; lg_range > 0; lg_range--) { 66a0698ed9Schristos sb = 42; 67a0698ed9Schristos rb = prng_lg_range_u64(&sb, lg_range); 68*7bdf38e5Schristos expect_u64_eq((rb & (UINT64_C(0xffffffffffffffff) << lg_range)), 69a0698ed9Schristos 0, "High order bits should be 0, lg_range=%u", lg_range); 70*7bdf38e5Schristos expect_u64_eq(rb, (ra >> (64 - lg_range)), 71a0698ed9Schristos "Expected high order bits of full-width result, " 72a0698ed9Schristos "lg_range=%u", lg_range); 73a0698ed9Schristos } 74a0698ed9Schristos } 75*7bdf38e5Schristos TEST_END 76a0698ed9Schristos 77*7bdf38e5Schristos TEST_BEGIN(test_prng_lg_range_zu) { 78*7bdf38e5Schristos size_t sa, sb; 79a0698ed9Schristos size_t ra, rb; 80a0698ed9Schristos unsigned lg_range; 81a0698ed9Schristos 82*7bdf38e5Schristos sa = 42; 83*7bdf38e5Schristos ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR)); 84*7bdf38e5Schristos sa = 42; 85*7bdf38e5Schristos rb = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR)); 86*7bdf38e5Schristos expect_zu_eq(ra, rb, 87a0698ed9Schristos "Repeated generation should produce repeated results"); 88a0698ed9Schristos 89*7bdf38e5Schristos sb = 42; 90*7bdf38e5Schristos rb = prng_lg_range_zu(&sb, ZU(1) << (3 + LG_SIZEOF_PTR)); 91*7bdf38e5Schristos expect_zu_eq(ra, rb, 92a0698ed9Schristos "Equivalent generation should produce equivalent results"); 93a0698ed9Schristos 94*7bdf38e5Schristos sa = 42; 95*7bdf38e5Schristos ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR)); 96*7bdf38e5Schristos rb = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR)); 97*7bdf38e5Schristos expect_zu_ne(ra, rb, 98a0698ed9Schristos "Full-width results must not immediately repeat"); 99a0698ed9Schristos 100*7bdf38e5Schristos sa = 42; 101*7bdf38e5Schristos ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR)); 102a0698ed9Schristos for (lg_range = (ZU(1) << (3 + LG_SIZEOF_PTR)) - 1; lg_range > 0; 103a0698ed9Schristos lg_range--) { 104*7bdf38e5Schristos sb = 42; 105*7bdf38e5Schristos rb = prng_lg_range_zu(&sb, lg_range); 106*7bdf38e5Schristos expect_zu_eq((rb & (SIZE_T_MAX << lg_range)), 107a0698ed9Schristos 0, "High order bits should be 0, lg_range=%u", lg_range); 108*7bdf38e5Schristos expect_zu_eq(rb, (ra >> ((ZU(1) << (3 + LG_SIZEOF_PTR)) - 109a0698ed9Schristos lg_range)), "Expected high order bits of full-width " 110a0698ed9Schristos "result, lg_range=%u", lg_range); 111a0698ed9Schristos } 112a0698ed9Schristos 113a0698ed9Schristos } 114a0698ed9Schristos TEST_END 115a0698ed9Schristos 116*7bdf38e5Schristos TEST_BEGIN(test_prng_range_u32) { 117a0698ed9Schristos uint32_t range; 118a0698ed9Schristos 119*7bdf38e5Schristos const uint32_t max_range = 10000000; 120*7bdf38e5Schristos const uint32_t range_step = 97; 121*7bdf38e5Schristos const unsigned nreps = 10; 122*7bdf38e5Schristos 123*7bdf38e5Schristos for (range = 2; range < max_range; range += range_step) { 124*7bdf38e5Schristos uint32_t s; 125a0698ed9Schristos unsigned rep; 126a0698ed9Schristos 127*7bdf38e5Schristos s = range; 128*7bdf38e5Schristos for (rep = 0; rep < nreps; rep++) { 129*7bdf38e5Schristos uint32_t r = prng_range_u32(&s, range); 130a0698ed9Schristos 131*7bdf38e5Schristos expect_u32_lt(r, range, "Out of range"); 132a0698ed9Schristos } 133a0698ed9Schristos } 134a0698ed9Schristos } 135*7bdf38e5Schristos TEST_END 136a0698ed9Schristos 137*7bdf38e5Schristos TEST_BEGIN(test_prng_range_u64) { 138a0698ed9Schristos uint64_t range; 139a0698ed9Schristos 140*7bdf38e5Schristos const uint64_t max_range = 10000000; 141*7bdf38e5Schristos const uint64_t range_step = 97; 142*7bdf38e5Schristos const unsigned nreps = 10; 143*7bdf38e5Schristos 144*7bdf38e5Schristos for (range = 2; range < max_range; range += range_step) { 145a0698ed9Schristos uint64_t s; 146a0698ed9Schristos unsigned rep; 147a0698ed9Schristos 148a0698ed9Schristos s = range; 149*7bdf38e5Schristos for (rep = 0; rep < nreps; rep++) { 150a0698ed9Schristos uint64_t r = prng_range_u64(&s, range); 151a0698ed9Schristos 152*7bdf38e5Schristos expect_u64_lt(r, range, "Out of range"); 153a0698ed9Schristos } 154a0698ed9Schristos } 155a0698ed9Schristos } 156*7bdf38e5Schristos TEST_END 157a0698ed9Schristos 158*7bdf38e5Schristos TEST_BEGIN(test_prng_range_zu) { 159a0698ed9Schristos size_t range; 160a0698ed9Schristos 161*7bdf38e5Schristos const size_t max_range = 10000000; 162*7bdf38e5Schristos const size_t range_step = 97; 163*7bdf38e5Schristos const unsigned nreps = 10; 164*7bdf38e5Schristos 165*7bdf38e5Schristos 166*7bdf38e5Schristos for (range = 2; range < max_range; range += range_step) { 167*7bdf38e5Schristos size_t s; 168a0698ed9Schristos unsigned rep; 169a0698ed9Schristos 170*7bdf38e5Schristos s = range; 171*7bdf38e5Schristos for (rep = 0; rep < nreps; rep++) { 172*7bdf38e5Schristos size_t r = prng_range_zu(&s, range); 173a0698ed9Schristos 174*7bdf38e5Schristos expect_zu_lt(r, range, "Out of range"); 175a0698ed9Schristos } 176a0698ed9Schristos } 177a0698ed9Schristos } 178a0698ed9Schristos TEST_END 179a0698ed9Schristos 180a0698ed9Schristos int 181a0698ed9Schristos main(void) { 182*7bdf38e5Schristos return test_no_reentrancy( 183*7bdf38e5Schristos test_prng_lg_range_u32, 184*7bdf38e5Schristos test_prng_lg_range_u64, 185*7bdf38e5Schristos test_prng_lg_range_zu, 186*7bdf38e5Schristos test_prng_range_u32, 187*7bdf38e5Schristos test_prng_range_u64, 188*7bdf38e5Schristos test_prng_range_zu); 189a0698ed9Schristos } 190