Fixed one serious bug, working on another. Still very broken.
[oweals/gnunet.git] / src / util / test_container_meta_data.c
index 17ef79161e037ad1bf33f34c1f3779784159c1c8..7f9ffb0f112ee98e8cd71c46403ef7b94362926e 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2003, 2004, 2006, 2009 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2003, 2004, 2006, 2009, 2010 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
 */
 
 /**
@@ -25,8 +25,9 @@
  */
 
 #include "platform.h"
  */
 
 #include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_container_lib.h"
+#include "gnunet_util_lib.h"
+
+#if HAVE_EXTRACTOR_H
 
 #define ABORT(m) { fprintf(stderr, "Error at %s:%d\n", __FILE__, __LINE__); if (m != NULL) GNUNET_CONTAINER_meta_data_destroy(m); return 1; }
 
 
 #define ABORT(m) { fprintf(stderr, "Error at %s:%d\n", __FILE__, __LINE__); if (m != NULL) GNUNET_CONTAINER_meta_data_destroy(m); return 1; }
 
@@ -34,85 +35,88 @@ static int
 testMeta (int i)
 {
   struct GNUNET_CONTAINER_MetaData *m;
 testMeta (int i)
 {
   struct GNUNET_CONTAINER_MetaData *m;
-  char *val;
+  char val[256];
+  char *sval;
   int j;
   unsigned int size;
 
   m = GNUNET_CONTAINER_meta_data_create ();
   if (GNUNET_OK !=
   int j;
   unsigned int size;
 
   m = GNUNET_CONTAINER_meta_data_create ();
   if (GNUNET_OK !=
-      GNUNET_CONTAINER_meta_data_insert (m, EXTRACTOR_TITLE, "TestTitle"))
+      GNUNET_CONTAINER_meta_data_insert (m, "<test>", EXTRACTOR_METATYPE_TITLE,
+                                         EXTRACTOR_METAFORMAT_UTF8,
+                                         "text/plain", "TestTitle",
+                                         strlen ("TestTitle") + 1))
     ABORT (m);
   if (GNUNET_OK !=
     ABORT (m);
   if (GNUNET_OK !=
-      GNUNET_CONTAINER_meta_data_insert (m, EXTRACTOR_AUTHOR, "TestTitle"))
+      GNUNET_CONTAINER_meta_data_insert (m, "<test>",
+                                         EXTRACTOR_METATYPE_AUTHOR_NAME,
+                                         EXTRACTOR_METAFORMAT_UTF8,
+                                         "text/plain", "TestTitle",
+                                         strlen ("TestTitle") + 1))
     ABORT (m);
     ABORT (m);
-  if (GNUNET_OK == GNUNET_CONTAINER_meta_data_insert (m, EXTRACTOR_TITLE, "TestTitle")) /* dup! */
+  if (GNUNET_OK == GNUNET_CONTAINER_meta_data_insert (m, "<test>", EXTRACTOR_METATYPE_TITLE, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "TestTitle", strlen ("TestTitle") + 1))   /* dup! */
     ABORT (m);
     ABORT (m);
-  if (GNUNET_OK == GNUNET_CONTAINER_meta_data_insert (m, EXTRACTOR_AUTHOR, "TestTitle"))        /* dup! */
+  if (GNUNET_OK == GNUNET_CONTAINER_meta_data_insert (m, "<test>", EXTRACTOR_METATYPE_AUTHOR_NAME, EXTRACTOR_METAFORMAT_UTF8, "text/plain", "TestTitle", strlen ("TestTitle") + 1))     /* dup! */
     ABORT (m);
     ABORT (m);
-  if (2 != GNUNET_CONTAINER_meta_data_get_contents (m, NULL, NULL))
+  if (2 != GNUNET_CONTAINER_meta_data_iterate (m, NULL, NULL))
     ABORT (m);
   if (GNUNET_OK !=
     ABORT (m);
   if (GNUNET_OK !=
-      GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_AUTHOR, "TestTitle"))
+      GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_METATYPE_AUTHOR_NAME,
+                                         "TestTitle", strlen ("TestTitle") + 1))
     ABORT (m);
     ABORT (m);
-  if (GNUNET_OK == GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_AUTHOR, "TestTitle"))        /* already gone */
+  if (GNUNET_OK == GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_METATYPE_AUTHOR_NAME, "TestTitle", strlen ("TestTitle") + 1))        /* already gone */
     ABORT (m);
     ABORT (m);
-  if (1 != GNUNET_CONTAINER_meta_data_get_contents (m, NULL, NULL))
+  if (1 != GNUNET_CONTAINER_meta_data_iterate (m, NULL, NULL))
     ABORT (m);
   if (GNUNET_OK !=
     ABORT (m);
   if (GNUNET_OK !=
-      GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_TITLE, "TestTitle"))
+      GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_METATYPE_TITLE,
+                                         "TestTitle", strlen ("TestTitle") + 1))
     ABORT (m);
     ABORT (m);
-  if (GNUNET_OK == GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_TITLE, "TestTitle")) /* already gone */
+  if (GNUNET_OK == GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_METATYPE_TITLE, "TestTitle", strlen ("TestTitle") + 1))      /* already gone */
     ABORT (m);
     ABORT (m);
-  if (0 != GNUNET_CONTAINER_meta_data_get_contents (m, NULL, NULL))
+  if (0 != GNUNET_CONTAINER_meta_data_iterate (m, NULL, NULL))
     ABORT (m);
     ABORT (m);
-  val = GNUNET_malloc (256);
   for (j = 0; j < i; j++)
   for (j = 0; j < i; j++)
-    {
-      GNUNET_snprintf (val, 256, "%s.%d",
-                       "A teststring that should compress well.", j);
-      if (GNUNET_OK !=
-          GNUNET_CONTAINER_meta_data_insert (m, EXTRACTOR_UNKNOWN, val))
-        {
-          GNUNET_free (val);
-          ABORT (m);
-        }
-    }
-  GNUNET_free (val);
-  if (i != GNUNET_CONTAINER_meta_data_get_contents (m, NULL, NULL))
+  {
+    GNUNET_snprintf (val, sizeof (val), "%s.%d",
+                     "A teststring that should compress well.", j);
+    if (GNUNET_OK !=
+        GNUNET_CONTAINER_meta_data_insert (m, "<test>",
+                                           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);
 
     ABORT (m);
 
-  size =
-    GNUNET_CONTAINER_meta_data_get_serialized_size (m,
-                                                    GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL);
-  val = GNUNET_malloc (size);
-  if (size != GNUNET_CONTAINER_meta_data_serialize (m, val, size,
-                                                    GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL))
-    {
-      GNUNET_free (val);
-      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_non_null (sval);
+    ABORT (m);
+  }
   GNUNET_CONTAINER_meta_data_destroy (m);
   GNUNET_CONTAINER_meta_data_destroy (m);
-  m = GNUNET_CONTAINER_meta_data_deserialize (val, size);
-  GNUNET_free (val);
+  m = GNUNET_CONTAINER_meta_data_deserialize (sval, size);
+  GNUNET_free (sval);
   if (m == NULL)
     ABORT (m);
   if (m == NULL)
     ABORT (m);
-  val = GNUNET_malloc (256);
   for (j = 0; j < i; j++)
   for (j = 0; j < i; j++)
-    {
-      GNUNET_snprintf (val, 256, "%s.%d",
-                       "A teststring that should compress well.", j);
-      if (GNUNET_OK !=
-          GNUNET_CONTAINER_meta_data_delete (m, EXTRACTOR_UNKNOWN, val))
-        {
-          GNUNET_free (val);
-          ABORT (m);
-        }
-    }
-  GNUNET_free (val);
-  if (0 != GNUNET_CONTAINER_meta_data_get_contents (m, NULL, NULL))
+  {
+    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);
     }
     {
       ABORT (m);
     }
+  }
+  if (0 != GNUNET_CONTAINER_meta_data_iterate (m, NULL, NULL))
+    ABORT (m);
   GNUNET_CONTAINER_meta_data_destroy (m);
   return 0;
 }
   GNUNET_CONTAINER_meta_data_destroy (m);
   return 0;
 }
@@ -128,24 +132,22 @@ testMetaMore (int i)
 
   meta = GNUNET_CONTAINER_meta_data_create ();
   for (q = 0; q <= i; q++)
 
   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 %
-                                         EXTRACTOR_getHighestKeywordTypeNumber
-                                         (), txt);
-    }
-  size =
-    GNUNET_CONTAINER_meta_data_get_serialized_size (meta,
-                                                    GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL);
+  {
+    GNUNET_snprintf (txt, 128, "%u -- %u\n", i, q);
+    GNUNET_CONTAINER_meta_data_insert (meta, "<test>",
+                                       q % 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);
   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);
-    }
+  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;
   GNUNET_CONTAINER_meta_data_destroy (meta);
   GNUNET_free (data);
   return 0;
@@ -160,22 +162,23 @@ testMetaLink ()
 
   m = GNUNET_CONTAINER_meta_data_create ();
   if (GNUNET_OK !=
 
   m = GNUNET_CONTAINER_meta_data_create ();
   if (GNUNET_OK !=
-      GNUNET_CONTAINER_meta_data_insert (m, EXTRACTOR_UNKNOWN, "link"))
+      GNUNET_CONTAINER_meta_data_insert (m, "<test>",
+                                         EXTRACTOR_METATYPE_UNKNOWN,
+                                         EXTRACTOR_METAFORMAT_UTF8,
+                                         "text/plain", "link",
+                                         strlen ("link") + 1))
     ABORT (m);
   if (GNUNET_OK !=
     ABORT (m);
   if (GNUNET_OK !=
-      GNUNET_CONTAINER_meta_data_insert (m, EXTRACTOR_FILENAME,
-                                         "lib-link.m4"))
+      GNUNET_CONTAINER_meta_data_insert (m, "<test>",
+                                         EXTRACTOR_METATYPE_FILENAME,
+                                         EXTRACTOR_METAFORMAT_UTF8,
+                                         "text/plain", "lib-link.m4",
+                                         strlen ("lib-link.m4") + 1))
     ABORT (m);
     ABORT (m);
+  val = NULL;
   size =
   size =
-    GNUNET_CONTAINER_meta_data_get_serialized_size (m,
-                                                    GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL);
-  val = GNUNET_malloc (size);
-  if (size != GNUNET_CONTAINER_meta_data_serialize (m, val, size,
-                                                    GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL))
-    {
-      GNUNET_free (val);
-      ABORT (m);
-    }
+      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);
   GNUNET_CONTAINER_meta_data_destroy (m);
   m = GNUNET_CONTAINER_meta_data_deserialize (val, size);
   GNUNET_free (val);
@@ -185,57 +188,136 @@ testMetaLink ()
   return 0;
 }
 
   return 0;
 }
 
-
-static int
-testThumbnail ()
+int
+check ()
 {
 {
-  struct GNUNET_CONTAINER_MetaData *m;
-  struct GNUNET_CONTAINER_MetaData *d;
-  EXTRACTOR_ExtractorList *ex;
+  struct GNUNET_CONTAINER_MetaData *meta;
+  struct GNUNET_CONTAINER_MetaData *meta2;
+  int q;
+  int i = 100;
+  char txt[128];
+  char *str;
   unsigned char *thumb;
   unsigned char *thumb;
-  size_t size;
-  char *date;
 
 
-  ex = EXTRACTOR_loadConfigLibraries (NULL, "libextractor_thumbnail");
-  if (ex == NULL)
-    {
-      fprintf (stderr,
-               "Test incomplete, have no thumbnail extractor available.\n");
-      return 0;                 /* can not test, no thumbnailer */
-    }
-  ex = EXTRACTOR_loadConfigLibraries (ex, "libextractor_mime");
-  m = GNUNET_CONTAINER_meta_data_create ();
-  if (3 != GNUNET_CONTAINER_meta_data_extract_from_file (m,
-                                                         "test_container_meta_data_image.jpg",
-                                                         ex))
-    {
-      GNUNET_break (0);
-      EXTRACTOR_removeAll (ex);
-      GNUNET_CONTAINER_meta_data_destroy (m);
-      return 1;
-    }
-  EXTRACTOR_removeAll (ex);
-  d = GNUNET_CONTAINER_meta_data_duplicate (m);
-  GNUNET_CONTAINER_meta_data_destroy (m);
-  size = GNUNET_CONTAINER_meta_data_get_thumbnail (d, &thumb);
-  if (size == 0)
-    {
-      GNUNET_break (0);
-      GNUNET_CONTAINER_meta_data_destroy (d);
-      return 1;
-    }
-  GNUNET_free (thumb);
-  GNUNET_CONTAINER_meta_data_add_publication_date (d);
-  date = GNUNET_CONTAINER_meta_data_get_by_type (d,
-                                                 EXTRACTOR_PUBLICATION_DATE);
-  if (date == NULL)
-    {
-      GNUNET_break (0);
-      GNUNET_CONTAINER_meta_data_destroy (d);
-      return 1;
-    }
-  GNUNET_free (date);
-  GNUNET_CONTAINER_meta_data_destroy (d);
+  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, "<test>",
+                                       EXTRACTOR_METATYPE_UNKNOWN,
+                                       EXTRACTOR_METAFORMAT_UTF8, "text/plain",
+                                       "TestTitle", strlen ("TestTitle") + 1);
+    GNUNET_CONTAINER_meta_data_insert (meta2, "<test>",
+                                       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;
 }
 
   return 0;
 }
 
@@ -252,11 +334,27 @@ main (int argc, char *argv[])
   for (i = 1; i < 255; i++)
     failureCount += testMetaMore (i);
   failureCount += testMetaLink ();
   for (i = 1; i < 255; i++)
     failureCount += testMetaMore (i);
   failureCount += testMetaLink ();
-  failureCount += testThumbnail ();
+
+  int ret = check ();
+
+  if (ret == 1)
+    return 1;
 
   if (failureCount != 0)
     return 1;
   return 0;
 }
 
 
   if (failureCount != 0)
     return 1;
   return 0;
 }
 
-/* end of metatest.c */
+#else
+
+int
+main (int argc, char *argv[])
+{
+  fprintf (stderr,
+           "GNU libextractor not found, skipping test.\n");
+  return 0;
+}
+
+#endif
+
+/* end of test_container_meta_data.c */