summaryrefslogtreecommitdiff
path: root/src/user/app/tests/kernel/path.c
blob: bc87881e3dd15edbbc353e935778623531896ced (plain)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "../tests.h"
#include <camellia/path.h>
#include <string.h>

static void test_path_simplify(void) {
	const char *testcases[][2] = {
		{"/",         "/"},
		{"/.",        "/"},
		{"//",        "/"},
		{"/asdf",     "/asdf"},
		{"/asdf/",    "/asdf/"},
		{"/asdf//",   "/asdf/"},
		{"/asdf/./",  "/asdf/"},
		{"/a/./b",    "/a/b"},
		{"/a/./b/",   "/a/b/"},

		// some slightly less easy cases
		{"/asdf/..",  "/"},
		{"/asdf/../", "/"},
		{"/asdf/.",   "/asdf/"},
		{"/asdf//.",  "/asdf/"},

		{"/foo/bar/..", "/foo/"},
		{"/foo/bar/../baz",  "/foo/baz"},
		{"/foo/bar/../baz/", "/foo/baz/"},
		{"/foo/bar/xyz/..",  "/foo/bar/"},
		{"/foo/bar/xyz/../", "/foo/bar/"},

		// going under the root or close to it
		{"/..",        NULL},
		{"/../asdf",   NULL},
		{"/../asdf/",  NULL},
		{"/./a/../..", NULL},
		{"/a/a/../..", "/"},
		{"/a/../a/..", "/"},
		{"/a/../../a", NULL},
		{"/../a/../a", NULL},
		{"/../../a/a", NULL},
		{"/////../..", NULL},
		{"//a//../..", NULL},

		// relative paths aren't allowed
		{"relative",   NULL},
		{"some/stuff", NULL},
		{"./stuff",    NULL},
		{"../stuff",   NULL},
		{"",           NULL},
	};

	char buf[256];
	for (size_t i = 0; i < sizeof(testcases) / sizeof(testcases[0]); i++) {
		const char *input    = testcases[i][0];
		const char *expected = testcases[i][1];
		int len = path_simplify(input, buf, strlen(input));
		if (expected == NULL) {
			test(len < 0);
		} else {
			// TODO an argument for printing info on test failure
			test(len == (int)strlen(expected) && !memcmp(expected, buf, len));
		}
	}
}

void r_k_path(void) {
	run_test(test_path_simplify);
}