/* This file is part of GNUnet. Copyright (C) 2003, 2004, 2006, 2009, 2010 GNUnet e.V. GNUnet is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . SPDX-License-Identifier: AGPL3.0-or-later */ /** * @file util/test_container_meta_data.c * @brief Test for container_meta_data.c * @author Christian Grothoff */ #include "platform.h" #include "gnunet_util_lib.h" #define ABORT(m) { fprintf (stderr, "Error at %s:%d\n", __FILE__, __LINE__); \ if (m != NULL) GNUNET_CONTAINER_meta_data_destroy (m); \ return 1; } static int testMeta (int i) { struct GNUNET_CONTAINER_MetaData *m; char val[256]; char *sval; int j; unsigned int size; m = GNUNET_CONTAINER_meta_data_create (); if (GNUNET_OK != GNUNET_CONTAINER_meta_data_insert (m, "", EXTRACTOR_METATYPE_TITLE, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "TestTitle", strlen ("TestTitle") + 1)) ABORT (m); if (GNUNET_OK != GNUNET_CONTAINER_meta_data_insert (m, "", EXTRACTOR_METATYPE_AUTHOR_NAME, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "TestTitle", strlen ("TestTitle") + 1)) ABORT (m); if (GNUNET_OK == GNUNET_CONTAINER_meta_data_insert (m, "", EXTRACTOR_METATYPE_TITLE, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "TestTitle", strlen ( "TestTitle") + 1)) /* dup! */ ABORT (m); if (GNUNET_OK == GNUNET_CONTAINER_meta_data_insert (m, "", EXTRACTOR_METATYPE_AUTHOR_NAME, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "TestTitle", strlen ( "TestTitle") + 1)) /* dup! */ ABORT (m); if (2 != GNUNET_CONTAINER_meta_data_iterate (m, NULL, NULL)) ABORT (m); if (GNUNET_OK != GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_METATYPE_AUTHOR_NAME, "TestTitle", strlen ("TestTitle") + 1)) ABORT (m); if (GNUNET_OK == GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_METATYPE_AUTHOR_NAME, "TestTitle", strlen ( "TestTitle") + 1)) /* already gone */ ABORT (m); if (1 != GNUNET_CONTAINER_meta_data_iterate (m, NULL, NULL)) ABORT (m); if (GNUNET_OK != GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_METATYPE_TITLE, "TestTitle", strlen ("TestTitle") + 1)) ABORT (m); if (GNUNET_OK == GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_METATYPE_TITLE, "TestTitle", strlen ( "TestTitle") + 1)) /* already gone */ ABORT (m); if (0 != GNUNET_CONTAINER_meta_data_iterate (m, NULL, NULL)) ABORT (m); for (j = 0; j < i; j++) { GNUNET_snprintf (val, sizeof(val), "%s.%d", "A teststring that should compress well.", j); if (GNUNET_OK != GNUNET_CONTAINER_meta_data_insert (m, "", EXTRACTOR_METATYPE_UNKNOWN, EXTRACTOR_METAFORMAT_UTF8, "text/plain", val, strlen (val) + 1)) ABORT (m); } if (i != GNUNET_CONTAINER_meta_data_iterate (m, NULL, NULL)) ABORT (m); size = GNUNET_CONTAINER_meta_data_get_serialized_size (m); sval = NULL; if (size != GNUNET_CONTAINER_meta_data_serialize (m, &sval, size, GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL)) { GNUNET_free (sval); ABORT (m); } GNUNET_CONTAINER_meta_data_destroy (m); m = GNUNET_CONTAINER_meta_data_deserialize (sval, size); GNUNET_free (sval); if (m == NULL) ABORT (m); for (j = 0; j < i; j++) { GNUNET_snprintf (val, sizeof(val), "%s.%d", "A teststring that should compress well.", j); if (GNUNET_OK != GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_METATYPE_UNKNOWN, val, strlen (val) + 1)) { ABORT (m); } } if (0 != GNUNET_CONTAINER_meta_data_iterate (m, NULL, NULL)) ABORT (m); GNUNET_CONTAINER_meta_data_destroy (m); return 0; } static int testMetaMore (int i) { struct GNUNET_CONTAINER_MetaData *meta; int q; char txt[128]; char *data; unsigned long long size; meta = GNUNET_CONTAINER_meta_data_create (); for (q = 0; q <= i; q++) { GNUNET_snprintf (txt, 128, "%u -- %u\n", i, q); GNUNET_CONTAINER_meta_data_insert (meta, "", q % 42 /* EXTRACTOR_metatype_get_max () */, EXTRACTOR_METAFORMAT_UTF8, "text/plain", txt, strlen (txt) + 1); } size = GNUNET_CONTAINER_meta_data_get_serialized_size (meta); data = GNUNET_malloc (size * 4); if (size != GNUNET_CONTAINER_meta_data_serialize (meta, &data, size * 4, GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL)) { GNUNET_free (data); ABORT (meta); } GNUNET_CONTAINER_meta_data_destroy (meta); GNUNET_free (data); return 0; } static int testMetaLink () { struct GNUNET_CONTAINER_MetaData *m; char *val; unsigned int size; m = GNUNET_CONTAINER_meta_data_create (); if (GNUNET_OK != GNUNET_CONTAINER_meta_data_insert (m, "", EXTRACTOR_METATYPE_UNKNOWN, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "link", strlen ("link") + 1)) ABORT (m); if (GNUNET_OK != GNUNET_CONTAINER_meta_data_insert (m, "", EXTRACTOR_METATYPE_FILENAME, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "lib-link.m4", strlen ("lib-link.m4") + 1)) ABORT (m); val = NULL; size = GNUNET_CONTAINER_meta_data_serialize (m, &val, (size_t) -1, GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL); GNUNET_CONTAINER_meta_data_destroy (m); m = GNUNET_CONTAINER_meta_data_deserialize (val, size); GNUNET_free (val); if (m == NULL) ABORT (m); GNUNET_CONTAINER_meta_data_destroy (m); return 0; } static int check () { struct GNUNET_CONTAINER_MetaData *meta; struct GNUNET_CONTAINER_MetaData *meta2; int q; int i = 100; char txt[128]; char *str; unsigned char *thumb; meta = GNUNET_CONTAINER_meta_data_create (); meta2 = GNUNET_CONTAINER_meta_data_create (); for (q = 0; q <= i; q++) { GNUNET_snprintf (txt, 128, "%u -- %u\n", i, q); GNUNET_CONTAINER_meta_data_insert (meta, "", EXTRACTOR_METATYPE_UNKNOWN, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "TestTitle", strlen ("TestTitle") + 1); GNUNET_CONTAINER_meta_data_insert (meta2, "", EXTRACTOR_METATYPE_UNKNOWN, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "TestTitle", strlen ("TestTitle") + 1); } // check meta_data_test_equal if (GNUNET_YES != GNUNET_CONTAINER_meta_data_test_equal (meta, meta2)) { GNUNET_CONTAINER_meta_data_destroy (meta2); ABORT (meta); } // check meta_data_clear GNUNET_CONTAINER_meta_data_clear (meta2); if (0 != GNUNET_CONTAINER_meta_data_iterate (meta2, NULL, NULL)) { GNUNET_CONTAINER_meta_data_destroy (meta2); ABORT (meta); } // check equal branch in meta_data_test_equal if (GNUNET_YES != GNUNET_CONTAINER_meta_data_test_equal (meta, meta)) { GNUNET_CONTAINER_meta_data_destroy (meta2); ABORT (meta); } // check "count" branch in meta_data_test_equal if (GNUNET_NO != GNUNET_CONTAINER_meta_data_test_equal (meta, meta2)) { GNUNET_CONTAINER_meta_data_destroy (meta2); ABORT (meta); } // check meta_data_add_publication_date GNUNET_CONTAINER_meta_data_add_publication_date (meta2); // check meta_data_merge GNUNET_CONTAINER_meta_data_clear (meta2); GNUNET_CONTAINER_meta_data_merge (meta2, meta); if (100 == GNUNET_CONTAINER_meta_data_iterate (meta2, NULL, NULL)) { GNUNET_CONTAINER_meta_data_destroy (meta2); ABORT (meta); } // check meta_data_get_by_type GNUNET_CONTAINER_meta_data_clear (meta2); if (NULL != (str = GNUNET_CONTAINER_meta_data_get_by_type (meta2, EXTRACTOR_METATYPE_UNKNOWN))) { GNUNET_CONTAINER_meta_data_destroy (meta2); GNUNET_free (str); ABORT (meta); } str = GNUNET_CONTAINER_meta_data_get_by_type (meta, EXTRACTOR_METATYPE_UNKNOWN); GNUNET_assert (NULL != str); if (str[0] != 'T') { GNUNET_CONTAINER_meta_data_destroy (meta2); GNUNET_free (str); ABORT (meta); } GNUNET_free (str); // check branch if (NULL != (str = GNUNET_CONTAINER_meta_data_get_by_type (meta, EXTRACTOR_METATYPE_PUBLICATION_DATE))) { GNUNET_free (str); GNUNET_CONTAINER_meta_data_destroy (meta2); ABORT (meta); } // check meta_data_get_first_by_types str = GNUNET_CONTAINER_meta_data_get_first_by_types (meta, EXTRACTOR_METATYPE_UNKNOWN, -1); GNUNET_assert (NULL != str); if (str[0] != 'T') { GNUNET_CONTAINER_meta_data_destroy (meta2); GNUNET_free (str); ABORT (meta); } GNUNET_free (str); // check meta_data_get_thumbnail if (GNUNET_CONTAINER_meta_data_get_thumbnail (meta, &thumb) != 0) { GNUNET_free (thumb); GNUNET_CONTAINER_meta_data_destroy (meta2); ABORT (meta); } GNUNET_CONTAINER_meta_data_destroy (meta2); // check meta_data_duplicate meta2 = GNUNET_CONTAINER_meta_data_duplicate (meta); if (200 == GNUNET_CONTAINER_meta_data_iterate (meta2, NULL, NULL)) { GNUNET_CONTAINER_meta_data_destroy (meta2); ABORT (meta); } GNUNET_CONTAINER_meta_data_destroy (meta2); GNUNET_CONTAINER_meta_data_destroy (meta); return 0; } int main (int argc, char *argv[]) { int failureCount = 0; int i; GNUNET_log_setup ("test-container-meta-data", "WARNING", NULL); for (i = 0; i < 255; i++) failureCount += testMeta (i); for (i = 1; i < 255; i++) failureCount += testMetaMore (i); failureCount += testMetaLink (); int ret = check (); if (ret == 1) return 1; if (failureCount != 0) return 1; return 0; } /* end of test_container_meta_data.c */