timed tail for logfiles. Display loglines given a minimum date and/or a maximum date.
c
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

ttail_argparse_check.c 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. #include <check.h>
  2. #include <errno.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include "ttail.h"
  6. #include "ttail_init.h"
  7. ttail_t *ttail;
  8. #define __Fname_sz 5
  9. #define FNAME_NO_EXIST 0
  10. #define FNAME_EXIST 1
  11. char *fname[__Fname_sz];
  12. void teardown_ttail(void)
  13. {
  14. ttail_free(ttail);
  15. }
  16. /*
  17. * Empty argument parsing test case
  18. */
  19. void setup_ttail_empty(void)
  20. {
  21. ttail = ttail_init(1, (char**)&"foo");
  22. }
  23. START_TEST (test_argparse_empty_logfilename)
  24. {
  25. ck_assert_msg(ttail->logfile_name == NULL,
  26. "ttail_t.logfile_name should be NULL");
  27. }
  28. END_TEST
  29. START_TEST (test_argparse_empty_logfile)
  30. {
  31. ck_assert_msg(ttail->logfile == NULL,
  32. "ttail_t.logfile should be NULL");
  33. }
  34. END_TEST
  35. START_TEST (test_argparse_empty_logfilesz)
  36. {
  37. ck_assert_msg(ttail->logfile_sz == 0,
  38. "ttail_t.logfile_sz should be 0");
  39. }
  40. END_TEST
  41. START_TEST (test_argparse_empty_flag)
  42. {
  43. ck_assert_msg(ttail->flag == 0,
  44. "ttail_t.flag should be 0");
  45. }
  46. END_TEST
  47. START_TEST (test_argparse_empty_fmt)
  48. {
  49. ck_assert_msg(ttail->fmt == NULL,
  50. "ttail_t.fmt should be NULL");
  51. }
  52. END_TEST
  53. START_TEST (test_argparse_empty_verbose)
  54. {
  55. ck_assert_msg(ttail->verbose == 0,
  56. "ttail_t.verbose should be 0");
  57. }
  58. END_TEST
  59. START_TEST (test_argparse_empty_prefixsz)
  60. {
  61. ck_assert_msg(ttail->prefix_sz == -1,
  62. "ttail_t.prefix_sz should be NULL");
  63. }
  64. END_TEST
  65. START_TEST (test_argparse_empty_session)
  66. {
  67. ck_assert_msg(ttail->session == NULL,
  68. "ttail_t.session should be NULL");
  69. }
  70. END_TEST
  71. /*
  72. * Bad arguments
  73. */
  74. START_TEST (test_argparse_bad1)
  75. {
  76. ttail_t *t;
  77. char *args[] = {"foo", "--sdfsdf"};
  78. t = ttail_init(2, args);
  79. ck_assert(t == NULL);
  80. }
  81. END_TEST
  82. START_TEST (test_argparse_bad2)
  83. {
  84. ttail_t *t;
  85. char *args[] = {"foo", "-x"};
  86. t = ttail_init(2, args);
  87. ck_assert(t == NULL);
  88. }
  89. END_TEST
  90. START_TEST (test_argparse_bad3)
  91. {
  92. ttail_t *t;
  93. char *args[] = {"foo", "-p"};
  94. t = ttail_init(2, args);
  95. ck_assert(t == NULL);
  96. }
  97. END_TEST
  98. START_TEST (test_argparse_bad4)
  99. {
  100. ttail_t *t;
  101. char *args[] = {"foo", "-f"};
  102. t = ttail_init(2, args);
  103. ck_assert(t == NULL);
  104. }
  105. END_TEST
  106. START_TEST (test_argparse_bad5)
  107. {
  108. ttail_t *t;
  109. char *args[] = {"foo", "-d"};
  110. t = ttail_init(2, args);
  111. ck_assert(t == NULL);
  112. }
  113. END_TEST
  114. START_TEST (test_argparse_bad6)
  115. {
  116. ttail_t *t;
  117. char *args[] = {"foo", "-m"};
  118. t = ttail_init(2, args);
  119. ck_assert(t == NULL);
  120. }
  121. END_TEST
  122. START_TEST (test_argparse_bad7)
  123. {
  124. ttail_t *t;
  125. char *args[] = {"foo", "-l"};
  126. t = ttail_init(2, args);
  127. ck_assert(t == NULL);
  128. }
  129. END_TEST
  130. /*
  131. * file argument parsing
  132. */
  133. void setup_fname(void)
  134. {
  135. int i;
  136. FILE *fp;
  137. for(i=0;i<__Fname_sz;i++)
  138. {
  139. fname[i] = NULL;
  140. }
  141. for(i=0; i<__Fname_sz; i++)
  142. {
  143. fname[i] = tempnam(NULL, "ttail_check");
  144. if(i%2)
  145. {
  146. if((fp=fopen(fname[i], "w+")) == NULL)
  147. {
  148. perror("Unable to create file for testing");
  149. ck_abort_msg("Unable to create file for testing");
  150. }
  151. if(fclose(fp))
  152. {
  153. perror("Unable to close file for testing");
  154. ck_abort_msg("Unable to close file for testing");
  155. }
  156. }
  157. }
  158. }
  159. void teardown_fname(void)
  160. {
  161. int i;
  162. for(i=0; i<__Fname_sz; i++)
  163. {
  164. unlink(fname[i]);
  165. if(fname[i] != NULL)
  166. {
  167. free(fname[i]);
  168. }
  169. }
  170. }
  171. START_TEST (test_argparse_file_non_exist)
  172. {
  173. ttail_t *t;
  174. char *args[3] = {"foo", "-l", NULL};
  175. args[2] = fname[FNAME_NO_EXIST];
  176. t = ttail_init(3, args);
  177. ck_assert_msg(t != NULL, "init failed");
  178. ck_assert_msg(t->logfile_sz == 1,
  179. "ttail_t.logfile_sz should be 1");
  180. ck_assert_msg(strcmp(t->logfile_name[0], args[2]) == 0,
  181. "ttail_t.logfile_name[0] does not contain the filename");
  182. ck_assert_msg(t->logfile[0] == NULL,
  183. "ttail_t.logfile[0] should be NULL");
  184. ttail_free(t);
  185. }
  186. END_TEST
  187. START_TEST (test_argparse_file_exist)
  188. {
  189. ttail_t *t;
  190. char *args[3] = {"foo", "-l", NULL};
  191. args[2] = fname[FNAME_EXIST];
  192. t = ttail_init(3, args);
  193. ck_assert_msg(t != NULL, "init failed");
  194. ck_assert_msg(t->logfile_sz == 1,
  195. "ttail_t.logfile_sz should be 1");
  196. ck_assert_msg(strcmp(t->logfile_name[0], args[2]) == 0,
  197. "ttail_t.logfile_name[0] does not contain the filename");
  198. ck_assert_msg(t->logfile[0] != NULL,
  199. "ttail_t.logfile[0] shouldn't be NULL");
  200. ttail_free(t);
  201. }
  202. END_TEST
  203. START_TEST (test_argparse_file_multiple)
  204. {
  205. ttail_t *t;
  206. int i;
  207. char *args[11] = {"foo", "-l", NULL, "-l", NULL,
  208. "-l", NULL, "-l", NULL, "-l", NULL};
  209. for(i=0; i<__Fname_sz; i++)
  210. {
  211. args[(i*2)+2] = fname[i];
  212. }
  213. t = ttail_init(11, args);
  214. ck_assert_msg(t != NULL, "init failed");
  215. ck_assert_msg(t->logfile_sz == __Fname_sz,
  216. "ttail_t.logfile_sz doesn't have the good value");
  217. for(i=0;i<__Fname_sz; i++)
  218. {
  219. ck_assert_msg(strcmp(t->logfile_name[i], args[(i*2)+2]) == 0,
  220. "some filename corrupted in ttail_t.logfile_name");
  221. if(i%2)
  222. {
  223. ck_assert_msg(t->logfile[i] != NULL,
  224. "logfile not opened");
  225. } else {
  226. ck_assert_msg(t->logfile[i] == NULL,
  227. "logfile should be NULL");
  228. }
  229. }
  230. }
  231. END_TEST
  232. START_TEST (test_argparse_reprefix_short)
  233. {
  234. ttail_t *t;
  235. char *args[] = {"foo", "-r", "^[^ ]+ "};
  236. t = ttail_init(3, args);
  237. ck_assert(t != NULL);
  238. ck_assert((t->flag & TTAIL_FLAG_PREFIX) == TTAIL_FLAG_PREFIX);
  239. }
  240. END_TEST
  241. START_TEST (test_argparse_reprefix_long)
  242. {
  243. ttail_t *t;
  244. char *args[] = {"foo", "--re-prefix", "^[^ ]+ "};
  245. t = ttail_init(3, args);
  246. ck_assert(t != NULL);
  247. ck_assert((t->flag & TTAIL_FLAG_PREFIX) == TTAIL_FLAG_PREFIX);
  248. }
  249. END_TEST
  250. START_TEST (test_argparse_prefixlen_short)
  251. {
  252. ttail_t *t;
  253. char *args[] = {"foo", "-p", "10"};
  254. t = ttail_init(3, args);
  255. ck_assert(t != NULL);
  256. ck_assert((t->flag & TTAIL_FLAG_PREFIX) == TTAIL_FLAG_PREFIX);
  257. ck_assert_int_eq(t->prefix_sz, 10);
  258. }
  259. END_TEST
  260. START_TEST (test_argparse_prefixlen_long)
  261. {
  262. ttail_t *t;
  263. char *args[] = {"foo", "--prefix-len", "42"};
  264. t = ttail_init(3, args);
  265. ck_assert(t != NULL);
  266. ck_assert((t->flag & TTAIL_FLAG_PREFIX) == TTAIL_FLAG_PREFIX);
  267. ck_assert_int_eq(t->prefix_sz, 42);
  268. }
  269. END_TEST
  270. START_TEST (test_argparse_prefix_multiple)
  271. {
  272. ttail_t *t;
  273. char *args[] = {"foo", "--re-prefix", "^[^ ]+ ", "-p", "20"};
  274. t = ttail_init(5, args);
  275. ck_assert(t == NULL);
  276. }
  277. END_TEST
  278. START_TEST (test_argparse_fmt_short)
  279. {
  280. ttail_t *t;
  281. char *args[] = {"foo", "-f", "%m"};
  282. t = ttail_init(3, args);
  283. ck_assert(t != NULL);
  284. }
  285. END_TEST
  286. START_TEST (test_argparse_fmt_long)
  287. {
  288. ttail_t *t;
  289. char *args[] = {"foo", "--date-format", "%m"};
  290. t = ttail_init(3, args);
  291. ck_assert(t != NULL);
  292. }
  293. END_TEST
  294. START_TEST (test_argparse_fmt_multiple)
  295. {
  296. ttail_t *t;
  297. char *args[] = {"foo", "-f", "%m", "-f", "%d"};
  298. t = ttail_init(5, args);
  299. ck_assert(t == NULL);
  300. }
  301. END_TEST
  302. Suite * ttail_init_suite(void)
  303. {
  304. Suite *s;
  305. TCase *tc_argparse_empty;
  306. TCase *tc_argparse_badarg;
  307. TCase *tc_argparse_files;
  308. TCase *tc_argparse_prefix;
  309. TCase *tc_argparse_fmt;
  310. s = suite_create("ttail argument parsing checks");
  311. tc_argparse_empty = tcase_create("empty arguments parsing");
  312. tcase_add_checked_fixture(tc_argparse_empty,
  313. setup_ttail_empty, teardown_ttail);
  314. tcase_add_test(tc_argparse_empty, test_argparse_empty_logfilename);
  315. tcase_add_test(tc_argparse_empty, test_argparse_empty_logfile);
  316. tcase_add_test(tc_argparse_empty, test_argparse_empty_logfilesz);
  317. tcase_add_test(tc_argparse_empty, test_argparse_empty_flag);
  318. tcase_add_test(tc_argparse_empty, test_argparse_empty_fmt);
  319. tcase_add_test(tc_argparse_empty, test_argparse_empty_verbose);
  320. tcase_add_test(tc_argparse_empty, test_argparse_empty_prefixsz);
  321. tcase_add_test(tc_argparse_empty, test_argparse_empty_session);
  322. tc_argparse_badarg = tcase_create("bad arguments parsing");
  323. tcase_add_test(tc_argparse_badarg, test_argparse_bad1);
  324. tcase_add_test(tc_argparse_badarg, test_argparse_bad2);
  325. tcase_add_test(tc_argparse_badarg, test_argparse_bad3);
  326. tcase_add_test(tc_argparse_badarg, test_argparse_bad4);
  327. tcase_add_test(tc_argparse_badarg, test_argparse_bad5);
  328. tcase_add_test(tc_argparse_badarg, test_argparse_bad6);
  329. tcase_add_test(tc_argparse_badarg, test_argparse_bad7);
  330. tc_argparse_files = tcase_create("files options parse");
  331. tcase_add_checked_fixture(tc_argparse_files,
  332. setup_fname, teardown_fname);
  333. tcase_add_test(tc_argparse_files, test_argparse_file_non_exist);
  334. tcase_add_test(tc_argparse_files, test_argparse_file_exist);
  335. tcase_add_test(tc_argparse_files, test_argparse_file_multiple);
  336. tc_argparse_prefix = tcase_create("re-prefix arguments parsing");
  337. tcase_add_test(tc_argparse_prefix, test_argparse_reprefix_short);
  338. tcase_add_test(tc_argparse_prefix, test_argparse_reprefix_long);
  339. tcase_add_test(tc_argparse_prefix, test_argparse_prefixlen_short);
  340. tcase_add_test(tc_argparse_prefix, test_argparse_prefixlen_long);
  341. tcase_add_test(tc_argparse_prefix, test_argparse_prefix_multiple);
  342. tc_argparse_fmt = tcase_create("date format arguments parsing");
  343. tcase_add_test(tc_argparse_fmt, test_argparse_fmt_short);
  344. tcase_add_test(tc_argparse_fmt, test_argparse_fmt_long);
  345. tcase_add_test(tc_argparse_fmt, test_argparse_fmt_multiple);
  346. suite_add_tcase(s, tc_argparse_empty);
  347. suite_add_tcase(s, tc_argparse_badarg);
  348. suite_add_tcase(s, tc_argparse_files);
  349. suite_add_tcase(s, tc_argparse_prefix);
  350. suite_add_tcase(s, tc_argparse_fmt);
  351. return s;
  352. }
  353. int main(void)
  354. {
  355. int number_failed = 0;
  356. SRunner *sr;
  357. sr = srunner_create(ttail_init_suite());
  358. srunner_set_fork_status(sr, CK_FORK);
  359. srunner_run_all(sr,CK_VERBOSE);
  360. number_failed = srunner_ntests_failed(sr);
  361. srunner_free(sr);
  362. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  363. }