Home | History | Annotate | Download | only in unit
      1 #include "test/jemalloc_test.h"
      2 
      3 static void
      4 test_prng_lg_range_u32(bool atomic)
      5 {
      6 	uint32_t sa, sb, ra, rb;
      7 	unsigned lg_range;
      8 
      9 	sa = 42;
     10 	ra = prng_lg_range_u32(&sa, 32, atomic);
     11 	sa = 42;
     12 	rb = prng_lg_range_u32(&sa, 32, atomic);
     13 	assert_u32_eq(ra, rb,
     14 	    "Repeated generation should produce repeated results");
     15 
     16 	sb = 42;
     17 	rb = prng_lg_range_u32(&sb, 32, atomic);
     18 	assert_u32_eq(ra, rb,
     19 	    "Equivalent generation should produce equivalent results");
     20 
     21 	sa = 42;
     22 	ra = prng_lg_range_u32(&sa, 32, atomic);
     23 	rb = prng_lg_range_u32(&sa, 32, atomic);
     24 	assert_u32_ne(ra, rb,
     25 	    "Full-width results must not immediately repeat");
     26 
     27 	sa = 42;
     28 	ra = prng_lg_range_u32(&sa, 32, atomic);
     29 	for (lg_range = 31; lg_range > 0; lg_range--) {
     30 		sb = 42;
     31 		rb = prng_lg_range_u32(&sb, lg_range, atomic);
     32 		assert_u32_eq((rb & (UINT32_C(0xffffffff) << lg_range)),
     33 		    0, "High order bits should be 0, lg_range=%u", lg_range);
     34 		assert_u32_eq(rb, (ra >> (32 - lg_range)),
     35 		    "Expected high order bits of full-width result, "
     36 		    "lg_range=%u", lg_range);
     37 	}
     38 }
     39 
     40 static void
     41 test_prng_lg_range_u64(void)
     42 {
     43 	uint64_t sa, sb, ra, rb;
     44 	unsigned lg_range;
     45 
     46 	sa = 42;
     47 	ra = prng_lg_range_u64(&sa, 64);
     48 	sa = 42;
     49 	rb = prng_lg_range_u64(&sa, 64);
     50 	assert_u64_eq(ra, rb,
     51 	    "Repeated generation should produce repeated results");
     52 
     53 	sb = 42;
     54 	rb = prng_lg_range_u64(&sb, 64);
     55 	assert_u64_eq(ra, rb,
     56 	    "Equivalent generation should produce equivalent results");
     57 
     58 	sa = 42;
     59 	ra = prng_lg_range_u64(&sa, 64);
     60 	rb = prng_lg_range_u64(&sa, 64);
     61 	assert_u64_ne(ra, rb,
     62 	    "Full-width results must not immediately repeat");
     63 
     64 	sa = 42;
     65 	ra = prng_lg_range_u64(&sa, 64);
     66 	for (lg_range = 63; lg_range > 0; lg_range--) {
     67 		sb = 42;
     68 		rb = prng_lg_range_u64(&sb, lg_range);
     69 		assert_u64_eq((rb & (UINT64_C(0xffffffffffffffff) << lg_range)),
     70 		    0, "High order bits should be 0, lg_range=%u", lg_range);
     71 		assert_u64_eq(rb, (ra >> (64 - lg_range)),
     72 		    "Expected high order bits of full-width result, "
     73 		    "lg_range=%u", lg_range);
     74 	}
     75 }
     76 
     77 static void
     78 test_prng_lg_range_zu(bool atomic)
     79 {
     80 	size_t sa, sb, ra, rb;
     81 	unsigned lg_range;
     82 
     83 	sa = 42;
     84 	ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
     85 	sa = 42;
     86 	rb = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
     87 	assert_zu_eq(ra, rb,
     88 	    "Repeated generation should produce repeated results");
     89 
     90 	sb = 42;
     91 	rb = prng_lg_range_zu(&sb, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
     92 	assert_zu_eq(ra, rb,
     93 	    "Equivalent generation should produce equivalent results");
     94 
     95 	sa = 42;
     96 	ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
     97 	rb = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
     98 	assert_zu_ne(ra, rb,
     99 	    "Full-width results must not immediately repeat");
    100 
    101 	sa = 42;
    102 	ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
    103 	for (lg_range = (ZU(1) << (3 + LG_SIZEOF_PTR)) - 1; lg_range > 0;
    104 	    lg_range--) {
    105 		sb = 42;
    106 		rb = prng_lg_range_zu(&sb, lg_range, atomic);
    107 		assert_zu_eq((rb & (SIZE_T_MAX << lg_range)),
    108 		    0, "High order bits should be 0, lg_range=%u", lg_range);
    109 		assert_zu_eq(rb, (ra >> ((ZU(1) << (3 + LG_SIZEOF_PTR)) -
    110 		    lg_range)), "Expected high order bits of full-width "
    111 		    "result, lg_range=%u", lg_range);
    112 	}
    113 }
    114 
    115 TEST_BEGIN(test_prng_lg_range_u32_nonatomic)
    116 {
    117 
    118 	test_prng_lg_range_u32(false);
    119 }
    120 TEST_END
    121 
    122 TEST_BEGIN(test_prng_lg_range_u32_atomic)
    123 {
    124 
    125 	test_prng_lg_range_u32(true);
    126 }
    127 TEST_END
    128 
    129 TEST_BEGIN(test_prng_lg_range_u64_nonatomic)
    130 {
    131 
    132 	test_prng_lg_range_u64();
    133 }
    134 TEST_END
    135 
    136 TEST_BEGIN(test_prng_lg_range_zu_nonatomic)
    137 {
    138 
    139 	test_prng_lg_range_zu(false);
    140 }
    141 TEST_END
    142 
    143 TEST_BEGIN(test_prng_lg_range_zu_atomic)
    144 {
    145 
    146 	test_prng_lg_range_zu(true);
    147 }
    148 TEST_END
    149 
    150 static void
    151 test_prng_range_u32(bool atomic)
    152 {
    153 	uint32_t range;
    154 #define	MAX_RANGE	10000000
    155 #define	RANGE_STEP	97
    156 #define	NREPS		10
    157 
    158 	for (range = 2; range < MAX_RANGE; range += RANGE_STEP) {
    159 		uint32_t s;
    160 		unsigned rep;
    161 
    162 		s = range;
    163 		for (rep = 0; rep < NREPS; rep++) {
    164 			uint32_t r = prng_range_u32(&s, range, atomic);
    165 
    166 			assert_u32_lt(r, range, "Out of range");
    167 		}
    168 	}
    169 }
    170 
    171 static void
    172 test_prng_range_u64(void)
    173 {
    174 	uint64_t range;
    175 #define	MAX_RANGE	10000000
    176 #define	RANGE_STEP	97
    177 #define	NREPS		10
    178 
    179 	for (range = 2; range < MAX_RANGE; range += RANGE_STEP) {
    180 		uint64_t s;
    181 		unsigned rep;
    182 
    183 		s = range;
    184 		for (rep = 0; rep < NREPS; rep++) {
    185 			uint64_t r = prng_range_u64(&s, range);
    186 
    187 			assert_u64_lt(r, range, "Out of range");
    188 		}
    189 	}
    190 }
    191 
    192 static void
    193 test_prng_range_zu(bool atomic)
    194 {
    195 	size_t range;
    196 #define	MAX_RANGE	10000000
    197 #define	RANGE_STEP	97
    198 #define	NREPS		10
    199 
    200 	for (range = 2; range < MAX_RANGE; range += RANGE_STEP) {
    201 		size_t s;
    202 		unsigned rep;
    203 
    204 		s = range;
    205 		for (rep = 0; rep < NREPS; rep++) {
    206 			size_t r = prng_range_zu(&s, range, atomic);
    207 
    208 			assert_zu_lt(r, range, "Out of range");
    209 		}
    210 	}
    211 }
    212 
    213 TEST_BEGIN(test_prng_range_u32_nonatomic)
    214 {
    215 
    216 	test_prng_range_u32(false);
    217 }
    218 TEST_END
    219 
    220 TEST_BEGIN(test_prng_range_u32_atomic)
    221 {
    222 
    223 	test_prng_range_u32(true);
    224 }
    225 TEST_END
    226 
    227 TEST_BEGIN(test_prng_range_u64_nonatomic)
    228 {
    229 
    230 	test_prng_range_u64();
    231 }
    232 TEST_END
    233 
    234 TEST_BEGIN(test_prng_range_zu_nonatomic)
    235 {
    236 
    237 	test_prng_range_zu(false);
    238 }
    239 TEST_END
    240 
    241 TEST_BEGIN(test_prng_range_zu_atomic)
    242 {
    243 
    244 	test_prng_range_zu(true);
    245 }
    246 TEST_END
    247 
    248 int
    249 main(void)
    250 {
    251 
    252 	return (test(
    253 	    test_prng_lg_range_u32_nonatomic,
    254 	    test_prng_lg_range_u32_atomic,
    255 	    test_prng_lg_range_u64_nonatomic,
    256 	    test_prng_lg_range_zu_nonatomic,
    257 	    test_prng_lg_range_zu_atomic,
    258 	    test_prng_range_u32_nonatomic,
    259 	    test_prng_range_u32_atomic,
    260 	    test_prng_range_u64_nonatomic,
    261 	    test_prng_range_zu_nonatomic,
    262 	    test_prng_range_zu_atomic));
    263 }
    264