fluentd 0.14.4-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (328) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +6 -0
  3. data/.gitignore +26 -0
  4. data/.travis.yml +45 -0
  5. data/AUTHORS +2 -0
  6. data/CONTRIBUTING.md +35 -0
  7. data/COPYING +14 -0
  8. data/ChangeLog +276 -0
  9. data/Gemfile +9 -0
  10. data/README.md +51 -0
  11. data/Rakefile +53 -0
  12. data/Vagrantfile +17 -0
  13. data/appveyor.yml +41 -0
  14. data/bin/fluent-debug +5 -0
  15. data/example/copy_roundrobin.conf +39 -0
  16. data/example/filter_stdout.conf +22 -0
  17. data/example/in_forward.conf +11 -0
  18. data/example/in_http.conf +14 -0
  19. data/example/in_out_forward.conf +17 -0
  20. data/example/in_syslog.conf +15 -0
  21. data/example/in_tail.conf +14 -0
  22. data/example/in_tcp.conf +13 -0
  23. data/example/in_udp.conf +13 -0
  24. data/example/multi_filters.conf +61 -0
  25. data/example/out_buffered_null.conf +32 -0
  26. data/example/out_copy.conf +20 -0
  27. data/example/out_file.conf +13 -0
  28. data/example/out_forward.conf +35 -0
  29. data/example/out_forward_buf_file.conf +23 -0
  30. data/example/v0_12_filter.conf +78 -0
  31. data/example/v1_literal_example.conf +36 -0
  32. data/fluent.conf +139 -0
  33. data/fluentd.gemspec +51 -0
  34. data/lib/fluent/agent.rb +194 -0
  35. data/lib/fluent/command/bundler_injection.rb +45 -0
  36. data/lib/fluent/command/cat.rb +319 -0
  37. data/lib/fluent/command/debug.rb +102 -0
  38. data/lib/fluent/command/fluentd.rb +273 -0
  39. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  40. data/lib/fluent/compat/exec_util.rb +129 -0
  41. data/lib/fluent/compat/file_util.rb +54 -0
  42. data/lib/fluent/compat/filter.rb +68 -0
  43. data/lib/fluent/compat/formatter.rb +111 -0
  44. data/lib/fluent/compat/formatter_utils.rb +85 -0
  45. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  46. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  47. data/lib/fluent/compat/input.rb +49 -0
  48. data/lib/fluent/compat/output.rb +677 -0
  49. data/lib/fluent/compat/output_chain.rb +60 -0
  50. data/lib/fluent/compat/parser.rb +180 -0
  51. data/lib/fluent/compat/parser_utils.rb +40 -0
  52. data/lib/fluent/compat/propagate_default.rb +62 -0
  53. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  54. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  55. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  56. data/lib/fluent/compat/socket_util.rb +165 -0
  57. data/lib/fluent/compat/string_util.rb +34 -0
  58. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  59. data/lib/fluent/compat/type_converter.rb +90 -0
  60. data/lib/fluent/config.rb +56 -0
  61. data/lib/fluent/config/basic_parser.rb +123 -0
  62. data/lib/fluent/config/configure_proxy.rb +366 -0
  63. data/lib/fluent/config/dsl.rb +149 -0
  64. data/lib/fluent/config/element.rb +218 -0
  65. data/lib/fluent/config/error.rb +26 -0
  66. data/lib/fluent/config/literal_parser.rb +251 -0
  67. data/lib/fluent/config/parser.rb +107 -0
  68. data/lib/fluent/config/section.rb +212 -0
  69. data/lib/fluent/config/types.rb +136 -0
  70. data/lib/fluent/config/v1_parser.rb +190 -0
  71. data/lib/fluent/configurable.rb +176 -0
  72. data/lib/fluent/daemon.rb +15 -0
  73. data/lib/fluent/engine.rb +220 -0
  74. data/lib/fluent/env.rb +27 -0
  75. data/lib/fluent/event.rb +287 -0
  76. data/lib/fluent/event_router.rb +259 -0
  77. data/lib/fluent/filter.rb +21 -0
  78. data/lib/fluent/formatter.rb +23 -0
  79. data/lib/fluent/input.rb +21 -0
  80. data/lib/fluent/label.rb +38 -0
  81. data/lib/fluent/load.rb +36 -0
  82. data/lib/fluent/log.rb +445 -0
  83. data/lib/fluent/match.rb +141 -0
  84. data/lib/fluent/mixin.rb +31 -0
  85. data/lib/fluent/msgpack_factory.rb +62 -0
  86. data/lib/fluent/output.rb +26 -0
  87. data/lib/fluent/output_chain.rb +23 -0
  88. data/lib/fluent/parser.rb +23 -0
  89. data/lib/fluent/plugin.rb +161 -0
  90. data/lib/fluent/plugin/bare_output.rb +63 -0
  91. data/lib/fluent/plugin/base.rb +130 -0
  92. data/lib/fluent/plugin/buf_file.rb +154 -0
  93. data/lib/fluent/plugin/buf_memory.rb +34 -0
  94. data/lib/fluent/plugin/buffer.rb +603 -0
  95. data/lib/fluent/plugin/buffer/chunk.rb +160 -0
  96. data/lib/fluent/plugin/buffer/file_chunk.rb +323 -0
  97. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  98. data/lib/fluent/plugin/exec_util.rb +22 -0
  99. data/lib/fluent/plugin/file_util.rb +22 -0
  100. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  101. data/lib/fluent/plugin/filter.rb +93 -0
  102. data/lib/fluent/plugin/filter_grep.rb +75 -0
  103. data/lib/fluent/plugin/filter_record_transformer.rb +342 -0
  104. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  105. data/lib/fluent/plugin/formatter.rb +45 -0
  106. data/lib/fluent/plugin/formatter_csv.rb +47 -0
  107. data/lib/fluent/plugin/formatter_hash.rb +29 -0
  108. data/lib/fluent/plugin/formatter_json.rb +44 -0
  109. data/lib/fluent/plugin/formatter_ltsv.rb +41 -0
  110. data/lib/fluent/plugin/formatter_msgpack.rb +29 -0
  111. data/lib/fluent/plugin/formatter_out_file.rb +78 -0
  112. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  113. data/lib/fluent/plugin/formatter_stdout.rb +74 -0
  114. data/lib/fluent/plugin/in_debug_agent.rb +64 -0
  115. data/lib/fluent/plugin/in_dummy.rb +135 -0
  116. data/lib/fluent/plugin/in_exec.rb +149 -0
  117. data/lib/fluent/plugin/in_forward.rb +366 -0
  118. data/lib/fluent/plugin/in_gc_stat.rb +52 -0
  119. data/lib/fluent/plugin/in_http.rb +422 -0
  120. data/lib/fluent/plugin/in_monitor_agent.rb +401 -0
  121. data/lib/fluent/plugin/in_object_space.rb +90 -0
  122. data/lib/fluent/plugin/in_syslog.rb +204 -0
  123. data/lib/fluent/plugin/in_tail.rb +838 -0
  124. data/lib/fluent/plugin/in_tcp.rb +41 -0
  125. data/lib/fluent/plugin/in_udp.rb +37 -0
  126. data/lib/fluent/plugin/in_unix.rb +201 -0
  127. data/lib/fluent/plugin/input.rb +33 -0
  128. data/lib/fluent/plugin/multi_output.rb +95 -0
  129. data/lib/fluent/plugin/out_buffered_null.rb +59 -0
  130. data/lib/fluent/plugin/out_buffered_stdout.rb +70 -0
  131. data/lib/fluent/plugin/out_copy.rb +42 -0
  132. data/lib/fluent/plugin/out_exec.rb +114 -0
  133. data/lib/fluent/plugin/out_exec_filter.rb +393 -0
  134. data/lib/fluent/plugin/out_file.rb +167 -0
  135. data/lib/fluent/plugin/out_forward.rb +646 -0
  136. data/lib/fluent/plugin/out_null.rb +27 -0
  137. data/lib/fluent/plugin/out_relabel.rb +28 -0
  138. data/lib/fluent/plugin/out_roundrobin.rb +80 -0
  139. data/lib/fluent/plugin/out_stdout.rb +48 -0
  140. data/lib/fluent/plugin/out_stream.rb +130 -0
  141. data/lib/fluent/plugin/output.rb +1020 -0
  142. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  143. data/lib/fluent/plugin/parser.rb +175 -0
  144. data/lib/fluent/plugin/parser_apache.rb +28 -0
  145. data/lib/fluent/plugin/parser_apache2.rb +84 -0
  146. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  147. data/lib/fluent/plugin/parser_csv.rb +33 -0
  148. data/lib/fluent/plugin/parser_json.rb +79 -0
  149. data/lib/fluent/plugin/parser_ltsv.rb +50 -0
  150. data/lib/fluent/plugin/parser_multiline.rb +104 -0
  151. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  152. data/lib/fluent/plugin/parser_none.rb +36 -0
  153. data/lib/fluent/plugin/parser_regexp.rb +73 -0
  154. data/lib/fluent/plugin/parser_syslog.rb +82 -0
  155. data/lib/fluent/plugin/parser_tsv.rb +37 -0
  156. data/lib/fluent/plugin/socket_util.rb +22 -0
  157. data/lib/fluent/plugin/storage.rb +84 -0
  158. data/lib/fluent/plugin/storage_local.rb +132 -0
  159. data/lib/fluent/plugin/string_util.rb +22 -0
  160. data/lib/fluent/plugin_helper.rb +42 -0
  161. data/lib/fluent/plugin_helper/child_process.rb +298 -0
  162. data/lib/fluent/plugin_helper/compat_parameters.rb +224 -0
  163. data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
  164. data/lib/fluent/plugin_helper/event_loop.rb +118 -0
  165. data/lib/fluent/plugin_helper/formatter.rb +149 -0
  166. data/lib/fluent/plugin_helper/inject.rb +125 -0
  167. data/lib/fluent/plugin_helper/parser.rb +147 -0
  168. data/lib/fluent/plugin_helper/retry_state.rb +177 -0
  169. data/lib/fluent/plugin_helper/storage.rb +331 -0
  170. data/lib/fluent/plugin_helper/thread.rb +147 -0
  171. data/lib/fluent/plugin_helper/timer.rb +90 -0
  172. data/lib/fluent/plugin_id.rb +63 -0
  173. data/lib/fluent/process.rb +504 -0
  174. data/lib/fluent/registry.rb +99 -0
  175. data/lib/fluent/root_agent.rb +314 -0
  176. data/lib/fluent/rpc.rb +94 -0
  177. data/lib/fluent/supervisor.rb +680 -0
  178. data/lib/fluent/system_config.rb +122 -0
  179. data/lib/fluent/test.rb +56 -0
  180. data/lib/fluent/test/base.rb +85 -0
  181. data/lib/fluent/test/driver/base.rb +179 -0
  182. data/lib/fluent/test/driver/base_owned.rb +70 -0
  183. data/lib/fluent/test/driver/base_owner.rb +125 -0
  184. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  185. data/lib/fluent/test/driver/filter.rb +57 -0
  186. data/lib/fluent/test/driver/formatter.rb +30 -0
  187. data/lib/fluent/test/driver/input.rb +31 -0
  188. data/lib/fluent/test/driver/multi_output.rb +52 -0
  189. data/lib/fluent/test/driver/output.rb +76 -0
  190. data/lib/fluent/test/driver/parser.rb +30 -0
  191. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  192. data/lib/fluent/test/filter_test.rb +77 -0
  193. data/lib/fluent/test/formatter_test.rb +65 -0
  194. data/lib/fluent/test/helpers.rb +79 -0
  195. data/lib/fluent/test/input_test.rb +172 -0
  196. data/lib/fluent/test/log.rb +73 -0
  197. data/lib/fluent/test/output_test.rb +156 -0
  198. data/lib/fluent/test/parser_test.rb +70 -0
  199. data/lib/fluent/time.rb +175 -0
  200. data/lib/fluent/timezone.rb +133 -0
  201. data/lib/fluent/unique_id.rb +39 -0
  202. data/lib/fluent/version.rb +21 -0
  203. data/lib/fluent/winsvc.rb +71 -0
  204. data/test/compat/test_calls_super.rb +166 -0
  205. data/test/compat/test_parser.rb +82 -0
  206. data/test/config/assertions.rb +42 -0
  207. data/test/config/test_config_parser.rb +507 -0
  208. data/test/config/test_configurable.rb +1194 -0
  209. data/test/config/test_configure_proxy.rb +386 -0
  210. data/test/config/test_dsl.rb +415 -0
  211. data/test/config/test_element.rb +403 -0
  212. data/test/config/test_literal_parser.rb +297 -0
  213. data/test/config/test_section.rb +184 -0
  214. data/test/config/test_system_config.rb +120 -0
  215. data/test/config/test_types.rb +171 -0
  216. data/test/helper.rb +119 -0
  217. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  218. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  219. data/test/plugin/data/2010/01/20100102.log +0 -0
  220. data/test/plugin/data/log/bar +0 -0
  221. data/test/plugin/data/log/foo/bar.log +0 -0
  222. data/test/plugin/data/log/test.log +0 -0
  223. data/test/plugin/test_bare_output.rb +118 -0
  224. data/test/plugin/test_base.rb +75 -0
  225. data/test/plugin/test_buf_file.rb +571 -0
  226. data/test/plugin/test_buf_memory.rb +42 -0
  227. data/test/plugin/test_buffer.rb +1200 -0
  228. data/test/plugin/test_buffer_chunk.rb +168 -0
  229. data/test/plugin/test_buffer_file_chunk.rb +771 -0
  230. data/test/plugin/test_buffer_memory_chunk.rb +265 -0
  231. data/test/plugin/test_file_util.rb +96 -0
  232. data/test/plugin/test_filter.rb +353 -0
  233. data/test/plugin/test_filter_grep.rb +119 -0
  234. data/test/plugin/test_filter_record_transformer.rb +600 -0
  235. data/test/plugin/test_filter_stdout.rb +211 -0
  236. data/test/plugin/test_formatter_csv.rb +94 -0
  237. data/test/plugin/test_formatter_json.rb +30 -0
  238. data/test/plugin/test_formatter_ltsv.rb +52 -0
  239. data/test/plugin/test_formatter_msgpack.rb +28 -0
  240. data/test/plugin/test_formatter_out_file.rb +95 -0
  241. data/test/plugin/test_formatter_single_value.rb +38 -0
  242. data/test/plugin/test_in_debug_agent.rb +28 -0
  243. data/test/plugin/test_in_dummy.rb +188 -0
  244. data/test/plugin/test_in_exec.rb +133 -0
  245. data/test/plugin/test_in_forward.rb +635 -0
  246. data/test/plugin/test_in_gc_stat.rb +39 -0
  247. data/test/plugin/test_in_http.rb +442 -0
  248. data/test/plugin/test_in_monitor_agent.rb +329 -0
  249. data/test/plugin/test_in_object_space.rb +64 -0
  250. data/test/plugin/test_in_syslog.rb +205 -0
  251. data/test/plugin/test_in_tail.rb +1001 -0
  252. data/test/plugin/test_in_tcp.rb +102 -0
  253. data/test/plugin/test_in_udp.rb +121 -0
  254. data/test/plugin/test_in_unix.rb +126 -0
  255. data/test/plugin/test_input.rb +122 -0
  256. data/test/plugin/test_multi_output.rb +180 -0
  257. data/test/plugin/test_out_buffered_null.rb +79 -0
  258. data/test/plugin/test_out_buffered_stdout.rb +122 -0
  259. data/test/plugin/test_out_copy.rb +160 -0
  260. data/test/plugin/test_out_exec.rb +155 -0
  261. data/test/plugin/test_out_exec_filter.rb +262 -0
  262. data/test/plugin/test_out_file.rb +383 -0
  263. data/test/plugin/test_out_forward.rb +590 -0
  264. data/test/plugin/test_out_null.rb +29 -0
  265. data/test/plugin/test_out_relabel.rb +28 -0
  266. data/test/plugin/test_out_roundrobin.rb +146 -0
  267. data/test/plugin/test_out_stdout.rb +92 -0
  268. data/test/plugin/test_out_stream.rb +93 -0
  269. data/test/plugin/test_output.rb +568 -0
  270. data/test/plugin/test_output_as_buffered.rb +1604 -0
  271. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  272. data/test/plugin/test_output_as_buffered_retries.rb +839 -0
  273. data/test/plugin/test_output_as_buffered_secondary.rb +817 -0
  274. data/test/plugin/test_output_as_standard.rb +374 -0
  275. data/test/plugin/test_owned_by.rb +35 -0
  276. data/test/plugin/test_parser_apache.rb +42 -0
  277. data/test/plugin/test_parser_apache2.rb +38 -0
  278. data/test/plugin/test_parser_apache_error.rb +45 -0
  279. data/test/plugin/test_parser_base.rb +32 -0
  280. data/test/plugin/test_parser_csv.rb +104 -0
  281. data/test/plugin/test_parser_json.rb +107 -0
  282. data/test/plugin/test_parser_labeled_tsv.rb +129 -0
  283. data/test/plugin/test_parser_multiline.rb +100 -0
  284. data/test/plugin/test_parser_nginx.rb +48 -0
  285. data/test/plugin/test_parser_none.rb +53 -0
  286. data/test/plugin/test_parser_regexp.rb +277 -0
  287. data/test/plugin/test_parser_syslog.rb +66 -0
  288. data/test/plugin/test_parser_time.rb +46 -0
  289. data/test/plugin/test_parser_tsv.rb +121 -0
  290. data/test/plugin/test_storage.rb +167 -0
  291. data/test/plugin/test_storage_local.rb +8 -0
  292. data/test/plugin/test_string_util.rb +26 -0
  293. data/test/plugin_helper/test_child_process.rb +608 -0
  294. data/test/plugin_helper/test_compat_parameters.rb +242 -0
  295. data/test/plugin_helper/test_event_emitter.rb +51 -0
  296. data/test/plugin_helper/test_event_loop.rb +52 -0
  297. data/test/plugin_helper/test_formatter.rb +252 -0
  298. data/test/plugin_helper/test_inject.rb +487 -0
  299. data/test/plugin_helper/test_parser.rb +263 -0
  300. data/test/plugin_helper/test_retry_state.rb +399 -0
  301. data/test/plugin_helper/test_storage.rb +521 -0
  302. data/test/plugin_helper/test_thread.rb +164 -0
  303. data/test/plugin_helper/test_timer.rb +131 -0
  304. data/test/scripts/exec_script.rb +32 -0
  305. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  306. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  307. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  308. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  309. data/test/test_config.rb +179 -0
  310. data/test/test_configdsl.rb +148 -0
  311. data/test/test_event.rb +329 -0
  312. data/test/test_event_router.rb +331 -0
  313. data/test/test_event_time.rb +184 -0
  314. data/test/test_filter.rb +121 -0
  315. data/test/test_formatter.rb +319 -0
  316. data/test/test_input.rb +31 -0
  317. data/test/test_log.rb +572 -0
  318. data/test/test_match.rb +137 -0
  319. data/test/test_mixin.rb +351 -0
  320. data/test/test_output.rb +214 -0
  321. data/test/test_plugin_classes.rb +136 -0
  322. data/test/test_plugin_helper.rb +81 -0
  323. data/test/test_process.rb +48 -0
  324. data/test/test_root_agent.rb +278 -0
  325. data/test/test_supervisor.rb +339 -0
  326. data/test/test_time_formatter.rb +186 -0
  327. data/test/test_unique_id.rb +47 -0
  328. metadata +823 -0
@@ -0,0 +1,211 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/filter'
3
+ require 'fluent/plugin/filter_stdout'
4
+ require 'timecop'
5
+ require 'flexmock/test_unit'
6
+
7
+ class StdoutFilterTest < Test::Unit::TestCase
8
+ include FlexMock::TestCase
9
+
10
+ def setup
11
+ Fluent::Test.setup
12
+ @old_tz = ENV["TZ"]
13
+ ENV["TZ"] = "UTC"
14
+ Timecop.freeze
15
+ end
16
+
17
+ def teardown
18
+ super # FlexMock::TestCase requires this
19
+ # http://flexmock.rubyforge.org/FlexMock/TestCase.html
20
+ Timecop.return
21
+ ENV["TZ"] = @old_tz
22
+ end
23
+
24
+ CONFIG = config_element('ROOT')
25
+
26
+ def create_driver(conf = CONFIG)
27
+ Fluent::Test::Driver::Filter.new(Fluent::Plugin::StdoutFilter).configure(conf)
28
+ end
29
+
30
+ def filter(d, time, record)
31
+ d.run {
32
+ d.feed("filter.test", time, record)
33
+ }
34
+ d.filtered_records
35
+ end
36
+
37
+ def test_through_record
38
+ d = create_driver
39
+ filtered = filter(d, event_time, {'test' => 'test'})
40
+ assert_equal([{'test' => 'test'}], filtered)
41
+ end
42
+
43
+ sub_test_case "flat style parameters" do
44
+ sub_test_case "configure" do
45
+ def test_configure_default
46
+ d = create_driver
47
+ d.run {}
48
+ assert_equal 'json', d.instance.formatter.output_type
49
+ end
50
+
51
+ data(json: "json",
52
+ hash: "hash",
53
+ ltsv: "ltsv")
54
+ def test_output_type(data)
55
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => data }))
56
+ d.run {}
57
+ assert_equal data, d.instance.formatter.output_type
58
+ end
59
+
60
+ def test_invalid_output_type
61
+ assert_raise(Fluent::ConfigError) do
62
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "foo" }))
63
+ d.run {}
64
+ end
65
+ end
66
+ end
67
+
68
+ def test_output_type_json
69
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "json" }))
70
+ etime = event_time
71
+ time = Time.at(etime.sec)
72
+ out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
73
+ assert_equal "#{time.localtime} filter.test: {\"test\":\"test\"}\n", out
74
+
75
+ # NOTE: Float::NAN is not jsonable
76
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "json" }))
77
+ flexmock(d.instance.router).should_receive(:emit_error_event)
78
+ filter(d, etime, {'test' => Float::NAN})
79
+ end
80
+
81
+ def test_output_type_hash
82
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "hash" }))
83
+ etime = event_time
84
+ time = Time.at(etime.sec)
85
+ out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
86
+ assert_equal "#{time.localtime} filter.test: {\"test\"=>\"test\"}\n", out
87
+
88
+ # NOTE: Float::NAN is not jsonable, but hash string can output it.
89
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "hash" }))
90
+ out = capture_log(d) { filter(d, etime, {'test' => Float::NAN}) }
91
+ assert_equal "#{time.localtime} filter.test: {\"test\"=>NaN}\n", out
92
+ end
93
+
94
+ # Use include_time_key to output the message's time
95
+ def test_include_time_key
96
+ config = config_element("", "", {
97
+ "output_type" => "json",
98
+ "include_time_key" => true,
99
+ "localtime" => false
100
+ })
101
+ d = create_driver(config)
102
+ etime = event_time
103
+ time = Time.at(etime.sec)
104
+ message_time = event_time("2011-01-02 13:14:15 UTC")
105
+ out = capture_log(d) { filter(d, message_time, {'test' => 'test'}) }
106
+ assert_equal "#{time.localtime} filter.test: {\"test\":\"test\",\"time\":\"2011-01-02T13:14:15Z\"}\n", out
107
+ end
108
+
109
+ # out_stdout formatter itself can also be replaced
110
+ def test_format_json
111
+ d = create_driver(CONFIG + config_element("", "", { "format" => "json" }))
112
+ out = capture_log(d) { filter(d, event_time, {'test' => 'test'}) }
113
+ assert_equal "{\"test\":\"test\"}\n", out
114
+ end
115
+ end
116
+
117
+ sub_test_case "with <format> sub section" do
118
+ sub_test_case "configure" do
119
+ def test_default
120
+ conf = config_element
121
+ conf.elements << config_element("format", "", { "@type" => "stdout"})
122
+ d = create_driver(conf)
123
+ d.run {}
124
+ assert_equal("json", d.instance.formatter.output_type)
125
+ end
126
+
127
+ data(json: "json",
128
+ hash: "hash",
129
+ ltsv: "ltsv")
130
+ def test_output_type(data)
131
+ conf = config_element
132
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => data })
133
+ d = create_driver(conf)
134
+ d.run {}
135
+ assert_equal(data, d.instance.formatter.output_type)
136
+ end
137
+
138
+ def test_invalid_output_type
139
+ conf = config_element
140
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "foo" })
141
+ assert_raise(Fluent::ConfigError) do
142
+ d = create_driver(conf)
143
+ d.run {}
144
+ end
145
+ end
146
+ end
147
+
148
+ sub_test_case "output_type" do
149
+ def test_json
150
+ conf = config_element
151
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "json" })
152
+ d = create_driver(conf)
153
+ etime = event_time
154
+ time = Time.at(etime.sec)
155
+ out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
156
+ assert_equal "#{time.localtime} filter.test: {\"test\":\"test\"}\n", out
157
+ end
158
+
159
+ def test_json_nan
160
+ # NOTE: Float::NAN is not jsonable
161
+ conf = config_element
162
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "json" })
163
+ d = create_driver(conf)
164
+ etime = event_time
165
+ flexmock(d.instance.router).should_receive(:emit_error_event)
166
+ filter(d, etime, {'test' => Float::NAN})
167
+ end
168
+
169
+ def test_hash
170
+ conf = config_element
171
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "hash" })
172
+ d = create_driver(conf)
173
+ etime = event_time
174
+ time = Time.at(etime.sec)
175
+ out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
176
+ assert_equal "#{time.localtime} filter.test: {\"test\"=>\"test\"}\n", out
177
+ end
178
+
179
+ def test_hash_nan
180
+ # NOTE: Float::NAN is not jsonable, but hash string can output it.
181
+ conf = config_element
182
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "hash" })
183
+ d = create_driver(conf)
184
+ etime = event_time
185
+ time = Time.at(etime.sec)
186
+ out = capture_log(d) { filter(d, etime, {'test' => Float::NAN}) }
187
+ assert_equal "#{time.localtime} filter.test: {\"test\"=>NaN}\n", out
188
+ end
189
+
190
+ # Use include_time_key to output the message's time
191
+ def test_include_time_key
192
+ conf = config_element
193
+ conf.elements << config_element("format", "", {
194
+ "@type" => "stdout",
195
+ "output_type" => "json"
196
+ })
197
+ conf.elements << config_element("inject", "", {
198
+ "time_key" => "time",
199
+ "time_type" => "string",
200
+ "localtime" => false
201
+ })
202
+ d = create_driver(conf)
203
+ etime = event_time
204
+ time = Time.at(etime.sec)
205
+ message_time = event_time("2011-01-02 13:14:15 UTC")
206
+ out = capture_log(d) { filter(d, message_time, {'test' => 'test'}) }
207
+ assert_equal "#{time.localtime} filter.test: {\"test\":\"test\",\"time\":\"2011-01-02T13:14:15Z\"}\n", out
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,94 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/formatter'
3
+ require 'fluent/plugin/formatter_csv'
4
+
5
+ class CsvFormatterTest < ::Test::Unit::TestCase
6
+
7
+ def setup
8
+ @time = event_time
9
+ end
10
+
11
+ CONF = %[
12
+ fields a,b,c
13
+ ]
14
+
15
+ def create_driver(conf = CONF)
16
+ Fluent::Test::Driver::Formatter.new(Fluent::Plugin::CsvFormatter).configure(conf)
17
+ end
18
+
19
+ def tag
20
+ "tag"
21
+ end
22
+
23
+ def test_config_params
24
+ d = create_driver
25
+ assert_equal(',', d.instance.delimiter)
26
+ assert_equal(true, d.instance.force_quotes)
27
+ assert_equal(['a', 'b', 'c'], d.instance.fields)
28
+ end
29
+
30
+ data(
31
+ 'tab_char' => ["\t", '\t'],
32
+ 'tab_string' => ["\t", 'TAB'],
33
+ 'pipe' => ['|', '|'])
34
+ def test_config_params_with_customized_delimiters(data)
35
+ expected, target = data
36
+ d = create_driver("delimiter" => target, 'fields' => 'a,b,c')
37
+ assert_equal expected, d.instance.delimiter
38
+ end
39
+
40
+ def test_format
41
+ d = create_driver("fields" => "message,message2")
42
+ formatted = d.instance.format(tag, @time, {
43
+ 'message' => 'awesome',
44
+ 'message2' => 'awesome2'
45
+ })
46
+ assert_equal("\"awesome\",\"awesome2\"\n", formatted)
47
+ end
48
+
49
+ def test_format_with_customized_delimiters
50
+ d = create_driver("fields" => "message,message2",
51
+ "delimiter" => "\t")
52
+ formatted = d.instance.format(tag, @time, {
53
+ 'message' => 'awesome',
54
+ 'message2' => 'awesome2'
55
+ })
56
+ assert_equal("\"awesome\"\t\"awesome2\"\n", formatted)
57
+ end
58
+
59
+ def test_format_with_non_quote
60
+ d = create_driver("fields" => "message,message2",
61
+ "force_quotes" => false)
62
+ formatted = d.instance.format(tag, @time, {
63
+ 'message' => 'awesome',
64
+ 'message2' => 'awesome2'
65
+ })
66
+ assert_equal("awesome,awesome2\n", formatted)
67
+ end
68
+
69
+ data(
70
+ 'nil' => {
71
+ 'message' => 'awesome',
72
+ 'message2' => nil,
73
+ 'message3' => 'awesome3'
74
+ },
75
+ 'blank' => {
76
+ 'message' => 'awesome',
77
+ 'message2' => '',
78
+ 'message3' => 'awesome3'
79
+ })
80
+ def test_format_with_empty_fields(data)
81
+ d = create_driver("fields" => "message,message2,message3")
82
+ formatted = d.instance.format(tag, @time, data)
83
+ assert_equal("\"awesome\",\"\",\"awesome3\"\n", formatted)
84
+ end
85
+
86
+ data(
87
+ 'normally' => 'one,two,three',
88
+ 'white_space' => 'one , two , three',
89
+ 'blank' => 'one,,two,three')
90
+ def test_config_params_with_fields(data)
91
+ d = create_driver('fields' => data)
92
+ assert_equal %w(one two three), d.instance.fields
93
+ end
94
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/formatter'
3
+ require 'fluent/plugin/formatter_json'
4
+
5
+ class JsonFormatterTest < ::Test::Unit::TestCase
6
+
7
+ def setup
8
+ @time = event_time
9
+ end
10
+
11
+ def create_driver(conf = "")
12
+ Fluent::Test::Driver::Formatter.new(Fluent::Plugin::JSONFormatter).configure(conf)
13
+ end
14
+
15
+ def tag
16
+ "tag"
17
+ end
18
+
19
+ def record
20
+ {'message' => 'awesome'}
21
+ end
22
+
23
+ data('oj' => 'oj', 'yajl' => 'yajl')
24
+ def test_format(data)
25
+ d = create_driver('json_parser' => data)
26
+ formatted = d.instance.format(tag, @time, record)
27
+
28
+ assert_equal("#{Yajl.dump(record)}\n", formatted)
29
+ end
30
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/formatter'
3
+ require 'fluent/plugin/formatter_ltsv'
4
+
5
+ class LabeledTSVFormatterTest < ::Test::Unit::TestCase
6
+ def setup
7
+ @time = event_time
8
+ end
9
+
10
+ def create_driver(conf = "")
11
+ Fluent::Test::Driver::Formatter.new(Fluent::Plugin::LabeledTSVFormatter).configure(conf)
12
+ end
13
+
14
+ def tag
15
+ "tag"
16
+ end
17
+
18
+ def record
19
+ {'message' => 'awesome', 'greeting' => 'hello'}
20
+ end
21
+
22
+ def test_config_params
23
+ d = create_driver
24
+ assert_equal "\t", d.instance.delimiter
25
+ assert_equal ":", d.instance.label_delimiter
26
+
27
+ d = create_driver(
28
+ 'delimiter' => ',',
29
+ 'label_delimiter' => '=',
30
+ )
31
+
32
+ assert_equal ",", d.instance.delimiter
33
+ assert_equal "=", d.instance.label_delimiter
34
+ end
35
+
36
+ def test_format
37
+ d = create_driver({})
38
+ formatted = d.instance.format(tag, @time, record)
39
+
40
+ assert_equal("message:awesome\tgreeting:hello\n", formatted)
41
+ end
42
+
43
+ def test_format_with_customized_delimiters
44
+ d = create_driver(
45
+ 'delimiter' => ',',
46
+ 'label_delimiter' => '=',
47
+ )
48
+ formatted = d.instance.format(tag, @time, record)
49
+
50
+ assert_equal("message=awesome,greeting=hello\n", formatted)
51
+ end
52
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/formatter'
3
+ require 'fluent/plugin/formatter_msgpack'
4
+
5
+ class MessagePackFormatterTest < ::Test::Unit::TestCase
6
+ def setup
7
+ @time = event_time
8
+ end
9
+
10
+ def create_driver(conf = "")
11
+ Fluent::Test::Driver::Formatter.new(Fluent::Plugin::MessagePackFormatter).configure(conf)
12
+ end
13
+
14
+ def tag
15
+ "tag"
16
+ end
17
+
18
+ def record
19
+ {'message' => 'awesome'}
20
+ end
21
+
22
+ def test_format
23
+ d = create_driver({})
24
+ formatted = d.instance.format(tag, @time, record)
25
+
26
+ assert_equal(record.to_msgpack, formatted)
27
+ end
28
+ end
@@ -0,0 +1,95 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/formatter'
3
+ require 'fluent/plugin/formatter_out_file'
4
+
5
+ class OutFileFormatterTest < ::Test::Unit::TestCase
6
+ def setup
7
+ @time = event_time
8
+ end
9
+
10
+ def create_driver(conf = {})
11
+ d = Fluent::Test::Driver::Formatter.new(Fluent::Plugin::OutFileFormatter)
12
+ case conf
13
+ when Fluent::Config::Element
14
+ d.configure(conf)
15
+ when Hash
16
+ d.configure({'utc' => true}.merge(conf))
17
+ else
18
+ d.configure(conf)
19
+ end
20
+ end
21
+
22
+ def tag
23
+ "tag"
24
+ end
25
+
26
+ def record
27
+ {'message' => 'awesome'}
28
+ end
29
+
30
+ data('both true' => 'true', 'both false' => 'false')
31
+ def test_configured_with_both_of_utc_and_localtime(value)
32
+ assert_raise(Fluent::ConfigError.new("both of utc and localtime are specified, use only one of them")) do
33
+ create_driver({'utc' => value, 'localtime' => value})
34
+ end
35
+ end
36
+
37
+ time_i = Time.parse("2016-07-26 21:08:30 -0700").to_i
38
+ data(
39
+ 'configured for localtime by localtime' => ['localtime', 'true', time_i, "2016-07-26T21:08:30-07:00"],
40
+ 'configured for localtime by utc' => ['utc', 'false', time_i, "2016-07-26T21:08:30-07:00"],
41
+ 'configured for utc by localtime' => ['localtime', 'false', time_i, "2016-07-27T04:08:30Z"],
42
+ 'configured for utc by utc' => ['utc', 'true', time_i, "2016-07-27T04:08:30Z"],
43
+ )
44
+ def test_configured_with_utc_or_localtime(data)
45
+ key, value, time_i, expected = data
46
+ time = Time.at(time_i)
47
+ begin
48
+ oldtz, ENV['TZ'] = ENV['TZ'], "UTC+07"
49
+ d = create_driver(config_element('ROOT', '', {key => value}))
50
+ tag = 'test'
51
+ assert_equal "#{expected}\t#{tag}\t#{Yajl.dump(record)}\n", d.instance.format(tag, time, record)
52
+ ensure
53
+ ENV['TZ'] = oldtz
54
+ end
55
+ end
56
+
57
+ def test_format
58
+ d = create_driver({})
59
+ formatted = d.instance.format(tag, @time, record)
60
+
61
+ assert_equal("#{time2str(@time)}\t#{tag}\t#{Yajl.dump(record)}\n", formatted)
62
+ end
63
+
64
+ def test_format_without_time
65
+ d = create_driver('output_time' => 'false')
66
+ formatted = d.instance.format(tag, @time, record)
67
+
68
+ assert_equal("#{tag}\t#{Yajl.dump(record)}\n", formatted)
69
+ end
70
+
71
+ def test_format_without_tag
72
+ d = create_driver('output_tag' => 'false')
73
+ formatted = d.instance.format(tag, @time, record)
74
+
75
+ assert_equal("#{time2str(@time)}\t#{Yajl.dump(record)}\n", formatted)
76
+ end
77
+
78
+ def test_format_without_time_and_tag
79
+ d = create_driver('output_tag' => 'false', 'output_time' => 'false')
80
+ formatted = d.instance.format('tag', @time, record)
81
+
82
+ assert_equal("#{Yajl.dump(record)}\n", formatted)
83
+ end
84
+
85
+ def test_format_without_time_and_tag_against_string_literal_configure
86
+ d = create_driver(%[
87
+ utc true
88
+ output_tag false
89
+ output_time false
90
+ ])
91
+ formatted = d.instance.format('tag', @time, record)
92
+
93
+ assert_equal("#{Yajl.dump(record)}\n", formatted)
94
+ end
95
+ end