gout

A static git page generator
git clone https://git.bracken.jp/gout.git
Log | Files | Refs | README | LICENSE

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 }