Home | History | Annotate | Download | only in t
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <fcntl.h>
      4 #include <string.h>
      5 #include <unistd.h>
      6 #include <inttypes.h>
      7 
      8 #include "../lib/lfsr.h"
      9 #include "../lib/axmap.h"
     10 
     11 void *smalloc(size_t size)
     12 {
     13 	return malloc(size);
     14 }
     15 
     16 void sfree(void *ptr)
     17 {
     18 	free(ptr);
     19 }
     20 
     21 static int test_regular(size_t size, int seed)
     22 {
     23 	struct fio_lfsr lfsr;
     24 	struct axmap *map;
     25 	size_t osize;
     26 	uint64_t ff;
     27 	int err;
     28 
     29 	printf("Using %llu entries...", (unsigned long long) size);
     30 	fflush(stdout);
     31 
     32 	lfsr_init(&lfsr, size, seed, seed & 0xF);
     33 	map = axmap_new(size);
     34 	osize = size;
     35 	err = 0;
     36 
     37 	while (size--) {
     38 		uint64_t val;
     39 
     40 		if (lfsr_next(&lfsr, &val)) {
     41 			printf("lfsr: short loop\n");
     42 			err = 1;
     43 			break;
     44 		}
     45 		if (axmap_isset(map, val)) {
     46 			printf("bit already set\n");
     47 			err = 1;
     48 			break;
     49 		}
     50 		axmap_set(map, val);
     51 		if (!axmap_isset(map, val)) {
     52 			printf("bit not set\n");
     53 			err = 1;
     54 			break;
     55 		}
     56 	}
     57 
     58 	if (err)
     59 		return err;
     60 
     61 	ff = axmap_next_free(map, osize);
     62 	if (ff != (uint64_t) -1ULL) {
     63 		printf("axmap_next_free broken: got %llu\n", (unsigned long long) ff);
     64 		return 1;
     65 	}
     66 
     67 	printf("pass!\n");
     68 	axmap_free(map);
     69 	return 0;
     70 }
     71 
     72 static int test_multi(size_t size, unsigned int bit_off)
     73 {
     74 	unsigned int map_size = size;
     75 	struct axmap *map;
     76 	uint64_t val = bit_off;
     77 	int i, err;
     78 
     79 	printf("Test multi %llu entries %u offset...", (unsigned long long) size, bit_off);
     80 	fflush(stdout);
     81 
     82 	map = axmap_new(map_size);
     83 	while (val + 128 <= map_size) {
     84 		err = 0;
     85 		for (i = val; i < val + 128; i++) {
     86 			if (axmap_isset(map, val + i)) {
     87 				printf("bit already set\n");
     88 				err = 1;
     89 				break;
     90 			}
     91 		}
     92 
     93 		if (err)
     94 			break;
     95 
     96 		err = axmap_set_nr(map, val, 128);
     97 		if (err != 128) {
     98 			printf("only set %u bits\n", err);
     99 			break;
    100 		}
    101 
    102 		err = 0;
    103 		for (i = 0; i < 128; i++) {
    104 			if (!axmap_isset(map, val + i)) {
    105 				printf("bit not set: %llu\n", (unsigned long long) val + i);
    106 				err = 1;
    107 				break;
    108 			}
    109 		}
    110 
    111 		val += 128;
    112 		if (err)
    113 			break;
    114 	}
    115 
    116 	if (!err)
    117 		printf("pass!\n");
    118 
    119 	axmap_free(map);
    120 	return err;
    121 }
    122 
    123 int main(int argc, char *argv[])
    124 {
    125 	size_t size = (1UL << 23) - 200;
    126 	int seed = 1;
    127 
    128 	if (argc > 1) {
    129 		size = strtoul(argv[1], NULL, 10);
    130 		if (argc > 2)
    131 			seed = strtoul(argv[2], NULL, 10);
    132 	}
    133 
    134 	if (test_regular(size, seed))
    135 		return 1;
    136 	if (test_multi(size, 0))
    137 		return 2;
    138 	if (test_multi(size, 17))
    139 		return 3;
    140 
    141 	return 0;
    142 }
    143