aboutsummaryrefslogtreecommitdiff
path: root/src/util/test_disk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/test_disk.c')
-rw-r--r--src/util/test_disk.c283
1 files changed, 283 insertions, 0 deletions
diff --git a/src/util/test_disk.c b/src/util/test_disk.c
new file mode 100644
index 0000000..5462772
--- /dev/null
+++ b/src/util/test_disk.c
@@ -0,0 +1,283 @@
+/*
+ This file is part of GNUnet.
+ (C) 2001, 2002, 2003, 2005, 2006, 2009 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 3, 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 util/test_disk.c
+ * @brief testcase for the storage module
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include "gnunet_common.h"
+#include "gnunet_disk_lib.h"
+#include "gnunet_scheduler_lib.h"
+
+#define TESTSTRING "Hello World\0"
+
+static int
+testReadWrite ()
+{
+ char tmp[100 + 1];
+ int ret;
+
+ if (strlen (TESTSTRING) !=
+ GNUNET_DISK_fn_write (".testfile", TESTSTRING, strlen (TESTSTRING),
+ GNUNET_DISK_PERM_USER_READ |
+ GNUNET_DISK_PERM_USER_WRITE))
+ return 1;
+ if (GNUNET_OK != GNUNET_DISK_file_test (".testfile"))
+ return 1;
+ ret = GNUNET_DISK_fn_read (".testfile", tmp, sizeof (tmp) - 1);
+ if (ret < 0)
+ {
+ FPRINTF (stderr, "Error reading file `%s' in testReadWrite\n", ".testfile");
+ return 1;
+ }
+ tmp[ret] = '\0';
+ if (0 != memcmp (tmp, TESTSTRING, strlen (TESTSTRING) + 1))
+ {
+ FPRINTF (stderr, "Error in testReadWrite: *%s* != *%s* for file %s\n", tmp,
+ TESTSTRING, ".testfile");
+ return 1;
+ }
+ GNUNET_DISK_file_copy (".testfile", ".testfile2");
+ memset (tmp, 0, sizeof (tmp));
+ ret = GNUNET_DISK_fn_read (".testfile2", tmp, sizeof (tmp) - 1);
+ if (ret < 0)
+ {
+ FPRINTF (stderr, "Error reading file `%s' in testReadWrite\n",
+ ".testfile2");
+ return 1;
+ }
+ tmp[ret] = '\0';
+ if (0 != memcmp (tmp, TESTSTRING, strlen (TESTSTRING) + 1))
+ {
+ FPRINTF (stderr, "Error in testReadWrite: *%s* != *%s* for file %s\n", tmp,
+ TESTSTRING, ".testfile2");
+ return 1;
+ }
+
+ GNUNET_break (0 == UNLINK (".testfile"));
+ GNUNET_break (0 == UNLINK (".testfile2"));
+ if (GNUNET_NO != GNUNET_DISK_file_test (".testfile"))
+ return 1;
+
+ return 0;
+}
+
+static int
+testOpenClose ()
+{
+ struct GNUNET_DISK_FileHandle *fh;
+ uint64_t size;
+ long avail;
+
+ fh = GNUNET_DISK_file_open (".testfile",
+ GNUNET_DISK_OPEN_READWRITE |
+ GNUNET_DISK_OPEN_CREATE,
+ GNUNET_DISK_PERM_USER_READ |
+ GNUNET_DISK_PERM_USER_WRITE);
+ GNUNET_assert (GNUNET_NO == GNUNET_DISK_handle_invalid (fh));
+ GNUNET_break (5 == GNUNET_DISK_file_write (fh, "Hello", 5));
+ GNUNET_DISK_file_close (fh);
+ GNUNET_break (GNUNET_OK ==
+ GNUNET_DISK_file_size (".testfile", &size, GNUNET_NO));
+ if (size != 5)
+ return 1;
+ GNUNET_break (0 == UNLINK (".testfile"));
+
+ /* test that avail goes down as we fill the disk... */
+ GNUNET_log_skip (1, GNUNET_NO);
+ avail = GNUNET_DISK_get_blocks_available (".testfile");
+ GNUNET_log_skip (0, GNUNET_NO);
+ fh = GNUNET_DISK_file_open (".testfile",
+ GNUNET_DISK_OPEN_READWRITE |
+ GNUNET_DISK_OPEN_CREATE,
+ GNUNET_DISK_PERM_USER_WRITE |
+ GNUNET_DISK_PERM_USER_READ);
+ GNUNET_assert (GNUNET_NO == GNUNET_DISK_handle_invalid (fh));
+ while ((avail == GNUNET_DISK_get_blocks_available (".testfile")) &&
+ (avail != -1))
+ if (16 != GNUNET_DISK_file_write (fh, "HelloWorld123456", 16))
+ {
+ GNUNET_DISK_file_close (fh);
+ GNUNET_break (0 == UNLINK (".testfile"));
+ return 1;
+ }
+ GNUNET_DISK_file_close (fh);
+ GNUNET_break (0 == UNLINK (".testfile"));
+
+ return 0;
+}
+
+static int ok;
+
+static int
+scan_callback (void *want, const char *filename)
+{
+ if (NULL != strstr (filename, want))
+ ok++;
+ return GNUNET_OK;
+}
+
+static int
+testDirScan ()
+{
+ if (GNUNET_OK !=
+ GNUNET_DISK_directory_create ("test" DIR_SEPARATOR_STR "entry"))
+ return 1;
+ if (GNUNET_OK !=
+ GNUNET_DISK_directory_create ("test" DIR_SEPARATOR_STR "entry_more"))
+ return 1;
+ GNUNET_DISK_directory_scan ("test", &scan_callback,
+ "test" DIR_SEPARATOR_STR "entry");
+ if (GNUNET_OK != GNUNET_DISK_directory_remove ("test"))
+ return 1;
+ if (ok < 2)
+ return 1;
+ return 0;
+}
+
+static void
+iter_callback (void *cls, struct GNUNET_DISK_DirectoryIterator *di,
+ const char *filename, const char *dirname)
+{
+ int *i = cls;
+
+ (*i)++;
+ GNUNET_DISK_directory_iterator_next (di, GNUNET_NO);
+}
+
+static void
+iter_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ GNUNET_DISK_directory_iterator_start (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
+ "test", &iter_callback, cls);
+}
+
+static int
+testDirIter ()
+{
+ int i;
+
+ i = 0;
+ if (GNUNET_OK != GNUNET_DISK_directory_create ("test/entry"))
+ return 1;
+ if (GNUNET_OK != GNUNET_DISK_directory_create ("test/entry_many"))
+ return 1;
+ if (GNUNET_OK != GNUNET_DISK_directory_create ("test/entry_more"))
+ return 1;
+ GNUNET_SCHEDULER_run (&iter_task, &i);
+ if (GNUNET_OK != GNUNET_DISK_directory_remove ("test"))
+ return 1;
+ if (i < 3)
+ return 1;
+ return 0;
+}
+
+
+static int
+testGetHome ()
+{
+ struct GNUNET_CONFIGURATION_Handle *cfg;
+ char *fn;
+ int ret;
+
+ cfg = GNUNET_CONFIGURATION_create ();
+ GNUNET_assert (cfg != NULL);
+ GNUNET_CONFIGURATION_set_value_string (cfg, "service", "HOME",
+ "/tmp/test-gnunet-disk-a/b/c");
+ fn = GNUNET_DISK_get_home_filename (cfg, "service", "d", "e", NULL);
+ GNUNET_assert (fn != NULL);
+ GNUNET_CONFIGURATION_destroy (cfg);
+ ret = strcmp ("/tmp/test-gnunet-disk-a/b/c/d/e", fn);
+ GNUNET_free (fn);
+ GNUNET_break (GNUNET_OK ==
+ GNUNET_DISK_directory_remove ("/tmp/test-gnunet-disk-a"));
+ return ret;
+}
+
+static int
+testCanonicalize ()
+{
+ char *fn = GNUNET_strdup ("ab?><|cd*ef:/g\"");
+
+ GNUNET_DISK_filename_canonicalize (fn);
+ if (0 != strcmp (fn, "ab____cd_ef__g_"))
+ {
+ GNUNET_free (fn);
+ return 1;
+ }
+ GNUNET_free (fn);
+ return 0;
+}
+
+static int
+testChangeOwner ()
+{
+ GNUNET_log_skip (1, GNUNET_NO);
+ if (GNUNET_OK == GNUNET_DISK_file_change_owner ("/dev/null", "unknownuser"))
+ return 1;
+ return 0;
+}
+
+static int
+testDirMani ()
+{
+ if (GNUNET_OK != GNUNET_DISK_directory_create_for_file ("test/ing"))
+ return 1;
+ if (GNUNET_NO != GNUNET_DISK_file_test ("test"))
+ return 1;
+ if (GNUNET_NO != GNUNET_DISK_file_test ("test/ing"))
+ return 1;
+ if (GNUNET_OK != GNUNET_DISK_directory_remove ("test"))
+ return 1;
+ if (GNUNET_OK != GNUNET_DISK_directory_create ("test"))
+ return 1;
+ if (GNUNET_YES != GNUNET_DISK_directory_test ("test"))
+ return 1;
+ if (GNUNET_OK != GNUNET_DISK_directory_remove ("test"))
+ return 1;
+
+
+ return 0;
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ unsigned int failureCount = 0;
+
+ GNUNET_log_setup ("test-disk", "WARNING", NULL);
+ failureCount += testReadWrite ();
+ failureCount += testOpenClose ();
+ failureCount += testDirScan ();
+ failureCount += testDirIter ();
+ failureCount += testGetHome ();
+ failureCount += testCanonicalize ();
+ failureCount += testChangeOwner ();
+ failureCount += testDirMani ();
+ if (failureCount != 0)
+ {
+ FPRINTF (stderr, "\n%u TESTS FAILED!\n", failureCount);
+ return -1;
+ }
+ return 0;
+} /* end of main */