]> git.ozlabs.org Git - ccan/blob - ccan/invbloom/test/run.c
take, tal, tal/path, tal/str, tal/talloc: annotate APIs with TAKES.
[ccan] / ccan / invbloom / test / run.c
1 #include <ccan/invbloom/invbloom.h>
2 /* Include the C files directly. */
3 #include <ccan/invbloom/invbloom.c>
4 #include <ccan/tap/tap.h>
5
6 int main(void)
7 {
8         struct invbloom *ib;
9         const tal_t *ctx = tal(NULL, char);
10         int val, val2, *ip, *ip2, i;
11
12         /* This is how many tests you plan to run */
13         plan_tests(127);
14
15         ib = invbloom_new(ctx, int, 1, 100);
16         ok1(tal_parent(ib) == ctx);
17         ok1(ib->id_size == sizeof(int));
18         ok1(ib->salt == 100);
19         ok1(ib->n_elems == 1);
20         ok1(invbloom_empty(ib));
21
22         val = 0;
23         invbloom_insert(ib, &val);
24         ok1(ib->count[0] == NUM_HASHES);
25         ok1(!invbloom_empty(ib));
26         invbloom_delete(ib, &val);
27         ok1(invbloom_empty(ib));
28
29         val2 = 2;
30         invbloom_insert(ib, &val);
31         invbloom_insert(ib, &val2);
32         ok1(!invbloom_empty(ib));
33         invbloom_delete(ib, &val);
34         ok1(!invbloom_empty(ib));
35         invbloom_delete(ib, &val2);
36         ok1(invbloom_empty(ib));
37
38         tal_free(ib);
39
40         ib = invbloom_new(ctx, int, 1, 100);
41         ok1(tal_parent(ib) == ctx);
42         ok1(ib->id_size == sizeof(int));
43         ok1(ib->salt == 100);
44         ok1(ib->n_elems == 1);
45         ok1(invbloom_empty(ib));
46
47         val = 0;
48         invbloom_insert(ib, &val);
49         ok1(ib->count[0] == NUM_HASHES);
50         ok1(!invbloom_empty(ib));
51         invbloom_delete(ib, &val);
52         ok1(invbloom_empty(ib));
53
54         val2 = 2;
55         invbloom_insert(ib, &val);
56         invbloom_insert(ib, &val2);
57         ok1(!invbloom_empty(ib));
58         invbloom_delete(ib, &val);
59         ok1(!invbloom_empty(ib));
60         invbloom_delete(ib, &val2);
61         ok1(invbloom_empty(ib));
62
63         tal_free(ib);
64
65         /* Now, a more realistic test. */
66         for (i = 0; i < 5; i++) {
67                 ib = invbloom_new(ctx, int, 1024, i);
68                 invbloom_insert(ib, &val);
69                 invbloom_insert(ib, &val2);
70                 ok1(invbloom_get(ib, &val));
71                 ok1(invbloom_get(ib, &val2));
72
73                 ip = invbloom_extract_negative(ctx, ib);
74                 ok1(!ip);
75
76                 ip = invbloom_extract(ctx, ib);
77                 ok1(ip);
78                 ok1(tal_parent(ip) == ctx);
79                 ok1(*ip == val || *ip == val2);
80
81                 ip2 = invbloom_extract(ctx, ib);
82                 ok1(ip2);
83                 ok1(tal_parent(ip2) == ctx);
84                 ok1(*ip2 == val || *ip2 == val2);
85                 ok1(*ip2 != *ip);
86
87                 ok1(invbloom_extract(ctx, ib) == NULL);
88
89                 invbloom_delete(ib, &val);
90                 invbloom_delete(ib, &val2);
91                 ip = invbloom_extract(ctx, ib);
92                 ok1(!ip);
93
94                 ip = invbloom_extract_negative(ctx, ib);
95                 ok1(ip);
96                 ok1(tal_parent(ip) == ctx);
97                 ok1(*ip == val || *ip == val2);
98
99                 ip2 = invbloom_extract_negative(ctx, ib);
100                 ok1(ip2);
101                 ok1(tal_parent(ip2) == ctx);
102                 ok1(*ip2 == val || *ip2 == val2);
103                 ok1(*ip2 != *ip);
104
105                 ok1(invbloom_extract_negative(ctx, ib) == NULL);
106                 ok1(invbloom_empty(ib));
107
108                 tal_free(ib);
109         }
110
111         tal_free(ctx);
112
113         /* This exits depending on whether all tests passed */
114         return exit_status();
115 }