t/axmap: add test for multi bit sets
authorJens Axboe <axboe@kernel.dk>
Fri, 29 Mar 2013 15:14:23 +0000 (09:14 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 29 Mar 2013 15:14:23 +0000 (09:14 -0600)
Signed-off-by: Jens Axboe <axboe@kernel.dk>
t/axmap.c

index 7ab500fa57804670d838468fc8a9cf6fe2280761..57c585b6798ae9a3d28b17f5a49a25062590ded4 100644 (file)
--- a/t/axmap.c
+++ b/t/axmap.c
@@ -18,49 +18,125 @@ void sfree(void *ptr)
        free(ptr);
 }
 
-int main(int argc, char *argv[])
+static int test_regular(size_t size, int seed)
 {
        struct fio_lfsr lfsr;
-       size_t osize, size = (1UL << 28) - 200;
        struct axmap *map;
+       size_t osize;
        uint64_t ff;
-       int seed = 1;
+       int err;
 
-       if (argc > 1) {
-               size = strtoul(argv[1], NULL, 10);
-               if (argc > 2)
-                       seed = strtoul(argv[2], NULL, 10);
-       }
-
-       printf("Using %llu entries\n", (unsigned long long) size);
+       printf("Using %llu entries...", (unsigned long long) size);
+       fflush(stdout);
 
        lfsr_init(&lfsr, size, seed, seed & 0xF);
        map = axmap_new(size);
        osize = size;
+       err = 0;
 
        while (size--) {
                uint64_t val;
 
                if (lfsr_next(&lfsr, &val, osize)) {
                        printf("lfsr: short loop\n");
+                       err = 1;
                        break;
                }
                if (axmap_isset(map, val)) {
                        printf("bit already set\n");
+                       err = 1;
                        break;
                }
                axmap_set(map, val);
                if (!axmap_isset(map, val)) {
                        printf("bit not set\n");
+                       err = 1;
                        break;
                }
        }
 
+       if (err)
+               return err;
+
        ff = axmap_next_free(map, osize);
        if (ff != (uint64_t) -1ULL) {
                printf("axmap_next_free broken: got %llu\n", (unsigned long long) ff);
                return 1;
        }
 
+       printf("pass!\n");
+       axmap_free(map);
+       return 0;
+}
+
+static int test_multi(size_t size, unsigned int bit_off)
+{
+       unsigned int map_size = size;
+       struct axmap *map;
+       uint64_t val = bit_off;
+       int i, err;
+
+       printf("Test multi %llu entries %u offset...", (unsigned long long) size, bit_off);
+       fflush(stdout);
+
+       map = axmap_new(map_size);
+       while (val + 128 <= map_size) {
+               err = 0;
+               for (i = val; i < val + 128; i++) {
+                       if (axmap_isset(map, val + i)) {
+                               printf("bit already set\n");
+                               err = 1;
+                               break;
+                       }
+               }
+
+               if (err)
+                       break;
+
+               err = axmap_set_nr(map, val, 128);
+               if (err != 128) {
+                       printf("only set %u bits\n", err);
+                       break;
+               }
+
+               err = 0;
+               for (i = 0; i < 128; i++) {
+                       if (!axmap_isset(map, val + i)) {
+                               printf("bit not set: %llu\n", (unsigned long long) val + i);
+                               err = 1;
+                               break;
+                       }
+               }
+
+               val += 128;
+               if (err)
+                       break;
+       }
+
+       if (!err)
+               printf("pass!\n");
+
+       axmap_free(map);
+       return err;
+}
+
+int main(int argc, char *argv[])
+{
+       size_t size = (1UL << 23) - 200;
+       int seed = 1;
+
+       if (argc > 1) {
+               size = strtoul(argv[1], NULL, 10);
+               if (argc > 2)
+                       seed = strtoul(argv[2], NULL, 10);
+       }
+
+       if (test_regular(size, seed))
+               return 1;
+       if (test_multi(size, 0))
+               return 2;
+       if (test_multi(size, 17))
+               return 3;
+
        return 0;
 }