test_stream2.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. static const char version[] = "$Id: test_stream2.c,v 1.5 2012/10/04 22:51:28 valtri Exp $";
  2. /*
  3. * test_category.c
  4. *
  5. * Copyright 2001-2003, Meiosys (www.meiosys.com). All rights reserved.
  6. *
  7. * See the COPYING file for the terms of usage and distribution.
  8. */
  9. #ifdef HAVE_CONFIG_H
  10. #include "config.h"
  11. #endif
  12. #include <log4c/appender.h>
  13. #include <log4c/appender_type_stream2.h>
  14. #include <log4c/layout.h>
  15. #include <log4c/category.h>
  16. #include <log4c/init.h>
  17. #include <sd/test.h>
  18. #include <sd/factory.h>
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. static log4c_category_t* root = NULL;
  22. static log4c_category_t* sub1 = NULL;
  23. static log4c_category_t* sub1sub2 = NULL;
  24. /******************************************************************************
  25. The stream2 appender is used as follows:
  26. 1. Get an appender of type "stream2":
  27. stream2_appender = log4c_appender_get(<appender name>);
  28. log4c_appender_set_type(stream2_appender,
  29. log4c_appender_type_get("stream2"));
  30. 2a.Go straight into logging with this appender by setting it as the appender
  31. for a category:
  32. log4c_category_set_appender(root, stream2_appender);
  33. In this case the appender will be configured automatically with default
  34. values:
  35. . the filename is the same as the <appender name>
  36. . the file is opened in "w+" mode
  37. . the default system buffer is used (cf; setbuf() )
  38. OR
  39. 2b. Configure the appender using the stream2 setter functions and then
  40. go into logging by setting the appender as the appender for a category:
  41. If you set a file pointer yourself you are reposnsible for opening,
  42. setting any opttions and closing the file pointer. In this case the name of
  43. the log file will be the file name of myfp and not the name of the appender:
  44. log4c_stream2_set_fp(stream2_appender,myfp);
  45. log4c_category_set_appender(root, stream2_appender);
  46. By default the stream2 file pointer is in buffered mode.
  47. If you want to set the mode for the stream2 file pointer to unbuffered then
  48. do it this way:
  49. log4c_stream2_set_flags(stream2_appender, LOG4C_STREAM2_UNBUFFERED);
  50. log4c_category_set_appender(root, stream2_appender);
  51. I you are using your own file pointer then you can set the buffer directly
  52. and you do not need to use this option.
  53. */
  54. /******************************************************************************/
  55. static void log4c_print(FILE* a_fp)
  56. {
  57. extern sd_factory_t* log4c_category_factory;
  58. extern sd_factory_t* log4c_appender_factory;
  59. extern sd_factory_t* log4c_layout_factory;
  60. sd_factory_print(log4c_category_factory, a_fp); fprintf(a_fp, "\n");
  61. sd_factory_print(log4c_appender_factory, a_fp); fprintf(a_fp, "\n");
  62. sd_factory_print(log4c_layout_factory, a_fp); fprintf(a_fp, "\n");
  63. }
  64. /******************************************************************************/
  65. #define foo(cat, level) \
  66. { \
  67. fprintf(sd_test_out(a_test), "\n# "#cat" "#level" (priority = %s)\n", \
  68. log4c_priority_to_string(log4c_category_get_priority(cat))); \
  69. log4c_category_##level(cat, #cat" "#level); \
  70. }
  71. /******************************************************************************/
  72. static int test0(sd_test_t* a_test, int argc, char* argv[])
  73. {
  74. log4c_print(sd_test_out(a_test));
  75. return 1;
  76. }
  77. /******************************************************************************/
  78. /*
  79. This tests case 2b above (setting our own file pointer)
  80. */
  81. static int test1(sd_test_t* a_test, int argc, char* argv[])
  82. {
  83. log4c_appender_t* stream2_appender = NULL;
  84. log4c_category_set_priority(root, LOG4C_PRIORITY_TRACE);
  85. stream2_appender =
  86. log4c_appender_get("stream2_appender");
  87. log4c_appender_set_type(stream2_appender,
  88. log4c_appender_type_get("stream2"));
  89. log4c_stream2_set_fp(stream2_appender, sd_test_out(a_test));
  90. log4c_category_set_appender(root, stream2_appender);
  91. foo(root, error);
  92. foo(root, warn);
  93. return 1;
  94. }
  95. /******************************************************************************/
  96. /*
  97. This tests case 2b above (setting the fp mode to unbuffered)
  98. */
  99. static int test2(sd_test_t* a_test, int argc, char* argv[])
  100. {
  101. log4c_appender_t* stream2_appender = NULL;
  102. int flags;
  103. log4c_category_set_priority(sub1, LOG4C_PRIORITY_TRACE);
  104. stream2_appender =
  105. log4c_appender_get("stream2_appender");
  106. log4c_appender_set_type(stream2_appender, &log4c_appender_type_stream2);
  107. log4c_stream2_set_flags(stream2_appender,LOG4C_STREAM2_UNBUFFERED);
  108. flags = log4c_stream2_get_flags(stream2_appender);
  109. fprintf(sd_test_out(a_test), "stream2 flags '%d'\n",flags);
  110. log4c_category_set_appender(sub1, stream2_appender);
  111. foo(sub1, error);
  112. foo(sub1, warn);
  113. return 1;
  114. }
  115. /******************************************************************************/
  116. /*
  117. This tests case 2a above (use stream2 default config values)
  118. */
  119. static int test3(sd_test_t* a_test, int argc, char* argv[])
  120. {
  121. log4c_appender_t* stream2_appender = NULL;
  122. char testlogname[1024];
  123. log4c_category_set_priority(root, LOG4C_PRIORITY_TRACE);
  124. sprintf(testlogname, "%s.log", sd_test_get_name(a_test));
  125. stream2_appender =
  126. log4c_appender_get(testlogname);
  127. log4c_appender_set_type(stream2_appender,
  128. log4c_appender_type_get("stream2"));
  129. log4c_category_set_appender(root, stream2_appender);
  130. foo(root, error);
  131. fprintf(sd_test_out(a_test),"# check %s for this message\n",
  132. testlogname);
  133. foo(root, warn);
  134. fprintf(sd_test_out(a_test),"# check %s for this message\n",
  135. testlogname);
  136. return 1;
  137. }
  138. /******************************************************************************/
  139. /*
  140. This tests case tests opening and closing the stream2
  141. several times....to test for mem leaks or corruption
  142. */
  143. static int test4(sd_test_t* a_test, int argc, char* argv[])
  144. {
  145. log4c_appender_t* stream2_appender = NULL;
  146. char testlogname[1024];
  147. log4c_category_set_priority(root, LOG4C_PRIORITY_TRACE);
  148. sprintf(testlogname, "%s.1", sd_test_get_name(a_test));
  149. stream2_appender =
  150. log4c_appender_get(testlogname);
  151. log4c_appender_set_type(stream2_appender,
  152. log4c_appender_type_get("stream2"));
  153. log4c_category_set_appender(root, stream2_appender);
  154. foo(root, error);
  155. fprintf(sd_test_out(a_test),"# check %s for this message\n",
  156. testlogname);
  157. foo(root, warn);
  158. fprintf(sd_test_out(a_test),"# check %s for this message\n",
  159. testlogname);
  160. /* Now close it....*/
  161. log4c_appender_close(stream2_appender );
  162. /* Now open it....*/
  163. foo(root, warn);
  164. fprintf(sd_test_out(a_test),"# check %s for this message\n",
  165. testlogname);
  166. foo(root, warn);
  167. fprintf(sd_test_out(a_test),"# check %s for this message\n",
  168. testlogname);
  169. /* Now close it....*/
  170. log4c_appender_close(stream2_appender );
  171. /* Now open it....*/
  172. foo(root, info);
  173. fprintf(sd_test_out(a_test),"# check %s for this message\n",
  174. testlogname);
  175. foo(root, warn);
  176. fprintf(sd_test_out(a_test),"# check %s for this message\n",
  177. testlogname);
  178. /* Now close it....*/
  179. return 1;
  180. }
  181. /******************************************************************************/
  182. int main(int argc, char* argv[])
  183. {
  184. int ret;
  185. sd_test_t* t = sd_test_new(argc, argv);
  186. if ( log4c_init() > 0 ) {
  187. fprintf(stderr, "Failed to init log4c...exiting\n");
  188. exit(1);
  189. }
  190. root = log4c_category_get("root");
  191. sub1 = log4c_category_get("sub1");
  192. sub1sub2 = log4c_category_get("sub1.sub2");
  193. sd_test_add(t, test0);
  194. sd_test_add(t, test1);
  195. sd_test_add(t, test2);
  196. sd_test_add(t, test3);
  197. sd_test_add(t, test4);
  198. ret = sd_test_run(t, argc, argv);
  199. sd_test_delete(t);
  200. log4c_fini();
  201. return ! ret;
  202. }