]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/utils_utest.c
utils: add mkdir_recursive
[ppp.git] / pppd / utils_utest.c
diff --git a/pppd/utils_utest.c b/pppd/utils_utest.c
new file mode 100644 (file)
index 0000000..cdca97e
--- /dev/null
@@ -0,0 +1,139 @@
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "pppd-private.h"
+
+/* globals used in test.c... */
+int debug = 1;
+int error_count;
+int unsuccess;
+
+/* check if path exists and returns its type */
+static int
+file_type(char *path)
+{
+    struct stat statbuf;
+
+    if (stat(path, &statbuf) < 0)
+       return -1;
+
+    return statbuf.st_mode & S_IFMT;
+}
+
+int
+test_simple() {
+    if (mkdir_recursive("dir"))
+       return -1;
+
+    if (file_type("dir") != S_IFDIR)
+       return -1;
+
+    rmdir("dir");
+    return 0;
+}
+
+int
+test_recurse() {
+    if (mkdir_recursive("dir/subdir/subsubdir"))
+       return -1;
+
+    if (file_type("dir/subdir/subsubdir") != S_IFDIR)
+       return -1;
+
+    rmdir("dir/subdir/subsubdir");
+
+    /* try again with partial existence */
+    if (mkdir_recursive("dir/subdir/subsubdir"))
+       return -1;
+
+    if (file_type("dir/subdir/subsubdir") != S_IFDIR)
+       return -1;
+
+    rmdir("dir/subdir/subsubdir");
+    rmdir("dir/subdir");
+    rmdir("dir");
+    return 0;
+}
+
+int
+test_recurse_multislash() {
+    if (mkdir_recursive("dir/subdir///subsubdir"))
+       return -1;
+
+    if (file_type("dir/subdir/subsubdir") != S_IFDIR)
+       return -1;
+
+    rmdir("dir/subdir/subsubdir");
+    rmdir("dir/subdir");
+
+    /* try again with partial existence */
+    if (mkdir_recursive("dir/subdir/subsubdir///"))
+       return -1;
+
+    if (file_type("dir/subdir/subsubdir") != S_IFDIR)
+       return -1;
+
+    rmdir("dir/subdir/subsubdir");
+    rmdir("dir/subdir");
+    rmdir("dir");
+    return 0;
+}
+
+int
+test_parent_notdir() {
+    int fd = open("file", O_CREAT, 0600);
+    if (fd < 0)
+       return -1;
+    close(fd);
+
+    if (mkdir_recursive("file") == 0)
+       return -1;
+    if (mkdir_recursive("file/dir") == 0)
+       return -1;
+
+    unlink("file");
+    return 0;
+}
+
+int
+main()
+{
+    char *base_dir = strdup("/tmp/ppp_utils_utest.XXXXXX");
+    int failure = 0;
+
+    if (mkdtemp(base_dir) == NULL) {
+       printf("Could not create test directory, aborting\n");
+       return 1;
+    }
+
+    if (chdir(base_dir) < 0) {
+       printf("Could not enter newly created test dir, aborting\n");
+       return 1;
+    }
+
+    if (test_simple()) {
+       printf("Could not create simple directory\n");
+       failure++;
+    }
+
+    if (test_recurse()) {
+       printf("Could not create recursive directory\n");
+       failure++;
+    }
+
+    if (test_recurse_multislash()) {
+       printf("Could not create recursive directory with multiple slashes\n");
+       failure++;
+    }
+
+    if (test_parent_notdir()) {
+       printf("Creating over a file appeared to work?\n");
+       failure++;
+    }
+
+    rmdir(base_dir);
+    free(base_dir);
+    return failure;
+}