Merge branch 'master' of git+ssh://gnunet.org/gnunet
[oweals/gnunet.git] / src / fs / test_fs_unindex_persistence.c
index 2185be21d02952d18b543502a343c38eddac0c79..7c76ee22774baa143a9d1626f720686911f4ded6 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2004, 2005, 2006, 2008, 2009, 2010 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 GNUnet e.V.
 
      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.
 */
 
 /**
 */
 
 /**
  */
 #include "platform.h"
 #include "gnunet_util_lib.h"
  */
 #include "platform.h"
 #include "gnunet_util_lib.h"
-#include "gnunet_arm_service.h"
+#include "gnunet_testing_lib.h"
 #include "gnunet_fs_service.h"
 
 #include "gnunet_fs_service.h"
 
-#define VERBOSE GNUNET_NO
-
-#define START_ARM GNUNET_YES
-
 /**
  * File-size we use for testing.
  */
 /**
  * File-size we use for testing.
  */
 
 /**
  * How long should our test-content live?
 
 /**
  * How long should our test-content live?
- */ 
+ */
 #define LIFETIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
 
 #define LIFETIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
 
-struct PeerContext
-{
-  struct GNUNET_CONFIGURATION_Handle *cfg;
-#if START_ARM
-  pid_t arm_pid;
-#endif
-};
-
-static struct PeerContext p1;
 
 static struct GNUNET_TIME_Absolute start;
 
 
 static struct GNUNET_TIME_Absolute start;
 
-static struct GNUNET_SCHEDULER_Handle *sched;
-
 static struct GNUNET_FS_Handle *fs;
 
 static struct GNUNET_FS_UnindexContext *unindex;
 static struct GNUNET_FS_Handle *fs;
 
 static struct GNUNET_FS_UnindexContext *unindex;
@@ -71,9 +56,9 @@ static char *fn;
 
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
 
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
+
 static void
 static void
-abort_publish_task (void *cls,
-                    const struct GNUNET_SCHEDULER_TaskContext *tc)
+abort_publish_task (void *cls)
 {
   GNUNET_FS_publish_stop (publish);
   publish = NULL;
 {
   GNUNET_FS_publish_stop (publish);
   publish = NULL;
@@ -81,40 +66,38 @@ abort_publish_task (void *cls,
 
 
 static void
 
 
 static void
-abort_unindex_task (void *cls,
-                   const struct GNUNET_SCHEDULER_TaskContext *tc)
+abort_unindex_task (void *cls)
 {
 {
-  GNUNET_FS_unindex_stop (unindex);
-  unindex = NULL;
-  GNUNET_DISK_directory_remove (fn);
-  GNUNET_free (fn);
-  fn = NULL;
+  if (unindex != NULL)
+  {
+    GNUNET_FS_unindex_stop (unindex);
+    unindex = NULL;
+  }
+  if (fn != NULL)
+  {
+    GNUNET_DISK_directory_remove (fn);
+    GNUNET_free (fn);
+    fn = NULL;
+  }
 }
 
 
 static void *
 }
 
 
 static void *
-progress_cb (void *cls, 
-            const struct GNUNET_FS_ProgressInfo *event);
+progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event);
 
 
 static void
 
 
 static void
-restart_fs_task (void *cls,
-                const struct GNUNET_SCHEDULER_TaskContext *tc)
+restart_fs_task (void *cls)
 {
   GNUNET_FS_stop (fs);
 {
   GNUNET_FS_stop (fs);
-  fs = GNUNET_FS_start (sched,
-                       cfg,
-                       "test-fs-unindex-persistence",
-                       &progress_cb,
-                       NULL,
-                       GNUNET_FS_FLAGS_PERSISTENCE,
-                       GNUNET_FS_OPTIONS_END);
+  fs = GNUNET_FS_start (cfg, "test-fs-unindex-persistence", &progress_cb, NULL,
+                        GNUNET_FS_FLAGS_PERSISTENCE, GNUNET_FS_OPTIONS_END);
 }
 
 
 /**
 }
 
 
 /**
- * Consider scheduling the restart-task. 
- * Only runs the restart task once per event 
+ * Consider scheduling the restart-task.
+ * Only runs the restart task once per event
  * category.
  *
  * @param ev type of the event to consider
  * category.
  *
  * @param ev type of the event to consider
@@ -125,173 +108,130 @@ consider_restart (int ev)
   static int prev[32];
   static int off;
   int i;
   static int prev[32];
   static int off;
   int i;
-  for (i=0;i<off;i++)
+
+  for (i = 0; i < off; i++)
     if (prev[i] == ev)
       return;
   prev[off++] = ev;
     if (prev[i] == ev)
       return;
   prev[off++] = ev;
-  GNUNET_SCHEDULER_add_with_priority (sched,
-                                     GNUNET_SCHEDULER_PRIORITY_URGENT,
-                                     &restart_fs_task,
-                                     NULL);
+  GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_URGENT,
+                                      &restart_fs_task, NULL);
 }
 
 
 static void *
 }
 
 
 static void *
-progress_cb (void *cls, 
-            const struct GNUNET_FS_ProgressInfo *event)
+progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
 {
   switch (event->status)
 {
   switch (event->status)
+  {
+  case GNUNET_FS_STATUS_PUBLISH_PROGRESS:
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+               "Publish is progressing (%llu/%llu at level %u off %llu)...\n",
+               (unsigned long long) event->value.publish.completed,
+               (unsigned long long) event->value.publish.size,
+               event->value.publish.specifics.progress.depth,
+               (unsigned long long) event->value.publish.specifics.
+               progress.offset);
+    break;
+  case GNUNET_FS_STATUS_PUBLISH_PROGRESS_DIRECTORY:
+    break;
+  case GNUNET_FS_STATUS_PUBLISH_COMPLETED:
+    printf ("Publishing complete, %llu kbps.\n",
+            (unsigned long long) (FILESIZE * 1000000LL /
+                                  (1 +
+                                   GNUNET_TIME_absolute_get_duration
+                                   (start).rel_value_us) / 1024));
+    start = GNUNET_TIME_absolute_get ();
+    unindex = GNUNET_FS_unindex_start (fs, fn, "unindex");
+    GNUNET_assert (unindex != NULL);
+    break;
+  case GNUNET_FS_STATUS_UNINDEX_COMPLETED:
+    printf ("Unindex complete,  %llu kbps.\n",
+            (unsigned long long) (FILESIZE * 1000000LL /
+                                  (1 +
+                                   GNUNET_TIME_absolute_get_duration
+                                   (start).rel_value_us) / 1024));
+    GNUNET_SCHEDULER_add_now (&abort_unindex_task, NULL);
+    break;
+  case GNUNET_FS_STATUS_UNINDEX_PROGRESS:
+    consider_restart (event->status);
+    GNUNET_assert (unindex == event->value.unindex.uc);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+               "Unindex is progressing (%llu/%llu at level %u off %llu)...\n",
+               (unsigned long long) event->value.unindex.completed,
+               (unsigned long long) event->value.unindex.size,
+               event->value.unindex.specifics.progress.depth,
+               (unsigned long long) event->value.unindex.specifics.
+               progress.offset);
+    break;
+  case GNUNET_FS_STATUS_PUBLISH_SUSPEND:
+    if (event->value.publish.pc == publish)
+      publish = NULL;
+    break;
+  case GNUNET_FS_STATUS_PUBLISH_RESUME:
+    if (NULL == publish)
     {
     {
-    case GNUNET_FS_STATUS_PUBLISH_PROGRESS:
-#if VERBOSE
-      printf ("Publish is progressing (%llu/%llu at level %u off %llu)...\n",
-              (unsigned long long) event->value.publish.completed,
-              (unsigned long long) event->value.publish.size,
-             event->value.publish.specifics.progress.depth,
-             (unsigned long long) event->value.publish.specifics.progress.offset);
-#endif      
-      break;
-    case GNUNET_FS_STATUS_PUBLISH_COMPLETED:
-      printf ("Publishing complete, %llu kbps.\n",
-             (unsigned long long) (FILESIZE * 1000 / (1+GNUNET_TIME_absolute_get_duration (start).value) / 1024));
-      start = GNUNET_TIME_absolute_get ();
-      unindex = GNUNET_FS_unindex_start (fs,
-                                        fn,
-                                        "unindex");
-      GNUNET_assert (unindex != NULL);
-      break;
-    case GNUNET_FS_STATUS_UNINDEX_COMPLETED:
-      printf ("Unindex complete,  %llu kbps.\n",
-             (unsigned long long) (FILESIZE * 1000 / (1+GNUNET_TIME_absolute_get_duration (start).value) / 1024));
-      GNUNET_SCHEDULER_add_continuation (sched,
-                                        &abort_unindex_task,
-                                        NULL,
-                                        GNUNET_SCHEDULER_REASON_PREREQ_DONE);
-      break;
-    case GNUNET_FS_STATUS_UNINDEX_PROGRESS:
-      consider_restart (event->status);
-      GNUNET_assert (unindex == event->value.unindex.uc);
-#if VERBOSE
-      printf ("Unindex is progressing (%llu/%llu at level %u off %llu)...\n",
-              (unsigned long long) event->value.unindex.completed,
-              (unsigned long long) event->value.unindex.size,
-             event->value.unindex.specifics.progress.depth,
-             (unsigned long long) event->value.unindex.specifics.progress.offset);
-#endif
-      break;
-    case GNUNET_FS_STATUS_PUBLISH_SUSPEND:
-      if  (event->value.publish.sc == publish)
-       publish = NULL;
-      break;
-    case GNUNET_FS_STATUS_PUBLISH_RESUME:
-      if (NULL == publish)
-       {
-         publish = event->value.publish.sc;
-         return "publish-context";
-       }
-      break;
-    case GNUNET_FS_STATUS_UNINDEX_SUSPEND:
-      GNUNET_assert (event->value.unindex.uc == unindex);
-      unindex = NULL;
-      break;
-    case GNUNET_FS_STATUS_UNINDEX_RESUME:
-      GNUNET_assert (NULL == unindex);
-      unindex = event->value.unindex.uc;
-      return "unindex";
-    case GNUNET_FS_STATUS_PUBLISH_ERROR:
-      fprintf (stderr,
-              "Error publishing file: %s\n",
-              event->value.publish.specifics.error.message);
-      GNUNET_break (0);
-      GNUNET_SCHEDULER_add_continuation (sched,
-                                        &abort_publish_task,
-                                        NULL,
-                                        GNUNET_SCHEDULER_REASON_PREREQ_DONE);
-      break;
-    case GNUNET_FS_STATUS_UNINDEX_ERROR:
-      fprintf (stderr,
-              "Error unindexing file: %s\n",
-              event->value.unindex.specifics.error.message);
-      GNUNET_SCHEDULER_add_continuation (sched,
-                                        &abort_unindex_task,
-                                        NULL,
-                                        GNUNET_SCHEDULER_REASON_PREREQ_DONE);
-      break;
-    case GNUNET_FS_STATUS_PUBLISH_START:
-      GNUNET_assert (0 == strcmp ("publish-context", event->value.publish.cctx));
-      GNUNET_assert (NULL == event->value.publish.pctx);
-      GNUNET_assert (FILESIZE == event->value.publish.size);
-      GNUNET_assert (0 == event->value.publish.completed);
-      GNUNET_assert (1 == event->value.publish.anonymity);
-      break;
-    case GNUNET_FS_STATUS_PUBLISH_STOPPED:
-      GNUNET_assert (publish == event->value.publish.sc);
-      GNUNET_assert (FILESIZE == event->value.publish.size);
-      GNUNET_assert (1 == event->value.publish.anonymity);
-      GNUNET_FS_stop (fs);
-      fs = NULL;
-      break;
-    case GNUNET_FS_STATUS_UNINDEX_START:
-      consider_restart (event->status);
-      GNUNET_assert (unindex == NULL);
-      GNUNET_assert (0 == strcmp ("unindex", event->value.unindex.cctx));
-      GNUNET_assert (0 == strcmp (fn, event->value.unindex.filename));
-      GNUNET_assert (FILESIZE == event->value.unindex.size);
-      GNUNET_assert (0 == event->value.unindex.completed);
-      break;
-    case GNUNET_FS_STATUS_UNINDEX_STOPPED:
-      GNUNET_assert (unindex == event->value.unindex.uc);
-      GNUNET_SCHEDULER_add_continuation (sched,
-                                        &abort_publish_task,
-                                        NULL,
-                                        GNUNET_SCHEDULER_REASON_PREREQ_DONE);
-      break;
-    default:
-      printf ("Unexpected event: %d\n", 
-             event->status);
-      break;
+      publish = event->value.publish.pc;
+      return "publish-context";
     }
     }
+    break;
+  case GNUNET_FS_STATUS_UNINDEX_SUSPEND:
+    GNUNET_assert (event->value.unindex.uc == unindex);
+    unindex = NULL;
+    break;
+  case GNUNET_FS_STATUS_UNINDEX_RESUME:
+    GNUNET_assert (NULL == unindex);
+    unindex = event->value.unindex.uc;
+    return "unindex";
+  case GNUNET_FS_STATUS_PUBLISH_ERROR:
+    FPRINTF (stderr, "Error publishing file: %s\n",
+             event->value.publish.specifics.error.message);
+    GNUNET_break (0);
+    GNUNET_SCHEDULER_add_now (&abort_publish_task, NULL);
+    break;
+  case GNUNET_FS_STATUS_UNINDEX_ERROR:
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+               "Error unindexing file: %s\n",
+               event->value.unindex.specifics.error.message);
+    GNUNET_SCHEDULER_add_now (&abort_unindex_task, NULL);
+    break;
+  case GNUNET_FS_STATUS_PUBLISH_START:
+    GNUNET_assert (0 == strcmp ("publish-context", event->value.publish.cctx));
+    GNUNET_assert (NULL == event->value.publish.pctx);
+    GNUNET_assert (FILESIZE == event->value.publish.size);
+    GNUNET_assert (0 == event->value.publish.completed);
+    GNUNET_assert (1 == event->value.publish.anonymity);
+    break;
+  case GNUNET_FS_STATUS_PUBLISH_STOPPED:
+    GNUNET_assert (publish == event->value.publish.pc);
+    GNUNET_assert (FILESIZE == event->value.publish.size);
+    GNUNET_assert (1 == event->value.publish.anonymity);
+    GNUNET_FS_stop (fs);
+    fs = NULL;
+    break;
+  case GNUNET_FS_STATUS_UNINDEX_START:
+    consider_restart (event->status);
+    GNUNET_assert (unindex == NULL);
+    GNUNET_assert (0 == strcmp ("unindex", event->value.unindex.cctx));
+    GNUNET_assert (0 == strcmp (fn, event->value.unindex.filename));
+    GNUNET_assert (FILESIZE == event->value.unindex.size);
+    GNUNET_assert (0 == event->value.unindex.completed);
+    break;
+  case GNUNET_FS_STATUS_UNINDEX_STOPPED:
+    GNUNET_assert (unindex == event->value.unindex.uc);
+    GNUNET_SCHEDULER_add_now (&abort_publish_task, NULL);
+    break;
+  default:
+    printf ("Unexpected event: %d\n", event->status);
+    break;
+  }
   return NULL;
 }
 
 
   return NULL;
 }
 
 
-static void
-setup_peer (struct PeerContext *p, const char *cfgname)
-{
-  p->cfg = GNUNET_CONFIGURATION_create ();
-#if START_ARM
-  p->arm_pid = GNUNET_OS_start_process (NULL, NULL, "gnunet-service-arm",
-                                        "gnunet-service-arm",
-#if VERBOSE
-                                        "-L", "DEBUG",
-#endif
-                                        "-c", cfgname, NULL);
-#endif
-  GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname));
-}
-
-
-static void
-stop_arm (struct PeerContext *p)
-{
-#if START_ARM
-  if (0 != PLIBC_KILL (p->arm_pid, SIGTERM))
-    GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
-  if (GNUNET_OS_process_wait(p->arm_pid) != GNUNET_OK)
-    GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "waitpid");
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "ARM process %u stopped\n", p->arm_pid);
-#endif
-  GNUNET_CONFIGURATION_destroy (p->cfg);
-}
-
-
 static void
 run (void *cls,
 static void
 run (void *cls,
-     struct GNUNET_SCHEDULER_Handle *s,
-     char *const *args,
-     const char *cfgfile,
-     const struct GNUNET_CONFIGURATION_Handle *c)
+     const struct GNUNET_CONFIGURATION_Handle *c,
+     struct GNUNET_TESTING_Peer *peer)
 {
   const char *keywords[] = {
     "down_foo",
 {
   const char *keywords[] = {
     "down_foo",
@@ -302,47 +242,37 @@ run (void *cls,
   struct GNUNET_FS_Uri *kuri;
   struct GNUNET_FS_FileInformation *fi;
   size_t i;
   struct GNUNET_FS_Uri *kuri;
   struct GNUNET_FS_FileInformation *fi;
   size_t i;
+  struct GNUNET_FS_BlockOptions bo;
 
 
-  sched = s;
   cfg = c;
   cfg = c;
-  setup_peer (&p1, "test_fs_unindex_data.conf");
   fn = GNUNET_DISK_mktemp ("gnunet-unindex-test-dst");
   fn = GNUNET_DISK_mktemp ("gnunet-unindex-test-dst");
-  fs = GNUNET_FS_start (sched,
-                       cfg,
-                       "test-fs-unindex-persistence",
-                       &progress_cb,
-                       NULL,
-                       GNUNET_FS_FLAGS_PERSISTENCE,
-                       GNUNET_FS_OPTIONS_END);
-  GNUNET_assert (NULL != fs); 
+  fs = GNUNET_FS_start (cfg, "test-fs-unindex-persistence", &progress_cb, NULL,
+                        GNUNET_FS_FLAGS_PERSISTENCE, GNUNET_FS_OPTIONS_END);
+  GNUNET_assert (NULL != fs);
   buf = GNUNET_malloc (FILESIZE);
   for (i = 0; i < FILESIZE; i++)
     buf[i] = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 256);
   GNUNET_assert (FILESIZE ==
   buf = GNUNET_malloc (FILESIZE);
   for (i = 0; i < FILESIZE; i++)
     buf[i] = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 256);
   GNUNET_assert (FILESIZE ==
-                GNUNET_DISK_fn_write (fn,
-                                      buf,
-                                      FILESIZE,
-                                      GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE));
+                 GNUNET_DISK_fn_write (fn, buf, FILESIZE,
+                                       GNUNET_DISK_PERM_USER_READ |
+                                       GNUNET_DISK_PERM_USER_WRITE));
   GNUNET_free (buf);
   meta = GNUNET_CONTAINER_meta_data_create ();
   kuri = GNUNET_FS_uri_ksk_create_from_args (2, keywords);
   GNUNET_free (buf);
   meta = GNUNET_CONTAINER_meta_data_create ();
   kuri = GNUNET_FS_uri_ksk_create_from_args (2, keywords);
-  fi = GNUNET_FS_file_information_create_from_file (fs,
-                                                   "publish-context",
-                                                   fn,
-                                                   kuri,
-                                                   meta,
-                                                   GNUNET_YES,
-                                                   1,
-                                                   42,
-                                                   GNUNET_TIME_relative_to_absolute (LIFETIME)); 
+  bo.content_priority = 42;
+  bo.anonymity_level = 1;
+  bo.replication_level = 0;
+  bo.expiration_time = GNUNET_TIME_relative_to_absolute (LIFETIME);
+  fi = GNUNET_FS_file_information_create_from_file (fs, "publish-context", fn,
+                                                    kuri, meta, GNUNET_YES,
+                                                    &bo);
   GNUNET_FS_uri_destroy (kuri);
   GNUNET_CONTAINER_meta_data_destroy (meta);
   GNUNET_assert (NULL != fi);
   start = GNUNET_TIME_absolute_get ();
   GNUNET_FS_uri_destroy (kuri);
   GNUNET_CONTAINER_meta_data_destroy (meta);
   GNUNET_assert (NULL != fi);
   start = GNUNET_TIME_absolute_get ();
-  publish = GNUNET_FS_publish_start (fs,
-                                   fi,
-                                   NULL, NULL, NULL,
-                                   GNUNET_FS_PUBLISH_OPTION_NONE);
+  publish =
+      GNUNET_FS_publish_start (fs, fi, NULL, NULL, NULL,
+                               GNUNET_FS_PUBLISH_OPTION_NONE);
   GNUNET_assert (publish != NULL);
 }
 
   GNUNET_assert (publish != NULL);
 }
 
@@ -350,33 +280,10 @@ run (void *cls,
 int
 main (int argc, char *argv[])
 {
 int
 main (int argc, char *argv[])
 {
-  char *const argvx[] = { 
-    "test-fs-unindex",
-    "-c",
-    "test_fs_unindex_data.conf",
-#if VERBOSE
-    "-L", "DEBUG",
-#endif
-    NULL
-  };
-  struct GNUNET_GETOPT_CommandLineOption options[] = {
-    GNUNET_GETOPT_OPTION_END
-  };
-
-  GNUNET_log_setup ("test_fs_unindex_persistence", 
-#if VERBOSE
-                   "DEBUG",
-#else
-                   "WARNING",
-#endif
-                   NULL);
-  GNUNET_PROGRAM_run ((sizeof (argvx) / sizeof (char *)) - 1,
-                      argvx, "test-fs-unindex",
-                     "nohelp", options, &run, NULL);
-  stop_arm (&p1);
-  GNUNET_DISK_directory_remove ("/tmp/gnunet-test-fs-unindex/");
-  GNUNET_DISK_directory_remove (fn);
-  GNUNET_free_non_null (fn);
+  if (0 != GNUNET_TESTING_peer_run ("test-fs-unindex-persistence",
+                                   "test_fs_unindex_data.conf",
+                                   &run, NULL))
+    return 1;
   return 0;
 }
 
   return 0;
 }