aboutsummaryrefslogtreecommitdiff
path: root/src/util/test_container_bloomfilter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/test_container_bloomfilter.c')
-rw-r--r--src/util/test_container_bloomfilter.c301
1 files changed, 0 insertions, 301 deletions
diff --git a/src/util/test_container_bloomfilter.c b/src/util/test_container_bloomfilter.c
deleted file mode 100644
index 06a3fb500..000000000
--- a/src/util/test_container_bloomfilter.c
+++ /dev/null
@@ -1,301 +0,0 @@
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#include "platform.h"
28#include "gnunet_util_lib.h"
29
30#define K 4
31#define SIZE 65536
32#define TESTFILE "/tmp/bloomtest.dat"
33
34
35static void
36bernd_interop (void)
37{
38 struct GNUNET_HashCode hc;
39 char val[128];
40 size_t len;
41 struct GNUNET_CONTAINER_BloomFilter *bf;
42
43 len = GNUNET_DNSPARSER_hex_to_bin (
44 "ac4d46b62f8ddaf3cefbc1c01e47536b7ff297cb081e27a396362b1e92e5729b",
45 val);
46 GNUNET_assert (len < 128);
47 GNUNET_CRYPTO_hash (val,
48 len,
49 &hc);
50 fprintf (stderr,
51 "sha512: %s\n",
52 GNUNET_DNSPARSER_bin_to_hex (&hc,
53 sizeof (hc)));
54 bf = GNUNET_CONTAINER_bloomfilter_init (NULL,
55 128,
56 16);
57 GNUNET_CONTAINER_bloomfilter_add (bf,
58 &hc);
59 len = GNUNET_CONTAINER_bloomfilter_get_size (bf);
60 {
61 char raw[len];
62
63 GNUNET_CONTAINER_bloomfilter_get_raw_data (bf,
64 raw,
65 len);
66 fprintf (stderr,
67 "BF: %s\n",
68 GNUNET_DNSPARSER_bin_to_hex (raw,
69 len));
70 }
71
72}
73
74
75/**
76 * Generate a random hashcode.
77 */
78static void
79nextHC (struct GNUNET_HashCode *hc)
80{
81 GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, hc);
82}
83
84
85static int
86add_iterator (void *cls, struct GNUNET_HashCode *next)
87{
88 int *ret = cls;
89 struct GNUNET_HashCode pos;
90
91 if (0 == (*ret)--)
92 return GNUNET_NO;
93 nextHC (&pos);
94 *next = pos;
95 return GNUNET_YES;
96}
97
98
99int
100main (int argc, char *argv[])
101{
102 struct GNUNET_CONTAINER_BloomFilter *bf;
103 struct GNUNET_CONTAINER_BloomFilter *bfi;
104 struct GNUNET_HashCode tmp;
105 int i;
106 int ok1;
107 int ok2;
108 int falseok;
109 char buf[SIZE];
110 struct stat sbuf;
111
112 GNUNET_log_setup ("test-container-bloomfilter",
113 "WARNING",
114 NULL);
115 if (0)
116 {
117 bernd_interop ();
118 return 0;
119 }
120 GNUNET_CRYPTO_seed_weak_random (1);
121 if (0 == stat (TESTFILE, &sbuf))
122 if (0 != unlink (TESTFILE))
123 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "unlink", TESTFILE);
124 bf = GNUNET_CONTAINER_bloomfilter_load (TESTFILE, SIZE, K);
125
126 for (i = 0; i < 200; i++)
127 {
128 nextHC (&tmp);
129 GNUNET_CONTAINER_bloomfilter_add (bf, &tmp);
130 }
131 GNUNET_CRYPTO_seed_weak_random (1);
132 ok1 = 0;
133 for (i = 0; i < 200; i++)
134 {
135 nextHC (&tmp);
136 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
137 ok1++;
138 }
139 if (ok1 != 200)
140 {
141 printf ("Got %d elements out of"
142 "200 expected after insertion.\n",
143 ok1);
144 GNUNET_CONTAINER_bloomfilter_free (bf);
145 return -1;
146 }
147 if (GNUNET_OK != GNUNET_CONTAINER_bloomfilter_get_raw_data (bf, buf, SIZE))
148 {
149 GNUNET_CONTAINER_bloomfilter_free (bf);
150 return -1;
151 }
152
153 GNUNET_CONTAINER_bloomfilter_free (bf);
154
155 bf = GNUNET_CONTAINER_bloomfilter_load (TESTFILE, SIZE, K);
156 GNUNET_assert (bf != NULL);
157 bfi = GNUNET_CONTAINER_bloomfilter_init (buf, SIZE, K);
158 GNUNET_assert (bfi != NULL);
159
160 GNUNET_CRYPTO_seed_weak_random (1);
161 ok1 = 0;
162 ok2 = 0;
163 for (i = 0; i < 200; i++)
164 {
165 nextHC (&tmp);
166 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
167 ok1++;
168 if (GNUNET_CONTAINER_bloomfilter_test (bfi, &tmp) == GNUNET_YES)
169 ok2++;
170 }
171 if (ok1 != 200)
172 {
173 printf ("Got %d elements out of 200 "
174 "expected after reloading.\n",
175 ok1);
176 GNUNET_CONTAINER_bloomfilter_free (bf);
177 GNUNET_CONTAINER_bloomfilter_free (bfi);
178 return -1;
179 }
180
181 if (ok2 != 200)
182 {
183 printf ("Got %d elements out of 200 "
184 "expected after initialization.\n",
185 ok2);
186 GNUNET_CONTAINER_bloomfilter_free (bf);
187 GNUNET_CONTAINER_bloomfilter_free (bfi);
188 return -1;
189 }
190
191 GNUNET_CRYPTO_seed_weak_random (1);
192 for (i = 0; i < 100; i++)
193 {
194 nextHC (&tmp);
195 GNUNET_CONTAINER_bloomfilter_remove (bf, &tmp);
196 GNUNET_CONTAINER_bloomfilter_remove (bfi, &tmp);
197 }
198
199 GNUNET_CRYPTO_seed_weak_random (1);
200
201 ok1 = 0;
202 ok2 = 0;
203 for (i = 0; i < 200; i++)
204 {
205 nextHC (&tmp);
206 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
207 ok1++;
208 if (GNUNET_CONTAINER_bloomfilter_test (bfi, &tmp) == GNUNET_YES)
209 ok2++;
210 }
211
212 if (ok1 != 100)
213 {
214 printf ("Expected 100 elements in loaded filter"
215 " after adding 200 and deleting 100, got %d\n",
216 ok1);
217 GNUNET_CONTAINER_bloomfilter_free (bf);
218 GNUNET_CONTAINER_bloomfilter_free (bfi);
219 return -1;
220 }
221 if (ok2 != 200)
222 {
223 printf ("Expected 200 elements in initialized filter"
224 " after adding 200 and deleting 100 "
225 "(which should do nothing for a filter not backed by a file), got %d\n",
226 ok2);
227 GNUNET_CONTAINER_bloomfilter_free (bf);
228 GNUNET_CONTAINER_bloomfilter_free (bfi);
229 return -1;
230 }
231
232 GNUNET_CRYPTO_seed_weak_random (3);
233
234 GNUNET_CONTAINER_bloomfilter_clear (bf);
235 falseok = 0;
236 for (i = 0; i < 1000; i++)
237 {
238 nextHC (&tmp);
239 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
240 falseok++;
241 }
242 if (falseok > 0)
243 {
244 GNUNET_CONTAINER_bloomfilter_free (bf);
245 GNUNET_CONTAINER_bloomfilter_free (bfi);
246 return -1;
247 }
248
249 if (GNUNET_OK != GNUNET_CONTAINER_bloomfilter_or (bf, buf, SIZE))
250 {
251 GNUNET_CONTAINER_bloomfilter_free (bf);
252 GNUNET_CONTAINER_bloomfilter_free (bfi);
253 return -1;
254 }
255
256 GNUNET_CRYPTO_seed_weak_random (2);
257 i = 20;
258 GNUNET_CONTAINER_bloomfilter_resize (bfi, &add_iterator, &i, SIZE * 2, K);
259
260 GNUNET_CRYPTO_seed_weak_random (2);
261 i = 20;
262 GNUNET_CONTAINER_bloomfilter_resize (bf, &add_iterator, &i, SIZE * 2, K);
263 GNUNET_CRYPTO_seed_weak_random (2);
264
265 ok1 = 0;
266 ok2 = 0;
267 for (i = 0; i < 20; i++)
268 {
269 nextHC (&tmp);
270 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
271 ok1++;
272 if (GNUNET_CONTAINER_bloomfilter_test (bfi, &tmp) == GNUNET_YES)
273 ok2++;
274 }
275
276 if (ok1 != 20)
277 {
278 printf ("Expected 20 elements in resized file-backed filter"
279 " after adding 20, got %d\n",
280 ok1);
281 GNUNET_CONTAINER_bloomfilter_free (bf);
282 GNUNET_CONTAINER_bloomfilter_free (bfi);
283 return -1;
284 }
285 if (ok2 != 20)
286 {
287 printf ("Expected 20 elements in resized filter"
288 " after adding 20, got %d\n",
289 ok2);
290 GNUNET_CONTAINER_bloomfilter_free (bf);
291 GNUNET_CONTAINER_bloomfilter_free (bfi);
292 return -1;
293 }
294
295
296 GNUNET_CONTAINER_bloomfilter_free (bf);
297 GNUNET_CONTAINER_bloomfilter_free (bfi);
298
299 GNUNET_break (0 == unlink (TESTFILE));
300 return 0;
301}