Tests about a simple python3 fastcgi runner using libfcgi and the Python-C API.
python
c
wsgi
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

check_logger.c 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. #include <stdlib.h>
  2. #include <check.h>
  3. #include <time.h>
  4. #include <stdio.h>
  5. #include "logger.h"
  6. pyfcgi_conf_logger_t *conf = &PyFCGI_conf.logs;
  7. START_TEST(test_logger_init)
  8. {
  9. pyfcgi_logger_init();
  10. ck_assert_ptr_eq(conf->syslog_ident, NULL);
  11. ck_assert_ptr_eq(conf->ident, NULL);
  12. ck_assert_ptr_eq(conf->format, NULL);
  13. ck_assert_ptr_eq(conf->loggers, NULL);
  14. ck_assert_int_eq(conf->logger_sz, 0);
  15. ck_assert_int_eq(conf->format_sz, 0);
  16. ck_assert_int_eq(conf->flags, 0);
  17. }
  18. END_TEST
  19. /*
  20. START_TEST(test_logger_format_add)
  21. {
  22. int ret;
  23. size_t s;
  24. pyfcgi_logger_init();
  25. ret = pyfcgi_logger_format_add("TEST", NULL);
  26. ck_assert_int_eq(conf->format_sz, 1);
  27. ck_assert_str_eq(conf->format[0], "TEST");
  28. }
  29. END_TEST
  30. */
  31. START_TEST(test_logger_parse_field_dtfmt_default)
  32. {
  33. int ret;
  34. char *ptr, *orig, *fmt;
  35. orig = "}";
  36. ptr = orig;
  37. fmt = NULL;
  38. ret = pyfcgi_logger_parse_field_dtfmt((const char**)&ptr, &fmt);
  39. ck_assert_int_eq(ret, 0);
  40. ck_assert_str_eq(fmt, PYFCGI_LOGGER_TIME_FMT_DEFAULT);
  41. ck_assert_ptr_eq(ptr, orig+1);
  42. free(fmt);
  43. }
  44. END_TEST
  45. START_TEST(test_logger_parse_field_sz_default)
  46. {
  47. int ret;
  48. size_t val;
  49. char *ptr, **orig;
  50. char *vals[] = {":%F}", ":}", "}", NULL};
  51. orig = vals;
  52. while(*orig)
  53. {
  54. ptr = *orig;
  55. ret = pyfcgi_logger_parse_field_sz((const char**)&ptr, &val);
  56. ck_assert_int_eq(val, 0);
  57. ck_assert_ptr_eq(ptr, (*orig)+1);
  58. orig++;
  59. }
  60. }
  61. END_TEST
  62. START_TEST(test_logger_parse_field_datetime_default)
  63. {
  64. int ret;
  65. char *ptr, **orig, err[PYFCGI_LOGGER_FMT_PARSE_ERRSZ];
  66. pyfcgi_logger_fmt_field_t field;
  67. char *vals[] = {"datetime}", "datetime::}", "datetime:}", NULL};
  68. memset(&field, 0, sizeof(pyfcgi_logger_fmt_field_t));
  69. orig = vals;
  70. while(*orig)
  71. {
  72. ptr = *orig;
  73. ret = pyfcgi_logger_parse_field((const char**)&ptr,
  74. (const char*)ptr, &field,
  75. err);
  76. if(ret)
  77. {
  78. dprintf(2, "ERROR : '%s'\n", err);
  79. }
  80. ck_assert_int_eq(ret, 0);
  81. ck_assert_int_eq(field.type, pyfcgi_logger_field_datetime);
  82. ck_assert_int_ne(field.known_length, 0);
  83. ck_assert_int_eq(field.len, PYFCGI_LOG_DTM_LEN);
  84. ck_assert_ptr_eq(field.val, strftime);
  85. ck_assert_str_eq(field.args.datetime.format,
  86. PYFCGI_LOGGER_TIME_FMT_DEFAULT);
  87. ck_assert_ptr_eq(field.buf_ptr, NULL);
  88. orig++;
  89. }
  90. }
  91. END_TEST
  92. START_TEST(test_logger_parse_field_sz)
  93. {
  94. int ret, *res;
  95. size_t val;
  96. char *ptr, **orig;
  97. char *vals[] = {"42:%F}", "1337:}", "0}", NULL};
  98. int _res[] = {42,1337,0};
  99. orig = vals;
  100. res = _res;
  101. while(*orig)
  102. {
  103. ptr = *orig;
  104. ret = pyfcgi_logger_parse_field_sz((const char**)&ptr, &val);
  105. ck_assert_int_eq(val, *res);
  106. ck_assert_ptr_eq(ptr, (*orig)+snprintf(NULL, 0, "%d", *res));
  107. orig++;
  108. res++;
  109. }
  110. }
  111. END_TEST
  112. START_TEST(test_logger_parse_field_dtfmt)
  113. {
  114. int ret;
  115. size_t len;
  116. char **val, **ptr, *fmt;
  117. char *_vals[] = {"%fdc}", "123}", "4}}foo}", NULL};
  118. val = _vals;
  119. while(*val)
  120. {
  121. ptr = val;
  122. len = strlen(*val);
  123. ret = pyfcgi_logger_parse_field_dtfmt((const char**)&ptr, &fmt);
  124. *val[len-1] = '\0'; //deleting leading '}' to get expected result
  125. ck_assert_int_eq(ret, 0);
  126. ck_assert_ptr_ne(fmt, *val);
  127. ck_assert_str_eq(fmt, *val);
  128. ck_assert_ptr_eq(ptr, *val+len-1);
  129. free(fmt);
  130. val++;
  131. }
  132. }
  133. END_TEST
  134. START_TEST(test_logger_parse_field_datetime)
  135. {
  136. int ret, *len;
  137. char *ptr, **orig, **fmt, err[PYFCGI_LOGGER_FMT_PARSE_ERRSZ];
  138. pyfcgi_logger_fmt_field_t field;
  139. char *vals[] = {"datetime:42}", "datetime::%s%F}",
  140. "datetime:42:COUCOU}",
  141. "dat:32:FOO}", "d::BAR}", NULL};
  142. int _len[] = {42, PYFCGI_LOG_DTM_LEN, 42, 32, PYFCGI_LOG_DTM_LEN};
  143. char *_fmt[] = {PYFCGI_LOGGER_TIME_FMT_DEFAULT, "%s%F", "COUCOU", "FOO",
  144. "BAR"};
  145. memset(&field, 0, sizeof(pyfcgi_logger_fmt_field_t));
  146. len = _len;
  147. fmt = _fmt;
  148. orig = vals;
  149. while(*orig)
  150. {
  151. ptr = *orig;
  152. ret = pyfcgi_logger_parse_field((const char**)&ptr,
  153. (const char*)ptr, &field,
  154. err);
  155. if(ret)
  156. {
  157. dprintf(2, "ERROR : '%s'\n", err);
  158. }
  159. ck_assert_int_eq(ret, 0);
  160. ck_assert_int_eq(field.type, pyfcgi_logger_field_datetime);
  161. ck_assert_int_ne(field.known_length, 0);
  162. ck_assert_int_eq(field.len, *len);
  163. ck_assert_ptr_eq(field.val, strftime);
  164. ck_assert_str_eq(field.args.datetime.format, *fmt);
  165. ck_assert_ptr_eq(field.buf_ptr, NULL);
  166. orig++;
  167. len++;
  168. fmt++;
  169. }
  170. }
  171. END_TEST
  172. START_TEST(test_logger_parse_field_level)
  173. {
  174. int ret;
  175. char **val, **ptr;
  176. char err[PYFCGI_LOGGER_FMT_PARSE_ERRSZ];
  177. char *vals[] = {"level}", "l}", "leve}", NULL};
  178. pyfcgi_logger_fmt_field_t field;
  179. val = vals;
  180. memset(&field, 0, sizeof(pyfcgi_logger_fmt_field_t));
  181. while(*val)
  182. {
  183. ptr = val;
  184. ret = pyfcgi_logger_parse_field((const char**)ptr,
  185. (const char*)*ptr, &field,
  186. err);
  187. if(ret)
  188. {
  189. dprintf(2, "ERROR : '%s'\n", err);
  190. }
  191. ck_assert_int_eq(ret, 0);
  192. ck_assert_int_eq(field.type, pyfcgi_logger_field_level);
  193. ck_assert_int_ne(field.known_length, 0);
  194. ck_assert_int_eq(field.len, PYFCGI_LOG_LVL_LEN);
  195. ck_assert_ptr_eq(field.val, pyfcgi_logger_value_level);
  196. val++;
  197. }
  198. }
  199. END_TEST
  200. START_TEST(test_logger_parse_field_facility)
  201. {
  202. int ret;
  203. char **val, **ptr;
  204. char err[PYFCGI_LOGGER_FMT_PARSE_ERRSZ];
  205. char *vals[] = {"facility}", "f}", "fac}", NULL};
  206. pyfcgi_logger_fmt_field_t field;
  207. val = vals;
  208. memset(&field, 0, sizeof(pyfcgi_logger_fmt_field_t));
  209. while(*val)
  210. {
  211. ptr = val;
  212. ret = pyfcgi_logger_parse_field((const char**)ptr,
  213. (const char*)*ptr, &field,
  214. err);
  215. if(ret)
  216. {
  217. dprintf(2, "ERROR : '%s'\n", err);
  218. }
  219. ck_assert_int_eq(ret, 0);
  220. ck_assert_int_eq(field.type, pyfcgi_logger_field_facility);
  221. ck_assert_int_ne(field.known_length, 0);
  222. ck_assert_int_eq(field.len, PYFCGI_LOG_TYP_LEN);
  223. ck_assert_ptr_eq(field.val, pyfcgi_logger_value_facility);
  224. val++;
  225. }
  226. }
  227. END_TEST
  228. START_TEST(test_logger_parse_field_pid)
  229. {
  230. int ret;
  231. char **val, **ptr;
  232. char err[PYFCGI_LOGGER_FMT_PARSE_ERRSZ];
  233. char *vals[] = {"pid}", "p}", "pi}", NULL};
  234. pyfcgi_logger_fmt_field_t field;
  235. val = vals;
  236. memset(&field, 0, sizeof(pyfcgi_logger_fmt_field_t));
  237. while(*val)
  238. {
  239. ptr = val;
  240. ret = pyfcgi_logger_parse_field((const char**)ptr,
  241. (const char*)*ptr, &field,
  242. err);
  243. if(ret)
  244. {
  245. dprintf(2, "ERROR : '%s'\n", err);
  246. }
  247. ck_assert_int_eq(ret, 0);
  248. ck_assert_int_eq(field.type, pyfcgi_logger_field_pid);
  249. ck_assert_int_ne(field.known_length, 0);
  250. ck_assert_int_eq(field.len, PYFCGI_LOG_PID_LEN);
  251. ck_assert_ptr_eq(field.val, (&PyFCGI_conf.context.pid));
  252. val++;
  253. }
  254. }
  255. END_TEST
  256. START_TEST(test_logger_parse_field_ident)
  257. {
  258. int ret;
  259. char **val, **ptr;
  260. char err[PYFCGI_LOGGER_FMT_PARSE_ERRSZ];
  261. char *vals[] = {"ident}", "i}", "id}", NULL};
  262. pyfcgi_logger_fmt_field_t field;
  263. val = vals;
  264. memset(&field, 0, sizeof(pyfcgi_logger_fmt_field_t));
  265. while(*val)
  266. {
  267. ptr = val;
  268. ret = pyfcgi_logger_parse_field((const char**)ptr,
  269. (const char*)*ptr, &field,
  270. err);
  271. if(ret)
  272. {
  273. dprintf(2, "ERROR : '%s'\n", err);
  274. }
  275. ck_assert_int_eq(ret, 0);
  276. ck_assert_int_eq(field.type, pyfcgi_logger_field_ident);
  277. ck_assert_int_ne(field.known_length, 0);
  278. ck_assert_int_eq(field.len, 0);
  279. ck_assert_ptr_eq(field.val, (&PyFCGI_conf.logs.ident));
  280. val++;
  281. }
  282. }
  283. END_TEST
  284. START_TEST(test_logger_parse_field_msg)
  285. {
  286. int ret;
  287. char **val, **ptr;
  288. char err[PYFCGI_LOGGER_FMT_PARSE_ERRSZ];
  289. char *vals[] = {"msg}", "m}", "ms}", NULL};
  290. pyfcgi_logger_fmt_field_t field;
  291. val = vals;
  292. memset(&field, 0, sizeof(pyfcgi_logger_fmt_field_t));
  293. while(*val)
  294. {
  295. ptr = val;
  296. ret = pyfcgi_logger_parse_field((const char**)ptr,
  297. (const char*)*ptr, &field,
  298. err);
  299. if(ret)
  300. {
  301. dprintf(2, "ERROR : '%s'\n", err);
  302. }
  303. ck_assert_int_eq(ret, 0);
  304. ck_assert_int_eq(field.type, pyfcgi_logger_field_msg);
  305. ck_assert_int_eq(field.known_length, 0);
  306. ck_assert_int_eq(field.len, 0);
  307. ck_assert_ptr_eq(field.val, NULL);
  308. val++;
  309. }
  310. }
  311. END_TEST
  312. Suite * logger_suite(void)
  313. {
  314. Suite *s;
  315. TCase *tc_init, *tc_fmt, *tc_fmt_default;
  316. s = suite_create("Logger");
  317. tc_init = tcase_create("Initialisation");
  318. tcase_add_test(tc_init, test_logger_init);
  319. //tcase_add_test(tc_init, test_logger_format_add);
  320. suite_add_tcase(s, tc_init);
  321. tc_fmt_default = tcase_create("Logger format parsing default values");
  322. tcase_add_test(tc_fmt_default, test_logger_parse_field_dtfmt_default);
  323. tcase_add_test(tc_fmt_default, test_logger_parse_field_sz_default);
  324. tcase_add_test(tc_fmt_default, test_logger_parse_field_datetime_default);
  325. suite_add_tcase(s, tc_fmt_default);
  326. tc_fmt = tcase_create("Logger format parsing");
  327. tcase_add_test(tc_fmt, test_logger_parse_field_sz);
  328. tcase_add_test(tc_fmt, test_logger_parse_field_datetime);
  329. tcase_add_test(tc_fmt, test_logger_parse_field_level);
  330. tcase_add_test(tc_fmt, test_logger_parse_field_facility);
  331. tcase_add_test(tc_fmt, test_logger_parse_field_pid);
  332. tcase_add_test(tc_fmt, test_logger_parse_field_ident);
  333. tcase_add_test(tc_fmt, test_logger_parse_field_msg);
  334. suite_add_tcase(s, tc_fmt);
  335. return s;
  336. }
  337. int main(void)
  338. {
  339. int nfailed;
  340. Suite *s;
  341. SRunner *sr;
  342. s = logger_suite();
  343. sr = srunner_create(s);
  344. //srunner_set_fork_status(sr, CK_NOFORK);
  345. //srunner_run_all(sr, CK_NORMAL);
  346. //srunner_run_all(sr, CK_ENV);
  347. srunner_run_all(sr, CK_VERBOSE);
  348. nfailed = srunner_ntests_failed(sr);
  349. srunner_free(sr);
  350. return (!nfailed)?EXIT_SUCCESS:EXIT_FAILURE;
  351. }