fluentd 0.12.40 → 1.6.2

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 (428) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab/cicd-template.yaml +10 -0
  8. data/.gitlab-ci.yml +147 -0
  9. data/.travis.yml +56 -20
  10. data/ADOPTERS.md +5 -0
  11. data/CHANGELOG.md +1369 -0
  12. data/CONTRIBUTING.md +16 -5
  13. data/GOVERNANCE.md +55 -0
  14. data/Gemfile +5 -0
  15. data/GithubWorkflow.md +78 -0
  16. data/LICENSE +202 -0
  17. data/MAINTAINERS.md +7 -0
  18. data/README.md +23 -11
  19. data/Rakefile +48 -2
  20. data/Vagrantfile +17 -0
  21. data/appveyor.yml +37 -0
  22. data/bin/fluent-binlog-reader +7 -0
  23. data/bin/fluent-ca-generate +6 -0
  24. data/bin/fluent-plugin-config-format +5 -0
  25. data/bin/fluent-plugin-generate +5 -0
  26. data/bin/fluentd +3 -0
  27. data/code-of-conduct.md +3 -0
  28. data/example/copy_roundrobin.conf +39 -0
  29. data/example/counter.conf +18 -0
  30. data/example/in_dummy_blocks.conf +17 -0
  31. data/example/in_dummy_with_compression.conf +23 -0
  32. data/example/in_forward.conf +7 -0
  33. data/example/in_forward_client.conf +37 -0
  34. data/example/in_forward_shared_key.conf +15 -0
  35. data/example/in_forward_tls.conf +14 -0
  36. data/example/in_forward_users.conf +24 -0
  37. data/example/in_forward_workers.conf +21 -0
  38. data/example/in_http.conf +3 -1
  39. data/example/in_out_forward.conf +17 -0
  40. data/example/logevents.conf +25 -0
  41. data/example/multi_filters.conf +61 -0
  42. data/example/out_exec_filter.conf +42 -0
  43. data/example/out_forward.conf +13 -13
  44. data/example/out_forward_buf_file.conf +23 -0
  45. data/example/out_forward_client.conf +109 -0
  46. data/example/out_forward_heartbeat_none.conf +16 -0
  47. data/example/out_forward_shared_key.conf +36 -0
  48. data/example/out_forward_tls.conf +18 -0
  49. data/example/out_forward_users.conf +65 -0
  50. data/example/out_null.conf +36 -0
  51. data/example/secondary_file.conf +42 -0
  52. data/example/suppress_config_dump.conf +7 -0
  53. data/example/worker_section.conf +36 -0
  54. data/fluent.conf +29 -0
  55. data/fluentd.gemspec +21 -11
  56. data/lib/fluent/agent.rb +67 -90
  57. data/lib/fluent/clock.rb +62 -0
  58. data/lib/fluent/command/binlog_reader.rb +244 -0
  59. data/lib/fluent/command/ca_generate.rb +181 -0
  60. data/lib/fluent/command/cat.rb +42 -18
  61. data/lib/fluent/command/debug.rb +12 -10
  62. data/lib/fluent/command/fluentd.rb +153 -5
  63. data/lib/fluent/command/plugin_config_formatter.rb +292 -0
  64. data/lib/fluent/command/plugin_generator.rb +324 -0
  65. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  66. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  67. data/lib/fluent/compat/exec_util.rb +129 -0
  68. data/lib/fluent/compat/file_util.rb +54 -0
  69. data/lib/fluent/compat/filter.rb +68 -0
  70. data/lib/fluent/compat/formatter.rb +111 -0
  71. data/lib/fluent/compat/formatter_utils.rb +85 -0
  72. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  73. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  74. data/lib/fluent/compat/input.rb +49 -0
  75. data/lib/fluent/compat/output.rb +718 -0
  76. data/lib/fluent/compat/output_chain.rb +60 -0
  77. data/lib/fluent/compat/parser.rb +310 -0
  78. data/lib/fluent/compat/parser_utils.rb +40 -0
  79. data/lib/fluent/compat/propagate_default.rb +62 -0
  80. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  81. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  82. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  83. data/lib/fluent/compat/socket_util.rb +165 -0
  84. data/lib/fluent/compat/string_util.rb +34 -0
  85. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  86. data/lib/fluent/compat/type_converter.rb +90 -0
  87. data/lib/fluent/config/configure_proxy.rb +210 -62
  88. data/lib/fluent/config/dsl.rb +12 -5
  89. data/lib/fluent/config/element.rb +107 -9
  90. data/lib/fluent/config/literal_parser.rb +9 -3
  91. data/lib/fluent/config/parser.rb +4 -4
  92. data/lib/fluent/config/section.rb +51 -14
  93. data/lib/fluent/config/types.rb +28 -13
  94. data/lib/fluent/config/v1_parser.rb +3 -5
  95. data/lib/fluent/config.rb +23 -20
  96. data/lib/fluent/configurable.rb +79 -21
  97. data/lib/fluent/counter/base_socket.rb +46 -0
  98. data/lib/fluent/counter/client.rb +297 -0
  99. data/lib/fluent/counter/error.rb +86 -0
  100. data/lib/fluent/counter/mutex_hash.rb +163 -0
  101. data/lib/fluent/counter/server.rb +273 -0
  102. data/lib/fluent/counter/store.rb +205 -0
  103. data/lib/fluent/counter/validator.rb +145 -0
  104. data/lib/fluent/counter.rb +23 -0
  105. data/lib/fluent/daemon.rb +15 -0
  106. data/lib/fluent/engine.rb +102 -65
  107. data/lib/fluent/env.rb +7 -3
  108. data/lib/fluent/error.rb +30 -0
  109. data/lib/fluent/event.rb +197 -21
  110. data/lib/fluent/event_router.rb +93 -10
  111. data/lib/fluent/filter.rb +2 -50
  112. data/lib/fluent/formatter.rb +4 -293
  113. data/lib/fluent/input.rb +2 -32
  114. data/lib/fluent/label.rb +10 -2
  115. data/lib/fluent/load.rb +3 -3
  116. data/lib/fluent/log.rb +348 -81
  117. data/lib/fluent/match.rb +37 -36
  118. data/lib/fluent/mixin.rb +12 -176
  119. data/lib/fluent/msgpack_factory.rb +62 -0
  120. data/lib/fluent/output.rb +10 -612
  121. data/lib/fluent/output_chain.rb +23 -0
  122. data/lib/fluent/parser.rb +4 -800
  123. data/lib/fluent/plugin/bare_output.rb +63 -0
  124. data/lib/fluent/plugin/base.rb +192 -0
  125. data/lib/fluent/plugin/buf_file.rb +128 -174
  126. data/lib/fluent/plugin/buf_memory.rb +9 -92
  127. data/lib/fluent/plugin/buffer/chunk.rb +221 -0
  128. data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
  129. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  130. data/lib/fluent/plugin/buffer.rb +779 -0
  131. data/lib/fluent/plugin/compressable.rb +92 -0
  132. data/lib/fluent/plugin/exec_util.rb +3 -108
  133. data/lib/fluent/plugin/file_util.rb +4 -34
  134. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  135. data/lib/fluent/plugin/filter.rb +93 -0
  136. data/lib/fluent/plugin/filter_grep.rb +117 -34
  137. data/lib/fluent/plugin/filter_parser.rb +85 -62
  138. data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
  139. data/lib/fluent/plugin/filter_stdout.rb +15 -12
  140. data/lib/fluent/plugin/formatter.rb +50 -0
  141. data/lib/fluent/plugin/formatter_csv.rb +52 -0
  142. data/lib/fluent/plugin/formatter_hash.rb +33 -0
  143. data/lib/fluent/plugin/formatter_json.rb +55 -0
  144. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  145. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  146. data/lib/fluent/plugin/formatter_out_file.rb +51 -0
  147. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  148. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  149. data/lib/fluent/plugin/formatter_tsv.rb +38 -0
  150. data/lib/fluent/plugin/in_debug_agent.rb +17 -6
  151. data/lib/fluent/plugin/in_dummy.rb +47 -20
  152. data/lib/fluent/plugin/in_exec.rb +55 -123
  153. data/lib/fluent/plugin/in_forward.rb +299 -216
  154. data/lib/fluent/plugin/in_gc_stat.rb +14 -36
  155. data/lib/fluent/plugin/in_http.rb +204 -91
  156. data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
  157. data/lib/fluent/plugin/in_object_space.rb +13 -41
  158. data/lib/fluent/plugin/in_syslog.rb +112 -134
  159. data/lib/fluent/plugin/in_tail.rb +408 -745
  160. data/lib/fluent/plugin/in_tcp.rb +66 -9
  161. data/lib/fluent/plugin/in_udp.rb +60 -11
  162. data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
  163. data/lib/fluent/plugin/input.rb +37 -0
  164. data/lib/fluent/plugin/multi_output.rb +158 -0
  165. data/lib/fluent/plugin/out_copy.rb +23 -35
  166. data/lib/fluent/plugin/out_exec.rb +67 -70
  167. data/lib/fluent/plugin/out_exec_filter.rb +204 -271
  168. data/lib/fluent/plugin/out_file.rb +267 -73
  169. data/lib/fluent/plugin/out_forward.rb +854 -325
  170. data/lib/fluent/plugin/out_null.rb +42 -9
  171. data/lib/fluent/plugin/out_relabel.rb +9 -5
  172. data/lib/fluent/plugin/out_roundrobin.rb +18 -37
  173. data/lib/fluent/plugin/out_secondary_file.rb +133 -0
  174. data/lib/fluent/plugin/out_stdout.rb +43 -10
  175. data/lib/fluent/plugin/out_stream.rb +7 -2
  176. data/lib/fluent/plugin/output.rb +1498 -0
  177. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  178. data/lib/fluent/plugin/parser.rb +191 -0
  179. data/lib/fluent/plugin/parser_apache.rb +28 -0
  180. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  181. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  182. data/lib/fluent/plugin/parser_csv.rb +39 -0
  183. data/lib/fluent/plugin/parser_json.rb +94 -0
  184. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  185. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  186. data/lib/fluent/plugin/parser_multiline.rb +106 -0
  187. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  188. data/lib/fluent/plugin/parser_none.rb +36 -0
  189. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  190. data/lib/fluent/plugin/parser_syslog.rb +142 -0
  191. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  192. data/lib/fluent/plugin/socket_util.rb +3 -143
  193. data/lib/fluent/plugin/storage.rb +84 -0
  194. data/lib/fluent/plugin/storage_local.rb +164 -0
  195. data/lib/fluent/plugin/string_util.rb +3 -15
  196. data/lib/fluent/plugin.rb +122 -121
  197. data/lib/fluent/plugin_helper/cert_option.rb +178 -0
  198. data/lib/fluent/plugin_helper/child_process.rb +364 -0
  199. data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
  200. data/lib/fluent/plugin_helper/counter.rb +51 -0
  201. data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
  202. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  203. data/lib/fluent/plugin_helper/extract.rb +104 -0
  204. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  205. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  206. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  207. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  208. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  209. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  210. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  211. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  212. data/lib/fluent/plugin_helper/http_server.rb +76 -0
  213. data/lib/fluent/plugin_helper/inject.rb +151 -0
  214. data/lib/fluent/plugin_helper/parser.rb +147 -0
  215. data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
  216. data/lib/fluent/plugin_helper/retry_state.rb +205 -0
  217. data/lib/fluent/plugin_helper/server.rb +807 -0
  218. data/lib/fluent/plugin_helper/socket.rb +250 -0
  219. data/lib/fluent/plugin_helper/socket_option.rb +80 -0
  220. data/lib/fluent/plugin_helper/storage.rb +349 -0
  221. data/lib/fluent/plugin_helper/thread.rb +179 -0
  222. data/lib/fluent/plugin_helper/timer.rb +92 -0
  223. data/lib/fluent/plugin_helper.rb +73 -0
  224. data/lib/fluent/plugin_id.rb +80 -0
  225. data/lib/fluent/process.rb +3 -489
  226. data/lib/fluent/registry.rb +52 -10
  227. data/lib/fluent/root_agent.rb +204 -42
  228. data/lib/fluent/supervisor.rb +597 -359
  229. data/lib/fluent/system_config.rb +131 -42
  230. data/lib/fluent/test/base.rb +6 -54
  231. data/lib/fluent/test/driver/base.rb +224 -0
  232. data/lib/fluent/test/driver/base_owned.rb +70 -0
  233. data/lib/fluent/test/driver/base_owner.rb +135 -0
  234. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  235. data/lib/fluent/test/driver/filter.rb +57 -0
  236. data/lib/fluent/test/driver/formatter.rb +30 -0
  237. data/lib/fluent/test/driver/input.rb +31 -0
  238. data/lib/fluent/test/driver/multi_output.rb +53 -0
  239. data/lib/fluent/test/driver/output.rb +102 -0
  240. data/lib/fluent/test/driver/parser.rb +30 -0
  241. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  242. data/lib/fluent/test/filter_test.rb +0 -1
  243. data/lib/fluent/test/formatter_test.rb +4 -1
  244. data/lib/fluent/test/helpers.rb +58 -10
  245. data/lib/fluent/test/input_test.rb +27 -19
  246. data/lib/fluent/test/log.rb +79 -0
  247. data/lib/fluent/test/output_test.rb +28 -39
  248. data/lib/fluent/test/parser_test.rb +3 -1
  249. data/lib/fluent/test/startup_shutdown.rb +46 -0
  250. data/lib/fluent/test.rb +33 -1
  251. data/lib/fluent/time.rb +450 -1
  252. data/lib/fluent/timezone.rb +27 -3
  253. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  254. data/lib/fluent/version.rb +1 -1
  255. data/lib/fluent/winsvc.rb +85 -0
  256. data/templates/new_gem/Gemfile +3 -0
  257. data/templates/new_gem/README.md.erb +43 -0
  258. data/templates/new_gem/Rakefile +13 -0
  259. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  260. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  261. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  262. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  263. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  264. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  265. data/templates/new_gem/test/helper.rb.erb +8 -0
  266. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  267. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  268. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  269. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  270. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  271. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  272. data/templates/plugin_config_formatter/param.md.erb +34 -0
  273. data/templates/plugin_config_formatter/section.md.erb +12 -0
  274. data/test/command/test_binlog_reader.rb +346 -0
  275. data/test/command/test_ca_generate.rb +70 -0
  276. data/test/command/test_fluentd.rb +901 -0
  277. data/test/command/test_plugin_config_formatter.rb +276 -0
  278. data/test/command/test_plugin_generator.rb +92 -0
  279. data/test/compat/test_calls_super.rb +166 -0
  280. data/test/compat/test_parser.rb +92 -0
  281. data/test/config/test_config_parser.rb +126 -2
  282. data/test/config/test_configurable.rb +946 -187
  283. data/test/config/test_configure_proxy.rb +424 -74
  284. data/test/config/test_dsl.rb +11 -11
  285. data/test/config/test_element.rb +500 -0
  286. data/test/config/test_literal_parser.rb +8 -0
  287. data/test/config/test_plugin_configuration.rb +56 -0
  288. data/test/config/test_section.rb +79 -7
  289. data/test/config/test_system_config.rb +122 -35
  290. data/test/config/test_types.rb +38 -0
  291. data/test/counter/test_client.rb +559 -0
  292. data/test/counter/test_error.rb +44 -0
  293. data/test/counter/test_mutex_hash.rb +179 -0
  294. data/test/counter/test_server.rb +589 -0
  295. data/test/counter/test_store.rb +258 -0
  296. data/test/counter/test_validator.rb +137 -0
  297. data/test/helper.rb +89 -6
  298. data/test/helpers/fuzzy_assert.rb +89 -0
  299. data/test/plugin/test_bare_output.rb +118 -0
  300. data/test/plugin/test_base.rb +115 -0
  301. data/test/plugin/test_buf_file.rb +823 -460
  302. data/test/plugin/test_buf_memory.rb +32 -194
  303. data/test/plugin/test_buffer.rb +1233 -0
  304. data/test/plugin/test_buffer_chunk.rb +198 -0
  305. data/test/plugin/test_buffer_file_chunk.rb +844 -0
  306. data/test/plugin/test_buffer_memory_chunk.rb +338 -0
  307. data/test/plugin/test_compressable.rb +84 -0
  308. data/test/plugin/test_filter.rb +357 -0
  309. data/test/plugin/test_filter_grep.rb +540 -29
  310. data/test/plugin/test_filter_parser.rb +439 -452
  311. data/test/plugin/test_filter_record_transformer.rb +123 -166
  312. data/test/plugin/test_filter_stdout.rb +160 -72
  313. data/test/plugin/test_formatter_csv.rb +111 -0
  314. data/test/plugin/test_formatter_hash.rb +35 -0
  315. data/test/plugin/test_formatter_json.rb +51 -0
  316. data/test/plugin/test_formatter_ltsv.rb +62 -0
  317. data/test/plugin/test_formatter_msgpack.rb +28 -0
  318. data/test/plugin/test_formatter_out_file.rb +95 -0
  319. data/test/plugin/test_formatter_single_value.rb +38 -0
  320. data/test/plugin/test_formatter_tsv.rb +68 -0
  321. data/test/plugin/test_in_debug_agent.rb +24 -1
  322. data/test/plugin/test_in_dummy.rb +111 -18
  323. data/test/plugin/test_in_exec.rb +200 -113
  324. data/test/plugin/test_in_forward.rb +990 -387
  325. data/test/plugin/test_in_gc_stat.rb +10 -8
  326. data/test/plugin/test_in_http.rb +600 -224
  327. data/test/plugin/test_in_monitor_agent.rb +690 -0
  328. data/test/plugin/test_in_object_space.rb +24 -8
  329. data/test/plugin/test_in_syslog.rb +154 -215
  330. data/test/plugin/test_in_tail.rb +1006 -707
  331. data/test/plugin/test_in_tcp.rb +125 -48
  332. data/test/plugin/test_in_udp.rb +204 -63
  333. data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
  334. data/test/plugin/test_input.rb +126 -0
  335. data/test/plugin/test_metadata.rb +89 -0
  336. data/test/plugin/test_multi_output.rb +180 -0
  337. data/test/plugin/test_out_copy.rb +117 -112
  338. data/test/plugin/test_out_exec.rb +258 -53
  339. data/test/plugin/test_out_exec_filter.rb +538 -115
  340. data/test/plugin/test_out_file.rb +865 -178
  341. data/test/plugin/test_out_forward.rb +998 -210
  342. data/test/plugin/test_out_null.rb +105 -0
  343. data/test/plugin/test_out_relabel.rb +28 -0
  344. data/test/plugin/test_out_roundrobin.rb +36 -29
  345. data/test/plugin/test_out_secondary_file.rb +458 -0
  346. data/test/plugin/test_out_stdout.rb +135 -37
  347. data/test/plugin/test_out_stream.rb +18 -0
  348. data/test/plugin/test_output.rb +984 -0
  349. data/test/plugin/test_output_as_buffered.rb +2021 -0
  350. data/test/plugin/test_output_as_buffered_backup.rb +312 -0
  351. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  352. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  353. data/test/plugin/test_output_as_buffered_retries.rb +911 -0
  354. data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
  355. data/test/plugin/test_output_as_standard.rb +374 -0
  356. data/test/plugin/test_owned_by.rb +35 -0
  357. data/test/plugin/test_parser.rb +359 -0
  358. data/test/plugin/test_parser_apache.rb +42 -0
  359. data/test/plugin/test_parser_apache2.rb +47 -0
  360. data/test/plugin/test_parser_apache_error.rb +45 -0
  361. data/test/plugin/test_parser_csv.rb +103 -0
  362. data/test/plugin/test_parser_json.rb +138 -0
  363. data/test/plugin/test_parser_labeled_tsv.rb +145 -0
  364. data/test/plugin/test_parser_multiline.rb +100 -0
  365. data/test/plugin/test_parser_nginx.rb +88 -0
  366. data/test/plugin/test_parser_none.rb +52 -0
  367. data/test/plugin/test_parser_regexp.rb +289 -0
  368. data/test/plugin/test_parser_syslog.rb +441 -0
  369. data/test/plugin/test_parser_tsv.rb +122 -0
  370. data/test/plugin/test_storage.rb +167 -0
  371. data/test/plugin/test_storage_local.rb +335 -0
  372. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  373. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  374. data/test/plugin_helper/data/cert/cert.pem +19 -0
  375. data/test/plugin_helper/http_server/test_app.rb +65 -0
  376. data/test/plugin_helper/http_server/test_route.rb +32 -0
  377. data/test/plugin_helper/test_cert_option.rb +16 -0
  378. data/test/plugin_helper/test_child_process.rb +794 -0
  379. data/test/plugin_helper/test_compat_parameters.rb +353 -0
  380. data/test/plugin_helper/test_event_emitter.rb +51 -0
  381. data/test/plugin_helper/test_event_loop.rb +52 -0
  382. data/test/plugin_helper/test_extract.rb +194 -0
  383. data/test/plugin_helper/test_formatter.rb +255 -0
  384. data/test/plugin_helper/test_http_server_helper.rb +205 -0
  385. data/test/plugin_helper/test_inject.rb +519 -0
  386. data/test/plugin_helper/test_parser.rb +264 -0
  387. data/test/plugin_helper/test_record_accessor.rb +197 -0
  388. data/test/plugin_helper/test_retry_state.rb +442 -0
  389. data/test/plugin_helper/test_server.rb +1714 -0
  390. data/test/plugin_helper/test_storage.rb +542 -0
  391. data/test/plugin_helper/test_thread.rb +164 -0
  392. data/test/plugin_helper/test_timer.rb +132 -0
  393. data/test/scripts/exec_script.rb +0 -6
  394. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  395. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  396. data/test/scripts/fluent/plugin/out_test.rb +23 -15
  397. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  398. data/test/test_clock.rb +164 -0
  399. data/test/test_config.rb +16 -7
  400. data/test/test_configdsl.rb +2 -2
  401. data/test/test_event.rb +360 -13
  402. data/test/test_event_router.rb +108 -11
  403. data/test/test_event_time.rb +199 -0
  404. data/test/test_filter.rb +48 -6
  405. data/test/test_formatter.rb +11 -391
  406. data/test/test_input.rb +1 -1
  407. data/test/test_log.rb +591 -31
  408. data/test/test_mixin.rb +1 -1
  409. data/test/test_output.rb +121 -185
  410. data/test/test_plugin.rb +251 -0
  411. data/test/test_plugin_classes.rb +177 -10
  412. data/test/test_plugin_helper.rb +81 -0
  413. data/test/test_plugin_id.rb +101 -0
  414. data/test/test_process.rb +8 -42
  415. data/test/test_root_agent.rb +766 -21
  416. data/test/test_supervisor.rb +481 -0
  417. data/test/test_test_drivers.rb +135 -0
  418. data/test/test_time_formatter.rb +282 -0
  419. data/test/test_time_parser.rb +231 -0
  420. data/test/test_unique_id.rb +47 -0
  421. metadata +454 -60
  422. data/COPYING +0 -14
  423. data/ChangeLog +0 -666
  424. data/lib/fluent/buffer.rb +0 -365
  425. data/lib/fluent/plugin/in_status.rb +0 -76
  426. data/test/plugin/test_in_status.rb +0 -38
  427. data/test/test_buffer.rb +0 -624
  428. data/test/test_parser.rb +0 -1305
@@ -0,0 +1,542 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/storage'
3
+ require 'fluent/plugin/base'
4
+
5
+ class ExampleStorage < Fluent::Plugin::Storage
6
+ Fluent::Plugin.register_storage('example', self)
7
+
8
+ attr_reader :data, :saved, :load_times, :save_times
9
+
10
+ def initialize
11
+ super
12
+ @data = {}
13
+ @saved = {}
14
+ @load_times = 0
15
+ @save_times = 0
16
+ end
17
+ def load
18
+ @data ||= {}
19
+ @load_times += 1
20
+ end
21
+ def save
22
+ @saved = @data.dup
23
+ @save_times += 1
24
+ end
25
+ def get(key)
26
+ @data[key]
27
+ end
28
+ def fetch(key, defval)
29
+ @data.fetch(key, defval)
30
+ end
31
+ def put(key, value)
32
+ @data[key] = value
33
+ end
34
+ def delete(key)
35
+ @data.delete(key)
36
+ end
37
+ def update(key, &block)
38
+ @data[key] = block.call(@data[key])
39
+ end
40
+ def close
41
+ @data = {}
42
+ super
43
+ end
44
+ def terminate
45
+ @saved = {}
46
+ @load_times = @save_times = 0
47
+ super
48
+ end
49
+ end
50
+
51
+ class Example2Storage < ExampleStorage
52
+ Fluent::Plugin.register_storage('ex2', self)
53
+ config_param :dummy_path, :string, default: 'dummy'
54
+ end
55
+ class Example3Storage < ExampleStorage
56
+ Fluent::Plugin.register_storage('ex3', self)
57
+ def synchronized?
58
+ true
59
+ end
60
+ end
61
+ class Example4Storage < ExampleStorage
62
+ Fluent::Plugin.register_storage('ex4', self)
63
+ def persistent_always?
64
+ true
65
+ end
66
+ def synchronized?
67
+ true
68
+ end
69
+ end
70
+
71
+ class StorageHelperTest < Test::Unit::TestCase
72
+ class Dummy < Fluent::Plugin::TestBase
73
+ helpers :storage
74
+ end
75
+
76
+ class Dummy2 < Fluent::Plugin::TestBase
77
+ helpers :storage
78
+ config_section :storage do
79
+ config_set_default :@type, 'ex2'
80
+ config_set_default :dummy_path, '/tmp/yay'
81
+ end
82
+ end
83
+
84
+ setup do
85
+ @d = nil
86
+ end
87
+
88
+ teardown do
89
+ if @d
90
+ @d.stop unless @d.stopped?
91
+ @d.shutdown unless @d.shutdown?
92
+ @d.close unless @d.closed?
93
+ @d.terminate unless @d.terminated?
94
+ end
95
+ end
96
+
97
+ test 'can be initialized without any storages at first' do
98
+ d = Dummy.new
99
+ assert_equal 0, d._storages.size
100
+ end
101
+
102
+ test 'can be configured with hash' do
103
+ d = Dummy.new
104
+ d.configure(config_element())
105
+ conf = { '@type' => 'example' }
106
+ assert_nothing_raised do
107
+ d.storage_create(conf: conf)
108
+ end
109
+ end
110
+
111
+ test 'can override default configuration parameters, but not overwrite whole definition' do
112
+ d = Dummy.new
113
+ d.configure(config_element())
114
+ assert_equal 1, d.storage_configs.size
115
+ assert_equal 'local', d.storage_configs.first[:@type]
116
+
117
+ d = Dummy2.new
118
+ d.configure(config_element('ROOT', '', {}, [config_element('storage', '', {}, [])]))
119
+ assert_raise NoMethodError do
120
+ d.storage
121
+ end
122
+ assert_equal 1, d.storage_configs.size
123
+ assert_equal 'ex2', d.storage_configs.first[:@type]
124
+ assert_equal '/tmp/yay', d.storage_configs.first.dummy_path
125
+ end
126
+
127
+ test 'creates instance of type specified by conf, or default_type if @type is missing in conf' do
128
+ d = Dummy2.new
129
+ d.configure(config_element())
130
+ i = d.storage_create(conf: config_element('format', '', {'@type' => 'example'}), default_type: 'ex2')
131
+ assert{ i.is_a?(Fluent::PluginHelper::Storage::SynchronizeWrapper) && i.instance_eval{ @storage }.is_a?(ExampleStorage) }
132
+
133
+ d = Dummy2.new
134
+ d.configure(config_element())
135
+ i = d.storage_create(conf: nil, default_type: 'ex2')
136
+ assert{ i.is_a?(Fluent::PluginHelper::Storage::SynchronizeWrapper) && i.instance_eval{ @storage }.is_a?(Example2Storage) }
137
+ end
138
+
139
+ test 'raises config error if config section is specified, but @type is not specified' do
140
+ d = Dummy2.new
141
+ d.configure(config_element())
142
+ assert_raise Fluent::ConfigError.new("@type is required in <storage>") do
143
+ d.storage_create(conf: config_element('storage', 'foo', {}), default_type: 'ex2')
144
+ end
145
+ end
146
+
147
+ test 'raises config error if config argument has invalid characters' do
148
+ d = Dummy.new
149
+ assert_raise Fluent::ConfigError.new("Argument in <storage ARG> uses invalid characters: 'yaa y'") do
150
+ d.configure(config_element('root', '', {}, [config_element('storage', 'yaa y', {'@type' => 'local'})]))
151
+ end
152
+ d.configure(config_element())
153
+ assert_raise Fluent::ConfigError.new("Argument in <storage ARG> uses invalid characters: 'a,b'") do
154
+ d.storage_create(usage: 'a,b', type: 'local')
155
+ end
156
+ end
157
+
158
+ test 'can be configured without storage sections' do
159
+ d = Dummy.new
160
+ assert_nothing_raised do
161
+ d.configure(config_element())
162
+ end
163
+ assert_equal 1, d._storages.size
164
+ end
165
+
166
+ test 'can be configured with a storage section' do
167
+ d = Dummy.new
168
+ conf = config_element('ROOT', '', {}, [
169
+ config_element('storage', '', {'@type' => 'example'})
170
+ ])
171
+ assert_nothing_raised do
172
+ d.configure(conf)
173
+ end
174
+ assert_equal 1, d._storages.size
175
+ assert{ d._storages.values.all?{ |s| !s.running } }
176
+ end
177
+
178
+ test 'can be configured with 2 or more storage sections with different usages with each other' do
179
+ d = Dummy.new
180
+ conf = config_element('ROOT', '', {}, [
181
+ config_element('storage', 'default', {'@type' => 'example'}),
182
+ config_element('storage', 'extra', {'@type' => 'ex2', 'dummy_path' => 'v'}),
183
+ ])
184
+ assert_nothing_raised do
185
+ d.configure(conf)
186
+ end
187
+ assert_equal 2, d._storages.size
188
+ assert{ d._storages.values.all?{ |s| !s.running } }
189
+ end
190
+
191
+ test 'cannot be configured with 2 storage sections with same usage' do
192
+ d = Dummy.new
193
+ conf = config_element('ROOT', '', {}, [
194
+ config_element('storage', 'default', {'@type' => 'example'}),
195
+ config_element('storage', 'extra', {'@type' => 'ex2', 'dummy_path' => 'v'}),
196
+ config_element('storage', 'extra', {'@type' => 'ex2', 'dummy_path' => 'v2'}),
197
+ ])
198
+ assert_raises Fluent::ConfigError do
199
+ d.configure(conf)
200
+ end
201
+ end
202
+
203
+ test 'creates a storage plugin instance which is already configured without usage' do
204
+ @d = d = Dummy.new
205
+ conf = config_element('ROOT', '', {}, [
206
+ config_element('storage', '', {'@type' => 'example'})
207
+ ])
208
+ d.configure(conf)
209
+ d.start
210
+
211
+ s = d.storage_create
212
+ assert{ s.implementation.is_a? ExampleStorage }
213
+ end
214
+
215
+ test 'creates a storage plugin instance which is already configured with usage' do
216
+ @d = d = Dummy.new
217
+ conf = config_element('ROOT', '', {}, [
218
+ config_element('storage', 'mydata', {'@type' => 'example'})
219
+ ])
220
+ d.configure(conf)
221
+ d.start
222
+
223
+ s = d.storage_create(usage: 'mydata')
224
+ assert{ s.implementation.is_a? ExampleStorage }
225
+ end
226
+
227
+ test 'creates a storage plugin without configurations' do
228
+ @d = d = Dummy.new
229
+ d.configure(config_element())
230
+ d.start
231
+
232
+ s = d.storage_create(usage: 'mydata', type: 'example', conf: config_element('storage', 'mydata'))
233
+ assert{ s.implementation.is_a? ExampleStorage }
234
+ end
235
+
236
+ test 'creates 2 or more storage plugin instances' do
237
+ @d = d = Dummy.new
238
+ conf = config_element('ROOT', '', {}, [
239
+ config_element('storage', 'mydata', {'@type' => 'example'}),
240
+ config_element('storage', 'secret', {'@type' => 'ex2', 'dummy_path' => 'yay!'}),
241
+ ])
242
+ d.configure(conf)
243
+ d.start
244
+
245
+ s1 = d.storage_create(usage: 'mydata')
246
+ s2 = d.storage_create(usage: 'secret')
247
+ assert{ s1.implementation.is_a? ExampleStorage }
248
+ assert{ s2.implementation.is_a? Example2Storage }
249
+ assert_equal 'yay!', s2.implementation.dummy_path
250
+ end
251
+
252
+ test 'creates wrapped instances for non-synchronized plugin in default' do # and check operations
253
+ @d = d = Dummy.new
254
+ conf = config_element('ROOT', '', {}, [
255
+ config_element('storage', 'mydata', {'@type' => 'example'})
256
+ ])
257
+ d.configure(conf)
258
+ d.start
259
+
260
+ s = d.storage_create(usage: 'mydata')
261
+ assert !s.implementation.synchronized?
262
+ assert{ s.is_a? Fluent::PluginHelper::Storage::SynchronizeWrapper }
263
+ assert s.synchronized?
264
+ assert s.autosave
265
+ assert s.save_at_shutdown
266
+
267
+ assert_nil s.get('key')
268
+ assert_equal 'value', s.put('key', 'value')
269
+ assert_equal 'value', s.fetch('key', 'v1')
270
+ assert_equal 'v2', s.update('key'){|v| v[0] + '2' }
271
+ assert_equal 'v2', s.get('key')
272
+ assert_equal 'v2', s.delete('key')
273
+ end
274
+
275
+ test 'creates wrapped instances for non-persistent plugins when configured as persistent' do # and check operations
276
+ @d = d = Dummy.new
277
+ conf = config_element('ROOT', '', {}, [
278
+ config_element('storage', 'mydata', {'@type' => 'example', 'persistent' => 'true'})
279
+ ])
280
+ d.configure(conf)
281
+ d.start
282
+
283
+ s = d.storage_create(usage: 'mydata')
284
+ assert !s.implementation.persistent_always?
285
+ assert{ s.is_a? Fluent::PluginHelper::Storage::PersistentWrapper }
286
+ assert s.persistent
287
+ assert s.persistent_always?
288
+ assert s.synchronized?
289
+ assert !s.autosave
290
+ assert s.save_at_shutdown
291
+
292
+ assert_nil s.get('key')
293
+ assert_equal 'value', s.put('key', 'value')
294
+ assert_equal 'value', s.fetch('key', 'v1')
295
+ assert_equal 'v2', s.update('key'){|v| v[0] + '2' }
296
+ assert_equal 'v2', s.get('key')
297
+ assert_equal 'v2', s.delete('key')
298
+ end
299
+
300
+ test 'creates bare instances for synchronized plugin in default' do
301
+ @d = d = Dummy.new
302
+ conf = config_element('ROOT', '', {}, [
303
+ config_element('storage', 'mydata', {'@type' => 'ex3'})
304
+ ])
305
+ d.configure(conf)
306
+ d.start
307
+
308
+ s = d.storage_create(usage: 'mydata')
309
+ assert s.implementation.synchronized?
310
+ assert{ s.is_a? Example3Storage }
311
+ assert s.synchronized?
312
+ end
313
+
314
+ test 'creates bare instances for persistent-always plugin when configured as persistent' do
315
+ @d = d = Dummy.new
316
+ conf = config_element('ROOT', '', {}, [
317
+ config_element('storage', 'mydata', {'@type' => 'ex4', 'persistent' => 'true'})
318
+ ])
319
+ d.configure(conf)
320
+ d.start
321
+
322
+ s = d.storage_create(usage: 'mydata')
323
+ assert s.implementation.persistent_always?
324
+ assert{ s.is_a? Example4Storage }
325
+ assert s.persistent
326
+ assert s.persistent_always?
327
+ assert s.synchronized?
328
+ end
329
+
330
+ test 'does not execute timer if autosave is not specified' do
331
+ @d = d = Dummy.new
332
+ conf = config_element('ROOT', '', {}, [
333
+ config_element('storage', 'mydata', {'@type' => 'example', 'autosave' => 'false'})
334
+ ])
335
+ d.configure(conf)
336
+ d.start
337
+
338
+ d.storage_create(usage: 'mydata')
339
+ assert_equal 0, d._timers.size
340
+ end
341
+
342
+ test 'executes timer if autosave is specified and plugin is not persistent' do
343
+ @d = d = Dummy.new
344
+ conf = config_element('ROOT', '', {}, [
345
+ config_element('storage', 'mydata', {'@type' => 'example', 'autosave_interval' => '1s', 'persistent' => 'false'})
346
+ ])
347
+ d.configure(conf)
348
+ d.start
349
+
350
+ d.storage_create(usage: 'mydata')
351
+ assert_equal 1, d._timers.size
352
+ end
353
+
354
+ test 'executes timer for autosave, which calls #save periodically' do
355
+ @d = d = Dummy.new
356
+ conf = config_element('ROOT', '', {}, [
357
+ config_element('storage', 'mydata', {'@type' => 'example', 'autosave_interval' => '1s', 'persistent' => 'false'})
358
+ ])
359
+ d.configure(conf)
360
+ d.start
361
+
362
+ s = d.storage_create(usage: 'mydata')
363
+ assert_equal 1, d._timers.size
364
+ timeout = Time.now + 3
365
+ while Time.now < timeout
366
+ s.put('k', 'v')
367
+ sleep 0.2
368
+ end
369
+
370
+ d.stop
371
+ assert{ s.implementation.save_times > 0 }
372
+ end
373
+
374
+ test 'saves data for each operations if plugin storage is configured as persistent, and wrapped' do
375
+ @d = d = Dummy.new
376
+ conf = config_element('ROOT', '', {}, [
377
+ config_element('storage', 'mydata', {'@type' => 'example', 'persistent' => 'true'})
378
+ ])
379
+ d.configure(conf)
380
+ d.start
381
+ s = d.storage_create(usage: 'mydata')
382
+ assert_equal 1, s.implementation.load_times
383
+ assert_equal 0, s.implementation.save_times
384
+
385
+ s.get('k1')
386
+ assert_equal 2, s.implementation.load_times
387
+ assert_equal 0, s.implementation.save_times
388
+
389
+ s.put('k1', 'v1')
390
+ assert_equal 3, s.implementation.load_times
391
+ assert_equal 1, s.implementation.save_times
392
+
393
+ s.fetch('k2', 'v2')
394
+ assert_equal 4, s.implementation.load_times
395
+ assert_equal 1, s.implementation.save_times
396
+
397
+ s.delete('k1')
398
+ assert_equal 5, s.implementation.load_times
399
+ assert_equal 2, s.implementation.save_times
400
+ end
401
+
402
+ test 'stops timer for autosave by #stop, calls #save by #shutdown if save_at_shutdown is specified' do
403
+ @d = d = Dummy.new
404
+ conf = config_element('ROOT', '', {}, [
405
+ config_element('storage', 'mydata', {'@type' => 'example', 'save_at_shutdown' => 'true'})
406
+ ])
407
+ d.configure(conf)
408
+
409
+ assert !d.timer_running?
410
+
411
+ d.start
412
+
413
+ assert d.timer_running?
414
+
415
+ s = d.storage_create(usage: 'mydata')
416
+ assert s.autosave
417
+ assert_equal 1, d._timers.size
418
+
419
+ d.stop
420
+
421
+ assert !d.timer_running?
422
+
423
+ assert_equal 1, s.implementation.load_times
424
+ assert_equal 0, s.implementation.save_times
425
+
426
+ d.before_shutdown
427
+
428
+ d.shutdown
429
+
430
+ assert_equal 1, s.implementation.load_times
431
+ assert_equal 1, s.implementation.save_times
432
+ end
433
+
434
+ test 'calls #close and #terminate for all plugin instances by #close/#shutdown' do
435
+ @d = d = Dummy.new
436
+ conf = config_element('ROOT', '', {}, [
437
+ config_element('storage', 'mydata', {'@type' => 'example', 'autosave' => 'false', 'save_at_shutdown' => 'true'})
438
+ ])
439
+ d.configure(conf)
440
+ d.start
441
+ s = d.storage_create(usage: 'mydata')
442
+
443
+ s.put('k1', 'v1')
444
+ s.put('k2', 2)
445
+ s.put('k3', true)
446
+
447
+ d.stop
448
+
449
+ assert_equal 3, s.implementation.data.size
450
+ assert_equal 0, s.implementation.saved.size
451
+
452
+ d.shutdown
453
+
454
+ assert_equal 3, s.implementation.data.size
455
+ assert_equal 3, s.implementation.saved.size
456
+
457
+ d.close
458
+
459
+ assert_equal 0, s.implementation.data.size
460
+ assert_equal 3, s.implementation.saved.size
461
+
462
+ d.shutdown
463
+
464
+ assert_equal 0, s.implementation.data.size
465
+ assert_equal 0, s.implementation.saved.size
466
+ end
467
+
468
+ test 'calls lifecycle methods for all plugin instances via owner plugin' do
469
+ @d = d = Dummy.new
470
+ conf = config_element('ROOT', '', {}, [ config_element('storage', '', {'@type' => 'example'}), config_element('storage', 'e2', {'@type' => 'example'}) ])
471
+ d.configure(conf)
472
+ d.start
473
+
474
+ i1 = d.storage_create(usage: '')
475
+ i2 = d.storage_create(usage: 'e2')
476
+ i3 = d.storage_create(usage: 'e3', type: 'ex2')
477
+
478
+ assert i1.started?
479
+ assert i2.started?
480
+ assert i3.started?
481
+
482
+ assert !i1.stopped?
483
+ assert !i2.stopped?
484
+ assert !i3.stopped?
485
+
486
+ d.stop
487
+
488
+ assert i1.stopped?
489
+ assert i2.stopped?
490
+ assert i3.stopped?
491
+
492
+ assert !i1.before_shutdown?
493
+ assert !i2.before_shutdown?
494
+ assert !i3.before_shutdown?
495
+
496
+ d.before_shutdown
497
+
498
+ assert i1.before_shutdown?
499
+ assert i2.before_shutdown?
500
+ assert i3.before_shutdown?
501
+
502
+ assert !i1.shutdown?
503
+ assert !i2.shutdown?
504
+ assert !i3.shutdown?
505
+
506
+ d.shutdown
507
+
508
+ assert i1.shutdown?
509
+ assert i2.shutdown?
510
+ assert i3.shutdown?
511
+
512
+ assert !i1.after_shutdown?
513
+ assert !i2.after_shutdown?
514
+ assert !i3.after_shutdown?
515
+
516
+ d.after_shutdown
517
+
518
+ assert i1.after_shutdown?
519
+ assert i2.after_shutdown?
520
+ assert i3.after_shutdown?
521
+
522
+ assert !i1.closed?
523
+ assert !i2.closed?
524
+ assert !i3.closed?
525
+
526
+ d.close
527
+
528
+ assert i1.closed?
529
+ assert i2.closed?
530
+ assert i3.closed?
531
+
532
+ assert !i1.terminated?
533
+ assert !i2.terminated?
534
+ assert !i3.terminated?
535
+
536
+ d.terminate
537
+
538
+ assert i1.terminated?
539
+ assert i2.terminated?
540
+ assert i3.terminated?
541
+ end
542
+ end
@@ -0,0 +1,164 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/thread'
3
+ require 'fluent/plugin/base'
4
+ require 'timeout'
5
+
6
+ class ThreadTest < Test::Unit::TestCase
7
+ class Dummy < Fluent::Plugin::TestBase
8
+ helpers :thread
9
+ def configure(conf)
10
+ super
11
+ @_thread_wait_seconds = 0.1
12
+ self
13
+ end
14
+ end
15
+
16
+ test 'can be instantiated to be able to create threads' do
17
+ d1 = Dummy.new
18
+ assert d1.respond_to?(:thread_current_running?)
19
+ assert d1.respond_to?(:thread_create)
20
+ assert d1.respond_to?(:_threads)
21
+ assert !d1.thread_current_running?
22
+ assert d1._threads.empty?
23
+ end
24
+
25
+ test 'can be configured' do
26
+ d1 = Dummy.new
27
+ assert_nothing_raised do
28
+ d1.configure(config_element())
29
+ end
30
+ assert d1.plugin_id
31
+ assert d1.log
32
+ end
33
+
34
+ test 'can create thread after prepared' do
35
+ d1 = Dummy.new
36
+ d1.configure(config_element())
37
+ d1.start
38
+
39
+ m1 = Mutex.new
40
+ m2 = Mutex.new
41
+
42
+ m1.lock
43
+ thread_run = false
44
+
45
+ Timeout.timeout(10) do
46
+ t = d1.thread_create(:test1) do
47
+ m2.lock
48
+
49
+ assert !d1._threads.empty? # this must be true always
50
+ assert d1.thread_current_running?
51
+
52
+ thread_run = true
53
+ m2.unlock
54
+ m1.lock
55
+ end
56
+ Thread.pass until m2.locked? || thread_run
57
+
58
+ m2.lock; m2.unlock
59
+ assert_equal 1, d1._threads.size
60
+
61
+ assert_equal :test1, t[:_fluentd_plugin_helper_thread_title]
62
+ assert t[:_fluentd_plugin_helper_thread_running]
63
+ assert !d1._threads.empty?
64
+
65
+ m1.unlock
66
+
67
+ while t[:_fluentd_plugin_helper_thread_running]
68
+ Thread.pass
69
+ end
70
+ end
71
+
72
+ assert d1._threads.empty?
73
+
74
+ d1.stop; d1.shutdown; d1.close; d1.terminate
75
+ end
76
+
77
+ test 'can wait until all threads start' do
78
+ d1 = Dummy.new.configure(config_element()).start
79
+ ary = []
80
+ d1.thread_create(:t1) do
81
+ ary << 1
82
+ end
83
+ d1.thread_create(:t2) do
84
+ ary << 2
85
+ end
86
+ d1.thread_create(:t3) do
87
+ ary << 3
88
+ end
89
+ Timeout.timeout(10) do
90
+ d1.thread_wait_until_start
91
+ end
92
+ assert_equal [1,2,3], ary.sort
93
+
94
+ d1.stop; d1.shutdown; d1.close; d1.terminate
95
+ end
96
+
97
+ test 'can stop threads which is watching thread_current_running?, and then close it' do
98
+ d1 = Dummy.new.configure(config_element()).start
99
+
100
+ m1 = Mutex.new
101
+ thread_in_run = false
102
+ Timeout.timeout(10) do
103
+ t = d1.thread_create(:test2) do
104
+ thread_in_run = true
105
+ m1.lock
106
+ while d1.thread_current_running?
107
+ Thread.pass
108
+ end
109
+ thread_in_run = false
110
+ m1.unlock
111
+ end
112
+ Thread.pass until m1.locked?
113
+
114
+ assert thread_in_run
115
+ assert !d1._threads.empty?
116
+
117
+ d1.stop
118
+ Thread.pass while m1.locked?
119
+ assert !t[:_fluentd_plugin_helper_thread_running]
120
+ assert t.stop?
121
+ end
122
+
123
+ assert d1._threads.empty?
124
+
125
+ d1.stop; d1.shutdown; d1.close; d1.terminate
126
+ end
127
+
128
+ test 'can terminate threads forcedly which is running forever' do
129
+ d1 = Dummy.new.configure(config_element()).start
130
+
131
+ m1 = Mutex.new
132
+ thread_in_run = false
133
+ Timeout.timeout(10) do
134
+ t = d1.thread_create(:test2) do
135
+ thread_in_run = true
136
+ m1.lock
137
+ while true
138
+ Thread.pass
139
+ end
140
+ thread_in_run = false
141
+ end
142
+ Thread.pass until m1.locked?
143
+
144
+ assert thread_in_run
145
+ assert !d1._threads.empty?
146
+
147
+ d1.stop
148
+ assert !t[:_fluentd_plugin_helper_thread_running]
149
+ assert t.alive?
150
+
151
+ d1.shutdown
152
+ assert t.alive?
153
+ assert !d1._threads.empty?
154
+
155
+ d1.close
156
+ assert t.alive?
157
+ assert !d1._threads.empty?
158
+
159
+ d1.terminate
160
+ assert t.stop?
161
+ assert d1._threads.empty?
162
+ end
163
+ end
164
+ end