aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-10-06 18:25:56 -0700
committerGarrett D'Amore <garrett@damore.org>2017-10-09 17:12:31 -0700
commitf14cdb705cc11f39a4702c28f22007ffaaf7c9e1 (patch)
tree8ca8b7b08e0ffc14a6c9283483bf1170fee31cd0 /tests
parent52d37858451ad23f077294fc78b1a3f56255c32f (diff)
downloadnng-f14cdb705cc11f39a4702c28f22007ffaaf7c9e1.tar.gz
nng-f14cdb705cc11f39a4702c28f22007ffaaf7c9e1.tar.bz2
nng-f14cdb705cc11f39a4702c28f22007ffaaf7c9e1.zip
New platform API for storage methods.
This includes converting the ZeroTier transport to use these. The new API supports file creation, retrieval, and deletion. It also supports directory methods for traversal, creation, and deletion. It also has a few methods to obtain well-known directories like $TMPDIR and $HOME. A rich test suite for this functionality is added as well.
Diffstat (limited to 'tests')
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/files.c196
-rw-r--r--tests/zt.c2
3 files changed, 198 insertions, 1 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index b34c5275..1042e48a 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -106,6 +106,7 @@ endif ()
add_nng_test(bus 5)
add_nng_test(event 5)
+add_nng_test(files 5)
add_nng_test(idhash 5)
add_nng_test(inproc 5)
add_nng_test(ipc 5)
diff --git a/tests/files.c b/tests/files.c
new file mode 100644
index 00000000..c7e6a1dd
--- /dev/null
+++ b/tests/files.c
@@ -0,0 +1,196 @@
+//
+// Copyright 2017 Garrett D'Amore <garrett@damore.org>
+// Copyright 2017 Capitar IT Group BV <info@capitar.com>
+//
+// This software is supplied under the terms of the MIT License, a
+// copy of which should be located in the distribution where this
+// file was obtained (LICENSE.txt). A copy of the license may also be
+// found online at https://opensource.org/licenses/MIT.
+//
+
+#include "convey.h"
+#include "core/nng_impl.h"
+#include "stubs.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef NNG_PLATFORM_POSIX
+#include <sys/stat.h>
+#include <unistd.h>
+#endif
+
+void
+test_permissions(void)
+{
+#ifdef NNG_PLATFORM_POSIX
+ Convey("Permissions work", {
+ int rv;
+ char * temp;
+ char * file;
+ void * data;
+ size_t n;
+ temp = nni_plat_temp_dir();
+ So(temp != NULL);
+ file = nni_plat_join_dir(temp, "nng_files_perms_test");
+ So(nni_plat_file_put(file, "abc", 4) == 0);
+ Reset({
+ nni_plat_file_delete(file);
+ nni_strfree(file);
+ nni_strfree(temp);
+ });
+ chmod(file, 0);
+ So((rv = nni_plat_file_get(file, &data, &n)) != 0);
+ So(rv == NNG_EPERM);
+ So(nni_plat_file_put(file, "def", 4) == NNG_EPERM);
+ });
+#endif
+}
+
+TestMain("Platform File Support", {
+ Convey("Directory names work", {
+ char *d;
+
+ So((d = nni_plat_temp_dir()) != NULL);
+ nni_strfree(d);
+
+ So((d = nni_plat_home_dir()) != NULL);
+ nni_strfree(d);
+
+ So((d = nni_plat_join_dir("a", "b")) != NULL);
+ So(d[0] == 'a');
+ So(d[2] == 'b');
+ So(d[3] == '\0');
+ So((d[1] == '/') || (d[1] == '\\'));
+ nni_strfree(d);
+ });
+
+ Convey("Cannot create file in non-extant directory", {
+ int rv;
+ So((rv = nni_plat_file_put("/bogus/dir/a", "", 0)) != 0);
+ So(rv == NNG_ENOENT);
+ });
+ Convey("Cannot read missing file", {
+ int rv;
+ void * data;
+ size_t n;
+ So((rv = nni_plat_file_get("/bogus/dir/a", &data, &n)) != 0);
+ So(rv == NNG_ENOENT);
+ });
+ Convey("Cannot delete missing file", {
+ int rv;
+ So((rv = nni_plat_file_delete("/bogus/dir/a")) != 0);
+ So(rv == NNG_ENOENT);
+ });
+ Convey("Cannot open missing directory", {
+ int rv;
+ void *dir;
+ So((rv = nni_plat_dir_open(
+ &dir, "/bogus/nng_does_not_exist")) != 0);
+ So(rv == NNG_ENOENT);
+ });
+ Convey("Cannot create directory in non-existing subdir", {
+ int rv;
+ So((rv = nni_plat_dir_create(
+ "/bogus/nng_does_not_exist/subdir")) != 0);
+ So(rv == NNG_ENOENT);
+ });
+ Convey("Remove missing directory works",
+ { So(nni_plat_dir_remove("/bogus/nng_does_not_exist") == 0); });
+
+ Convey("Create existing directory works", {
+ char *tmp;
+ tmp = nni_plat_temp_dir();
+ So(nni_plat_dir_create(tmp) == 0);
+ nni_strfree(tmp);
+ });
+ Convey("We can create a pair of files", {
+
+ char *temp;
+ char *mydir;
+ char *a;
+ char *b;
+ char *c;
+ temp = nni_plat_temp_dir();
+ So(temp != NULL);
+ mydir = nni_plat_join_dir(temp, "nng_files_test");
+ So(mydir != NULL);
+ a = nni_plat_join_dir(mydir, "a");
+ So(a != NULL);
+ b = nni_plat_join_dir(mydir, "b");
+ So(b != NULL);
+ c = nni_plat_join_dir(mydir, "c");
+ So(c != NULL);
+
+ So(nni_plat_dir_create(mydir) == 0);
+ So(nni_plat_file_put(a, "alpha", 6) == 0);
+ So(nni_plat_file_put(b, "bravo", 6) == 0);
+
+ Reset({
+ nni_strfree(temp);
+ nni_plat_file_delete(a);
+ nni_plat_file_delete(b);
+ nni_strfree(a);
+ nni_strfree(b);
+ nni_strfree(c);
+ nni_plat_dir_remove(mydir);
+ nni_strfree(mydir);
+ });
+
+ Convey("Directory list works", {
+ int seen_a = 0;
+ int seen_b = 0;
+ int seen_what = 0;
+ int rv;
+ void * dirh;
+ const char *name;
+
+ So(nni_plat_dir_open(&dirh, mydir) == 0);
+ while ((rv = nni_plat_dir_next(dirh, &name)) == 0) {
+ if (strcmp(name, "a") == 0) {
+ seen_a++;
+ } else if (strcmp(name, "b") == 0) {
+ seen_b++;
+ } else {
+ seen_what++;
+ }
+ }
+ So(rv == NNG_ENOENT);
+ So(seen_a == 1);
+ So(seen_b == 1);
+ So(seen_what == 0);
+ nni_plat_dir_close(dirh);
+ });
+
+ Convey("Contents work", {
+ void * data;
+ size_t len;
+
+ So(nni_plat_file_get(a, &data, &len) == 0);
+ So(len == 6);
+ So(strcmp(data, "alpha") == 0);
+ nni_free(data, len);
+ });
+ });
+
+ Convey("Zero length files work", {
+ char * temp;
+ char * empty;
+ void * data;
+ size_t n;
+ temp = nni_plat_temp_dir();
+ So(temp != NULL);
+ empty = nni_plat_join_dir(temp, "nng_files_test1");
+ So(empty != NULL);
+ So(nni_plat_file_put(empty, "", 0) == 0);
+ Reset({
+ nni_plat_file_delete(empty);
+ nni_strfree(empty);
+ nni_strfree(temp);
+ });
+ So(nni_plat_file_get(empty, &data, &n) == 0);
+ So(n == 0);
+ });
+
+ test_permissions();
+});
diff --git a/tests/zt.c b/tests/zt.c
index 1e6992b4..ee6bf9cc 100644
--- a/tests/zt.c
+++ b/tests/zt.c
@@ -318,7 +318,7 @@ TestMain("ZeroTier Transport", {
So(nng_dialer_setopt(
d, NNG_OPT_ZT_HOME, path2, strlen(path2) + 1) == 0);
So(nng_dialer_start(d, 0) == 0);
-
+ nng_usleep(2000000);
});
trantest_test_extended("zt://" NWID "/*:%u", check_props);