diff options
Diffstat (limited to 'src/service/fs/test_fs_meta_data.c')
-rw-r--r-- | src/service/fs/test_fs_meta_data.c | 492 |
1 files changed, 492 insertions, 0 deletions
diff --git a/src/service/fs/test_fs_meta_data.c b/src/service/fs/test_fs_meta_data.c new file mode 100644 index 000000000..4e7439d7b --- /dev/null +++ b/src/service/fs/test_fs_meta_data.c | |||
@@ -0,0 +1,492 @@ | |||
1 | /* | ||
2 | This file is part of GNUnet. | ||
3 | Copyright (C) 2003, 2004, 2006, 2009, 2010, 2022 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 | /** | ||
22 | * @file util/test_fs_meta_data.c | ||
23 | * @brief Test for fs_meta_data.c | ||
24 | * @author Christian Grothoff | ||
25 | * @author Martin Schanzenbach | ||
26 | */ | ||
27 | |||
28 | |||
29 | #include "platform.h" | ||
30 | #include "gnunet_util_lib.h" | ||
31 | |||
32 | #include "gnunet_fs_service.h" | ||
33 | |||
34 | #define ABORT(m) { fprintf (stderr, "Error at %s:%d\n", __FILE__, __LINE__); \ | ||
35 | if (m != NULL) GNUNET_FS_meta_data_destroy (m); \ | ||
36 | return 1; } | ||
37 | |||
38 | |||
39 | static int | ||
40 | testMeta (int i) | ||
41 | { | ||
42 | struct GNUNET_FS_MetaData *m; | ||
43 | char val[256]; | ||
44 | char *sval; | ||
45 | int j; | ||
46 | unsigned int size; | ||
47 | |||
48 | m = GNUNET_FS_meta_data_create (); | ||
49 | if (GNUNET_OK != | ||
50 | GNUNET_FS_meta_data_insert (m, "<test>", EXTRACTOR_METATYPE_TITLE, | ||
51 | EXTRACTOR_METAFORMAT_UTF8, | ||
52 | "text/plain", "TestTitle", | ||
53 | strlen ("TestTitle") + 1)) | ||
54 | ABORT (m); | ||
55 | if (GNUNET_OK != | ||
56 | GNUNET_FS_meta_data_insert (m, "<test>", | ||
57 | EXTRACTOR_METATYPE_AUTHOR_NAME, | ||
58 | EXTRACTOR_METAFORMAT_UTF8, | ||
59 | "text/plain", "TestTitle", | ||
60 | strlen ("TestTitle") + 1)) | ||
61 | ABORT (m); | ||
62 | if (GNUNET_OK == GNUNET_FS_meta_data_insert (m, "<test>", | ||
63 | EXTRACTOR_METATYPE_TITLE, | ||
64 | EXTRACTOR_METAFORMAT_UTF8, | ||
65 | "text/plain", | ||
66 | "TestTitle", strlen ( | ||
67 | "TestTitle") + 1)) /* dup! */ | ||
68 | ABORT (m); | ||
69 | if (GNUNET_OK == GNUNET_FS_meta_data_insert (m, "<test>", | ||
70 | EXTRACTOR_METATYPE_AUTHOR_NAME, | ||
71 | EXTRACTOR_METAFORMAT_UTF8, | ||
72 | "text/plain", | ||
73 | "TestTitle", strlen ( | ||
74 | "TestTitle") + 1)) /* dup! */ | ||
75 | ABORT (m); | ||
76 | if (2 != GNUNET_FS_meta_data_iterate (m, NULL, NULL)) | ||
77 | ABORT (m); | ||
78 | if (GNUNET_OK != | ||
79 | GNUNET_FS_meta_data_delete (m, EXTRACTOR_METATYPE_AUTHOR_NAME, | ||
80 | "TestTitle", strlen ("TestTitle") + 1)) | ||
81 | ABORT (m); | ||
82 | if (GNUNET_OK == GNUNET_FS_meta_data_delete (m, | ||
83 | EXTRACTOR_METATYPE_AUTHOR_NAME, | ||
84 | "TestTitle", strlen ( | ||
85 | "TestTitle") + 1)) /* already gone */ | ||
86 | ABORT (m); | ||
87 | if (1 != GNUNET_FS_meta_data_iterate (m, NULL, NULL)) | ||
88 | ABORT (m); | ||
89 | if (GNUNET_OK != | ||
90 | GNUNET_FS_meta_data_delete (m, EXTRACTOR_METATYPE_TITLE, | ||
91 | "TestTitle", strlen ("TestTitle") + 1)) | ||
92 | ABORT (m); | ||
93 | if (GNUNET_OK == GNUNET_FS_meta_data_delete (m, | ||
94 | EXTRACTOR_METATYPE_TITLE, | ||
95 | "TestTitle", strlen ( | ||
96 | "TestTitle") + 1)) /* already gone */ | ||
97 | ABORT (m); | ||
98 | if (0 != GNUNET_FS_meta_data_iterate (m, NULL, NULL)) | ||
99 | ABORT (m); | ||
100 | for (j = 0; j < i; j++) | ||
101 | { | ||
102 | GNUNET_snprintf (val, sizeof(val), "%s.%d", | ||
103 | "A teststring that should compress well.", j); | ||
104 | if (GNUNET_OK != | ||
105 | GNUNET_FS_meta_data_insert (m, "<test>", | ||
106 | EXTRACTOR_METATYPE_UNKNOWN, | ||
107 | EXTRACTOR_METAFORMAT_UTF8, | ||
108 | "text/plain", val, strlen (val) + 1)) | ||
109 | ABORT (m); | ||
110 | } | ||
111 | if (i != GNUNET_FS_meta_data_iterate (m, NULL, NULL)) | ||
112 | ABORT (m); | ||
113 | |||
114 | size = GNUNET_FS_meta_data_get_serialized_size (m); | ||
115 | sval = NULL; | ||
116 | if (size != | ||
117 | GNUNET_FS_meta_data_serialize (m, &sval, size, | ||
118 | GNUNET_FS_META_DATA_SERIALIZE_FULL)) | ||
119 | { | ||
120 | GNUNET_free (sval); | ||
121 | ABORT (m); | ||
122 | } | ||
123 | GNUNET_FS_meta_data_destroy (m); | ||
124 | m = GNUNET_FS_meta_data_deserialize (sval, size); | ||
125 | GNUNET_free (sval); | ||
126 | if (m == NULL) | ||
127 | ABORT (m); | ||
128 | for (j = 0; j < i; j++) | ||
129 | { | ||
130 | GNUNET_snprintf (val, | ||
131 | sizeof(val), | ||
132 | "%s.%d", | ||
133 | "A teststring that should compress well.", | ||
134 | j); | ||
135 | if (GNUNET_OK != | ||
136 | GNUNET_FS_meta_data_delete (m, | ||
137 | EXTRACTOR_METATYPE_UNKNOWN, | ||
138 | val, | ||
139 | strlen (val) + 1)) | ||
140 | { | ||
141 | ABORT (m); | ||
142 | } | ||
143 | } | ||
144 | if (0 != GNUNET_FS_meta_data_iterate (m, NULL, NULL)) | ||
145 | ABORT (m); | ||
146 | GNUNET_FS_meta_data_destroy (m); | ||
147 | return 0; | ||
148 | } | ||
149 | |||
150 | |||
151 | static int | ||
152 | testMetaMore (int i) | ||
153 | { | ||
154 | struct GNUNET_FS_MetaData *meta; | ||
155 | int q; | ||
156 | char txt[128]; | ||
157 | char *data; | ||
158 | unsigned long long size; | ||
159 | |||
160 | meta = GNUNET_FS_meta_data_create (); | ||
161 | for (q = 0; q <= i; q++) | ||
162 | { | ||
163 | GNUNET_snprintf (txt, 128, "%u -- %u\n", i, q); | ||
164 | GNUNET_FS_meta_data_insert (meta, "<test>", | ||
165 | q | ||
166 | % 42 /* EXTRACTOR_metatype_get_max () */, | ||
167 | EXTRACTOR_METAFORMAT_UTF8, "text/plain", | ||
168 | txt, strlen (txt) + 1); | ||
169 | } | ||
170 | size = GNUNET_FS_meta_data_get_serialized_size (meta); | ||
171 | data = GNUNET_malloc (size * 4); | ||
172 | if (size != | ||
173 | GNUNET_FS_meta_data_serialize (meta, &data, size * 4, | ||
174 | GNUNET_FS_META_DATA_SERIALIZE_FULL)) | ||
175 | { | ||
176 | GNUNET_free (data); | ||
177 | ABORT (meta); | ||
178 | } | ||
179 | GNUNET_FS_meta_data_destroy (meta); | ||
180 | GNUNET_free (data); | ||
181 | return 0; | ||
182 | } | ||
183 | |||
184 | |||
185 | static int | ||
186 | testMetaLink () | ||
187 | { | ||
188 | struct GNUNET_FS_MetaData *m; | ||
189 | char *val; | ||
190 | unsigned int size; | ||
191 | |||
192 | m = GNUNET_FS_meta_data_create (); | ||
193 | if (GNUNET_OK != | ||
194 | GNUNET_FS_meta_data_insert (m, "<test>", | ||
195 | EXTRACTOR_METATYPE_UNKNOWN, | ||
196 | EXTRACTOR_METAFORMAT_UTF8, | ||
197 | "text/plain", "link", | ||
198 | strlen ("link") + 1)) | ||
199 | ABORT (m); | ||
200 | if (GNUNET_OK != | ||
201 | GNUNET_FS_meta_data_insert (m, "<test>", | ||
202 | EXTRACTOR_METATYPE_FILENAME, | ||
203 | EXTRACTOR_METAFORMAT_UTF8, | ||
204 | "text/plain", "lib-link.m4", | ||
205 | strlen ("lib-link.m4") + 1)) | ||
206 | ABORT (m); | ||
207 | val = NULL; | ||
208 | size = | ||
209 | GNUNET_FS_meta_data_serialize (m, &val, (size_t) -1, | ||
210 | GNUNET_FS_META_DATA_SERIALIZE_FULL); | ||
211 | GNUNET_FS_meta_data_destroy (m); | ||
212 | m = GNUNET_FS_meta_data_deserialize (val, size); | ||
213 | GNUNET_free (val); | ||
214 | if (m == NULL) | ||
215 | ABORT (m); | ||
216 | GNUNET_FS_meta_data_destroy (m); | ||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | |||
221 | static int | ||
222 | check () | ||
223 | { | ||
224 | struct GNUNET_FS_MetaData *meta; | ||
225 | struct GNUNET_FS_MetaData *meta2; | ||
226 | int q; | ||
227 | int i = 100; | ||
228 | char txt[128]; | ||
229 | char *str; | ||
230 | unsigned char *thumb; | ||
231 | |||
232 | meta = GNUNET_FS_meta_data_create (); | ||
233 | meta2 = GNUNET_FS_meta_data_create (); | ||
234 | for (q = 0; q <= i; q++) | ||
235 | { | ||
236 | GNUNET_snprintf (txt, 128, "%u -- %u\n", i, q); | ||
237 | GNUNET_FS_meta_data_insert (meta, "<test>", | ||
238 | EXTRACTOR_METATYPE_UNKNOWN, | ||
239 | EXTRACTOR_METAFORMAT_UTF8, "text/plain", | ||
240 | "TestTitle", strlen ("TestTitle") + 1); | ||
241 | GNUNET_FS_meta_data_insert (meta2, "<test>", | ||
242 | EXTRACTOR_METATYPE_UNKNOWN, | ||
243 | EXTRACTOR_METAFORMAT_UTF8, "text/plain", | ||
244 | "TestTitle", strlen ("TestTitle") + 1); | ||
245 | } | ||
246 | |||
247 | // check meta_data_test_equal | ||
248 | if (GNUNET_YES != GNUNET_FS_meta_data_test_equal (meta, meta2)) | ||
249 | { | ||
250 | GNUNET_FS_meta_data_destroy (meta2); | ||
251 | ABORT (meta); | ||
252 | } | ||
253 | |||
254 | // check meta_data_clear | ||
255 | GNUNET_FS_meta_data_clear (meta2); | ||
256 | if (0 != GNUNET_FS_meta_data_iterate (meta2, NULL, NULL)) | ||
257 | { | ||
258 | GNUNET_FS_meta_data_destroy (meta2); | ||
259 | ABORT (meta); | ||
260 | } | ||
261 | // check equal branch in meta_data_test_equal | ||
262 | if (GNUNET_YES != GNUNET_FS_meta_data_test_equal (meta, meta)) | ||
263 | { | ||
264 | GNUNET_FS_meta_data_destroy (meta2); | ||
265 | ABORT (meta); | ||
266 | } | ||
267 | // check "count" branch in meta_data_test_equal | ||
268 | if (GNUNET_NO != GNUNET_FS_meta_data_test_equal (meta, meta2)) | ||
269 | { | ||
270 | GNUNET_FS_meta_data_destroy (meta2); | ||
271 | ABORT (meta); | ||
272 | } | ||
273 | |||
274 | // check meta_data_add_publication_date | ||
275 | GNUNET_FS_meta_data_add_publication_date (meta2); | ||
276 | |||
277 | // check meta_data_merge | ||
278 | GNUNET_FS_meta_data_clear (meta2); | ||
279 | GNUNET_FS_meta_data_merge (meta2, meta); | ||
280 | if (100 == GNUNET_FS_meta_data_iterate (meta2, NULL, NULL)) | ||
281 | { | ||
282 | GNUNET_FS_meta_data_destroy (meta2); | ||
283 | ABORT (meta); | ||
284 | } | ||
285 | |||
286 | // check meta_data_get_by_type | ||
287 | GNUNET_FS_meta_data_clear (meta2); | ||
288 | if (NULL != | ||
289 | (str = | ||
290 | GNUNET_FS_meta_data_get_by_type (meta2, | ||
291 | EXTRACTOR_METATYPE_UNKNOWN))) | ||
292 | { | ||
293 | GNUNET_FS_meta_data_destroy (meta2); | ||
294 | GNUNET_free (str); | ||
295 | ABORT (meta); | ||
296 | } | ||
297 | |||
298 | str = | ||
299 | GNUNET_FS_meta_data_get_by_type (meta, EXTRACTOR_METATYPE_UNKNOWN); | ||
300 | GNUNET_assert (NULL != str); | ||
301 | if (str[0] != 'T') | ||
302 | { | ||
303 | GNUNET_FS_meta_data_destroy (meta2); | ||
304 | GNUNET_free (str); | ||
305 | ABORT (meta); | ||
306 | } | ||
307 | GNUNET_free (str); | ||
308 | |||
309 | // check branch | ||
310 | if (NULL != | ||
311 | (str = | ||
312 | GNUNET_FS_meta_data_get_by_type (meta, | ||
313 | EXTRACTOR_METATYPE_PUBLICATION_DATE))) | ||
314 | { | ||
315 | GNUNET_free (str); | ||
316 | GNUNET_FS_meta_data_destroy (meta2); | ||
317 | ABORT (meta); | ||
318 | } | ||
319 | |||
320 | // check meta_data_get_first_by_types | ||
321 | str = | ||
322 | GNUNET_FS_meta_data_get_first_by_types (meta, | ||
323 | EXTRACTOR_METATYPE_UNKNOWN, | ||
324 | -1); | ||
325 | GNUNET_assert (NULL != str); | ||
326 | if (str[0] != 'T') | ||
327 | { | ||
328 | GNUNET_FS_meta_data_destroy (meta2); | ||
329 | GNUNET_free (str); | ||
330 | ABORT (meta); | ||
331 | } | ||
332 | GNUNET_free (str); | ||
333 | |||
334 | // check meta_data_get_thumbnail | ||
335 | if (GNUNET_FS_meta_data_get_thumbnail (meta, &thumb) != 0) | ||
336 | { | ||
337 | GNUNET_free (thumb); | ||
338 | GNUNET_FS_meta_data_destroy (meta2); | ||
339 | ABORT (meta); | ||
340 | } | ||
341 | GNUNET_FS_meta_data_destroy (meta2); | ||
342 | // check meta_data_duplicate | ||
343 | meta2 = GNUNET_FS_meta_data_duplicate (meta); | ||
344 | if (200 == GNUNET_FS_meta_data_iterate (meta2, NULL, NULL)) | ||
345 | { | ||
346 | GNUNET_FS_meta_data_destroy (meta2); | ||
347 | ABORT (meta); | ||
348 | } | ||
349 | GNUNET_FS_meta_data_destroy (meta2); | ||
350 | GNUNET_FS_meta_data_destroy (meta); | ||
351 | return 0; | ||
352 | } | ||
353 | |||
354 | |||
355 | static int | ||
356 | test_bigmeta_rw (void) | ||
357 | { | ||
358 | static char meta[1024 * 1024 * 10]; | ||
359 | struct GNUNET_BIO_WriteHandle *wh; | ||
360 | struct GNUNET_BIO_ReadHandle *rh; | ||
361 | char *filename = GNUNET_DISK_mktemp ("gnunet_bio"); | ||
362 | struct GNUNET_FS_MetaData *mdR = NULL; | ||
363 | |||
364 | memset (meta, 'b', sizeof (meta)); | ||
365 | meta[sizeof (meta) - 1] = '\0'; | ||
366 | |||
367 | wh = GNUNET_BIO_write_open_file (filename); | ||
368 | GNUNET_assert (NULL != wh); | ||
369 | if (GNUNET_OK != GNUNET_BIO_write_int32 (wh, | ||
370 | "test-bigmeta-rw-int32", | ||
371 | sizeof (meta))) | ||
372 | { | ||
373 | GNUNET_BIO_write_close (wh, NULL); | ||
374 | return 1; | ||
375 | } | ||
376 | if (GNUNET_OK != GNUNET_BIO_write (wh, | ||
377 | "test-bigmeta-rw-bytes", | ||
378 | meta, | ||
379 | sizeof (meta))) | ||
380 | { | ||
381 | GNUNET_BIO_write_close (wh, NULL); | ||
382 | return 1; | ||
383 | } | ||
384 | GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (wh, NULL)); | ||
385 | |||
386 | rh = GNUNET_BIO_read_open_file (filename); | ||
387 | GNUNET_assert (NULL != rh); | ||
388 | GNUNET_assert (GNUNET_SYSERR == | ||
389 | GNUNET_FS_read_meta_data (rh, | ||
390 | "test-bigmeta-rw-metadata", | ||
391 | &mdR)); | ||
392 | GNUNET_assert (GNUNET_SYSERR == GNUNET_BIO_read_close (rh, NULL)); | ||
393 | |||
394 | GNUNET_assert (NULL == mdR); | ||
395 | |||
396 | GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (filename)); | ||
397 | GNUNET_free (filename); | ||
398 | return 0; | ||
399 | } | ||
400 | |||
401 | static int | ||
402 | test_fakemeta_rw (void) | ||
403 | { | ||
404 | struct GNUNET_BIO_WriteHandle *wh; | ||
405 | struct GNUNET_BIO_ReadHandle *rh; | ||
406 | char *filename = GNUNET_DISK_mktemp ("gnunet_bio"); | ||
407 | struct GNUNET_FS_MetaData *mdR = NULL; | ||
408 | |||
409 | wh = GNUNET_BIO_write_open_file (filename); | ||
410 | GNUNET_assert (NULL != wh); | ||
411 | if (GNUNET_OK != GNUNET_BIO_write_int32 (wh, | ||
412 | "test-fakestring-rw-int32", | ||
413 | 2)) | ||
414 | { | ||
415 | GNUNET_BIO_write_close (wh, NULL); | ||
416 | return 1; | ||
417 | } | ||
418 | GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (wh, NULL)); | ||
419 | |||
420 | rh = GNUNET_BIO_read_open_file (filename); | ||
421 | GNUNET_assert (NULL != rh); | ||
422 | GNUNET_assert (GNUNET_SYSERR == | ||
423 | GNUNET_FS_read_meta_data (rh, | ||
424 | "test-fakestring-rw-metadata", | ||
425 | &mdR)); | ||
426 | GNUNET_assert (GNUNET_SYSERR == GNUNET_BIO_read_close (rh, NULL)); | ||
427 | |||
428 | GNUNET_assert (NULL == mdR); | ||
429 | |||
430 | GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (filename)); | ||
431 | GNUNET_free (filename); | ||
432 | return 0; | ||
433 | } | ||
434 | |||
435 | static int | ||
436 | test_fakebigmeta_rw (void) | ||
437 | { | ||
438 | struct GNUNET_BIO_WriteHandle *wh; | ||
439 | struct GNUNET_BIO_ReadHandle *rh; | ||
440 | char *filename = GNUNET_DISK_mktemp ("gnunet_bio"); | ||
441 | struct GNUNET_FS_MetaData *mdR = NULL; | ||
442 | int32_t wNum = 1024 * 1024 * 10; | ||
443 | |||
444 | wh = GNUNET_BIO_write_open_file (filename); | ||
445 | GNUNET_assert (NULL != wh); | ||
446 | GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int32 (wh, | ||
447 | "test-fakebigmeta-rw-int32", | ||
448 | wNum)); | ||
449 | GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (wh, NULL)); | ||
450 | |||
451 | rh = GNUNET_BIO_read_open_file (filename); | ||
452 | GNUNET_assert (NULL != rh); | ||
453 | GNUNET_assert (GNUNET_SYSERR == | ||
454 | GNUNET_FS_read_meta_data (rh, | ||
455 | "test-fakebigmeta-rw-metadata", | ||
456 | &mdR)); | ||
457 | GNUNET_assert (GNUNET_SYSERR == GNUNET_BIO_read_close (rh, NULL)); | ||
458 | |||
459 | GNUNET_assert (NULL == mdR); | ||
460 | |||
461 | GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (filename)); | ||
462 | GNUNET_free (filename); | ||
463 | return 0; | ||
464 | } | ||
465 | |||
466 | int | ||
467 | main (int argc, char *argv[]) | ||
468 | { | ||
469 | int failureCount = 0; | ||
470 | int i; | ||
471 | |||
472 | GNUNET_log_setup ("test-fs-meta-data", "WARNING", NULL); | ||
473 | for (i = 0; i < 255; i++) | ||
474 | failureCount += testMeta (i); | ||
475 | for (i = 1; i < 255; i++) | ||
476 | failureCount += testMetaMore (i); | ||
477 | failureCount += testMetaLink (); | ||
478 | failureCount += test_fakebigmeta_rw (); | ||
479 | failureCount += test_fakemeta_rw (); | ||
480 | failureCount += test_bigmeta_rw (); | ||
481 | int ret = check (); | ||
482 | |||
483 | if (ret == 1) | ||
484 | return 1; | ||
485 | |||
486 | if (failureCount != 0) | ||
487 | return 1; | ||
488 | return 0; | ||
489 | } | ||
490 | |||
491 | |||
492 | /* end of test_container_meta_data.c */ | ||