length-limits.test.c (3723B)
1 #include "url-parser.h" 2 #include "test.h" 3 4 void test_scheme_too_long() { 5 char scheme[72]; 6 memset(scheme, 'a', 65); 7 scheme[0] = 'h'; 8 scheme[1] = 't'; 9 scheme[2] = 't'; 10 scheme[3] = 'p'; 11 scheme[65] = '\0'; 12 char url[128]; 13 snprintf(url, sizeof(url), "%s://example.com", scheme); 14 struct parsed_url *purl = parse_url(url); 15 ASSERT("scheme too long returns NULL", purl == NULL); 16 ASSERT_STRING_EQUALS("ERR_SCHEME_TOO_LONG", parse_url_last_error()); 17 } 18 19 void test_username_too_long() { 20 char user[262]; 21 memset(user, 'a', 256); 22 user[256] = '\0'; 23 char url[320]; 24 snprintf(url, sizeof(url), "http://%s@example.com/", user); 25 struct parsed_url *purl = parse_url(url); 26 ASSERT("username too long returns NULL", purl == NULL); 27 ASSERT_STRING_EQUALS("ERR_USERNAME_TOO_LONG", parse_url_last_error()); 28 } 29 30 void test_password_too_long() { 31 char pass[262]; 32 memset(pass, 'a', 256); 33 pass[256] = '\0'; 34 char url[320]; 35 snprintf(url, sizeof(url), "http://user:%s@example.com/", pass); 36 struct parsed_url *purl = parse_url(url); 37 ASSERT("password too long returns NULL", purl == NULL); 38 ASSERT_STRING_EQUALS("ERR_PASSWORD_TOO_LONG", parse_url_last_error()); 39 } 40 41 void test_host_too_long() { 42 char host[262]; 43 memset(host, 'a', 256); 44 host[256] = '\0'; 45 char url[320]; 46 snprintf(url, sizeof(url), "http://%s/", host); 47 struct parsed_url *purl = parse_url(url); 48 ASSERT("host too long returns NULL", purl == NULL); 49 ASSERT_STRING_EQUALS("ERR_HOST_TOO_LONG", parse_url_last_error()); 50 } 51 52 void test_port_too_long() { 53 struct parsed_url *purl = parse_url("http://example.com:123456/"); 54 ASSERT("port too long returns NULL", purl == NULL); 55 ASSERT_STRING_EQUALS("ERR_PORT_TOO_LONG", parse_url_last_error()); 56 } 57 58 void test_port_invalid_zero() { 59 struct parsed_url *purl = parse_url("http://example.com:0/"); 60 ASSERT("port zero returns NULL", purl == NULL); 61 ASSERT_STRING_EQUALS("ERR_PORT_INVALID", parse_url_last_error()); 62 } 63 64 void test_port_invalid_overflow() { 65 struct parsed_url *purl = parse_url("http://example.com:65536/"); 66 ASSERT("port overflow returns NULL", purl == NULL); 67 ASSERT_STRING_EQUALS("ERR_PORT_INVALID", parse_url_last_error()); 68 } 69 70 void test_path_too_long() { 71 char path[4100]; 72 memset(path, 'a', 4097); 73 path[4097] = '\0'; 74 char url[4200]; 75 snprintf(url, sizeof(url), "http://example.com/%s", path); 76 struct parsed_url *purl = parse_url(url); 77 ASSERT("path too long returns NULL", purl == NULL); 78 ASSERT_STRING_EQUALS("ERR_PATH_TOO_LONG", parse_url_last_error()); 79 } 80 81 void test_query_too_long() { 82 char query[4100]; 83 memset(query, 'a', 4097); 84 query[4097] = '\0'; 85 char url[4200]; 86 snprintf(url, sizeof(url), "http://example.com/?%s", query); 87 struct parsed_url *purl = parse_url(url); 88 ASSERT("query too long returns NULL", purl == NULL); 89 ASSERT_STRING_EQUALS("ERR_QUERY_TOO_LONG", parse_url_last_error()); 90 } 91 92 void test_fragment_too_long() { 93 char frag[4100]; 94 memset(frag, 'a', 4097); 95 frag[4097] = '\0'; 96 char url[4200]; 97 snprintf(url, sizeof(url), "http://example.com/#%s", frag); 98 struct parsed_url *purl = parse_url(url); 99 ASSERT("fragment too long returns NULL", purl == NULL); 100 ASSERT_STRING_EQUALS("ERR_FRAGMENT_TOO_LONG", parse_url_last_error()); 101 } 102 103 int main() { 104 RUN(test_scheme_too_long); 105 RUN(test_username_too_long); 106 RUN(test_password_too_long); 107 RUN(test_host_too_long); 108 RUN(test_port_too_long); 109 RUN(test_port_invalid_zero); 110 RUN(test_port_invalid_overflow); 111 RUN(test_path_too_long); 112 RUN(test_query_too_long); 113 RUN(test_fragment_too_long); 114 return TEST_REPORT(); 115 }