t/axmap: add zero return overlap cases
[fio.git] / t / axmap.c
index 57c585b6798ae9a3d28b17f5a49a25062590ded4..ed078853e052f7fd7e237bd450f55c1c6cddeb83 100644 (file)
--- a/t/axmap.c
+++ b/t/axmap.c
@@ -1,23 +1,10 @@
 #include <stdio.h>
 #include <stdlib.h>
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
 #include <inttypes.h>
 
 #include "../lib/lfsr.h"
 #include "../lib/axmap.h"
 
-void *smalloc(size_t size)
-{
-       return malloc(size);
-}
-
-void sfree(void *ptr)
-{
-       free(ptr);
-}
-
 static int test_regular(size_t size, int seed)
 {
        struct fio_lfsr lfsr;
@@ -37,7 +24,7 @@ static int test_regular(size_t size, int seed)
        while (size--) {
                uint64_t val;
 
-               if (lfsr_next(&lfsr, &val, osize)) {
+               if (lfsr_next(&lfsr, &val)) {
                        printf("lfsr: short loop\n");
                        err = 1;
                        break;
@@ -120,6 +107,129 @@ static int test_multi(size_t size, unsigned int bit_off)
        return err;
 }
 
+struct overlap_test {
+       unsigned int start;
+       unsigned int nr;
+       unsigned int ret;
+};
+
+static int test_overlap(void)
+{
+       struct overlap_test tests[] = {
+               {
+                       .start  = 0,
+                       .nr     = 0,
+                       .ret    = 0,
+               },
+               {
+                       .start  = 16,
+                       .nr     = 16,
+                       .ret    = 16,
+               },
+               {
+                       .start  = 16,
+                       .nr     = 0,
+                       .ret    = 0,
+               },
+               {
+                       .start  = 0,
+                       .nr     = 32,
+                       .ret    = 16,
+               },
+               {
+                       .start  = 48,
+                       .nr     = 32,
+                       .ret    = 32,
+               },
+               {
+                       .start  = 32,
+                       .nr     = 32,
+                       .ret    = 16,
+               },
+               {
+                       .start  = 79,
+                       .nr     = 1,
+                       .ret    = 0,
+               },
+               {
+                       .start  = 80,
+                       .nr     = 21,
+                       .ret    = 21,
+               },
+               {
+                       .start  = 102,
+                       .nr     = 1,
+                       .ret    = 1,
+               },
+               {
+                       .start  = 101,
+                       .nr     = 3,
+                       .ret    = 1,
+               },
+               {
+                       .start  = 106,
+                       .nr     = 4,
+                       .ret    = 4,
+               },
+               {
+                       .start  = 105,
+                       .nr     = 3,
+                       .ret    = 1,
+               },
+               {
+                       .start  = 120,
+                       .nr     = 4,
+                       .ret    = 4,
+               },
+               {
+                       .start  = 118,
+                       .nr     = 2,
+                       .ret    = 2,
+               },
+               {
+                       .start  = 118,
+                       .nr     = 2,
+                       .ret    = 0,
+               },
+               {
+                       .start  = -1U,
+               },
+       };
+       struct axmap *map;
+       int entries, i, ret, err = 0;
+
+       entries = 0;
+       for (i = 0; tests[i].start != 1U; i++) {
+               unsigned int this = tests[i].start + tests[i].nr;
+
+               if (this > entries)
+                       entries = this;
+       }
+
+       printf("Test overlaps...");
+       fflush(stdout);
+
+       map = axmap_new(entries);
+
+       for (i = 0; tests[i].start != -1U; i++) {
+               struct overlap_test *t = &tests[i];
+
+               ret = axmap_set_nr(map, t->start, t->nr);
+               if (ret != t->ret) {
+                       printf("fail\n");
+                       printf("start=%u, nr=%d, ret=%d: %d\n", t->start, t->nr,
+                                                               t->ret, ret);
+                       err = 1;
+                       break;
+               }
+       }
+
+       if (!err)
+               printf("pass!\n");
+       axmap_free(map);
+       return err;
+}
+
 int main(int argc, char *argv[])
 {
        size_t size = (1UL << 23) - 200;
@@ -137,6 +247,8 @@ int main(int argc, char *argv[])
                return 2;
        if (test_multi(size, 17))
                return 3;
+       if (test_overlap())
+               return 4;
 
        return 0;
 }