Skip to content

Commit e01dae8

Browse files
committed
Add test case for map API
1 parent 830d41d commit e01dae8

File tree

2 files changed

+151
-12
lines changed

2 files changed

+151
-12
lines changed

mk/tests.mk

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
CACHE_TEST_DIR := tests/cache
22
CACHE_BUILD_DIR := build/cache
3-
TARGET := test-cache
3+
CACHE_TARGET := test-cache
4+
5+
MAP_TEST_DIR := tests/map
6+
MAP_BUILD_DIR:= build/map
7+
MAP_TARGET := test-map
48

59
CACHE_OBJS := \
610
test-cache.o
711

12+
MAP_OBJS := \
13+
test-map.o
14+
815
CACHE_OBJS := $(addprefix $(CACHE_BUILD_DIR)/, $(CACHE_OBJS))
916
OBJS += $(CACHE_OBJS)
1017
deps += $(CACHE_OBJS:%.o=%.o.d)
1118

12-
# Check adaptive replacement cache policy is enabled or not, default is LRU
19+
MAP_OBJS := $(addprefix $(MAP_BUILD_DIR)/, $(MAP_OBJS))
20+
OBJS += $(MAP_OBJS)
21+
deps += $(MAP_OBJS:%.o=%.o.d)
22+
23+
# Check adaptive replacement cache policy is enabled or not, default is LRU
1324
ifeq ($(ENABLE_ARC), 1)
1425
CACHE_CHECK_ELF_FILES := \
1526
arc/cache-new \
@@ -18,18 +29,21 @@ CACHE_CHECK_ELF_FILES := \
1829
arc/cache-lru-replace \
1930
arc/cache-lfu-replace \
2031
arc/cache-lru-ghost-replace \
21-
arc/cache-lfu-ghost-replace
32+
arc/cache-lfu-ghost-replace
2233
else
2334
CACHE_CHECK_ELF_FILES := \
2435
lfu/cache-new \
2536
lfu/cache-put \
2637
lfu/cache-get \
27-
lfu/cache-lfu-replace
38+
lfu/cache-lfu-replace
2839
endif
2940

3041
CACHE_OUT = $(addprefix $(CACHE_BUILD_DIR)/, $(CACHE_CHECK_ELF_FILES:%=%.out))
42+
MAP_OUT = $(addprefix $(MAP_BUILD_DIR)/$(MAP_TARGET), ".out")
3143

32-
tests : $(CACHE_OUT)
44+
tests : run_cache_test run_map_test
45+
46+
run_cache_test : $(CACHE_OUT)
3347
$(Q)$(foreach e,$(CACHE_CHECK_ELF_FILES),\
3448
$(PRINTF) "Running $(e) ... "; \
3549
if cmp $(CACHE_TEST_DIR)/$(e).expect $(CACHE_BUILD_DIR)/$(e).out; then \
@@ -40,16 +54,34 @@ tests : $(CACHE_OUT)
4054
fi; \
4155
)
4256

43-
$(CACHE_OUT): $(TARGET)
57+
run_map_test: $(MAP_TARGET)
58+
59+
$(CACHE_OUT): $(CACHE_TARGET)
4460
$(Q)$(foreach e,$(CACHE_CHECK_ELF_FILES),\
45-
$(CACHE_BUILD_DIR)/$(TARGET) $(CACHE_TEST_DIR)/$(e).in > $(CACHE_BUILD_DIR)/$(e).out; \
61+
$(CACHE_BUILD_DIR)/$(CACHE_TARGET) $(CACHE_TEST_DIR)/$(e).in > $(CACHE_BUILD_DIR)/$(e).out; \
4662
)
4763

48-
$(TARGET): $(CACHE_OBJS)
64+
$(CACHE_TARGET): $(CACHE_OBJS)
4965
$(VECHO) " CC\t$@\n"
50-
$(Q)$(CC) $^ build/cache.o build/mpool.o -o $(CACHE_BUILD_DIR)/$(TARGET)
51-
52-
$(CACHE_BUILD_DIR)/%.o: $(CACHE_TEST_DIR)/%.c
66+
$(Q)$(CC) $^ build/cache.o build/mpool.o -o $(CACHE_BUILD_DIR)/$(CACHE_TARGET)
67+
68+
$(CACHE_BUILD_DIR)/%.o: $(CACHE_TEST_DIR)/%.c
5369
$(VECHO) " CC\t$@\n"
5470
$(Q)mkdir -p $(dir $@)/arc $(dir $@)/lfu
55-
$(Q)$(CC) -o $@ $(CFLAGS) -I./src -c -MMD -MF $@.d $<
71+
$(Q)$(CC) -o $@ $(CFLAGS) -I./src -c -MMD -MF $@.d $<
72+
73+
$(MAP_TARGET): $(MAP_OBJS)
74+
$(VECHO) " CC\t$@\n"
75+
$(Q)$(CC) $^ build/map.o -o $(MAP_BUILD_DIR)/$(MAP_TARGET)
76+
$(Q)$(MAP_BUILD_DIR)/$(MAP_TARGET)
77+
$(Q)$(PRINTF) "Running test-map ... "; \
78+
if [ $$? -eq 0 ]; then \
79+
$(call notice, [OK]); \
80+
else \
81+
$(PRINTF) "Failed.\n"; \
82+
fi; \
83+
84+
$(MAP_BUILD_DIR)/%.o: $(MAP_TEST_DIR)/%.c
85+
$(VECHO) " CC\t$@\n"
86+
$(Q)mkdir -p $(dir $@)
87+
$(Q)$(CC) -o $@ $(CFLAGS) -I./src -c -MMD -MF $@.d $<

tests/map/test-map.c

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#include <assert.h>
2+
#include <stdbool.h>
3+
#include <stdint.h>
4+
#include <stdio.h>
5+
#include <stdlib.h>
6+
#include <time.h>
7+
8+
#include "map.h"
9+
10+
static void swap(int *x, int *y)
11+
{
12+
int tmp = *x;
13+
*x = *y;
14+
*y = tmp;
15+
}
16+
17+
enum { N_NODES = 10000 };
18+
19+
/* return 0 on success; non-zero values on failure */
20+
static int test_map_mixed_operations()
21+
{
22+
map_t tree = map_init(int, int, map_cmp_uint);
23+
24+
int key[N_NODES], val[N_NODES];
25+
26+
/*
27+
* Generate data for insertion
28+
*/
29+
for (int i = 0; i < N_NODES; i++) {
30+
key[i] = i;
31+
val[i] = i + 1;
32+
}
33+
34+
/* TODO: This is not a reconmended way to randomize stuff, just a simple
35+
* test. Using MT19937 might be better
36+
*/
37+
for (int i = 0; i < N_NODES; i++) {
38+
int pos_a = rand() % N_NODES;
39+
int pos_b = rand() % N_NODES;
40+
swap(&key[pos_a], &key[pos_b]);
41+
swap(&val[pos_a], &val[pos_b]);
42+
}
43+
44+
/* add first 1/2 items */
45+
for (int i = 0; i < N_NODES / 2; i++) {
46+
map_iter_t my_it;
47+
map_insert(tree, key + i, val + i);
48+
map_find(tree, &my_it, key + i);
49+
if (!my_it.node)
50+
return 1; /* test failed */
51+
assert(my_it.node);
52+
assert((*(int *) (my_it.node->data)) == val[i]);
53+
}
54+
55+
/* remove first 1/4 items */
56+
for (int i = 0; i < N_NODES / 4; i++) {
57+
map_iter_t my_it;
58+
map_find(tree, &my_it, key + i);
59+
if (map_at_end(tree, &my_it))
60+
continue;
61+
map_erase(tree, &my_it);
62+
map_find(tree, &my_it, key + i);
63+
if (my_it.node)
64+
return 1; /* test failed */
65+
assert(!my_it.node);
66+
}
67+
68+
/* add the rest */
69+
for (int i = N_NODES / 2 + 1; i < N_NODES; i++) {
70+
map_iter_t my_it;
71+
map_insert(tree, key + i, val + i);
72+
map_find(tree, &my_it, key + i);
73+
if (!my_it.node)
74+
return 1; /* test failed */
75+
assert(my_it.node);
76+
assert((*(int *) (my_it.node->data)) == val[i]);
77+
}
78+
79+
80+
/* remove 2nd quarter of items */
81+
for (int i = N_NODES / 4 + 1; i < N_NODES / 2; i++) {
82+
map_iter_t my_it;
83+
map_find(tree, &my_it, key + i);
84+
if (map_at_end(tree, &my_it))
85+
continue;
86+
map_erase(tree, &my_it);
87+
map_find(tree, &my_it, key + i);
88+
if (my_it.node)
89+
return 1; /* test failed */
90+
assert(!my_it.node);
91+
}
92+
93+
map_clear(tree);
94+
map_delete(tree);
95+
96+
return 0; /* test success */
97+
}
98+
99+
int main(int argc, char *argv[])
100+
{
101+
(void) argc;
102+
(void) argv;
103+
104+
srand((unsigned) time(NULL));
105+
106+
return test_map_mixed_operations();
107+
}

0 commit comments

Comments
 (0)