t/axmap: add a few more overlap test cases
[fio.git] / t / axmap.c
CommitLineData
ad1f90aa
JA
1#include <stdio.h>
2#include <stdlib.h>
ad1f90aa
JA
3#include <inttypes.h>
4
5#include "../lib/lfsr.h"
32bbd3ab 6#include "../lib/axmap.h"
ad1f90aa 7
a7448122 8static int test_regular(size_t size, int seed)
ad1f90aa
JA
9{
10 struct fio_lfsr lfsr;
ad1f90aa 11 struct axmap *map;
a7448122 12 size_t osize;
32bbd3ab 13 uint64_t ff;
a7448122 14 int err;
ad1f90aa 15
a7448122
JA
16 printf("Using %llu entries...", (unsigned long long) size);
17 fflush(stdout);
ad1f90aa 18
d474cbc9 19 lfsr_init(&lfsr, size, seed, seed & 0xF);
ad1f90aa 20 map = axmap_new(size);
32bbd3ab 21 osize = size;
a7448122 22 err = 0;
ad1f90aa
JA
23
24 while (size--) {
25 uint64_t val;
26
dd9bd2b2 27 if (lfsr_next(&lfsr, &val)) {
32bbd3ab 28 printf("lfsr: short loop\n");
a7448122 29 err = 1;
32bbd3ab
JA
30 break;
31 }
ab3379bc
JA
32 if (axmap_isset(map, val)) {
33 printf("bit already set\n");
a7448122 34 err = 1;
ab3379bc
JA
35 break;
36 }
ad1f90aa 37 axmap_set(map, val);
ab3379bc
JA
38 if (!axmap_isset(map, val)) {
39 printf("bit not set\n");
a7448122 40 err = 1;
ab3379bc
JA
41 break;
42 }
ad1f90aa
JA
43 }
44
a7448122
JA
45 if (err)
46 return err;
47
32bbd3ab
JA
48 ff = axmap_next_free(map, osize);
49 if (ff != (uint64_t) -1ULL) {
50 printf("axmap_next_free broken: got %llu\n", (unsigned long long) ff);
51 return 1;
52 }
53
a7448122
JA
54 printf("pass!\n");
55 axmap_free(map);
56 return 0;
57}
58
59static int test_multi(size_t size, unsigned int bit_off)
60{
61 unsigned int map_size = size;
62 struct axmap *map;
63 uint64_t val = bit_off;
64 int i, err;
65
66 printf("Test multi %llu entries %u offset...", (unsigned long long) size, bit_off);
67 fflush(stdout);
68
69 map = axmap_new(map_size);
70 while (val + 128 <= map_size) {
71 err = 0;
72 for (i = val; i < val + 128; i++) {
73 if (axmap_isset(map, val + i)) {
74 printf("bit already set\n");
75 err = 1;
76 break;
77 }
78 }
79
80 if (err)
81 break;
82
83 err = axmap_set_nr(map, val, 128);
84 if (err != 128) {
85 printf("only set %u bits\n", err);
86 break;
87 }
88
89 err = 0;
90 for (i = 0; i < 128; i++) {
91 if (!axmap_isset(map, val + i)) {
92 printf("bit not set: %llu\n", (unsigned long long) val + i);
93 err = 1;
94 break;
95 }
96 }
97
98 val += 128;
99 if (err)
100 break;
101 }
102
103 if (!err)
104 printf("pass!\n");
105
106 axmap_free(map);
107 return err;
108}
109
9a5950bf
JA
110static int test_overlap(void)
111{
112 struct axmap *map;
113 int ret;
114
115 printf("Test overlaps...");
116 fflush(stdout);
117
118 map = axmap_new(200);
119
53bf886a
JA
120 ret = axmap_set_nr(map, 16, 16);
121 if (ret != 16) {
122 printf("fail 0 16: %d\n", ret);
123 return 1;
124 }
125
126 ret = axmap_set_nr(map, 0, 32);
127 if (ret != 16) {
128 printf("fail 0 32: %d\n", ret);
129 return 1;
130 }
131
132 ret = axmap_set_nr(map, 48, 32);
133 if (ret != 32) {
134 printf("fail 48 32: %d\n", ret);
135 return 1;
136 }
137
138 ret = axmap_set_nr(map, 32, 32);
139 if (ret != 16) {
140 printf("fail 32 32: %d\n", ret);
141 return 1;
142 }
143
9a5950bf
JA
144 ret = axmap_set_nr(map, 102, 1);
145 if (ret != 1) {
146 printf("fail 102 1: %d\n", ret);
147 return 1;
148 }
149
150 ret = axmap_set_nr(map, 101, 3);
151 if (ret != 1) {
152 printf("fail 102 1: %d\n", ret);
153 return 1;
154 }
155
156 ret = axmap_set_nr(map, 106, 4);
157 if (ret != 4) {
158 printf("fail 106 4: %d\n", ret);
159 return 1;
160 }
161
162 ret = axmap_set_nr(map, 105, 3);
163 if (ret != 1) {
164 printf("fail 105 3: %d\n", ret);
165 return 1;
166 }
167
168 ret = axmap_set_nr(map, 120, 4);
169 if (ret != 4) {
170 printf("fail 120 4: %d\n", ret);
171 return 1;
172 }
173
174 ret = axmap_set_nr(map, 118, 2);
175 if (ret != 2) {
176 printf("fail 118 2: %d\n", ret);
177 return 1;
178 }
179
180 ret = axmap_set_nr(map, 118, 2);
181 if (ret != 0) {
182 printf("fail 118 2: %d\n", ret);
183 return 1;
184 }
185
186 printf("pass!\n");
187 axmap_free(map);
188 return 0;
189}
190
a7448122
JA
191int main(int argc, char *argv[])
192{
193 size_t size = (1UL << 23) - 200;
194 int seed = 1;
195
196 if (argc > 1) {
197 size = strtoul(argv[1], NULL, 10);
198 if (argc > 2)
199 seed = strtoul(argv[2], NULL, 10);
200 }
201
202 if (test_regular(size, seed))
203 return 1;
204 if (test_multi(size, 0))
205 return 2;
206 if (test_multi(size, 17))
207 return 3;
9a5950bf
JA
208 if (test_overlap())
209 return 4;
a7448122 210
ad1f90aa
JA
211 return 0;
212}