]> git.ozlabs.org Git - ppp.git/blob - pppd/utils_utest.c
utils: add mkdir_recursive
[ppp.git] / pppd / utils_utest.c
1 #include <fcntl.h>
2 #include <string.h>
3 #include <sys/stat.h>
4 #include <unistd.h>
5
6 #include "pppd-private.h"
7
8 /* globals used in test.c... */
9 int debug = 1;
10 int error_count;
11 int unsuccess;
12
13 /* check if path exists and returns its type */
14 static int
15 file_type(char *path)
16 {
17     struct stat statbuf;
18
19     if (stat(path, &statbuf) < 0)
20         return -1;
21
22     return statbuf.st_mode & S_IFMT;
23 }
24
25 int
26 test_simple() {
27     if (mkdir_recursive("dir"))
28         return -1;
29
30     if (file_type("dir") != S_IFDIR)
31         return -1;
32
33     rmdir("dir");
34     return 0;
35 }
36
37 int
38 test_recurse() {
39     if (mkdir_recursive("dir/subdir/subsubdir"))
40         return -1;
41
42     if (file_type("dir/subdir/subsubdir") != S_IFDIR)
43         return -1;
44
45     rmdir("dir/subdir/subsubdir");
46
47     /* try again with partial existence */
48     if (mkdir_recursive("dir/subdir/subsubdir"))
49         return -1;
50
51     if (file_type("dir/subdir/subsubdir") != S_IFDIR)
52         return -1;
53
54     rmdir("dir/subdir/subsubdir");
55     rmdir("dir/subdir");
56     rmdir("dir");
57     return 0;
58 }
59
60 int
61 test_recurse_multislash() {
62     if (mkdir_recursive("dir/subdir///subsubdir"))
63         return -1;
64
65     if (file_type("dir/subdir/subsubdir") != S_IFDIR)
66         return -1;
67
68     rmdir("dir/subdir/subsubdir");
69     rmdir("dir/subdir");
70
71     /* try again with partial existence */
72     if (mkdir_recursive("dir/subdir/subsubdir///"))
73         return -1;
74
75     if (file_type("dir/subdir/subsubdir") != S_IFDIR)
76         return -1;
77
78     rmdir("dir/subdir/subsubdir");
79     rmdir("dir/subdir");
80     rmdir("dir");
81     return 0;
82 }
83
84 int
85 test_parent_notdir() {
86     int fd = open("file", O_CREAT, 0600);
87     if (fd < 0)
88         return -1;
89     close(fd);
90
91     if (mkdir_recursive("file") == 0)
92         return -1;
93     if (mkdir_recursive("file/dir") == 0)
94         return -1;
95
96     unlink("file");
97     return 0;
98 }
99
100 int
101 main()
102 {
103     char *base_dir = strdup("/tmp/ppp_utils_utest.XXXXXX");
104     int failure = 0;
105
106     if (mkdtemp(base_dir) == NULL) {
107         printf("Could not create test directory, aborting\n");
108         return 1;
109     }
110
111     if (chdir(base_dir) < 0) {
112         printf("Could not enter newly created test dir, aborting\n");
113         return 1;
114     }
115
116     if (test_simple()) {
117         printf("Could not create simple directory\n");
118         failure++;
119     }
120
121     if (test_recurse()) {
122         printf("Could not create recursive directory\n");
123         failure++;
124     }
125
126     if (test_recurse_multislash()) {
127         printf("Could not create recursive directory with multiple slashes\n");
128         failure++;
129     }
130
131     if (test_parent_notdir()) {
132         printf("Creating over a file appeared to work?\n");
133         failure++;
134     }
135
136     rmdir(base_dir);
137     free(base_dir);
138     return failure;
139 }