0.7.0-alt1
[qemu] / qemu / tests / test_path.c
1 /* Test path override code */
2 #define _GNU_SOURCE
3 #include "../path.c"
4 #include <stdarg.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7
8 /* Any log message kills the test. */
9 void gemu_log(const char *fmt, ...)
10 {
11     va_list ap;
12
13     fprintf(stderr, "FATAL: ");
14     va_start(ap, fmt);
15     vfprintf(stderr, fmt, ap);
16     va_end(ap);
17     exit(1);
18 }
19
20 #define NO_CHANGE(_path)                                                \
21         do {                                                            \
22             if (strcmp(path(_path), _path) != 0) return __LINE__;       \
23         } while(0)
24
25 #define CHANGE_TO(_path, _newpath)                                      \
26         do {                                                            \
27             if (strcmp(path(_path), _newpath) != 0) return __LINE__;    \
28         } while(0)
29
30 static void cleanup(void)
31 {
32     unlink("/tmp/qemu-test_path/DIR1/DIR2/FILE");
33     unlink("/tmp/qemu-test_path/DIR1/DIR2/FILE2");
34     unlink("/tmp/qemu-test_path/DIR1/DIR2/FILE3");
35     unlink("/tmp/qemu-test_path/DIR1/DIR2/FILE4");
36     unlink("/tmp/qemu-test_path/DIR1/DIR2/FILE5");
37     rmdir("/tmp/qemu-test_path/DIR1/DIR2");
38     rmdir("/tmp/qemu-test_path/DIR1/DIR3");
39     rmdir("/tmp/qemu-test_path/DIR1");
40     rmdir("/tmp/qemu-test_path");
41 }
42
43 static unsigned int do_test(void)
44 {
45     if (mkdir("/tmp/qemu-test_path", 0700) != 0)
46         return __LINE__;
47
48     if (mkdir("/tmp/qemu-test_path/DIR1", 0700) != 0)
49         return __LINE__;
50
51     if (mkdir("/tmp/qemu-test_path/DIR1/DIR2", 0700) != 0)
52         return __LINE__;
53
54     if (mkdir("/tmp/qemu-test_path/DIR1/DIR3", 0700) != 0)
55         return __LINE__;
56
57     if (close(creat("/tmp/qemu-test_path/DIR1/DIR2/FILE", 0600)) != 0)
58         return __LINE__;
59
60     if (close(creat("/tmp/qemu-test_path/DIR1/DIR2/FILE2", 0600)) != 0)
61         return __LINE__;
62
63     if (close(creat("/tmp/qemu-test_path/DIR1/DIR2/FILE3", 0600)) != 0)
64         return __LINE__;
65
66     if (close(creat("/tmp/qemu-test_path/DIR1/DIR2/FILE4", 0600)) != 0)
67         return __LINE__;
68
69     if (close(creat("/tmp/qemu-test_path/DIR1/DIR2/FILE5", 0600)) != 0)
70         return __LINE__;
71
72     init_paths("/tmp/qemu-test_path");
73
74     NO_CHANGE("/tmp");
75     NO_CHANGE("/tmp/");
76     NO_CHANGE("/tmp/qemu-test_path");
77     NO_CHANGE("/tmp/qemu-test_path/");
78     NO_CHANGE("/tmp/qemu-test_path/D");
79     NO_CHANGE("/tmp/qemu-test_path/DI");
80     NO_CHANGE("/tmp/qemu-test_path/DIR");
81     NO_CHANGE("/tmp/qemu-test_path/DIR1");
82     NO_CHANGE("/tmp/qemu-test_path/DIR1/");
83
84     NO_CHANGE("/D");
85     NO_CHANGE("/DI");
86     NO_CHANGE("/DIR");
87     NO_CHANGE("/DIR2");
88     NO_CHANGE("/DIR1.");
89
90     CHANGE_TO("/DIR1", "/tmp/qemu-test_path/DIR1");
91     CHANGE_TO("/DIR1/", "/tmp/qemu-test_path/DIR1");
92
93     NO_CHANGE("/DIR1/D");
94     NO_CHANGE("/DIR1/DI");
95     NO_CHANGE("/DIR1/DIR");
96     NO_CHANGE("/DIR1/DIR1");
97
98     CHANGE_TO("/DIR1/DIR2", "/tmp/qemu-test_path/DIR1/DIR2");
99     CHANGE_TO("/DIR1/DIR2/", "/tmp/qemu-test_path/DIR1/DIR2");
100
101     CHANGE_TO("/DIR1/DIR3", "/tmp/qemu-test_path/DIR1/DIR3");
102     CHANGE_TO("/DIR1/DIR3/", "/tmp/qemu-test_path/DIR1/DIR3");
103
104     NO_CHANGE("/DIR1/DIR2/F");
105     NO_CHANGE("/DIR1/DIR2/FI");
106     NO_CHANGE("/DIR1/DIR2/FIL");
107     NO_CHANGE("/DIR1/DIR2/FIL.");
108
109     CHANGE_TO("/DIR1/DIR2/FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
110     CHANGE_TO("/DIR1/DIR2/FILE2", "/tmp/qemu-test_path/DIR1/DIR2/FILE2");
111     CHANGE_TO("/DIR1/DIR2/FILE3", "/tmp/qemu-test_path/DIR1/DIR2/FILE3");
112     CHANGE_TO("/DIR1/DIR2/FILE4", "/tmp/qemu-test_path/DIR1/DIR2/FILE4");
113     CHANGE_TO("/DIR1/DIR2/FILE5", "/tmp/qemu-test_path/DIR1/DIR2/FILE5");
114
115     NO_CHANGE("/DIR1/DIR2/FILE6");
116     NO_CHANGE("/DIR1/DIR2/FILE/X");
117
118     CHANGE_TO("/DIR1/../DIR1", "/tmp/qemu-test_path/DIR1");
119     CHANGE_TO("/DIR1/../DIR1/", "/tmp/qemu-test_path/DIR1");
120     CHANGE_TO("/../DIR1", "/tmp/qemu-test_path/DIR1");
121     CHANGE_TO("/../DIR1/", "/tmp/qemu-test_path/DIR1");
122     CHANGE_TO("/DIR1/DIR2/../DIR2", "/tmp/qemu-test_path/DIR1/DIR2");
123     CHANGE_TO("/DIR1/DIR2/../DIR2/../../DIR1/DIR2/FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
124     CHANGE_TO("/DIR1/DIR2/../DIR2/FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
125
126     NO_CHANGE("/DIR1/DIR2/../DIR1");
127     NO_CHANGE("/DIR1/DIR2/../FILE");
128
129     CHANGE_TO("/./DIR1/DIR2/FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
130     CHANGE_TO("/././DIR1/DIR2/FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
131     CHANGE_TO("/DIR1/./DIR2/FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
132     CHANGE_TO("/DIR1/././DIR2/FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
133     CHANGE_TO("/DIR1/DIR2/./FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
134     CHANGE_TO("/DIR1/DIR2/././FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
135     CHANGE_TO("/./DIR1/./DIR2/./FILE", "/tmp/qemu-test_path/DIR1/DIR2/FILE");
136
137     return 0;
138 }
139
140 int main(int argc, char *argv[])
141 {
142     int ret;
143
144     ret = do_test();
145     cleanup();
146     if (ret) {
147         fprintf(stderr, "test_path: failed on line %i\n", ret);
148         return 1;
149     }
150     return 0;
151 }
152