fix #3704
[oweals/gnunet.git] / src / fs / test_fs_download.c
index 31be6190385212937a0e300aab5d2b321d46c8a4..d645444acdf2a86c8ffe5b2b0efc6939c2fc5fa7 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2004, 2005, 2006, 2008, 2009, 2011 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2004, 2005, 2006, 2008, 2009, 2011, 2012 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
@@ -26,9 +26,8 @@
 
 #include "platform.h"
 #include "gnunet_util_lib.h"
-#include "gnunet_arm_service.h"
 #include "gnunet_fs_service.h"
-#include "gnunet_testing_lib-new.h"
+#include "gnunet_testing_lib.h"
 #include <gauger.h>
 
 /**
@@ -46,6 +45,9 @@
  */
 #define LIFETIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
 
+static unsigned int anonymity_level;
+
+static int indexed;
 
 static struct GNUNET_TIME_Absolute start;
 
@@ -55,10 +57,12 @@ static struct GNUNET_FS_DownloadContext *download;
 
 static struct GNUNET_FS_PublishContext *publish;
 
-static GNUNET_SCHEDULER_TaskIdentifier timeout_kill;
+static struct GNUNET_SCHEDULER_Task * timeout_kill;
 
 static char *fn;
 
+static char *fn1;
+
 static int err;
 
 
@@ -76,7 +80,7 @@ timeout_kill_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
     publish = NULL;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Timeout downloading file\n");
-  timeout_kill = GNUNET_SCHEDULER_NO_TASK;
+  timeout_kill = NULL;
   err = 1;
 }
 
@@ -116,7 +120,7 @@ abort_download_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   GNUNET_free (fn);
   fn = NULL;
   GNUNET_SCHEDULER_cancel (timeout_kill);
-  timeout_kill = GNUNET_SCHEDULER_NO_TASK;
+  timeout_kill = NULL;
 }
 
 
@@ -135,40 +139,49 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
                (unsigned long long) event->value.publish.specifics.
                progress.offset);
     break;
+  case GNUNET_FS_STATUS_PUBLISH_PROGRESS_DIRECTORY:
+    break;
   case GNUNET_FS_STATUS_PUBLISH_COMPLETED:
     fprintf (stdout,
             "Publishing complete, %llu kb/s.\n",
-            (unsigned long long) (FILESIZE * 1000LL /
+            (unsigned long long) (FILESIZE * 1000000LL /
                                   (1 +
                                    GNUNET_TIME_absolute_get_duration
-                                   (start).rel_value) / 1024LL));
-    GAUGER ("FS", "Publishing speed (insertion)",
-            (unsigned long long) (FILESIZE * 1000LL /
-                                  (1 +
-                                   GNUNET_TIME_absolute_get_duration
-                                   (start).rel_value) / 1024LL), "kb/s");
+                                   (start).rel_value_us) / 1024LL));
+    GAUGER ("FS",
+           (GNUNET_YES == indexed)
+           ? "Publishing speed (indexing)"
+            : "Publishing speed (insertion)",
+           (unsigned long long) (FILESIZE * 1000000LL /
+                                 (1 +
+                                  GNUNET_TIME_absolute_get_duration
+                                  (start).rel_value_us) / 1024LL), "kb/s");
     fn = GNUNET_DISK_mktemp ("gnunet-download-test-dst");
     start = GNUNET_TIME_absolute_get ();
     download =
         GNUNET_FS_download_start (fs,
                                   event->value.publish.specifics.
                                   completed.chk_uri, NULL, fn, NULL, 0,
-                                  FILESIZE, 1, GNUNET_FS_DOWNLOAD_OPTION_NONE,
+                                  FILESIZE, anonymity_level,
+                                 GNUNET_FS_DOWNLOAD_OPTION_NONE,
                                   "download", NULL);
     GNUNET_assert (download != NULL);
     break;
   case GNUNET_FS_STATUS_DOWNLOAD_COMPLETED:
     fprintf (stdout,
             "Download complete,  %llu kb/s.\n",
-            (unsigned long long) (FILESIZE * 1000LL /
+            (unsigned long long) (FILESIZE * 1000000LL /
                                   (1 +
                                    GNUNET_TIME_absolute_get_duration
-                                   (start).rel_value) / 1024LL));
-    GAUGER ("FS", "Local download speed (inserted)",
-            (unsigned long long) (FILESIZE * 1000LL /
+                                   (start).rel_value_us) / 1024LL));
+    GAUGER ("FS",
+           (GNUNET_YES == indexed)
+           ? "Local download speed (indexed)"
+           : "Local download speed (inserted)",
+            (unsigned long long) (FILESIZE * 1000000LL /
                                   (1 +
                                    GNUNET_TIME_absolute_get_duration
-                                   (start).rel_value) / 1024LL), "kb/s");
+                                   (start).rel_value_us) / 1024LL), "kb/s");
     GNUNET_SCHEDULER_add_now (&abort_download_task, NULL);
     break;
   case GNUNET_FS_STATUS_DOWNLOAD_PROGRESS:
@@ -187,11 +200,13 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
     GNUNET_break (0);
     GNUNET_SCHEDULER_add_continuation (&abort_publish_task, NULL,
                                        GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+    GNUNET_SCHEDULER_shutdown ();
     break;
   case GNUNET_FS_STATUS_DOWNLOAD_ERROR:
     FPRINTF (stderr, "Error downloading file: %s\n",
              event->value.download.specifics.error.message);
     GNUNET_SCHEDULER_add_now (&abort_download_task, NULL);
+    GNUNET_SCHEDULER_shutdown ();
     break;
   case GNUNET_FS_STATUS_DOWNLOAD_ACTIVE:
   case GNUNET_FS_STATUS_DOWNLOAD_INACTIVE:
@@ -233,8 +248,10 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
 
 static void
 run (void *cls,
-     const struct GNUNET_CONFIGURATION_Handle *cfg)
+     const struct GNUNET_CONFIGURATION_Handle *cfg,
+     struct GNUNET_TESTING_Peer *peer)
 {
+  const char *binary_name = cls;
   const char *keywords[] = {
     "down_foo",
     "down_bar",
@@ -246,7 +263,14 @@ run (void *cls,
   size_t i;
   struct GNUNET_FS_BlockOptions bo;
 
-  fs = GNUNET_FS_start (cfg, "test-fs-download", &progress_cb, NULL,
+  if (GNUNET_YES ==
+      GNUNET_CONFIGURATION_get_value_yesno (cfg,
+                                           "download-test",
+                                           "USE_STREAM"))
+    anonymity_level = 0;
+  else
+    anonymity_level = 1;
+  fs = GNUNET_FS_start (cfg, binary_name, &progress_cb, NULL,
                         GNUNET_FS_FLAGS_NONE, GNUNET_FS_OPTIONS_END);
   GNUNET_assert (NULL != fs);
   buf = GNUNET_malloc (FILESIZE);
@@ -255,12 +279,34 @@ run (void *cls,
   meta = GNUNET_CONTAINER_meta_data_create ();
   kuri = GNUNET_FS_uri_ksk_create_from_args (2, keywords);
   bo.content_priority = 42;
-  bo.anonymity_level = 1;
+  bo.anonymity_level = anonymity_level;
   bo.replication_level = 0;
   bo.expiration_time = GNUNET_TIME_relative_to_absolute (LIFETIME);
-  fi = GNUNET_FS_file_information_create_from_data (fs, "publish-context",
-                                                    FILESIZE, buf, kuri, meta,
-                                                    GNUNET_NO, &bo);
+
+  if (GNUNET_YES ==
+      GNUNET_CONFIGURATION_get_value_yesno (cfg,
+                                           "download-test",
+                                           "USE_INDEX"))
+  {
+    fn1 = GNUNET_DISK_mktemp ("gnunet-download-indexed-test");
+    GNUNET_assert (FILESIZE ==
+                  GNUNET_DISK_fn_write (fn1, buf, FILESIZE,
+                                        GNUNET_DISK_PERM_USER_READ |
+                                        GNUNET_DISK_PERM_USER_WRITE));
+    GNUNET_free (buf);
+    fi = GNUNET_FS_file_information_create_from_file (fs, "publish-context", fn1,
+                                                     kuri, meta, GNUNET_YES,
+                                                     &bo);
+    indexed = GNUNET_YES;
+  }
+  else
+  {
+    fi = GNUNET_FS_file_information_create_from_data (fs, "publish-context",
+                                                     FILESIZE, buf, kuri, meta,
+                                                     GNUNET_NO, &bo);
+    /* note: buf will be free'd as part of 'fi' now */
+    indexed = GNUNET_NO;
+  }
   GNUNET_FS_uri_destroy (kuri);
   GNUNET_CONTAINER_meta_data_destroy (meta);
   GNUNET_assert (NULL != fi);
@@ -277,10 +323,30 @@ run (void *cls,
 int
 main (int argc, char *argv[])
 {
-  if (0 != GNUNET_TESTING_peer_run ("test-fs-download",
-                                   "test_fs_download_data.conf",
-                                   &run, NULL))
+  const char *binary_name;
+  const char *config_name;
+
+  binary_name = "test-fs-download";
+  config_name = "test_fs_download_data.conf";
+  if (NULL != strstr (argv[0], "indexed"))
+  {
+    binary_name = "test-fs-download-indexed";
+    config_name = "test_fs_download_indexed.conf";
+  }
+  if (NULL != strstr (argv[0], "cadet"))
+  {
+    binary_name = "test-fs-download-cadet";
+    config_name = "test_fs_download_cadet.conf";
+  }
+  if (0 != GNUNET_TESTING_peer_run (binary_name,
+                                   config_name,
+                                   &run, (void *) binary_name))
     return 1;
+  if (NULL != fn1)
+  {
+    UNLINK (fn1);
+    GNUNET_free (fn1);
+  }
   return err;
 }