gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r6655 - GNUnet/src/applications/fs/fsui


From: gnunet
Subject: [GNUnet-SVN] r6655 - GNUnet/src/applications/fs/fsui
Date: Tue, 1 Apr 2008 06:54:21 -0600 (MDT)

Author: holindho
Date: 2008-04-01 06:54:21 -0600 (Tue, 01 Apr 2008)
New Revision: 6655

Added:
   GNUnet/src/applications/fs/fsui/recursivetest.c
Modified:
   GNUnet/src/applications/fs/fsui/Makefile.am
Log:
add test case for recursive downloads (still needs some polish)


Modified: GNUnet/src/applications/fs/fsui/Makefile.am
===================================================================
--- GNUnet/src/applications/fs/fsui/Makefile.am 2008-04-01 01:31:17 UTC (rev 
6654)
+++ GNUnet/src/applications/fs/fsui/Makefile.am 2008-04-01 12:54:21 UTC (rev 
6655)
@@ -40,7 +40,8 @@
   serializetest2 \
   serializetest3 \
   serializetest4 \
-  downloadtest 
+  downloadtest \
+  recursivetest
 
 TESTS = $(check_PROGRAMS)
 
@@ -72,6 +73,13 @@
   $(top_builddir)/src/applications/fs/fsui/libgnunetfsui.la \
   $(top_builddir)/src/util/libgnunetutil.la 
 
+recursivetest_SOURCES = \
+  recursivetest.c 
+recursivetest_LDADD = \
+  $(top_builddir)/src/applications/fs/ecrs/libgnunetecrs.la \
+  $(top_builddir)/src/applications/fs/fsui/libgnunetfsui.la \
+  $(top_builddir)/src/util/libgnunetutil.la 
+
 serializetest_SOURCES = \
   serializetest.c 
 serializetest_LDADD = \

Added: GNUnet/src/applications/fs/fsui/recursivetest.c
===================================================================
--- GNUnet/src/applications/fs/fsui/recursivetest.c                             
(rev 0)
+++ GNUnet/src/applications/fs/fsui/recursivetest.c     2008-04-01 12:54:21 UTC 
(rev 6655)
@@ -0,0 +1,412 @@
+/*
+     This file is part of GNUnet.
+     (C) 2004, 2005, 2006 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
+     by the Free Software Foundation; either version 2, 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
+     General Public License for more details.
+
+     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.
+*/
+
+/**
+ * @file applications/fs/fsui/recursivetest.c
+ * @brief testcase for fsui recursive upload-download
+ * @author Christian Grothoff
+ * @author Heikki Lindholm
+ */
+
+#include "platform.h"
+#include "gnunet_util.h"
+#include "gnunet_fsui_lib.h"
+
+#define DEBUG_VERBOSE GNUNET_YES
+
+#define CHECK(a) if (!(a)) { ok = GNUNET_NO; GNUNET_GE_BREAK(ectx, 0); goto 
FAILURE; }
+
+#define FILESIZE (1024 * 1024 * 2)
+/* depth-first directory tree d=dir f=file .=end of level*/
+#define DIRECTORY_TREE_SPEC "dddf.f.d"
+
+static struct GNUNET_GE_Context *ectx;
+
+static char *
+makeName (unsigned int i)
+{
+  char *fn;
+
+  fn = GNUNET_malloc (strlen ("/tmp/gnunet-fsui-recursivetest/FSUITEST") + 15);
+  GNUNET_snprintf (fn,
+                   strlen ("/tmp/gnunet-fsui-recursivetest/FSUITEST") + 15,
+                   "/tmp/gnunet-fsui-recursivetest/FSUITEST%u/", i);
+  return fn;
+}
+
+static int
+makeHierarchyHelper (const char *current, const char *tree, int index,
+                     int check)
+{
+  unsigned int fi, i;
+  int done;
+  char *s, *buf;
+
+  fi = 0;
+  done = 0;
+  while (!done && tree[index] != '\0')
+    {
+    printf("%s/%u\n", current, fi);
+    s = GNUNET_malloc (strlen(current)+strlen(DIR_SEPARATOR_STR)+14);
+    GNUNET_snprintf (s, strlen(current)+strlen(DIR_SEPARATOR_STR)+14,
+                     "%s%s%u",
+                     current, DIR_SEPARATOR_STR, fi);
+    switch (tree[index++])
+      {
+      case 'd':
+        if (check && GNUNET_disk_directory_test (NULL, s) == GNUNET_NO)
+          {
+            index = -1;
+            done = 1;
+          }
+        else
+          {
+            GNUNET_disk_directory_create (NULL, s);
+          }
+        if (!done)
+          index = makeHierarchyHelper (s, tree, index, 0);
+        break;
+      case 'f':
+        if (check && GNUNET_disk_directory_test (NULL, s) != GNUNET_NO)
+          {
+           /* TODO: compare file contents */
+            index = -1;
+            done = 1;
+          }
+        else
+          {
+            buf = GNUNET_malloc (FILESIZE);
+            for (i = 0; i < FILESIZE; i++)
+              buf[i] = GNUNET_random_u32 (GNUNET_RANDOM_QUALITY_WEAK, 256);
+            GNUNET_disk_file_write (ectx, s, buf, FILESIZE, "600");
+            GNUNET_free (buf);
+          }
+        break;
+      case '.':
+        done = 1;
+        break;
+      default:
+        break;
+      }
+    GNUNET_free (s);
+    fi++;
+    }
+  return index;
+}
+
+static char *
+makeHierarchy (unsigned int i, const char *tree)
+{
+  char *fn;
+
+  fn = makeName(i);
+  makeHierarchyHelper (fn, tree, 0, 0);
+  return fn;
+}
+
+static int
+checkHierarchy (unsigned int i, const char *tree)
+{
+  char *fn;
+
+  fn = makeName(i);
+  if (GNUNET_disk_directory_test (NULL, fn) != GNUNET_YES)
+    return GNUNET_SYSERR;
+  return (makeHierarchyHelper (fn, tree, 0, 1) == -1) ?
+         GNUNET_SYSERR : GNUNET_OK;
+}
+
+
+static volatile enum GNUNET_FSUI_EventType lastEvent;
+static volatile enum GNUNET_FSUI_EventType waitForEvent;
+static struct GNUNET_FSUI_Context *ctx;
+static struct GNUNET_ECRS_URI *upURI;
+static struct GNUNET_FSUI_SearchList *search;
+static struct GNUNET_FSUI_DownloadList *download;
+
+static void *
+eventCallback (void *cls, const GNUNET_FSUI_Event * event)
+{
+  char *fn;
+
+  switch (event->type)
+    {
+    case GNUNET_FSUI_search_suspended:
+      search = NULL;
+      break;
+    case GNUNET_FSUI_download_suspended:
+      download = NULL;
+      break;
+    case GNUNET_FSUI_search_resumed:
+      search = event->data.SearchResumed.sc.pos;
+      break;
+    case GNUNET_FSUI_download_resumed:
+      download = event->data.DownloadResumed.dc.pos;
+      break;
+    case GNUNET_FSUI_search_result:
+      if (download == NULL)
+        {
+          char *u;
+
+          u = GNUNET_ECRS_uri_to_string (event->data.SearchResult.fi.uri);
+          if (!GNUNET_ECRS_uri_test_equal
+              (upURI, event->data.SearchResult.fi.uri))
+            {
+#if DEBUG_VERBOSE
+              printf ("Received result for different file: %s.\n", u);
+#endif
+              GNUNET_free (u);
+              return NULL;      /* ignore */
+            }
+#if DEBUG_VERBOSE
+          printf ("Received search result; download started: %s.\n", u);
+#endif
+          GNUNET_free (u);
+          fn = makeName (43);
+          download = GNUNET_FSUI_download_start (ctx,
+                                                 0,
+                                                 GNUNET_YES,
+                                                 event->data.SearchResult.fi.
+                                                 uri,
+                                                 event->data.SearchResult.fi.
+                                                 meta, fn, NULL, NULL);
+          if (download == NULL)
+            {
+              GNUNET_GE_BREAK (ectx, 0);
+              return NULL;
+            }
+          GNUNET_free (fn);
+        }
+      break;
+    case GNUNET_FSUI_upload_progress:
+#if DEBUG_VERBOSE > 1
+      printf ("Upload is progressing (%llu/%llu)...\n",
+              event->data.UploadProgress.completed,
+              event->data.UploadProgress.total);
+#endif
+      break;
+    case GNUNET_FSUI_upload_completed:
+      upURI = GNUNET_ECRS_uri_duplicate (event->data.UploadCompleted.uri);
+#if DEBUG_VERBOSE
+      printf ("Upload complete.\n");
+#endif
+      break;
+    case GNUNET_FSUI_download_completed:
+#if DEBUG_VERBOSE
+      printf ("Download complete.\n");
+#endif
+      if (checkHierarchy(43, DIRECTORY_TREE_SPEC) == GNUNET_OK)
+        {
+          GNUNET_FSUI_search_abort (ctx, search);
+          GNUNET_FSUI_search_stop (ctx, search);
+          search = NULL;
+        }
+      break;
+    case GNUNET_FSUI_download_progress:
+#if DEBUG_VERBOSE > 1
+      printf ("Download is progressing (%llu/%llu)...\n",
+              event->data.DownloadProgress.completed,
+              event->data.DownloadProgress.total);
+#endif
+      break;
+    case GNUNET_FSUI_unindex_progress:
+#if DEBUG_VERBOSE > 1
+      printf ("Unindex is progressing (%llu/%llu)...\n",
+              event->data.UnindexProgress.completed,
+              event->data.UnindexProgress.total);
+#endif
+      break;
+    case GNUNET_FSUI_unindex_completed:
+#if DEBUG_VERBOSE
+      printf ("Unindex complete.\n");
+#endif
+      break;
+    case GNUNET_FSUI_unindex_error:
+    case GNUNET_FSUI_upload_error:
+    case GNUNET_FSUI_download_error:
+      fprintf (stderr, "Received ERROR: %d\n", event->type);
+      GNUNET_GE_BREAK (ectx, 0);
+      break;
+    case GNUNET_FSUI_download_aborted:
+#if DEBUG_VERBOSE
+      printf ("Received download aborted event.\n");
+#endif
+      break;
+    case GNUNET_FSUI_unindex_suspended:
+    case GNUNET_FSUI_upload_suspended:
+    case GNUNET_FSUI_upload_started:
+    case GNUNET_FSUI_upload_stopped:
+    case GNUNET_FSUI_download_started:
+    case GNUNET_FSUI_download_stopped:
+    case GNUNET_FSUI_search_started:
+    case GNUNET_FSUI_search_aborted:
+    case GNUNET_FSUI_search_stopped:
+    case GNUNET_FSUI_unindex_started:
+    case GNUNET_FSUI_unindex_stopped:
+      break;
+    default:
+      printf ("Unexpected event: %d\n", event->type);
+      break;
+    }
+  if (lastEvent == waitForEvent)
+    return NULL;                /* ignore all other events */
+  lastEvent = event->type;
+  return NULL;
+}
+
+
+#define START_DAEMON 1
+
+int
+main (int argc, char *argv[])
+{
+#if START_DAEMON
+  pid_t daemon;
+#endif
+  int ok;
+  int i;
+  struct GNUNET_ECRS_URI *uri = NULL;
+  char *fn = NULL;
+  char *keywords[] = {
+    "down_foo",
+    "down_bar",
+    NULL,
+  };
+  char keyword[40];
+  int prog;
+  char *buf;
+  struct GNUNET_ECRS_MetaData *meta;
+  struct GNUNET_ECRS_URI *kuri = NULL;
+  struct GNUNET_GC_Configuration *cfg;
+  struct GNUNET_FSUI_UnindexList *unindex = NULL;
+  struct GNUNET_FSUI_UploadList *upload = NULL;
+
+  ok = GNUNET_YES;
+  cfg = GNUNET_GC_create ();
+  if (-1 == GNUNET_GC_parse_configuration (cfg, "check.conf"))
+    {
+      GNUNET_GC_free (cfg);
+      return -1;
+    }
+#if START_DAEMON
+  GNUNET_disk_directory_remove (NULL, "/tmp/gnunet-fsui-test/content/");
+  daemon = GNUNET_daemon_start (NULL, cfg, "peer.conf", GNUNET_NO);
+  GNUNET_GE_ASSERT (NULL, daemon > 0);
+  CHECK (GNUNET_OK ==
+         GNUNET_wait_for_daemon_running (NULL, cfg,
+                                         30 * GNUNET_CRON_SECONDS));
+  GNUNET_thread_sleep (5 * GNUNET_CRON_SECONDS);        /* give apps time to 
start */
+  /* ACTUAL TEST CODE */
+#endif
+  ctx = GNUNET_FSUI_start (NULL,
+                           cfg, "fsuirecursivetest", 32, GNUNET_YES,
+                           &eventCallback, NULL);
+  CHECK (ctx != NULL);
+  fn = makeHierarchy(42, DIRECTORY_TREE_SPEC);
+  meta = GNUNET_ECRS_meta_data_create ();
+  kuri = GNUNET_ECRS_keyword_list_to_uri (ectx, 2, (const char **) keywords);
+  waitForEvent = GNUNET_FSUI_upload_completed;
+  upload = GNUNET_FSUI_upload_start (ctx,
+                                     fn,
+                                     (GNUNET_FSUI_DirectoryScanCallback) &
+                                     GNUNET_disk_directory_scan, NULL, 0, 0,
+                                     GNUNET_YES, GNUNET_NO, GNUNET_NO,
+                                     GNUNET_get_time () +
+                                     5 * GNUNET_CRON_HOURS, meta, kuri, kuri);
+  CHECK (upload != NULL);
+  GNUNET_ECRS_uri_destroy (kuri);
+  kuri = NULL;
+  GNUNET_ECRS_meta_data_destroy (meta);
+  prog = 0;
+  while (lastEvent != GNUNET_FSUI_upload_completed)
+    {
+      prog++;
+      CHECK (prog < 5000);
+      GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS);
+      if (GNUNET_shutdown_test () == GNUNET_YES)
+        break;
+    }
+  GNUNET_FSUI_upload_stop (ctx, upload);
+  GNUNET_snprintf (keyword, 40, "%s %s %s", keywords[0], _("AND"),
+                   keywords[1]);
+  uri = GNUNET_ECRS_keyword_string_to_uri (ectx, keyword);
+  waitForEvent = GNUNET_FSUI_download_completed;
+  search = GNUNET_FSUI_search_start (ctx, 0, uri);
+  CHECK (search != NULL);
+  prog = 0;
+  while (search != NULL)
+    {
+      prog++;
+      CHECK (prog < 1000);
+      GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS);
+      if (GNUNET_shutdown_test () == GNUNET_YES)
+        break;
+    }
+  CHECK (search == NULL);
+  CHECK (download != NULL);
+/*  waitForEvent = GNUNET_FSUI_unindex_completed;
+  unindex = GNUNET_FSUI_unindex_start (ctx, fn);
+  CHECK (unindex != NULL);
+  prog = 0;
+  while (lastEvent != GNUNET_FSUI_unindex_completed)
+    {
+      prog++;
+      CHECK (prog < 5000);
+      GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS);
+      CHECK (lastEvent != GNUNET_FSUI_unindex_error);
+      if (GNUNET_shutdown_test () == GNUNET_YES)
+        break;
+    }
+  CHECK (lastEvent == GNUNET_FSUI_unindex_completed);*/
+  /* END OF TEST CODE */
+FAILURE:
+  if (ctx != NULL)
+    {
+      if (unindex != NULL)
+        GNUNET_FSUI_unindex_stop (ctx, unindex);
+      if (download != NULL)
+        GNUNET_FSUI_download_stop (ctx, download);
+      if (search != NULL)
+        GNUNET_FSUI_search_stop (ctx, search);
+      GNUNET_FSUI_stop (ctx);
+    }
+    if (fn != NULL)
+    {
+      GNUNET_disk_directory_remove (NULL, fn);
+      GNUNET_free (fn);
+    }
+  if (uri != NULL)
+    GNUNET_ECRS_uri_destroy (uri);
+  if (kuri != NULL)
+    GNUNET_ECRS_uri_destroy (kuri);
+  fn = makeName (43);
+  GNUNET_disk_directory_remove (NULL, fn);
+  GNUNET_free (fn);
+  if (upURI != NULL)
+    GNUNET_ECRS_uri_destroy (upURI);
+
+#if START_DAEMON
+  GNUNET_GE_BREAK (NULL, GNUNET_OK == GNUNET_daemon_stop (NULL, daemon));
+#endif
+  GNUNET_GC_free (cfg);
+  return (ok == GNUNET_YES) ? 0 : 1;
+}
+
+/* end of recursivetest.c */





reply via email to

[Prev in Thread] Current Thread [Next in Thread]