aboutsummaryrefslogtreecommitdiff
path: root/src/lib/util/test_container_bloomfilter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/test_container_bloomfilter.c')
-rw-r--r--src/lib/util/test_container_bloomfilter.c302
1 files changed, 302 insertions, 0 deletions
diff --git a/src/lib/util/test_container_bloomfilter.c b/src/lib/util/test_container_bloomfilter.c
new file mode 100644
index 000000000..244733dd9
--- /dev/null
+++ b/src/lib/util/test_container_bloomfilter.c
@@ -0,0 +1,302 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2004, 2009 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/**
21 * @file util/test_container_bloomfilter.c
22 * @brief Testcase for the bloomfilter.
23 * @author Christian Grothoff
24 * @author Igor Wronsky
25 */
26
27
28#include "platform.h"
29#include "gnunet_util_lib.h"
30
31#define K 4
32#define SIZE 65536
33#define TESTFILE "/tmp/bloomtest.dat"
34
35
36static void
37bernd_interop (void)
38{
39 struct GNUNET_HashCode hc;
40 char val[128];
41 size_t len;
42 struct GNUNET_CONTAINER_BloomFilter *bf;
43
44 len = GNUNET_DNSPARSER_hex_to_bin (
45 "ac4d46b62f8ddaf3cefbc1c01e47536b7ff297cb081e27a396362b1e92e5729b",
46 val);
47 GNUNET_assert (len < 128);
48 GNUNET_CRYPTO_hash (val,
49 len,
50 &hc);
51 fprintf (stderr,
52 "sha512: %s\n",
53 GNUNET_DNSPARSER_bin_to_hex (&hc,
54 sizeof (hc)));
55 bf = GNUNET_CONTAINER_bloomfilter_init (NULL,
56 128,
57 16);
58 GNUNET_CONTAINER_bloomfilter_add (bf,
59 &hc);
60 len = GNUNET_CONTAINER_bloomfilter_get_size (bf);
61 {
62 char raw[len];
63
64 GNUNET_CONTAINER_bloomfilter_get_raw_data (bf,
65 raw,
66 len);
67 fprintf (stderr,
68 "BF: %s\n",
69 GNUNET_DNSPARSER_bin_to_hex (raw,
70 len));
71 }
72
73}
74
75
76/**
77 * Generate a random hashcode.
78 */
79static void
80nextHC (struct GNUNET_HashCode *hc)
81{
82 GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, hc);
83}
84
85
86static int
87add_iterator (void *cls, struct GNUNET_HashCode *next)
88{
89 int *ret = cls;
90 struct GNUNET_HashCode pos;
91
92 if (0 == (*ret)--)
93 return GNUNET_NO;
94 nextHC (&pos);
95 *next = pos;
96 return GNUNET_YES;
97}
98
99
100int
101main (int argc, char *argv[])
102{
103 struct GNUNET_CONTAINER_BloomFilter *bf;
104 struct GNUNET_CONTAINER_BloomFilter *bfi;
105 struct GNUNET_HashCode tmp;
106 int i;
107 int ok1;
108 int ok2;
109 int falseok;
110 char buf[SIZE];
111 struct stat sbuf;
112
113 GNUNET_log_setup ("test-container-bloomfilter",
114 "WARNING",
115 NULL);
116 if (0)
117 {
118 bernd_interop ();
119 return 0;
120 }
121 GNUNET_CRYPTO_seed_weak_random (1);
122 if (0 == stat (TESTFILE, &sbuf))
123 if (0 != unlink (TESTFILE))
124 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "unlink", TESTFILE);
125 bf = GNUNET_CONTAINER_bloomfilter_load (TESTFILE, SIZE, K);
126
127 for (i = 0; i < 200; i++)
128 {
129 nextHC (&tmp);
130 GNUNET_CONTAINER_bloomfilter_add (bf, &tmp);
131 }
132 GNUNET_CRYPTO_seed_weak_random (1);
133 ok1 = 0;
134 for (i = 0; i < 200; i++)
135 {
136 nextHC (&tmp);
137 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
138 ok1++;
139 }
140 if (ok1 != 200)
141 {
142 printf ("Got %d elements out of"
143 "200 expected after insertion.\n",
144 ok1);
145 GNUNET_CONTAINER_bloomfilter_free (bf);
146 return -1;
147 }
148 if (GNUNET_OK != GNUNET_CONTAINER_bloomfilter_get_raw_data (bf, buf, SIZE))
149 {
150 GNUNET_CONTAINER_bloomfilter_free (bf);
151 return -1;
152 }
153
154 GNUNET_CONTAINER_bloomfilter_free (bf);
155
156 bf = GNUNET_CONTAINER_bloomfilter_load (TESTFILE, SIZE, K);
157 GNUNET_assert (bf != NULL);
158 bfi = GNUNET_CONTAINER_bloomfilter_init (buf, SIZE, K);
159 GNUNET_assert (bfi != NULL);
160
161 GNUNET_CRYPTO_seed_weak_random (1);
162 ok1 = 0;
163 ok2 = 0;
164 for (i = 0; i < 200; i++)
165 {
166 nextHC (&tmp);
167 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
168 ok1++;
169 if (GNUNET_CONTAINER_bloomfilter_test (bfi, &tmp) == GNUNET_YES)
170 ok2++;
171 }
172 if (ok1 != 200)
173 {
174 printf ("Got %d elements out of 200 "
175 "expected after reloading.\n",
176 ok1);
177 GNUNET_CONTAINER_bloomfilter_free (bf);
178 GNUNET_CONTAINER_bloomfilter_free (bfi);
179 return -1;
180 }
181
182 if (ok2 != 200)
183 {
184 printf ("Got %d elements out of 200 "
185 "expected after initialization.\n",
186 ok2);
187 GNUNET_CONTAINER_bloomfilter_free (bf);
188 GNUNET_CONTAINER_bloomfilter_free (bfi);
189 return -1;
190 }
191
192 GNUNET_CRYPTO_seed_weak_random (1);
193 for (i = 0; i < 100; i++)
194 {
195 nextHC (&tmp);
196 GNUNET_CONTAINER_bloomfilter_remove (bf, &tmp);
197 GNUNET_CONTAINER_bloomfilter_remove (bfi, &tmp);
198 }
199
200 GNUNET_CRYPTO_seed_weak_random (1);
201
202 ok1 = 0;
203 ok2 = 0;
204 for (i = 0; i < 200; i++)
205 {
206 nextHC (&tmp);
207 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
208 ok1++;
209 if (GNUNET_CONTAINER_bloomfilter_test (bfi, &tmp) == GNUNET_YES)
210 ok2++;
211 }
212
213 if (ok1 != 100)
214 {
215 printf ("Expected 100 elements in loaded filter"
216 " after adding 200 and deleting 100, got %d\n",
217 ok1);
218 GNUNET_CONTAINER_bloomfilter_free (bf);
219 GNUNET_CONTAINER_bloomfilter_free (bfi);
220 return -1;
221 }
222 if (ok2 != 200)
223 {
224 printf ("Expected 200 elements in initialized filter"
225 " after adding 200 and deleting 100 "
226 "(which should do nothing for a filter not backed by a file), got %d\n",
227 ok2);
228 GNUNET_CONTAINER_bloomfilter_free (bf);
229 GNUNET_CONTAINER_bloomfilter_free (bfi);
230 return -1;
231 }
232
233 GNUNET_CRYPTO_seed_weak_random (3);
234
235 GNUNET_CONTAINER_bloomfilter_clear (bf);
236 falseok = 0;
237 for (i = 0; i < 1000; i++)
238 {
239 nextHC (&tmp);
240 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
241 falseok++;
242 }
243 if (falseok > 0)
244 {
245 GNUNET_CONTAINER_bloomfilter_free (bf);
246 GNUNET_CONTAINER_bloomfilter_free (bfi);
247 return -1;
248 }
249
250 if (GNUNET_OK != GNUNET_CONTAINER_bloomfilter_or (bf, buf, SIZE))
251 {
252 GNUNET_CONTAINER_bloomfilter_free (bf);
253 GNUNET_CONTAINER_bloomfilter_free (bfi);
254 return -1;
255 }
256
257 GNUNET_CRYPTO_seed_weak_random (2);
258 i = 20;
259 GNUNET_CONTAINER_bloomfilter_resize (bfi, &add_iterator, &i, SIZE * 2, K);
260
261 GNUNET_CRYPTO_seed_weak_random (2);
262 i = 20;
263 GNUNET_CONTAINER_bloomfilter_resize (bf, &add_iterator, &i, SIZE * 2, K);
264 GNUNET_CRYPTO_seed_weak_random (2);
265
266 ok1 = 0;
267 ok2 = 0;
268 for (i = 0; i < 20; i++)
269 {
270 nextHC (&tmp);
271 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
272 ok1++;
273 if (GNUNET_CONTAINER_bloomfilter_test (bfi, &tmp) == GNUNET_YES)
274 ok2++;
275 }
276
277 if (ok1 != 20)
278 {
279 printf ("Expected 20 elements in resized file-backed filter"
280 " after adding 20, got %d\n",
281 ok1);
282 GNUNET_CONTAINER_bloomfilter_free (bf);
283 GNUNET_CONTAINER_bloomfilter_free (bfi);
284 return -1;
285 }
286 if (ok2 != 20)
287 {
288 printf ("Expected 20 elements in resized filter"
289 " after adding 20, got %d\n",
290 ok2);
291 GNUNET_CONTAINER_bloomfilter_free (bf);
292 GNUNET_CONTAINER_bloomfilter_free (bfi);
293 return -1;
294 }
295
296
297 GNUNET_CONTAINER_bloomfilter_free (bf);
298 GNUNET_CONTAINER_bloomfilter_free (bfi);
299
300 GNUNET_break (0 == unlink (TESTFILE));
301 return 0;
302}