utils_tests.c (4484B)
1 #include "utils.h" 2 3 #include <limits.h> 4 #include <string.h> 5 6 #include "utest.h" 7 8 UTEST(path_concat, CanConcatenatePaths) { 9 char* out = path_concat("p1", "p2"); 10 EXPECT_STREQ("p1/p2", out); 11 free(out); 12 } 13 14 UTEST(path_concat, CanConcatenatePathsFirstEmpty) { 15 char* out = path_concat("", "p2"); 16 EXPECT_STREQ("p2", out); 17 free(out); 18 } 19 20 UTEST(path_concat, CanConcatenatePathsSecondEmpty) { 21 char* out = path_concat("p1", ""); 22 EXPECT_STREQ("p1", out); 23 free(out); 24 } 25 26 UTEST(path_concat, BothEmpty) { 27 char* out = path_concat("", ""); 28 EXPECT_STREQ("", out); 29 free(out); 30 } 31 32 UTEST(path_concat, TrailingSlashP1) { 33 char* out = path_concat("p1/", "p2"); 34 EXPECT_STREQ("p1/p2", out); 35 free(out); 36 } 37 38 UTEST(path_concat, LeadingSlashP2) { 39 char* out = path_concat("p1", "/p2"); 40 EXPECT_STREQ("p1/p2", out); 41 free(out); 42 } 43 44 UTEST(path_concat, BothSlashes) { 45 char* out = path_concat("p1/", "/p2"); 46 EXPECT_STREQ("p1/p2", out); 47 free(out); 48 } 49 50 UTEST(path_concat, AbsoluteP1) { 51 char* out = path_concat("/p1", "p2"); 52 EXPECT_STREQ("/p1/p2", out); 53 free(out); 54 } 55 56 UTEST(path_concat, NestedPaths) { 57 char* out = path_concat("a/b", "c/d"); 58 EXPECT_STREQ("a/b/c/d", out); 59 free(out); 60 } 61 62 UTEST(path_concat, MultipleTrailingSlashesP1) { 63 char* out = path_concat("p1//", "p2"); 64 EXPECT_STREQ("p1//p2", out); 65 free(out); 66 } 67 68 UTEST(is_safe_repo_path, AllowsValidRelativePaths) { 69 EXPECT_TRUE(is_safe_repo_path("foo")); 70 EXPECT_TRUE(is_safe_repo_path("foo/bar")); 71 EXPECT_TRUE(is_safe_repo_path("foo/bar.txt")); 72 EXPECT_TRUE(is_safe_repo_path(".foo")); 73 EXPECT_TRUE(is_safe_repo_path("foo.bar/baz")); 74 } 75 76 UTEST(is_safe_repo_path, RejectsInvalidPaths) { 77 EXPECT_FALSE(is_safe_repo_path("/foo")); 78 EXPECT_FALSE(is_safe_repo_path("/foo/bar")); 79 EXPECT_FALSE(is_safe_repo_path("..")); 80 EXPECT_FALSE(is_safe_repo_path("../foo")); 81 EXPECT_FALSE(is_safe_repo_path("foo/..")); 82 EXPECT_FALSE(is_safe_repo_path("foo/../bar")); 83 EXPECT_FALSE(is_safe_repo_path("foo/./../bar")); 84 } 85 86 UTEST(is_safe_url, AllowsValidSchemes) { 87 EXPECT_TRUE(is_safe_url("http://example.com")); 88 EXPECT_TRUE(is_safe_url("https://example.com")); 89 EXPECT_TRUE(is_safe_url("git://example.com")); 90 } 91 92 UTEST(is_safe_url, RejectsInvalidSchemes) { 93 EXPECT_FALSE(is_safe_url("ftp://example.com")); 94 EXPECT_FALSE(is_safe_url("javascript:alert(1)")); 95 EXPECT_FALSE(is_safe_url("example.com")); 96 EXPECT_FALSE(is_safe_url("http:/example.com")); 97 EXPECT_FALSE(is_safe_url("http//example.com")); 98 EXPECT_FALSE(is_safe_url("")); 99 } 100 101 UTEST(is_safe_mailto, AllowsValidEmails) { 102 EXPECT_TRUE(is_safe_mailto("test@example.com")); 103 EXPECT_TRUE(is_safe_mailto("test.user+alias@example.co.uk")); 104 } 105 106 UTEST(is_safe_mailto, RejectsInvalidCharacters) { 107 EXPECT_FALSE(is_safe_mailto("test<script>@example.com")); 108 EXPECT_FALSE(is_safe_mailto("test>@example.com")); 109 EXPECT_FALSE(is_safe_mailto("test\"@example.com")); 110 EXPECT_FALSE(is_safe_mailto("test'@example.com")); 111 EXPECT_FALSE(is_safe_mailto("test\\@example.com")); 112 EXPECT_FALSE(is_safe_mailto("test@example.com\n")); 113 } 114 115 UTEST(relpath_from_dir, EmptyOrNull) { 116 char* r1 = relpath_from_dir(""); 117 EXPECT_STREQ("", r1); 118 free(r1); 119 120 char* r2 = relpath_from_dir(NULL); 121 EXPECT_STREQ("", r2); 122 free(r2); 123 124 char* r3 = relpath_from_dir("."); 125 EXPECT_STREQ("", r3); 126 free(r3); 127 } 128 129 UTEST(relpath_from_dir, SingleDirectory) { 130 char* r1 = relpath_from_dir("foo"); 131 EXPECT_STREQ("../", r1); 132 free(r1); 133 134 char* r2 = relpath_from_dir("foo/"); 135 EXPECT_STREQ("../", r2); 136 free(r2); 137 } 138 139 UTEST(relpath_from_dir, LeadingSlash) { 140 char* r2 = relpath_from_dir("/foo"); 141 EXPECT_STREQ("../", r2); 142 free(r2); 143 } 144 145 UTEST(relpath_from_dir, TrailingSlash) { 146 char* r2 = relpath_from_dir("foo/"); 147 EXPECT_STREQ("../", r2); 148 free(r2); 149 } 150 151 UTEST(relpath_from_dir, NestedDirectories) { 152 char* r1 = relpath_from_dir("foo/bar"); 153 EXPECT_STREQ("../../", r1); 154 free(r1); 155 156 char* r2 = relpath_from_dir("foo/bar/baz"); 157 EXPECT_STREQ("../../../", r2); 158 free(r2); 159 160 char* r3 = relpath_from_dir("a/b/c/d/e"); 161 EXPECT_STREQ("../../../../../", r3); 162 free(r3); 163 } 164 165 UTEST(relpath_from_dir, MultipleSlashes) { 166 char* r1 = relpath_from_dir("foo//bar"); 167 EXPECT_STREQ("../../", r1); 168 free(r1); 169 170 char* r2 = relpath_from_dir("//foo///bar//"); 171 EXPECT_STREQ("../../", r2); 172 free(r2); 173 } 174 175 UTEST(relpath_from_dir, AbsolutePath) { 176 char* r1 = relpath_from_dir("/foo"); 177 EXPECT_STREQ("../", r1); 178 free(r1); 179 180 char* r2 = relpath_from_dir("/"); 181 EXPECT_STREQ("", r2); 182 free(r2); 183 }