Home | History | Annotate | Download | only in unit
      1 #include "test/jemalloc_test.h"
      2 
      3 #if (LG_BITMAP_MAXBITS > 12)
      4 #  define MAXBITS	4500
      5 #else
      6 #  define MAXBITS	(1U << LG_BITMAP_MAXBITS)
      7 #endif
      8 
      9 TEST_BEGIN(test_bitmap_size)
     10 {
     11 	size_t i, prev_size;
     12 
     13 	prev_size = 0;
     14 	for (i = 1; i <= MAXBITS; i++) {
     15 		size_t size = bitmap_size(i);
     16 		assert_true(size >= prev_size,
     17 		    "Bitmap size is smaller than expected");
     18 		prev_size = size;
     19 	}
     20 }
     21 TEST_END
     22 
     23 TEST_BEGIN(test_bitmap_init)
     24 {
     25 	size_t i;
     26 
     27 	for (i = 1; i <= MAXBITS; i++) {
     28 		bitmap_info_t binfo;
     29 		bitmap_info_init(&binfo, i);
     30 		{
     31 			size_t j;
     32 			bitmap_t *bitmap = malloc(sizeof(bitmap_t) *
     33 				bitmap_info_ngroups(&binfo));
     34 			bitmap_init(bitmap, &binfo);
     35 
     36 			for (j = 0; j < i; j++) {
     37 				assert_false(bitmap_get(bitmap, &binfo, j),
     38 				    "Bit should be unset");
     39 			}
     40 			free(bitmap);
     41 		}
     42 	}
     43 }
     44 TEST_END
     45 
     46 TEST_BEGIN(test_bitmap_set)
     47 {
     48 	size_t i;
     49 
     50 	for (i = 1; i <= MAXBITS; i++) {
     51 		bitmap_info_t binfo;
     52 		bitmap_info_init(&binfo, i);
     53 		{
     54 			size_t j;
     55 			bitmap_t *bitmap = malloc(sizeof(bitmap_t) *
     56 				bitmap_info_ngroups(&binfo));
     57 			bitmap_init(bitmap, &binfo);
     58 
     59 			for (j = 0; j < i; j++)
     60 				bitmap_set(bitmap, &binfo, j);
     61 			assert_true(bitmap_full(bitmap, &binfo),
     62 			    "All bits should be set");
     63 			free(bitmap);
     64 		}
     65 	}
     66 }
     67 TEST_END
     68 
     69 TEST_BEGIN(test_bitmap_unset)
     70 {
     71 	size_t i;
     72 
     73 	for (i = 1; i <= MAXBITS; i++) {
     74 		bitmap_info_t binfo;
     75 		bitmap_info_init(&binfo, i);
     76 		{
     77 			size_t j;
     78 			bitmap_t *bitmap = malloc(sizeof(bitmap_t) *
     79 				bitmap_info_ngroups(&binfo));
     80 			bitmap_init(bitmap, &binfo);
     81 
     82 			for (j = 0; j < i; j++)
     83 				bitmap_set(bitmap, &binfo, j);
     84 			assert_true(bitmap_full(bitmap, &binfo),
     85 			    "All bits should be set");
     86 			for (j = 0; j < i; j++)
     87 				bitmap_unset(bitmap, &binfo, j);
     88 			for (j = 0; j < i; j++)
     89 				bitmap_set(bitmap, &binfo, j);
     90 			assert_true(bitmap_full(bitmap, &binfo),
     91 			    "All bits should be set");
     92 			free(bitmap);
     93 		}
     94 	}
     95 }
     96 TEST_END
     97 
     98 TEST_BEGIN(test_bitmap_sfu)
     99 {
    100 	size_t i;
    101 
    102 	for (i = 1; i <= MAXBITS; i++) {
    103 		bitmap_info_t binfo;
    104 		bitmap_info_init(&binfo, i);
    105 		{
    106 			ssize_t j;
    107 			bitmap_t *bitmap = malloc(sizeof(bitmap_t) *
    108 				bitmap_info_ngroups(&binfo));
    109 			bitmap_init(bitmap, &binfo);
    110 
    111 			/* Iteratively set bits starting at the beginning. */
    112 			for (j = 0; j < i; j++) {
    113 				assert_zd_eq(bitmap_sfu(bitmap, &binfo), j,
    114 				    "First unset bit should be just after "
    115 				    "previous first unset bit");
    116 			}
    117 			assert_true(bitmap_full(bitmap, &binfo),
    118 			    "All bits should be set");
    119 
    120 			/*
    121 			 * Iteratively unset bits starting at the end, and
    122 			 * verify that bitmap_sfu() reaches the unset bits.
    123 			 */
    124 			for (j = i - 1; j >= 0; j--) {
    125 				bitmap_unset(bitmap, &binfo, j);
    126 				assert_zd_eq(bitmap_sfu(bitmap, &binfo), j,
    127 				    "First unset bit should the bit previously "
    128 				    "unset");
    129 				bitmap_unset(bitmap, &binfo, j);
    130 			}
    131 			assert_false(bitmap_get(bitmap, &binfo, 0),
    132 			    "Bit should be unset");
    133 
    134 			/*
    135 			 * Iteratively set bits starting at the beginning, and
    136 			 * verify that bitmap_sfu() looks past them.
    137 			 */
    138 			for (j = 1; j < i; j++) {
    139 				bitmap_set(bitmap, &binfo, j - 1);
    140 				assert_zd_eq(bitmap_sfu(bitmap, &binfo), j,
    141 				    "First unset bit should be just after the "
    142 				    "bit previously set");
    143 				bitmap_unset(bitmap, &binfo, j);
    144 			}
    145 			assert_zd_eq(bitmap_sfu(bitmap, &binfo), i - 1,
    146 			    "First unset bit should be the last bit");
    147 			assert_true(bitmap_full(bitmap, &binfo),
    148 			    "All bits should be set");
    149 			free(bitmap);
    150 		}
    151 	}
    152 }
    153 TEST_END
    154 
    155 int
    156 main(void)
    157 {
    158 
    159 	return (test(
    160 	    test_bitmap_size,
    161 	    test_bitmap_init,
    162 	    test_bitmap_set,
    163 	    test_bitmap_unset,
    164 	    test_bitmap_sfu));
    165 }
    166