]>
Commit | Line | Data |
---|---|---|
11fdf7f2 | 1 | /* Copyright (c) 2015-2017 the Civetweb developers\r |
7c673cae FG |
2 | *\r |
3 | * Permission is hereby granted, free of charge, to any person obtaining a copy\r | |
4 | * of this software and associated documentation files (the "Software"), to deal\r | |
5 | * in the Software without restriction, including without limitation the rights\r | |
6 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r | |
7 | * copies of the Software, and to permit persons to whom the Software is\r | |
8 | * furnished to do so, subject to the following conditions:\r | |
9 | *\r | |
10 | * The above copyright notice and this permission notice shall be included in\r | |
11 | * all copies or substantial portions of the Software.\r | |
12 | *\r | |
13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r | |
14 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r | |
15 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r | |
16 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r | |
17 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r | |
18 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r | |
19 | * THE SOFTWARE.\r | |
20 | */\r | |
21 | \r | |
22 | #ifdef _MSC_VER\r | |
23 | #ifndef _CRT_SECURE_NO_WARNINGS\r | |
24 | #define _CRT_SECURE_NO_WARNINGS\r | |
25 | #endif\r | |
26 | #endif\r | |
27 | \r | |
28 | #include <stdlib.h>\r | |
29 | #include <stdio.h>\r | |
30 | \r | |
31 | #include "public_func.h"\r | |
32 | #include <civetweb.h>\r | |
33 | \r | |
34 | /* This unit test file uses the excellent Check unit testing library.\r | |
35 | * The API documentation is available here:\r | |
36 | * http://check.sourceforge.net/doc/check_html/index.html\r | |
37 | */\r | |
38 | \r | |
39 | START_TEST(test_mg_version)\r | |
40 | {\r | |
41 | const char *ver = mg_version();\r | |
42 | unsigned major = 0, minor = 0;\r | |
43 | unsigned feature_files, feature_https, feature_cgi, feature_ipv6,\r | |
44 | feature_websocket, feature_lua, feature_duktape, feature_caching;\r | |
45 | unsigned expect_files = 0, expect_https = 0, expect_cgi = 0,\r | |
46 | expect_ipv6 = 0, expect_websocket = 0, expect_lua = 0,\r | |
47 | expect_duktape = 0, expect_caching = 0;\r | |
11fdf7f2 TL |
48 | int ret, len;\r |
49 | char *buf;\r | |
7c673cae FG |
50 | \r |
51 | ck_assert(ver != NULL);\r | |
52 | ck_assert_str_eq(ver, CIVETWEB_VERSION);\r | |
53 | \r | |
54 | /* check structure of version string */\r | |
55 | ret = sscanf(ver, "%u.%u", &major, &minor);\r | |
56 | ck_assert_int_eq(ret, 2);\r | |
57 | ck_assert_uint_ge(major, 1);\r | |
58 | if (major == 1) {\r | |
59 | ck_assert_uint_ge(minor, 8); /* current version is 1.8 */\r | |
60 | }\r | |
61 | \r | |
62 | /* check feature */\r | |
63 | feature_files = mg_check_feature(1);\r | |
64 | feature_https = mg_check_feature(2);\r | |
65 | feature_cgi = mg_check_feature(4);\r | |
66 | feature_ipv6 = mg_check_feature(8);\r | |
67 | feature_websocket = mg_check_feature(16);\r | |
68 | feature_lua = mg_check_feature(32);\r | |
69 | feature_duktape = mg_check_feature(64);\r | |
70 | feature_caching = mg_check_feature(128);\r | |
71 | \r | |
72 | #if !defined(NO_FILES)\r | |
73 | expect_files = 1;\r | |
74 | #endif\r | |
75 | #if !defined(NO_SSL)\r | |
76 | expect_https = 1;\r | |
77 | #endif\r | |
78 | #if !defined(NO_CGI)\r | |
79 | expect_cgi = 1;\r | |
80 | #endif\r | |
81 | #if defined(USE_IPV6)\r | |
82 | expect_ipv6 = 1;\r | |
83 | #endif\r | |
84 | #if defined(USE_WEBSOCKET)\r | |
85 | expect_websocket = 1;\r | |
86 | #endif\r | |
87 | #if defined(USE_LUA)\r | |
88 | expect_lua = 1;\r | |
89 | #endif\r | |
90 | #if defined(USE_DUKTAPE)\r | |
91 | expect_duktape = 1;\r | |
92 | #endif\r | |
93 | #if !defined(NO_CACHING)\r | |
94 | expect_caching = 1;\r | |
95 | #endif\r | |
96 | \r | |
97 | ck_assert_uint_eq(expect_files, !!feature_files);\r | |
98 | ck_assert_uint_eq(expect_https, !!feature_https);\r | |
99 | ck_assert_uint_eq(expect_cgi, !!feature_cgi);\r | |
100 | ck_assert_uint_eq(expect_ipv6, !!feature_ipv6);\r | |
101 | ck_assert_uint_eq(expect_websocket, !!feature_websocket);\r | |
102 | ck_assert_uint_eq(expect_lua, !!feature_lua);\r | |
103 | ck_assert_uint_eq(expect_duktape, !!feature_duktape);\r | |
104 | ck_assert_uint_eq(expect_caching, !!feature_caching);\r | |
11fdf7f2 TL |
105 | \r |
106 | /* get system information */\r | |
107 | len = mg_get_system_info(NULL, 0);\r | |
108 | ck_assert_int_gt(len, 0);\r | |
109 | buf = (char *)malloc((unsigned)len + 1);\r | |
110 | ck_assert_ptr_ne(buf, NULL);\r | |
111 | ret = mg_get_system_info(buf, len + 1);\r | |
112 | ck_assert_int_eq(len, ret);\r | |
113 | ret = (int)strlen(buf);\r | |
114 | ck_assert_int_eq(len, ret);\r | |
115 | free(buf);\r | |
7c673cae FG |
116 | }\r |
117 | END_TEST\r | |
118 | \r | |
119 | \r | |
120 | START_TEST(test_mg_get_valid_options)\r | |
121 | {\r | |
122 | int i;\r | |
123 | const struct mg_option *default_options = mg_get_valid_options();\r | |
124 | \r | |
125 | ck_assert(default_options != NULL);\r | |
126 | \r | |
127 | for (i = 0; default_options[i].name != NULL; i++) {\r | |
128 | ck_assert(default_options[i].name != NULL);\r | |
129 | ck_assert(strlen(default_options[i].name) > 0);\r | |
130 | ck_assert(((int)default_options[i].type) > 0);\r | |
131 | }\r | |
132 | \r | |
133 | ck_assert(i > 0);\r | |
134 | }\r | |
135 | END_TEST\r | |
136 | \r | |
137 | \r | |
138 | START_TEST(test_mg_get_builtin_mime_type)\r | |
139 | {\r | |
140 | ck_assert_str_eq(mg_get_builtin_mime_type("x.txt"), "text/plain");\r | |
141 | ck_assert_str_eq(mg_get_builtin_mime_type("x.html"), "text/html");\r | |
142 | ck_assert_str_eq(mg_get_builtin_mime_type("x.HTML"), "text/html");\r | |
143 | ck_assert_str_eq(mg_get_builtin_mime_type("x.hTmL"), "text/html");\r | |
144 | ck_assert_str_eq(mg_get_builtin_mime_type("/abc/def/ghi.htm"), "text/html");\r | |
145 | ck_assert_str_eq(mg_get_builtin_mime_type("x.unknown_extention_xyz"),\r | |
146 | "text/plain");\r | |
147 | }\r | |
148 | END_TEST\r | |
149 | \r | |
150 | \r | |
151 | START_TEST(test_mg_strncasecmp)\r | |
152 | {\r | |
153 | ck_assert(mg_strncasecmp("abc", "abc", 3) == 0);\r | |
154 | ck_assert(mg_strncasecmp("abc", "abcd", 3) == 0);\r | |
155 | ck_assert(mg_strncasecmp("abc", "abcd", 4) != 0);\r | |
156 | ck_assert(mg_strncasecmp("a", "A", 1) == 0);\r | |
157 | \r | |
158 | ck_assert(mg_strncasecmp("A", "B", 1) < 0);\r | |
159 | ck_assert(mg_strncasecmp("A", "b", 1) < 0);\r | |
160 | ck_assert(mg_strncasecmp("a", "B", 1) < 0);\r | |
161 | ck_assert(mg_strncasecmp("a", "b", 1) < 0);\r | |
162 | ck_assert(mg_strncasecmp("b", "A", 1) > 0);\r | |
163 | ck_assert(mg_strncasecmp("B", "A", 1) > 0);\r | |
164 | ck_assert(mg_strncasecmp("b", "a", 1) > 0);\r | |
165 | ck_assert(mg_strncasecmp("B", "a", 1) > 0);\r | |
166 | \r | |
167 | ck_assert(mg_strncasecmp("xAx", "xBx", 3) < 0);\r | |
168 | ck_assert(mg_strncasecmp("xAx", "xbx", 3) < 0);\r | |
169 | ck_assert(mg_strncasecmp("xax", "xBx", 3) < 0);\r | |
170 | ck_assert(mg_strncasecmp("xax", "xbx", 3) < 0);\r | |
171 | ck_assert(mg_strncasecmp("xbx", "xAx", 3) > 0);\r | |
172 | ck_assert(mg_strncasecmp("xBx", "xAx", 3) > 0);\r | |
173 | ck_assert(mg_strncasecmp("xbx", "xax", 3) > 0);\r | |
174 | ck_assert(mg_strncasecmp("xBx", "xax", 3) > 0);\r | |
175 | }\r | |
176 | END_TEST\r | |
177 | \r | |
178 | \r | |
179 | START_TEST(test_mg_get_cookie)\r | |
180 | {\r | |
181 | char buf[32];\r | |
182 | int ret;\r | |
183 | const char *longcookie = "key1=1; key2=2; key3; key4=4; key5=; key6; "\r | |
184 | "key7=this+is+it; key8=8; key9";\r | |
185 | \r | |
186 | /* invalid result buffer */\r | |
187 | ret = mg_get_cookie("", "notfound", NULL, 999);\r | |
188 | ck_assert_int_eq(ret, -2);\r | |
189 | \r | |
190 | /* zero size result buffer */\r | |
191 | ret = mg_get_cookie("", "notfound", buf, 0);\r | |
192 | ck_assert_int_eq(ret, -2);\r | |
193 | \r | |
194 | /* too small result buffer */\r | |
195 | ret = mg_get_cookie("key=toooooooooolong", "key", buf, 4);\r | |
196 | ck_assert_int_eq(ret, -3);\r | |
197 | \r | |
198 | /* key not found in string */\r | |
199 | ret = mg_get_cookie("", "notfound", buf, sizeof(buf));\r | |
200 | ck_assert_int_eq(ret, -1);\r | |
201 | \r | |
202 | ret = mg_get_cookie(longcookie, "notfound", buf, sizeof(buf));\r | |
203 | ck_assert_int_eq(ret, -1);\r | |
204 | \r | |
205 | /* key not found in string */\r | |
206 | ret = mg_get_cookie("key1=1; key2=2; key3=3", "notfound", buf, sizeof(buf));\r | |
207 | ck_assert_int_eq(ret, -1);\r | |
208 | \r | |
209 | /* keys are found as first, middle and last key */\r | |
210 | memset(buf, 77, sizeof(buf));\r | |
211 | ret = mg_get_cookie("key1=1; key2=2; key3=3", "key1", buf, sizeof(buf));\r | |
212 | ck_assert_int_eq(ret, 1);\r | |
213 | ck_assert_str_eq("1", buf);\r | |
214 | \r | |
215 | memset(buf, 77, sizeof(buf));\r | |
216 | ret = mg_get_cookie("key1=1; key2=2; key3=3", "key2", buf, sizeof(buf));\r | |
217 | ck_assert_int_eq(ret, 1);\r | |
218 | ck_assert_str_eq("2", buf);\r | |
219 | \r | |
220 | memset(buf, 77, sizeof(buf));\r | |
221 | ret = mg_get_cookie("key1=1; key2=2; key3=3", "key3", buf, sizeof(buf));\r | |
222 | ck_assert_int_eq(ret, 1);\r | |
223 | ck_assert_str_eq("3", buf);\r | |
224 | \r | |
225 | /* longer value in the middle of a longer string */\r | |
226 | memset(buf, 77, sizeof(buf));\r | |
227 | ret = mg_get_cookie(longcookie, "key7", buf, sizeof(buf));\r | |
228 | ck_assert_int_eq(ret, 10);\r | |
229 | ck_assert_str_eq("this+is+it", buf);\r | |
230 | \r | |
231 | /* key with = but without value in the middle of a longer string */\r | |
232 | memset(buf, 77, sizeof(buf));\r | |
233 | ret = mg_get_cookie(longcookie, "key5", buf, sizeof(buf));\r | |
234 | ck_assert_int_eq(ret, 0);\r | |
235 | ck_assert_str_eq("", buf);\r | |
236 | \r | |
237 | /* key without = and without value in the middle of a longer string */\r | |
238 | memset(buf, 77, sizeof(buf));\r | |
239 | ret = mg_get_cookie(longcookie, "key6", buf, sizeof(buf));\r | |
240 | ck_assert_int_eq(ret, -1);\r | |
241 | /* TODO: mg_get_cookie and mg_get_var(2) should have the same behavior */\r | |
242 | }\r | |
243 | END_TEST\r | |
244 | \r | |
245 | \r | |
246 | START_TEST(test_mg_get_var)\r | |
247 | {\r | |
248 | char buf[32];\r | |
249 | int ret;\r | |
250 | const char *shortquery = "key1=1&key2=2&key3=3";\r | |
251 | const char *longquery = "key1=1&key2=2&key3&key4=4&key5=&key6&"\r | |
252 | "key7=this+is+it&key8=8&key9&&key10=&&"\r | |
253 | "key7=that+is+it&key12=12";\r | |
254 | \r | |
255 | /* invalid result buffer */\r | |
256 | ret = mg_get_var2("", 0, "notfound", NULL, 999, 0);\r | |
257 | ck_assert_int_eq(ret, -2);\r | |
258 | \r | |
259 | /* zero size result buffer */\r | |
260 | ret = mg_get_var2("", 0, "notfound", buf, 0, 0);\r | |
261 | ck_assert_int_eq(ret, -2);\r | |
262 | \r | |
263 | /* too small result buffer */\r | |
264 | ret = mg_get_var2("key=toooooooooolong", 19, "key", buf, 4, 0);\r | |
265 | /* ck_assert_int_eq(ret, -3);\r | |
266 | --> TODO: mg_get_cookie returns -3, mg_get_var -2. This should be\r | |
267 | unified. */\r | |
268 | ck_assert(ret < 0);\r | |
269 | \r | |
270 | /* key not found in string */\r | |
271 | ret = mg_get_var2("", 0, "notfound", buf, sizeof(buf), 0);\r | |
272 | ck_assert_int_eq(ret, -1);\r | |
273 | \r | |
274 | ret = mg_get_var2(\r | |
275 | longquery, strlen(longquery), "notfound", buf, sizeof(buf), 0);\r | |
276 | ck_assert_int_eq(ret, -1);\r | |
277 | \r | |
278 | /* key not found in string */\r | |
279 | ret = mg_get_var2(\r | |
280 | shortquery, strlen(shortquery), "notfound", buf, sizeof(buf), 0);\r | |
281 | ck_assert_int_eq(ret, -1);\r | |
282 | \r | |
283 | /* key not found in string */\r | |
284 | ret = mg_get_var2("key1=1&key2=2&key3=3¬found=here",\r | |
285 | strlen(shortquery),\r | |
286 | "notfound",\r | |
287 | buf,\r | |
288 | sizeof(buf),\r | |
289 | 0);\r | |
290 | ck_assert_int_eq(ret, -1);\r | |
291 | \r | |
292 | /* key not found in string */\r | |
293 | ret = mg_get_var2(\r | |
294 | shortquery, strlen(shortquery), "key1", buf, sizeof(buf), 1);\r | |
295 | ck_assert_int_eq(ret, -1);\r | |
296 | \r | |
297 | /* keys are found as first, middle and last key */\r | |
298 | memset(buf, 77, sizeof(buf));\r | |
299 | ret = mg_get_var2(\r | |
300 | shortquery, strlen(shortquery), "key1", buf, sizeof(buf), 0);\r | |
301 | ck_assert_int_eq(ret, 1);\r | |
302 | ck_assert_str_eq("1", buf);\r | |
303 | \r | |
304 | memset(buf, 77, sizeof(buf));\r | |
305 | ret = mg_get_var2(\r | |
306 | shortquery, strlen(shortquery), "key2", buf, sizeof(buf), 0);\r | |
307 | ck_assert_int_eq(ret, 1);\r | |
308 | ck_assert_str_eq("2", buf);\r | |
309 | \r | |
310 | memset(buf, 77, sizeof(buf));\r | |
311 | ret = mg_get_var2(\r | |
312 | shortquery, strlen(shortquery), "key3", buf, sizeof(buf), 0);\r | |
313 | ck_assert_int_eq(ret, 1);\r | |
314 | ck_assert_str_eq("3", buf);\r | |
315 | \r | |
316 | /* mg_get_var call mg_get_var2 with last argument 0 */\r | |
317 | memset(buf, 77, sizeof(buf));\r | |
318 | ret = mg_get_var(shortquery, strlen(shortquery), "key1", buf, sizeof(buf));\r | |
319 | ck_assert_int_eq(ret, 1);\r | |
320 | ck_assert_str_eq("1", buf);\r | |
321 | \r | |
322 | /* longer value in the middle of a longer string */\r | |
323 | memset(buf, 77, sizeof(buf));\r | |
324 | ret =\r | |
325 | mg_get_var2(longquery, strlen(longquery), "key7", buf, sizeof(buf), 0);\r | |
326 | ck_assert_int_eq(ret, 10);\r | |
327 | ck_assert_str_eq("this is it", buf);\r | |
328 | \r | |
329 | /* longer value in the middle of a longer string - seccond occurance of key\r | |
330 | */\r | |
331 | memset(buf, 77, sizeof(buf));\r | |
332 | ret =\r | |
333 | mg_get_var2(longquery, strlen(longquery), "key7", buf, sizeof(buf), 1);\r | |
334 | ck_assert_int_eq(ret, 10);\r | |
335 | ck_assert_str_eq("that is it", buf);\r | |
336 | \r | |
337 | /* key with = but without value in the middle of a longer string */\r | |
338 | memset(buf, 77, sizeof(buf));\r | |
339 | ret =\r | |
340 | mg_get_var2(longquery, strlen(longquery), "key5", buf, sizeof(buf), 0);\r | |
341 | ck_assert_int_eq(ret, 0);\r | |
342 | ck_assert_str_eq(buf, "");\r | |
343 | \r | |
344 | /* key without = and without value in the middle of a longer string */\r | |
345 | memset(buf, 77, sizeof(buf));\r | |
346 | ret =\r | |
347 | mg_get_var2(longquery, strlen(longquery), "key6", buf, sizeof(buf), 0);\r | |
348 | ck_assert_int_eq(ret, -1);\r | |
349 | ck_assert_str_eq(buf, "");\r | |
350 | /* TODO: this is the same situation as with mg_get_value */\r | |
351 | }\r | |
352 | END_TEST\r | |
353 | \r | |
354 | \r | |
355 | START_TEST(test_mg_md5)\r | |
356 | {\r | |
357 | char buf[33];\r | |
358 | char *ret;\r | |
359 | const char *long_str =\r | |
360 | "_123456789A123456789B123456789C123456789D123456789E123456789F123456789"\r | |
361 | "G123456789H123456789I123456789J123456789K123456789L123456789M123456789"\r | |
362 | "N123456789O123456789P123456789Q123456789R123456789S123456789T123456789"\r | |
363 | "U123456789V123456789W123456789X123456789Y123456789Z";\r | |
364 | \r | |
365 | memset(buf, 77, sizeof(buf));\r | |
366 | ret = mg_md5(buf, NULL);\r | |
367 | ck_assert_str_eq(buf, "d41d8cd98f00b204e9800998ecf8427e");\r | |
368 | ck_assert_str_eq(ret, "d41d8cd98f00b204e9800998ecf8427e");\r | |
369 | ck_assert_ptr_eq(ret, buf);\r | |
370 | \r | |
371 | memset(buf, 77, sizeof(buf));\r | |
372 | ret = mg_md5(buf, "The quick brown fox jumps over the lazy dog.", NULL);\r | |
373 | ck_assert_str_eq(buf, "e4d909c290d0fb1ca068ffaddf22cbd0");\r | |
374 | ck_assert_str_eq(ret, "e4d909c290d0fb1ca068ffaddf22cbd0");\r | |
375 | ck_assert_ptr_eq(ret, buf);\r | |
376 | \r | |
377 | memset(buf, 77, sizeof(buf));\r | |
378 | ret = mg_md5(buf,\r | |
379 | "",\r | |
380 | "The qu",\r | |
381 | "ick bro",\r | |
382 | "",\r | |
383 | "wn fox ju",\r | |
384 | "m",\r | |
385 | "ps over the la",\r | |
386 | "",\r | |
387 | "",\r | |
388 | "zy dog.",\r | |
389 | "",\r | |
390 | NULL);\r | |
391 | ck_assert_str_eq(buf, "e4d909c290d0fb1ca068ffaddf22cbd0");\r | |
392 | ck_assert_str_eq(ret, "e4d909c290d0fb1ca068ffaddf22cbd0");\r | |
393 | ck_assert_ptr_eq(ret, buf);\r | |
394 | \r | |
395 | memset(buf, 77, sizeof(buf));\r | |
396 | ret = mg_md5(buf, long_str, NULL);\r | |
397 | ck_assert_str_eq(buf, "1cb13cf9f16427807f081b2138241f08");\r | |
398 | ck_assert_str_eq(ret, "1cb13cf9f16427807f081b2138241f08");\r | |
399 | ck_assert_ptr_eq(ret, buf);\r | |
400 | \r | |
401 | memset(buf, 77, sizeof(buf));\r | |
402 | ret = mg_md5(buf, long_str + 1, NULL);\r | |
403 | ck_assert_str_eq(buf, "cf62d3264334154f5779d3694cc5093f");\r | |
404 | ck_assert_str_eq(ret, "cf62d3264334154f5779d3694cc5093f");\r | |
405 | ck_assert_ptr_eq(ret, buf);\r | |
406 | }\r | |
407 | END_TEST\r | |
408 | \r | |
409 | \r | |
410 | START_TEST(test_mg_url_encode)\r | |
411 | {\r | |
412 | char buf[20];\r | |
413 | int ret;\r | |
414 | \r | |
415 | memset(buf, 77, sizeof(buf));\r | |
416 | ret = mg_url_encode("abc", buf, sizeof(buf));\r | |
417 | ck_assert_int_eq(3, ret);\r | |
418 | ck_assert_str_eq("abc", buf);\r | |
419 | \r | |
420 | memset(buf, 77, sizeof(buf));\r | |
421 | ret = mg_url_encode("a%b/c&d.e", buf, sizeof(buf));\r | |
422 | ck_assert_int_eq(15, ret);\r | |
423 | ck_assert_str_eq("a%25b%2fc%26d.e", buf);\r | |
424 | \r | |
425 | memset(buf, 77, sizeof(buf));\r | |
426 | ret = mg_url_encode("%%%", buf, 4);\r | |
427 | ck_assert_int_eq(-1, ret);\r | |
428 | ck_assert_str_eq("%25", buf);\r | |
429 | }\r | |
430 | END_TEST\r | |
431 | \r | |
432 | \r | |
433 | START_TEST(test_mg_url_decode)\r | |
434 | {\r | |
435 | char buf[20];\r | |
436 | int ret;\r | |
437 | \r | |
438 | ret = mg_url_decode("abc", 3, buf, sizeof(buf), 0);\r | |
439 | ck_assert_int_eq(ret, 3);\r | |
440 | ck_assert_str_eq(buf, "abc");\r | |
441 | \r | |
442 | ret = mg_url_decode("abcdef", 3, buf, sizeof(buf), 0);\r | |
443 | ck_assert_int_eq(ret, 3);\r | |
444 | ck_assert_str_eq(buf, "abc");\r | |
445 | \r | |
446 | ret = mg_url_decode("x+y", 3, buf, sizeof(buf), 0);\r | |
447 | ck_assert_int_eq(ret, 3);\r | |
448 | ck_assert_str_eq(buf, "x+y");\r | |
449 | \r | |
450 | ret = mg_url_decode("x+y", 3, buf, sizeof(buf), 1);\r | |
451 | ck_assert_int_eq(ret, 3);\r | |
452 | ck_assert_str_eq(buf, "x y");\r | |
453 | \r | |
454 | ret = mg_url_decode("%25", 3, buf, sizeof(buf), 1);\r | |
455 | ck_assert_int_eq(ret, 1);\r | |
456 | ck_assert_str_eq(buf, "%");\r | |
457 | }\r | |
458 | END_TEST\r | |
459 | \r | |
460 | \r | |
461 | START_TEST(test_mg_get_response_code_text)\r | |
462 | {\r | |
463 | int i;\r | |
464 | size_t j, len;\r | |
465 | const char *resp;\r | |
466 | \r | |
467 | for (i = 100; i < 600; i++) {\r | |
468 | resp = mg_get_response_code_text(NULL, i);\r | |
469 | ck_assert_ptr_ne(resp, NULL);\r | |
470 | len = strlen(resp);\r | |
471 | ck_assert_uint_gt(len, 1);\r | |
472 | ck_assert_uint_lt(len, 32);\r | |
473 | for (j = 0; j < len; j++) {\r | |
474 | if (resp[j] == ' ') {\r | |
475 | /* space is valid */\r | |
476 | } else if (resp[j] == '-') {\r | |
477 | /* hyphen is valid */\r | |
478 | } else if (resp[j] >= 'A' && resp[j] <= 'Z') {\r | |
479 | /* A-Z is valid */\r | |
480 | } else if (resp[j] >= 'a' && resp[j] <= 'z') {\r | |
481 | /* a-z is valid */\r | |
482 | } else {\r | |
483 | ck_abort_msg("Found letter %c (%02xh) in %s",\r | |
484 | resp[j],\r | |
485 | resp[j],\r | |
486 | resp);\r | |
487 | }\r | |
488 | }\r | |
489 | }\r | |
490 | }\r | |
491 | END_TEST\r | |
492 | \r | |
493 | \r | |
11fdf7f2 | 494 | #if !defined(REPLACE_CHECK_FOR_LOCAL_DEBUGGING)\r |
7c673cae FG |
495 | Suite *\r |
496 | make_public_func_suite(void)\r | |
497 | {\r | |
498 | Suite *const suite = suite_create("PublicFunc");\r | |
499 | \r | |
500 | TCase *const tcase_version = tcase_create("Version");\r | |
501 | TCase *const tcase_get_valid_options = tcase_create("Options");\r | |
502 | TCase *const tcase_get_builtin_mime_type = tcase_create("MIME types");\r | |
503 | TCase *const tcase_strncasecmp = tcase_create("strcasecmp");\r | |
504 | TCase *const tcase_urlencodingdecoding =\r | |
505 | tcase_create("URL encoding decoding");\r | |
506 | TCase *const tcase_cookies = tcase_create("Cookies and variables");\r | |
507 | TCase *const tcase_md5 = tcase_create("MD5");\r | |
508 | TCase *const tcase_aux = tcase_create("Aux functions");\r | |
509 | \r | |
510 | tcase_add_test(tcase_version, test_mg_version);\r | |
511 | tcase_set_timeout(tcase_version, civetweb_min_test_timeout);\r | |
512 | suite_add_tcase(suite, tcase_version);\r | |
513 | \r | |
514 | tcase_add_test(tcase_get_valid_options, test_mg_get_valid_options);\r | |
515 | tcase_set_timeout(tcase_get_valid_options, civetweb_min_test_timeout);\r | |
516 | suite_add_tcase(suite, tcase_get_valid_options);\r | |
517 | \r | |
518 | tcase_add_test(tcase_get_builtin_mime_type, test_mg_get_builtin_mime_type);\r | |
519 | tcase_set_timeout(tcase_get_builtin_mime_type, civetweb_min_test_timeout);\r | |
520 | suite_add_tcase(suite, tcase_get_builtin_mime_type);\r | |
521 | \r | |
522 | tcase_add_test(tcase_strncasecmp, test_mg_strncasecmp);\r | |
523 | tcase_set_timeout(tcase_strncasecmp, civetweb_min_test_timeout);\r | |
524 | suite_add_tcase(suite, tcase_strncasecmp);\r | |
525 | \r | |
526 | tcase_add_test(tcase_urlencodingdecoding, test_mg_url_encode);\r | |
527 | tcase_add_test(tcase_urlencodingdecoding, test_mg_url_decode);\r | |
528 | tcase_set_timeout(tcase_urlencodingdecoding, civetweb_min_test_timeout);\r | |
529 | suite_add_tcase(suite, tcase_urlencodingdecoding);\r | |
530 | \r | |
531 | tcase_add_test(tcase_cookies, test_mg_get_cookie);\r | |
532 | tcase_add_test(tcase_cookies, test_mg_get_var);\r | |
533 | tcase_set_timeout(tcase_cookies, civetweb_min_test_timeout);\r | |
534 | suite_add_tcase(suite, tcase_cookies);\r | |
535 | \r | |
536 | tcase_add_test(tcase_md5, test_mg_md5);\r | |
537 | tcase_set_timeout(tcase_md5, civetweb_min_test_timeout);\r | |
538 | suite_add_tcase(suite, tcase_md5);\r | |
539 | \r | |
540 | tcase_add_test(tcase_aux, test_mg_get_response_code_text);\r | |
541 | tcase_set_timeout(tcase_aux, civetweb_min_test_timeout);\r | |
542 | suite_add_tcase(suite, tcase_aux);\r | |
543 | \r | |
544 | return suite;\r | |
545 | }\r | |
11fdf7f2 | 546 | #endif\r |