Skip to content

Commit e9ddfa7

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

File tree

2 files changed

+158
-13
lines changed

2 files changed

+158
-13
lines changed

mk/tests.mk

Lines changed: 45 additions & 13 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,38 +29,59 @@ 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 \
3650
$(call notice, [OK]); \
3751
else \
3852
$(PRINTF) "Failed.\n"; \
3953
exit 1; \
40-
fi; \
54+
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: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
#include <assert.h>
2+
#include <stdint.h>
3+
#include <stdio.h>
4+
#include <stdlib.h>
5+
#include <time.h>
6+
7+
#include "map.h"
8+
9+
static void swap(int *x, int *y)
10+
{
11+
int tmp = *x;
12+
*x = *y;
13+
*y = tmp;
14+
}
15+
16+
enum { N_NODES = 10000 };
17+
18+
/* return 0 on success; non-zero values on failure */
19+
static int test_map_mixed_operations()
20+
{
21+
int ret = 0;
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+
ret = 1;
51+
goto free_tree;
52+
}
53+
assert((*(int *) (my_it.node->data)) == val[i]);
54+
}
55+
56+
/* remove first 1/4 items */
57+
for (int i = 0; i < N_NODES / 4; i++) {
58+
map_iter_t my_it;
59+
map_find(tree, &my_it, key + i);
60+
if (map_at_end(tree, &my_it))
61+
continue;
62+
map_erase(tree, &my_it);
63+
map_find(tree, &my_it, key + i);
64+
if (my_it.node) {
65+
ret = 1;
66+
goto free_tree;
67+
}
68+
}
69+
70+
/* add the rest */
71+
for (int i = N_NODES / 2 + 1; i < N_NODES; i++) {
72+
map_iter_t my_it;
73+
map_insert(tree, key + i, val + i);
74+
map_find(tree, &my_it, key + i);
75+
if (!my_it.node) {
76+
ret = 1; /* test fail */
77+
goto free_tree;
78+
}
79+
assert((*(int *) (my_it.node->data)) == val[i]);
80+
}
81+
82+
83+
/* remove 2nd quarter of items */
84+
for (int i = N_NODES / 4 + 1; i < N_NODES / 2; i++) {
85+
map_iter_t my_it;
86+
map_find(tree, &my_it, key + i);
87+
if (map_at_end(tree, &my_it)) {
88+
ret = 1; /* test fail */
89+
goto free_tree;
90+
}
91+
map_erase(tree, &my_it);
92+
map_find(tree, &my_it, key + i);
93+
if (my_it.node) {
94+
ret = 1; /* test fail */
95+
goto free_tree;
96+
}
97+
}
98+
99+
free_tree:
100+
map_clear(tree);
101+
map_delete(tree);
102+
return ret;
103+
}
104+
105+
int main(int argc, char *argv[])
106+
{
107+
(void) argc;
108+
(void) argv;
109+
110+
srand((unsigned) time(NULL));
111+
112+
return test_map_mixed_operations();
113+
}

0 commit comments

Comments
 (0)