1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <kernel/tests/base.h>
#include <kernel/util.h>
#include <kernel/vfs/path.h>
TEST(path_simplify) {
#define TEST_WRAPPER(argument, result) do { \
int len = path_simplify(argument, buf, sizeof(argument) - 1); \
if (result == 0) { \
TEST_COND(len < 0); \
} else { \
TEST_COND(len > 0); \
/* TODO check equality */ \
} \
} while (0)
char buf[256];
// some easy cases first
TEST_WRAPPER("/", "/");
TEST_WRAPPER("/asdf", "/asdf");
TEST_WRAPPER("/asdf/", "/asdf/");
TEST_WRAPPER("/asdf//", "/asdf/");
TEST_WRAPPER("/asdf/./", "/asdf/");
TEST_WRAPPER("/a/./b", "/a/b");
TEST_WRAPPER("/a/./b/", "/a/b/");
// some slightly less easy cases
TEST_WRAPPER("/asdf/..", "/");
TEST_WRAPPER("/asdf/../", "/");
TEST_WRAPPER("/asdf/.", "/asdf/");
TEST_WRAPPER("/asdf//.", "/asdf/");
// going under the root or close to it
TEST_WRAPPER("/../asdf", 0);
TEST_WRAPPER("/../asdf/", 0);
TEST_WRAPPER("/./a/../..", 0);
TEST_WRAPPER("/a/a/../..", "/");
TEST_WRAPPER("/////../..", 0);
TEST_WRAPPER("//a//../..", 0);
// relative paths aren't allowed
TEST_WRAPPER("relative", 0);
TEST_WRAPPER("some/stuff", 0);
TEST_WRAPPER("./stuff", 0);
TEST_WRAPPER("../stuff", 0);
TEST_WRAPPER("", 0);
#undef TEST_WRAPPER
}
void tests_vfs() {
TEST_RUN(path_simplify);
}
|