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