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,265 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin/buffer/memory_chunk'
3
+
4
+ require 'json'
5
+
6
+ class BufferMemoryChunkTest < Test::Unit::TestCase
7
+ setup do
8
+ @c = Fluent::Plugin::Buffer::MemoryChunk.new(Object.new)
9
+ end
10
+
11
+ test 'has blank chunk initially' do
12
+ assert @c.empty?
13
+ assert_equal '', @c.instance_eval{ @chunk }
14
+ assert_equal 0, @c.instance_eval{ @chunk_bytes }
15
+ assert_equal 0, @c.instance_eval{ @adding_bytes }
16
+ assert_equal 0, @c.instance_eval{ @adding_size }
17
+ end
18
+
19
+ test 'can #append, #commit and #read it' do
20
+ assert @c.empty?
21
+
22
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
23
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
24
+ data = [d1.to_json + "\n", d2.to_json + "\n"]
25
+ @c.append(data)
26
+ @c.commit
27
+
28
+ content = @c.read
29
+ ds = content.split("\n").select{|d| !d.empty? }
30
+
31
+ assert_equal 2, ds.size
32
+ assert_equal d1, JSON.parse(ds[0])
33
+ assert_equal d2, JSON.parse(ds[1])
34
+
35
+ d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
36
+ d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
37
+ @c.append([d3.to_json + "\n", d4.to_json + "\n"])
38
+ @c.commit
39
+
40
+ content = @c.read
41
+ ds = content.split("\n").select{|d| !d.empty? }
42
+
43
+ assert_equal 4, ds.size
44
+ assert_equal d1, JSON.parse(ds[0])
45
+ assert_equal d2, JSON.parse(ds[1])
46
+ assert_equal d3, JSON.parse(ds[2])
47
+ assert_equal d4, JSON.parse(ds[3])
48
+ end
49
+
50
+ test 'can #concat, #commit and #read it' do
51
+ assert @c.empty?
52
+
53
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
54
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
55
+ data = [d1.to_json + "\n", d2.to_json + "\n"].join
56
+ @c.concat(data, 2)
57
+ @c.commit
58
+
59
+ content = @c.read
60
+ ds = content.split("\n").select{|d| !d.empty? }
61
+
62
+ assert_equal 2, ds.size
63
+ assert_equal d1, JSON.parse(ds[0])
64
+ assert_equal d2, JSON.parse(ds[1])
65
+
66
+ d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
67
+ d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
68
+ @c.concat([d3.to_json + "\n", d4.to_json + "\n"].join, 2)
69
+ @c.commit
70
+
71
+ content = @c.read
72
+ ds = content.split("\n").select{|d| !d.empty? }
73
+
74
+ assert_equal 4, ds.size
75
+ assert_equal d1, JSON.parse(ds[0])
76
+ assert_equal d2, JSON.parse(ds[1])
77
+ assert_equal d3, JSON.parse(ds[2])
78
+ assert_equal d4, JSON.parse(ds[3])
79
+ end
80
+
81
+ test 'has its contents in binary (ascii-8bit)' do
82
+ data1 = "aaa bbb ccc".force_encoding('utf-8')
83
+ @c.append([data1])
84
+ @c.commit
85
+ assert_equal Encoding::ASCII_8BIT, @c.instance_eval{ @chunk.encoding }
86
+
87
+ content = @c.read
88
+ assert_equal Encoding::ASCII_8BIT, content.encoding
89
+ end
90
+
91
+ test 'has #bytesize and #size' do
92
+ assert @c.empty?
93
+
94
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
95
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
96
+ data = [d1.to_json + "\n", d2.to_json + "\n"]
97
+ @c.append(data)
98
+
99
+ assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
100
+ assert_equal 2, @c.size
101
+
102
+ @c.commit
103
+
104
+ assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
105
+ assert_equal 2, @c.size
106
+
107
+ first_bytesize = @c.bytesize
108
+
109
+ d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
110
+ d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
111
+ @c.append([d3.to_json + "\n", d4.to_json + "\n"])
112
+
113
+ assert_equal first_bytesize + (d3.to_json + "\n" + d4.to_json + "\n").bytesize, @c.bytesize
114
+ assert_equal 4, @c.size
115
+
116
+ @c.commit
117
+
118
+ assert_equal first_bytesize + (d3.to_json + "\n" + d4.to_json + "\n").bytesize, @c.bytesize
119
+ assert_equal 4, @c.size
120
+ end
121
+
122
+ test 'can #rollback to revert non-committed data' do
123
+ assert @c.empty?
124
+
125
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
126
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
127
+ data = [d1.to_json + "\n", d2.to_json + "\n"]
128
+ @c.append(data)
129
+
130
+ assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
131
+ assert_equal 2, @c.size
132
+
133
+ @c.rollback
134
+
135
+ assert @c.empty?
136
+
137
+ assert @c.empty?
138
+
139
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
140
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
141
+ data = [d1.to_json + "\n", d2.to_json + "\n"]
142
+ @c.append(data)
143
+ @c.commit
144
+
145
+ assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
146
+ assert_equal 2, @c.size
147
+
148
+ first_bytesize = @c.bytesize
149
+
150
+ d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
151
+ d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
152
+ @c.append([d3.to_json + "\n", d4.to_json + "\n"])
153
+
154
+ assert_equal first_bytesize + (d3.to_json + "\n" + d4.to_json + "\n").bytesize, @c.bytesize
155
+ assert_equal 4, @c.size
156
+
157
+ @c.rollback
158
+
159
+ assert_equal first_bytesize, @c.bytesize
160
+ assert_equal 2, @c.size
161
+ end
162
+
163
+ test 'can #rollback to revert non-committed data from #concat' do
164
+ assert @c.empty?
165
+
166
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
167
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
168
+ data = [d1.to_json + "\n", d2.to_json + "\n"].join
169
+ @c.concat(data, 2)
170
+
171
+ assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
172
+ assert_equal 2, @c.size
173
+
174
+ @c.rollback
175
+
176
+ assert @c.empty?
177
+
178
+ assert @c.empty?
179
+
180
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
181
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
182
+ data = [d1.to_json + "\n", d2.to_json + "\n"]
183
+ @c.append(data)
184
+ @c.commit
185
+
186
+ assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
187
+ assert_equal 2, @c.size
188
+
189
+ first_bytesize = @c.bytesize
190
+
191
+ d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
192
+ d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
193
+ @c.concat([d3.to_json + "\n", d4.to_json + "\n"].join, 2)
194
+
195
+ assert_equal first_bytesize + (d3.to_json + "\n" + d4.to_json + "\n").bytesize, @c.bytesize
196
+ assert_equal 4, @c.size
197
+
198
+ @c.rollback
199
+
200
+ assert_equal first_bytesize, @c.bytesize
201
+ assert_equal 2, @c.size
202
+ end
203
+
204
+ test 'does nothing for #close' do
205
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
206
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
207
+ data = [d1.to_json + "\n", d2.to_json + "\n"]
208
+ @c.append(data)
209
+ @c.commit
210
+ d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
211
+ d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
212
+ @c.append([d3.to_json + "\n", d4.to_json + "\n"])
213
+ @c.commit
214
+
215
+ content = @c.read
216
+
217
+ @c.close
218
+
219
+ assert_equal content, @c.read
220
+ end
221
+
222
+ test 'deletes all data by #purge' do
223
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
224
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
225
+ data = [d1.to_json + "\n", d2.to_json + "\n"]
226
+ @c.append(data)
227
+ @c.commit
228
+ d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
229
+ d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
230
+ @c.append([d3.to_json + "\n", d4.to_json + "\n"])
231
+ @c.commit
232
+
233
+ @c.purge
234
+
235
+ assert @c.empty?
236
+ assert_equal 0, @c.bytesize
237
+ assert_equal 0, @c.size
238
+ assert_equal '', @c.read
239
+ end
240
+
241
+ test 'can #open its contents as io' do
242
+ d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
243
+ d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
244
+ data = [d1.to_json + "\n", d2.to_json + "\n"]
245
+ @c.append(data)
246
+ @c.commit
247
+ d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
248
+ d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
249
+ @c.append([d3.to_json + "\n", d4.to_json + "\n"])
250
+ @c.commit
251
+
252
+ lines = []
253
+ @c.open do |io|
254
+ assert io
255
+ io.readlines.each do |l|
256
+ lines << l
257
+ end
258
+ end
259
+
260
+ assert_equal d1.to_json + "\n", lines[0]
261
+ assert_equal d2.to_json + "\n", lines[1]
262
+ assert_equal d3.to_json + "\n", lines[2]
263
+ assert_equal d4.to_json + "\n", lines[3]
264
+ end
265
+ end
@@ -0,0 +1,96 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin/file_util'
3
+ require 'fileutils'
4
+
5
+ class FileUtilTest < Test::Unit::TestCase
6
+ def setup
7
+ FileUtils.rm_rf(TEST_DIR)
8
+ FileUtils.mkdir_p(TEST_DIR)
9
+ end
10
+
11
+ TEST_DIR = File.expand_path(File.dirname(__FILE__) + "/../tmp/file_util")
12
+
13
+ sub_test_case 'writable?' do
14
+ test 'file exists and writable' do
15
+ FileUtils.touch("#{TEST_DIR}/test_file")
16
+ assert_true Fluent::FileUtil.writable?("#{TEST_DIR}/test_file")
17
+ end
18
+
19
+ test 'file exists and not writable' do
20
+ FileUtils.touch("#{TEST_DIR}/test_file")
21
+ File.chmod(0444, "#{TEST_DIR}/test_file")
22
+ assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_file")
23
+ end
24
+
25
+ test 'directory exists' do
26
+ FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
27
+ assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_dir")
28
+ end
29
+
30
+ test 'file does not exist and parent directory is writable' do
31
+ FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
32
+ assert_true Fluent::FileUtil.writable?("#{TEST_DIR}/test_dir/test_file")
33
+ end
34
+
35
+ test 'file does not exist and parent directory is not writable' do
36
+ FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
37
+ File.chmod(0444, "#{TEST_DIR}/test_dir")
38
+ assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_dir/test_file")
39
+ end
40
+
41
+ test 'parent directory does not exist' do
42
+ FileUtils.rm_rf("#{TEST_DIR}/test_dir")
43
+ assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_dir/test_file")
44
+ end
45
+
46
+ test 'parent file (not directory) exists' do
47
+ FileUtils.touch("#{TEST_DIR}/test_file")
48
+ assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_file/foo")
49
+ end
50
+ end
51
+
52
+ sub_test_case 'writable_p?' do
53
+ test 'file exists and writable' do
54
+ FileUtils.touch("#{TEST_DIR}/test_file")
55
+ assert_true Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_file")
56
+ end
57
+
58
+ test 'file exists and not writable' do
59
+ FileUtils.touch("#{TEST_DIR}/test_file")
60
+ File.chmod(0444, "#{TEST_DIR}/test_file")
61
+ assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_file")
62
+ end
63
+
64
+ test 'directory exists' do
65
+ FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
66
+ assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir")
67
+ end
68
+
69
+ test 'parent directory exists and writable' do
70
+ FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
71
+ assert_true Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir/test_file")
72
+ end
73
+
74
+ test 'parent directory exists and not writable' do
75
+ FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
76
+ File.chmod(0555, "#{TEST_DIR}/test_dir")
77
+ assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir/test_file")
78
+ end
79
+
80
+ test 'parent of parent (of parent ...) directory exists and writable' do
81
+ FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
82
+ assert_true Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir/foo/bar/baz")
83
+ end
84
+
85
+ test 'parent of parent (of parent ...) directory exists and not writable' do
86
+ FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
87
+ File.chmod(0555, "#{TEST_DIR}/test_dir")
88
+ assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir/foo/bar/baz")
89
+ end
90
+
91
+ test 'parent of parent (of parent ...) file (not directory) exists' do
92
+ FileUtils.touch("#{TEST_DIR}/test_file")
93
+ assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_file/foo/bar/baz")
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,353 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin/filter'
3
+ require 'fluent/event'
4
+ require 'flexmock/test_unit'
5
+
6
+ module FluentPluginFilterTest
7
+ class DummyPlugin < Fluent::Plugin::Filter
8
+ end
9
+ class NumDoublePlugin < Fluent::Plugin::Filter
10
+ def filter(tag, time, record)
11
+ r = record.dup
12
+ r["num"] = r["num"].to_i * 2
13
+ r
14
+ end
15
+ end
16
+ class IgnoreForNumPlugin < Fluent::Plugin::Filter
17
+ def filter(tag, time, record)
18
+ if record["num"].is_a? Numeric
19
+ nil
20
+ else
21
+ record
22
+ end
23
+ end
24
+ end
25
+ class RaiseForNumPlugin < Fluent::Plugin::Filter
26
+ def filter(tag, time, record)
27
+ if record["num"].is_a? Numeric
28
+ raise "Value of num is Number!"
29
+ end
30
+ record
31
+ end
32
+ end
33
+ class NumDoublePluginWithTime < Fluent::Plugin::Filter
34
+ def filter_with_time(tag, time, record)
35
+ r = record.dup
36
+ r["num"] = r["num"].to_i * 2
37
+ [time, r]
38
+ end
39
+ end
40
+ class IgnoreForNumPluginWithTime < Fluent::Plugin::Filter
41
+ def filter_with_time(tag, time, record)
42
+ if record["num"].is_a? Numeric
43
+ nil
44
+ else
45
+ [time, record]
46
+ end
47
+ end
48
+ end
49
+ class InvalidPlugin < Fluent::Plugin::Filter
50
+ # Because of implemnting `filter_with_time` and `filter` methods
51
+ def filter_with_time(tag, time, record); end
52
+ def filter(tag, time, record); end
53
+ end
54
+ end
55
+
56
+ class FilterPluginTest < Test::Unit::TestCase
57
+ DummyRouter = Struct.new(:emits) do
58
+ def emit_error_event(tag, time, record, error)
59
+ self.emits << [tag, time, record, error]
60
+ end
61
+ end
62
+
63
+ setup do
64
+ @p = nil
65
+ end
66
+
67
+ teardown do
68
+ if @p
69
+ @p.stop unless @p.stopped?
70
+ @p.before_shutdown unless @p.before_shutdown?
71
+ @p.shutdown unless @p.shutdown?
72
+ @p.after_shutdown unless @p.after_shutdown?
73
+ @p.close unless @p.closed?
74
+ @p.terminate unless @p.terminated?
75
+ end
76
+ end
77
+
78
+ sub_test_case 'for basic dummy plugin' do
79
+ setup do
80
+ Fluent::Test.setup
81
+ end
82
+
83
+ test 'plugin does not define #filter raises error' do
84
+ assert_raise NotImplementedError do
85
+ FluentPluginFilterTest::DummyPlugin.new
86
+ end
87
+ end
88
+ end
89
+
90
+ sub_test_case 'normal filter plugin' do
91
+ setup do
92
+ Fluent::Test.setup
93
+ @p = FluentPluginFilterTest::NumDoublePlugin.new
94
+ end
95
+
96
+ test 'has healthy lifecycle' do
97
+ assert !@p.configured?
98
+ @p.configure(config_element)
99
+ assert @p.configured?
100
+
101
+ assert !@p.started?
102
+ @p.start
103
+ assert @p.start
104
+
105
+ assert !@p.stopped?
106
+ @p.stop
107
+ assert @p.stopped?
108
+
109
+ assert !@p.before_shutdown?
110
+ @p.before_shutdown
111
+ assert @p.before_shutdown?
112
+
113
+ assert !@p.shutdown?
114
+ @p.shutdown
115
+ assert @p.shutdown?
116
+
117
+ assert !@p.after_shutdown?
118
+ @p.after_shutdown
119
+ assert @p.after_shutdown?
120
+
121
+ assert !@p.closed?
122
+ @p.close
123
+ assert @p.closed?
124
+
125
+ assert !@p.terminated?
126
+ @p.terminate
127
+ assert @p.terminated?
128
+ end
129
+
130
+ test 'has plugin_id automatically generated' do
131
+ assert @p.respond_to?(:plugin_id_configured?)
132
+ assert @p.respond_to?(:plugin_id)
133
+
134
+ @p.configure(config_element)
135
+
136
+ assert !@p.plugin_id_configured?
137
+ assert @p.plugin_id
138
+ assert{ @p.plugin_id != 'mytest' }
139
+ end
140
+
141
+ test 'has plugin_id manually configured' do
142
+ @p.configure(config_element('ROOT', '', {'@id' => 'mytest'}))
143
+ assert @p.plugin_id_configured?
144
+ assert_equal 'mytest', @p.plugin_id
145
+ end
146
+
147
+ test 'has plugin logger' do
148
+ assert @p.respond_to?(:log)
149
+ assert @p.log
150
+
151
+ # default logger
152
+ original_logger = @p.log
153
+
154
+ @p.configure(config_element('ROOT', '', {'@log_level' => 'debug'}))
155
+
156
+ assert{ @p.log.object_id != original_logger.object_id }
157
+ assert_equal Fluent::Log::LEVEL_DEBUG, @p.log.level
158
+ end
159
+
160
+ test 'can load plugin helpers' do
161
+ assert_nothing_raised do
162
+ class FluentPluginFilterTest::DummyPlugin2 < Fluent::Plugin::Filter
163
+ helpers :storage
164
+ end
165
+ end
166
+ end
167
+
168
+ test 'filters events correctly' do
169
+ test_es = [
170
+ [event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
171
+ [event_time('2016-04-19 13:01:03 -0700'), {"num" => "2", "message" => "Hello filters!"}],
172
+ [event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
173
+ ]
174
+ @p.configure(config_element)
175
+ es = @p.filter_stream('testing', test_es)
176
+ assert es.is_a? Fluent::EventStream
177
+
178
+ ary = []
179
+ es.each do |time, r|
180
+ ary << [time, r]
181
+ end
182
+
183
+ assert_equal 3, ary.size
184
+
185
+ assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
186
+ assert_equal "Hello filters!", ary[0][1]["message"]
187
+ assert_equal 2, ary[0][1]["num"]
188
+
189
+ assert_equal event_time('2016-04-19 13:01:03 -0700'), ary[1][0]
190
+ assert_equal 4, ary[1][1]["num"]
191
+
192
+ assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[2][0]
193
+ assert_equal 6, ary[2][1]["num"]
194
+ end
195
+ end
196
+
197
+ sub_test_case 'filter plugin returns nil for some records' do
198
+ setup do
199
+ Fluent::Test.setup
200
+ @p = FluentPluginFilterTest::IgnoreForNumPlugin.new
201
+ end
202
+
203
+ test 'filter_stream ignores records which #filter return nil' do
204
+ test_es = [
205
+ [event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
206
+ [event_time('2016-04-19 13:01:03 -0700'), {"num" => 2, "message" => "Ignored, yay!"}],
207
+ [event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
208
+ ]
209
+ @p.configure(config_element)
210
+ es = @p.filter_stream('testing', test_es)
211
+ assert es.is_a? Fluent::EventStream
212
+
213
+ ary = []
214
+ es.each do |time, r|
215
+ ary << [time, r]
216
+ end
217
+
218
+ assert_equal 2, ary.size
219
+
220
+ assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
221
+ assert_equal "Hello filters!", ary[0][1]["message"]
222
+ assert_equal "1", ary[0][1]["num"]
223
+
224
+ assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[1][0]
225
+ assert_equal "3", ary[1][1]["num"]
226
+ end
227
+ end
228
+
229
+ sub_test_case 'filter plugin raises error' do
230
+ setup do
231
+ Fluent::Test.setup
232
+ @p = FluentPluginFilterTest::RaiseForNumPlugin.new
233
+ end
234
+
235
+ test 'has router and can emit events to error streams' do
236
+ assert @p.has_router?
237
+ @p.configure(config_element)
238
+ assert @p.router
239
+
240
+ @p.router = DummyRouter.new([])
241
+
242
+ test_es = [
243
+ [event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
244
+ [event_time('2016-04-19 13:01:03 -0700'), {"num" => 2, "message" => "Hello error router!"}],
245
+ [event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
246
+ ]
247
+ es = @p.filter_stream('testing', test_es)
248
+ assert es.is_a? Fluent::EventStream
249
+
250
+ ary = []
251
+ es.each do |time, r|
252
+ ary << [time, r]
253
+ end
254
+
255
+ assert_equal 2, ary.size
256
+
257
+ assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
258
+ assert_equal "Hello filters!", ary[0][1]["message"]
259
+ assert_equal "1", ary[0][1]["num"]
260
+
261
+ assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[1][0]
262
+ assert_equal "3", ary[1][1]["num"]
263
+
264
+ assert_equal 1, @p.router.emits.size
265
+
266
+ error_emits = @p.router.emits
267
+
268
+ assert_equal "testing", error_emits[0][0]
269
+ assert_equal event_time('2016-04-19 13:01:03 -0700'), error_emits[0][1]
270
+ assert_equal({"num" => 2, "message" => "Hello error router!"}, error_emits[0][2])
271
+ assert{ error_emits[0][3].is_a? RuntimeError }
272
+ assert_equal "Value of num is Number!", error_emits[0][3].message
273
+ end
274
+ end
275
+
276
+ sub_test_case 'filter plugins that is implmented `filter_with_time`' do
277
+ setup do
278
+ Fluent::Test.setup
279
+ @p = FluentPluginFilterTest::NumDoublePluginWithTime.new
280
+ end
281
+
282
+ test 'filters events correctly' do
283
+ test_es = [
284
+ [event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
285
+ [event_time('2016-04-19 13:01:03 -0700'), {"num" => "2", "message" => "Hello filters!"}],
286
+ [event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
287
+ ]
288
+ es = @p.filter_stream('testing', test_es)
289
+ assert es.is_a? Fluent::EventStream
290
+
291
+ ary = []
292
+ es.each do |time, r|
293
+ ary << [time, r]
294
+ end
295
+
296
+ assert_equal 3, ary.size
297
+
298
+ assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
299
+ assert_equal "Hello filters!", ary[0][1]["message"]
300
+ assert_equal 2, ary[0][1]["num"]
301
+
302
+ assert_equal event_time('2016-04-19 13:01:03 -0700'), ary[1][0]
303
+ assert_equal 4, ary[1][1]["num"]
304
+
305
+ assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[2][0]
306
+ assert_equal 6, ary[2][1]["num"]
307
+ end
308
+ end
309
+
310
+ sub_test_case 'filter plugin that is implmented `filter_with_time` and returns nil for some records' do
311
+ setup do
312
+ Fluent::Test.setup
313
+ @p = FluentPluginFilterTest::IgnoreForNumPluginWithTime.new
314
+ end
315
+
316
+ test 'filter_stream ignores records which #filter_with_time return nil' do
317
+ test_es = [
318
+ [event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
319
+ [event_time('2016-04-19 13:01:03 -0700'), {"num" => 2, "message" => "Ignored, yay!"}],
320
+ [event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
321
+ ]
322
+ @p.configure(config_element)
323
+ es = @p.filter_stream('testing', test_es)
324
+ assert es.is_a? Fluent::EventStream
325
+
326
+ ary = []
327
+ es.each do |time, r|
328
+ ary << [time, r]
329
+ end
330
+
331
+ assert_equal 2, ary.size
332
+
333
+ assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
334
+ assert_equal "Hello filters!", ary[0][1]["message"]
335
+ assert_equal "1", ary[0][1]["num"]
336
+
337
+ assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[1][0]
338
+ assert_equal "3", ary[1][1]["num"]
339
+ end
340
+ end
341
+
342
+ sub_test_case 'filter plugins that is implmented both `filter_with_time` and `filter`' do
343
+ setup do
344
+ Fluent::Test.setup
345
+ end
346
+
347
+ test 'raises DuplicatedImplementError' do
348
+ assert_raise do
349
+ FluentPluginFilterTest::InvalidPlugin.new
350
+ end
351
+ end
352
+ end
353
+ end