2 This file is part of GNUnet.
3 Copyright (C) 2004, 2009 GNUnet e.V.
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.
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.
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/>.
19 * @file util/test_container_bloomfilter.c
20 * @brief Testcase for the bloomfilter.
21 * @author Christian Grothoff
22 * @author Igor Wronsky
26 #include "gnunet_util_lib.h"
30 #define TESTFILE "/tmp/bloomtest.dat"
33 * Generate a random hashcode.
36 nextHC (struct GNUNET_HashCode * hc)
38 GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, hc);
42 add_iterator (void *cls, struct GNUNET_HashCode * next)
45 struct GNUNET_HashCode pos;
55 main (int argc, char *argv[])
57 struct GNUNET_CONTAINER_BloomFilter *bf;
58 struct GNUNET_CONTAINER_BloomFilter *bfi;
59 struct GNUNET_HashCode tmp;
67 GNUNET_log_setup ("test-container-bloomfilter", "WARNING", NULL);
68 GNUNET_CRYPTO_seed_weak_random (1);
69 if (0 == STAT (TESTFILE, &sbuf))
70 if (0 != UNLINK (TESTFILE))
71 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "unlink", TESTFILE);
72 bf = GNUNET_CONTAINER_bloomfilter_load (TESTFILE, SIZE, K);
74 for (i = 0; i < 200; i++)
77 GNUNET_CONTAINER_bloomfilter_add (bf, &tmp);
79 GNUNET_CRYPTO_seed_weak_random (1);
81 for (i = 0; i < 200; i++)
84 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
89 printf ("Got %d elements out of" "200 expected after insertion.\n", ok1);
90 GNUNET_CONTAINER_bloomfilter_free (bf);
93 if (GNUNET_OK != GNUNET_CONTAINER_bloomfilter_get_raw_data (bf, buf, SIZE))
95 GNUNET_CONTAINER_bloomfilter_free (bf);
99 GNUNET_CONTAINER_bloomfilter_free (bf);
101 bf = GNUNET_CONTAINER_bloomfilter_load (TESTFILE, SIZE, K);
102 GNUNET_assert (bf != NULL);
103 bfi = GNUNET_CONTAINER_bloomfilter_init (buf, SIZE, K);
104 GNUNET_assert (bfi != NULL);
106 GNUNET_CRYPTO_seed_weak_random (1);
109 for (i = 0; i < 200; i++)
112 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
114 if (GNUNET_CONTAINER_bloomfilter_test (bfi, &tmp) == GNUNET_YES)
119 printf ("Got %d elements out of 200 " "expected after reloading.\n", ok1);
120 GNUNET_CONTAINER_bloomfilter_free (bf);
121 GNUNET_CONTAINER_bloomfilter_free (bfi);
127 printf ("Got %d elements out of 200 " "expected after initialization.\n",
129 GNUNET_CONTAINER_bloomfilter_free (bf);
130 GNUNET_CONTAINER_bloomfilter_free (bfi);
134 GNUNET_CRYPTO_seed_weak_random (1);
135 for (i = 0; i < 100; i++)
138 GNUNET_CONTAINER_bloomfilter_remove (bf, &tmp);
139 GNUNET_CONTAINER_bloomfilter_remove (bfi, &tmp);
142 GNUNET_CRYPTO_seed_weak_random (1);
146 for (i = 0; i < 200; i++)
149 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
151 if (GNUNET_CONTAINER_bloomfilter_test (bfi, &tmp) == GNUNET_YES)
157 printf ("Expected 100 elements in loaded filter"
158 " after adding 200 and deleting 100, got %d\n", ok1);
159 GNUNET_CONTAINER_bloomfilter_free (bf);
160 GNUNET_CONTAINER_bloomfilter_free (bfi);
165 printf ("Expected 200 elements in initialized filter"
166 " after adding 200 and deleting 100 "
167 "(which should do nothing for a filter not backed by a file), got %d\n",
169 GNUNET_CONTAINER_bloomfilter_free (bf);
170 GNUNET_CONTAINER_bloomfilter_free (bfi);
174 GNUNET_CRYPTO_seed_weak_random (3);
176 GNUNET_CONTAINER_bloomfilter_clear (bf);
178 for (i = 0; i < 1000; i++)
181 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
186 GNUNET_CONTAINER_bloomfilter_free (bf);
187 GNUNET_CONTAINER_bloomfilter_free (bfi);
191 if (GNUNET_OK != GNUNET_CONTAINER_bloomfilter_or (bf, buf, SIZE))
193 GNUNET_CONTAINER_bloomfilter_free (bf);
194 GNUNET_CONTAINER_bloomfilter_free (bfi);
198 GNUNET_CRYPTO_seed_weak_random (2);
200 GNUNET_CONTAINER_bloomfilter_resize (bfi, &add_iterator, &i, SIZE * 2, K);
202 GNUNET_CRYPTO_seed_weak_random (2);
204 GNUNET_CONTAINER_bloomfilter_resize (bf, &add_iterator, &i, SIZE * 2, K);
205 GNUNET_CRYPTO_seed_weak_random (2);
209 for (i = 0; i < 20; i++)
212 if (GNUNET_CONTAINER_bloomfilter_test (bf, &tmp) == GNUNET_YES)
214 if (GNUNET_CONTAINER_bloomfilter_test (bfi, &tmp) == GNUNET_YES)
220 printf ("Expected 20 elements in resized file-backed filter"
221 " after adding 20, got %d\n", ok1);
222 GNUNET_CONTAINER_bloomfilter_free (bf);
223 GNUNET_CONTAINER_bloomfilter_free (bfi);
228 printf ("Expected 20 elements in resized filter"
229 " after adding 20, got %d\n", ok2);
230 GNUNET_CONTAINER_bloomfilter_free (bf);
231 GNUNET_CONTAINER_bloomfilter_free (bfi);
236 GNUNET_CONTAINER_bloomfilter_free (bf);
237 GNUNET_CONTAINER_bloomfilter_free (bfi);
239 GNUNET_break (0 == UNLINK (TESTFILE));