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,167 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin/storage'
3
+ require 'fluent/plugin/base'
4
+
5
+ class DummyPlugin < Fluent::Plugin::TestBase
6
+ end
7
+
8
+ class BareStorage < Fluent::Plugin::Storage
9
+ Fluent::Plugin.register_storage('bare', self)
10
+ end
11
+
12
+ class BasicStorage < Fluent::Plugin::Storage
13
+ Fluent::Plugin.register_storage('example', self)
14
+
15
+ attr_reader :data, :saved
16
+
17
+ def initialize
18
+ super
19
+ @data = @saved = nil
20
+ end
21
+ def load
22
+ @data = {}
23
+ end
24
+ def save
25
+ @saved = @data.dup
26
+ end
27
+ def get(key)
28
+ @data[key]
29
+ end
30
+ def fetch(key, defval)
31
+ @data.fetch(key, defval)
32
+ end
33
+ def put(key, value)
34
+ @data[key] = value
35
+ end
36
+ def delete(key)
37
+ @data.delete(key)
38
+ end
39
+ def update(key, &block)
40
+ @data[key] = block.call(@data[key])
41
+ end
42
+ def close
43
+ @data = {}
44
+ super
45
+ end
46
+ def terminate
47
+ @saved = {}
48
+ super
49
+ end
50
+ end
51
+
52
+ class StorageTest < Test::Unit::TestCase
53
+ sub_test_case 'BareStorage' do
54
+ setup do
55
+ plugin = DummyPlugin.new
56
+ @s = BareStorage.new
57
+ @s.configure(config_element())
58
+ @s.owner = plugin
59
+ end
60
+
61
+ test 'is configured with plugin information and system config' do
62
+ plugin = DummyPlugin.new
63
+ plugin.system_config_override({'process_name' => 'mytest'})
64
+ plugin.configure(config_element('ROOT', '', {'@id' => '1'}))
65
+ s = BareStorage.new
66
+ s.configure(config_element())
67
+ s.owner = plugin
68
+
69
+ assert_equal 'mytest', s.owner.system_config.process_name
70
+ assert_equal '1', s.instance_eval{ @_plugin_id }
71
+ assert_equal true, s.instance_eval{ @_plugin_id_configured }
72
+ end
73
+
74
+ test 'does NOT have features for high-performance/high-consistent storages' do
75
+ assert_equal false, @s.persistent_always?
76
+ assert_equal false, @s.synchronized?
77
+ end
78
+
79
+ test 'does have default values which is conservative for almost all users' do
80
+ assert_equal false, @s.persistent
81
+ assert_equal true, @s.autosave
82
+ assert_equal 10, @s.autosave_interval
83
+ assert_equal true, @s.save_at_shutdown
84
+ end
85
+
86
+ test 'load/save doesn NOT anything: just as memory storage' do
87
+ assert_nothing_raised{ @s.load }
88
+ assert_nothing_raised{ @s.save }
89
+ end
90
+
91
+ test 'all operations are not defined yet' do
92
+ assert_raise NotImplementedError do
93
+ @s.get('key')
94
+ end
95
+ assert_raise NotImplementedError do
96
+ @s.fetch('key', 'value')
97
+ end
98
+ assert_raise NotImplementedError do
99
+ @s.put('key', 'value')
100
+ end
101
+ assert_raise NotImplementedError do
102
+ @s.delete('key')
103
+ end
104
+ assert_raise NotImplementedError do
105
+ @s.update('key'){ |v| v + '2' }
106
+ end
107
+ end
108
+ end
109
+
110
+ sub_test_case 'ExampleStorage' do
111
+ setup do
112
+ plugin = DummyPlugin.new
113
+ plugin.configure(config_element('ROOT', '', {'@id' => '1'}))
114
+ @s = BasicStorage.new
115
+ @s.configure(config_element())
116
+ @s.owner = plugin
117
+ end
118
+
119
+ test 'load/save works well as plugin internal state operations' do
120
+ plugin = DummyPlugin.new
121
+ plugin.configure(config_element('ROOT', '', {'@id' => '0'}))
122
+ s = BasicStorage.new
123
+ s.owner = plugin
124
+
125
+ assert_nothing_raised{ s.load }
126
+ assert s.data
127
+ assert_nil s.saved
128
+
129
+ assert_nothing_raised{ s.save }
130
+ assert s.saved
131
+ assert{ s.data == s.saved }
132
+ assert{ s.data.object_id != s.saved.object_id }
133
+ end
134
+
135
+ test 'all operations work well' do
136
+ @s.load
137
+
138
+ assert_nil @s.get('key')
139
+ assert_equal 'value', @s.fetch('key', 'value')
140
+ assert_nil @s.get('key')
141
+
142
+ assert_equal 'value', @s.put('key', 'value')
143
+ assert_equal 'value', @s.get('key')
144
+
145
+ assert_equal 'valuevalue', @s.update('key'){|v| v * 2 }
146
+
147
+ assert_equal 'valuevalue', @s.delete('key')
148
+ end
149
+
150
+ test 'close and terminate work to operate internal states' do
151
+ @s.load
152
+ @s.put('k1', 'v1')
153
+ @s.put('k2', 'v2')
154
+ assert_equal 2, @s.data.size
155
+ @s.save
156
+ assert_equal @s.data.size, @s.saved.size
157
+
158
+ assert_nothing_raised{ @s.close }
159
+ assert @s.data.empty?
160
+ assert !@s.saved.empty?
161
+
162
+ assert_nothing_raised{ @s.terminate }
163
+ assert @s.data.empty?
164
+ assert @s.saved.empty?
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,335 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin/storage_local'
3
+ require 'fluent/plugin/input'
4
+ require 'fluent/system_config'
5
+ require 'fileutils'
6
+
7
+ class LocalStorageTest < Test::Unit::TestCase
8
+ TMP_DIR = File.expand_path(File.dirname(__FILE__) + "/tmp/storage_local#{ENV['TEST_ENV_NUMBER']}")
9
+
10
+ class MyInput < Fluent::Plugin::Input
11
+ helpers :storage
12
+ config_section :storage do
13
+ config_set_default :@type, 'local'
14
+ end
15
+ end
16
+
17
+ setup do
18
+ FileUtils.rm_rf(TMP_DIR)
19
+ FileUtils.mkdir_p(TMP_DIR)
20
+ Fluent::Test.setup
21
+ @d = MyInput.new
22
+ end
23
+
24
+ teardown do
25
+ @d.stop unless @d.stopped?
26
+ @d.before_shutdown unless @d.before_shutdown?
27
+ @d.shutdown unless @d.shutdown?
28
+ @d.after_shutdown unless @d.after_shutdown?
29
+ @d.close unless @d.closed?
30
+ @d.terminate unless @d.terminated?
31
+ end
32
+
33
+ sub_test_case 'without any configuration' do
34
+ test 'works as on-memory storage' do
35
+ conf = config_element()
36
+
37
+ @d.configure(conf)
38
+ @d.start
39
+ @p = @d.storage_create()
40
+
41
+ assert_nil @p.path
42
+ assert @p.store.empty?
43
+
44
+ assert_nil @p.get('key1')
45
+ assert_equal 'EMPTY', @p.fetch('key1', 'EMPTY')
46
+
47
+ @p.put('key1', '1')
48
+ assert_equal '1', @p.get('key1')
49
+
50
+ @p.update('key1') do |v|
51
+ (v.to_i * 2).to_s
52
+ end
53
+ assert_equal '2', @p.get('key1')
54
+
55
+ @p.save # on-memory storage does nothing...
56
+
57
+ @d.stop; @d.before_shutdown; @d.shutdown; @d.after_shutdown; @d.close; @d.terminate
58
+
59
+ # re-create to reload storage contents
60
+ @d = MyInput.new
61
+ @d.configure(conf)
62
+ @d.start
63
+ @p = @d.storage_create()
64
+
65
+ assert @p.store.empty?
66
+ end
67
+
68
+ test 'warns about on-memory storage if autosave is true' do
69
+ @d.configure(config_element())
70
+ @d.start
71
+ @p = @d.storage_create()
72
+
73
+ logs = @d.log.out.logs
74
+ assert{ logs.any?{|log| log.include?("[warn]: both of Plugin @id and path for <storage> are not specified. Using on-memory store.") } }
75
+ end
76
+
77
+ test 'show info log about on-memory storage if autosave is false' do
78
+ @d.configure(config_element('ROOT', '', {}, [config_element('storage', '', {'autosave' => 'false'})]))
79
+ @d.start
80
+ @p = @d.storage_create()
81
+
82
+ logs = @d.log.out.logs
83
+ assert{ logs.any?{|log| log.include?("[info]: both of Plugin @id and path for <storage> are not specified. Using on-memory store.") } }
84
+ end
85
+ end
86
+
87
+ sub_test_case 'configured with file path' do
88
+ test 'works as storage which stores data on disk' do
89
+ storage_path = File.join(TMP_DIR, 'my_store.json')
90
+ conf = config_element('ROOT', '', {}, [config_element('storage', '', {'path' => storage_path})])
91
+ @d.configure(conf)
92
+ @d.start
93
+ @p = @d.storage_create()
94
+
95
+ assert_equal storage_path, @p.path
96
+ assert @p.store.empty?
97
+
98
+ assert_nil @p.get('key1')
99
+ assert_equal 'EMPTY', @p.fetch('key1', 'EMPTY')
100
+
101
+ @p.put('key1', '1')
102
+ assert_equal '1', @p.get('key1')
103
+
104
+ @p.update('key1') do |v|
105
+ (v.to_i * 2).to_s
106
+ end
107
+ assert_equal '2', @p.get('key1')
108
+
109
+ @p.save # stores all data into file
110
+
111
+ assert File.exist?(storage_path)
112
+
113
+ @p.put('key2', 4)
114
+
115
+ @d.stop; @d.before_shutdown; @d.shutdown; @d.after_shutdown; @d.close; @d.terminate
116
+
117
+ assert_equal({'key1' => '2', 'key2' => 4}, File.open(storage_path){|f| JSON.parse(f.read) })
118
+
119
+ # re-create to reload storage contents
120
+ @d = MyInput.new
121
+ @d.configure(conf)
122
+ @d.start
123
+ @p = @d.storage_create()
124
+
125
+ assert_false @p.store.empty?
126
+
127
+ assert_equal '2', @p.get('key1')
128
+ assert_equal 4, @p.get('key2')
129
+ end
130
+
131
+ test 'raise configuration error if a file specified with multi worker configuration' do
132
+ storage_path = File.join(TMP_DIR, 'my_store.json')
133
+ conf = config_element('ROOT', '', {}, [config_element('storage', '', {'path' => storage_path})])
134
+ @d.system_config_override('workers' => 3)
135
+ assert_raise Fluent::ConfigError.new("Plugin 'local' does not support multi workers configuration (Fluent::Plugin::LocalStorage)") do
136
+ @d.configure(conf)
137
+ end
138
+ end
139
+ end
140
+
141
+ sub_test_case 'configured with root-dir and plugin id' do
142
+ test 'works as storage which stores data under root dir' do
143
+ root_dir = File.join(TMP_DIR, 'root')
144
+ expected_storage_path = File.join(root_dir, 'worker0', 'local_storage_test', 'storage.json')
145
+ conf = config_element('ROOT', '', {'@id' => 'local_storage_test'})
146
+ Fluent::SystemConfig.overwrite_system_config('root_dir' => root_dir) do
147
+ @d.configure(conf)
148
+ end
149
+ @d.start
150
+ @p = @d.storage_create()
151
+
152
+ assert_equal expected_storage_path, @p.path
153
+ assert @p.store.empty?
154
+
155
+ assert_nil @p.get('key1')
156
+ assert_equal 'EMPTY', @p.fetch('key1', 'EMPTY')
157
+
158
+ @p.put('key1', '1')
159
+ assert_equal '1', @p.get('key1')
160
+
161
+ @p.update('key1') do |v|
162
+ (v.to_i * 2).to_s
163
+ end
164
+ assert_equal '2', @p.get('key1')
165
+
166
+ @p.save # stores all data into file
167
+
168
+ assert File.exist?(expected_storage_path)
169
+
170
+ @p.put('key2', 4)
171
+
172
+ @d.stop; @d.before_shutdown; @d.shutdown; @d.after_shutdown; @d.close; @d.terminate
173
+
174
+ assert_equal({'key1' => '2', 'key2' => 4}, File.open(expected_storage_path){|f| JSON.parse(f.read) })
175
+
176
+ # re-create to reload storage contents
177
+ @d = MyInput.new
178
+ Fluent::SystemConfig.overwrite_system_config('root_dir' => root_dir) do
179
+ @d.configure(conf)
180
+ end
181
+ @d.start
182
+ @p = @d.storage_create()
183
+
184
+ assert_false @p.store.empty?
185
+
186
+ assert_equal '2', @p.get('key1')
187
+ assert_equal 4, @p.get('key2')
188
+ end
189
+
190
+ test 'works with customized path by specified usage' do
191
+ root_dir = File.join(TMP_DIR, 'root')
192
+ expected_storage_path = File.join(root_dir, 'worker0', 'local_storage_test', 'storage.usage.json')
193
+ conf = config_element('ROOT', 'usage', {'@id' => 'local_storage_test'})
194
+ Fluent::SystemConfig.overwrite_system_config('root_dir' => root_dir) do
195
+ @d.configure(conf)
196
+ end
197
+ @d.start
198
+ @p = @d.storage_create(usage: 'usage', type: 'local')
199
+
200
+ assert_equal expected_storage_path, @p.path
201
+ assert @p.store.empty?
202
+ end
203
+ end
204
+
205
+ sub_test_case 'configured with root-dir and plugin id, and multi workers' do
206
+ test 'works as storage which stores data under root dir, also in workers' do
207
+ root_dir = File.join(TMP_DIR, 'root')
208
+ expected_storage_path = File.join(root_dir, 'worker1', 'local_storage_test', 'storage.json')
209
+ conf = config_element('ROOT', '', {'@id' => 'local_storage_test'})
210
+ with_worker_config(root_dir: root_dir, workers: 2, worker_id: 1) do
211
+ @d.configure(conf)
212
+ end
213
+ @d.start
214
+ @p = @d.storage_create()
215
+
216
+ assert_equal expected_storage_path, @p.path
217
+ assert @p.store.empty?
218
+ end
219
+ end
220
+
221
+ sub_test_case 'persistent specified' do
222
+ test 'works well with path' do
223
+ omit "It's hard to test on Windows" if Fluent.windows?
224
+
225
+ storage_path = File.join(TMP_DIR, 'my_store.json')
226
+ conf = config_element('ROOT', '', {}, [config_element('storage', '', {'path' => storage_path, 'persistent' => 'true'})])
227
+ @d.configure(conf)
228
+ @d.start
229
+ @p = @d.storage_create()
230
+
231
+ assert_equal storage_path, @p.path
232
+ assert @p.store.empty?
233
+
234
+ assert_nil @p.get('key1')
235
+ assert_equal 'EMPTY', @p.fetch('key1', 'EMPTY')
236
+
237
+ @p.put('key1', '1')
238
+ assert_equal({'key1' => '1'}, File.open(storage_path){|f| JSON.parse(f.read) })
239
+
240
+ @p.update('key1') do |v|
241
+ (v.to_i * 2).to_s
242
+ end
243
+ assert_equal({'key1' => '2'}, File.open(storage_path){|f| JSON.parse(f.read) })
244
+ end
245
+
246
+ test 'works well with root-dir and plugin id' do
247
+ omit "It's hard to test on Windows" if Fluent.windows?
248
+
249
+ root_dir = File.join(TMP_DIR, 'root')
250
+ expected_storage_path = File.join(root_dir, 'worker0', 'local_storage_test', 'storage.json')
251
+ conf = config_element('ROOT', '', {'@id' => 'local_storage_test'}, [config_element('storage', '', {'persistent' => 'true'})])
252
+ Fluent::SystemConfig.overwrite_system_config('root_dir' => root_dir) do
253
+ @d.configure(conf)
254
+ end
255
+ @d.start
256
+ @p = @d.storage_create()
257
+
258
+ assert_equal expected_storage_path, @p.path
259
+ assert @p.store.empty?
260
+
261
+ assert_nil @p.get('key1')
262
+ assert_equal 'EMPTY', @p.fetch('key1', 'EMPTY')
263
+
264
+ @p.put('key1', '1')
265
+ assert_equal({'key1' => '1'}, File.open(expected_storage_path){|f| JSON.parse(f.read) })
266
+
267
+ @p.update('key1') do |v|
268
+ (v.to_i * 2).to_s
269
+ end
270
+ assert_equal({'key1' => '2'}, File.open(expected_storage_path){|f| JSON.parse(f.read) })
271
+ end
272
+
273
+ test 'raises error if it is configured to use on-memory storage' do
274
+ assert_raise Fluent::ConfigError.new("Plugin @id or path for <storage> required when 'persistent' is true") do
275
+ @d.configure(config_element('ROOT', '', {}, [config_element('storage', '', {'persistent' => 'true'})]))
276
+ end
277
+ end
278
+ end
279
+
280
+ sub_test_case 'with various configurations' do
281
+ test 'mode and dir_mode controls permissions of stored data' do
282
+ omit "NTFS doesn't support UNIX like permissions" if Fluent.windows?
283
+
284
+ storage_path = File.join(TMP_DIR, 'dir', 'my_store.json')
285
+ storage_conf = {
286
+ 'path' => storage_path,
287
+ 'mode' => '0600',
288
+ 'dir_mode' => '0777',
289
+ }
290
+ conf = config_element('ROOT', '', {}, [config_element('storage', '', storage_conf)])
291
+ @d.configure(conf)
292
+ @d.start
293
+ @p = @d.storage_create()
294
+
295
+ assert_equal storage_path, @p.path
296
+ assert @p.store.empty?
297
+
298
+ @p.put('key1', '1')
299
+ assert_equal '1', @p.get('key1')
300
+
301
+ @p.save # stores all data into file
302
+
303
+ assert File.exist?(storage_path)
304
+ assert_equal 0600, (File.stat(storage_path).mode % 01000)
305
+ assert_equal 0777, (File.stat(File.dirname(storage_path)).mode % 01000)
306
+ end
307
+
308
+ test 'pretty_print controls to write data in files as human-easy-to-read' do
309
+ storage_path = File.join(TMP_DIR, 'dir', 'my_store.json')
310
+ storage_conf = {
311
+ 'path' => storage_path,
312
+ 'pretty_print' => 'true',
313
+ }
314
+ conf = config_element('ROOT', '', {}, [config_element('storage', '', storage_conf)])
315
+ @d.configure(conf)
316
+ @d.start
317
+ @p = @d.storage_create()
318
+
319
+ assert_equal storage_path, @p.path
320
+ assert @p.store.empty?
321
+
322
+ @p.put('key1', '1')
323
+ assert_equal '1', @p.get('key1')
324
+
325
+ @p.save # stores all data into file
326
+
327
+ expected_pp_json = <<JSON.chomp
328
+ {
329
+ "key1": "1"
330
+ }
331
+ JSON
332
+ assert_equal expected_pp_json, File.read(storage_path)
333
+ end
334
+ end
335
+ end
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpQIBAAKCAQEArbUTk5n5RruIQGhK1T8g/emKonlfWNMSj/J/f/U9NJ14ugIx
3
+ yHBMqx4WaTyA4zjT2VJO5tRBe385zlIUf8i+x7Ovt/MgsjiwXyKv7qdsE5KHLq+V
4
+ XJfA+s5vAAyzBHY/BA7xxh/QqCI8a/a1OyHyaQ9pFRFXtQBlTH7Fc1qSw5Yg0EXo
5
+ fa6YIBQuDjfqa7FRPj+bEWDO5PUqOMzH5XKBUPS9GLHOqia0CnzF2a51TArC0Dl1
6
+ oNFa7myVmjBuNtkG88Fkd7YNzGa+sNBJPmuGvFXuU3XPEnrtARO/SG4g9/MQUvfM
7
+ I3jFFOJAMmEKd8QXxO5FgIuEnaNOhVRVH/e9wwIDAQABAoIBAQCcYYAWSW/Y9ctb
8
+ 8IguIn8ZF77vNkVYOe1kGfQexjErxPiCvKcEw9TB2HxkkUuXQ/m0lBzkQgIRpB/u
9
+ VoaN47OdJW70M7UjvVVK0HeCascpd6irpvbYPOZG5MGZUdV4Ftv0U1/l9Y5rTycG
10
+ KzxM1+rcGjuH8+z5zjlj/FzV1Jx75pgH2vwE7tBC9hMIefKJVxsnj+1I2BWwT3Ra
11
+ tFayaKW80UYvGQeQjMHyWzEAHAAco5EVTNU9q4xkeKubZx/dod8b05S0Oral0SHY
12
+ AFzXJCp6k29w0m3saEtVQBTImwNut8scJ4KoryGRp9fj9a/dBb1RHe/6EXZ8kDRe
13
+ zhB2/XWBAoGBANpaAPdcIXFyke4DRB07JGin4NU+yzIZy+RwsHme1OIwu9jUYQ1j
14
+ SzcrnJ9adkjgHl4z2psXyeSz/lSUGj7ZjcMVaDu49JSYMPP3heXGkHdtlVyB7KFR
15
+ OBt1rgNdXYfOLOBg6j7mf5G5fXUIATM8fNw5nDYIivD7U3cl9TdUe3OJAoGBAMuo
16
+ e/pmRMEaaDmXuNkDGv/ZoOC4j9tO1fGheSdna9gZWoOyY+MUTFNBQuz/8aw6VsKS
17
+ c7RXY0QI6NsgdLD1OGVgH9AXhDqvgfOBXDWdr/DNJa0wDFNaWRrMFeNQLm7Xhxuf
18
+ OBQycq6vUiWJ6XTqcdk+xErcWRbsQPsGozCEcHfrAoGBAI+sl2QsMClI/PLDHWeq
19
+ ict/Y3aNigCebsYSzFxKgcOP05raLD417sEPplBIovpS1kigECDrJ0KgmSIoDZj7
20
+ Z8dM57gcfHrmJZfycB2AaYDcD2K+bui625Nd/LFkFu4MYQUHYDshSiGmDwIZ0UhY
21
+ bcQu+DWpq1rj1Mjaph7RLSYZAoGBAMAJNiZt6qT/ZonwA/A1mm7oYmekAJo2I0y+
22
+ CwTZ43oYph4Kx19nU3Up05aw3MyfEhJUkF/cCxErKY7+cqouAKiu1DCfDCNePTZE
23
+ o5M3BqEUgFNnPCgYyG6ZRIZco/wGpTKplvKMg1EuplIZUhbZvtKv+d3xGtyfl8Jc
24
+ huKH75lTAoGAHQ3Sy56zgQEJ3QFrIw4puztf/KXpSgLA+aSDh6Ti4IY7L+CwZmuW
25
+ JyVbgF33CwSIKEhacmALs1ZZsDc1ZXov1HWwePxe4/m7smoqZDtrRXQsbRB5COzA
26
+ U30iEMW/rwI3WmHhiIWZYje85+VJZqBc5QS8guv4/XrS/FE7C8Suksc=
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDLDCCAhSgAwIBAgIIEJHFsHrKBGYwDQYJKoZIhvcNAQELBQAwJjEQMA4GA1UE
3
+ ChMHRmx1ZW50ZDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTE5MDYxOTA1MTM0NVoX
4
+ DTE5MDkxODExMTg0NVowJjEQMA4GA1UEChMHRmx1ZW50ZDESMBAGA1UEAxMJbG9j
5
+ YWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArbUTk5n5RruI
6
+ QGhK1T8g/emKonlfWNMSj/J/f/U9NJ14ugIxyHBMqx4WaTyA4zjT2VJO5tRBe385
7
+ zlIUf8i+x7Ovt/MgsjiwXyKv7qdsE5KHLq+VXJfA+s5vAAyzBHY/BA7xxh/QqCI8
8
+ a/a1OyHyaQ9pFRFXtQBlTH7Fc1qSw5Yg0EXofa6YIBQuDjfqa7FRPj+bEWDO5PUq
9
+ OMzH5XKBUPS9GLHOqia0CnzF2a51TArC0Dl1oNFa7myVmjBuNtkG88Fkd7YNzGa+
10
+ sNBJPmuGvFXuU3XPEnrtARO/SG4g9/MQUvfMI3jFFOJAMmEKd8QXxO5FgIuEnaNO
11
+ hVRVH/e9wwIDAQABo14wXDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB
12
+ BQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPLdOVnVWuuB
13
+ 7Pnvpgte4BHitzFYMA0GCSqGSIb3DQEBCwUAA4IBAQBp8LAzjWIJapwTBnnivwZk
14
+ D6Lr028mZIacbBZKsmmPi0VvDFqCvUAbHN8ytPlRBWnvvkihDkZs1TwcDCXGsWYs
15
+ dNNwsYGpk3mQxsHQ9atvy0mQGLDlfaSs/329bfVCw1cPFo9n+MeivSBoE6asdIbH
16
+ tOW3kk1XtJZ2qQJJRvexFImZc0z8c2cG0+eR5hQxQd9bLnAczi/8mZ8VzaU/O3UU
17
+ OJoVuyp0AA8f2f0f1QDaeH9stWZtJQj3ZX1DWHRE3OmVkoBdlt8EHYGggtvQaLIF
18
+ XbHigLHzYztMjmDt4fmRczu/Fu6M4xNro8jLgjiIjqlLBjDZiKrSbOwgyebwFDlv
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDLDCCAhSgAwIBAgIIEJHFsHrKBGYwDQYJKoZIhvcNAQELBQAwJjEQMA4GA1UE
3
+ ChMHRmx1ZW50ZDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTE5MDYxOTA1MTM0NVoX
4
+ DTE5MDkxODExMTg0NVowJjEQMA4GA1UEChMHRmx1ZW50ZDESMBAGA1UEAxMJbG9j
5
+ YWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArbUTk5n5RruI
6
+ QGhK1T8g/emKonlfWNMSj/J/f/U9NJ14ugIxyHBMqx4WaTyA4zjT2VJO5tRBe385
7
+ zlIUf8i+x7Ovt/MgsjiwXyKv7qdsE5KHLq+VXJfA+s5vAAyzBHY/BA7xxh/QqCI8
8
+ a/a1OyHyaQ9pFRFXtQBlTH7Fc1qSw5Yg0EXofa6YIBQuDjfqa7FRPj+bEWDO5PUq
9
+ OMzH5XKBUPS9GLHOqia0CnzF2a51TArC0Dl1oNFa7myVmjBuNtkG88Fkd7YNzGa+
10
+ sNBJPmuGvFXuU3XPEnrtARO/SG4g9/MQUvfMI3jFFOJAMmEKd8QXxO5FgIuEnaNO
11
+ hVRVH/e9wwIDAQABo14wXDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB
12
+ BQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPLdOVnVWuuB
13
+ 7Pnvpgte4BHitzFYMA0GCSqGSIb3DQEBCwUAA4IBAQBp8LAzjWIJapwTBnnivwZk
14
+ D6Lr028mZIacbBZKsmmPi0VvDFqCvUAbHN8ytPlRBWnvvkihDkZs1TwcDCXGsWYs
15
+ dNNwsYGpk3mQxsHQ9atvy0mQGLDlfaSs/329bfVCw1cPFo9n+MeivSBoE6asdIbH
16
+ tOW3kk1XtJZ2qQJJRvexFImZc0z8c2cG0+eR5hQxQd9bLnAczi/8mZ8VzaU/O3UU
17
+ OJoVuyp0AA8f2f0f1QDaeH9stWZtJQj3ZX1DWHRE3OmVkoBdlt8EHYGggtvQaLIF
18
+ XbHigLHzYztMjmDt4fmRczu/Fu6M4xNro8jLgjiIjqlLBjDZiKrSbOwgyebwFDlv
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,65 @@
1
+ require_relative '../../helper'
2
+ require 'flexmock/test_unit'
3
+
4
+ begin
5
+ require 'fluent/plugin_helper/http_server/app'
6
+ skip = false
7
+ rescue LoadError => _
8
+ skip = true
9
+ end
10
+
11
+ unless skip
12
+ class HtttpHelperAppTest < Test::Unit::TestCase
13
+ NULL_LOGGER = Logger.new(nil)
14
+
15
+ class DummyRounter
16
+ def initialize(table = {})
17
+ @table = table
18
+ end
19
+
20
+ def route!(method, path, _req)
21
+ r = @table.fetch(method).fetch(path)
22
+ [200, {}, r]
23
+ end
24
+ end
25
+
26
+ sub_test_case '#call' do
27
+ data(
28
+ 'GET request' => 'GET',
29
+ 'POST request' => 'POST',
30
+ 'DELETE request' => 'DELETE',
31
+ 'PUT request' => 'PUT',
32
+ 'PATCH request' => 'PATCH',
33
+ 'OPTION request' => 'OPTIONS',
34
+ 'CONNECT request' => 'CONNECT',
35
+ 'TRACE request' => 'TRACE',
36
+ )
37
+ test 'dispatch correct path' do |method|
38
+ r = DummyRounter.new(method.downcase.to_sym => { '/path/' => 'hi' })
39
+ app = Fluent::PluginHelper::HttpServer::App.new(r, NULL_LOGGER)
40
+ m = flexmock('request', method: method, path: '/path/')
41
+ r = app.call(m)
42
+ assert_equal(r.body.read, 'hi')
43
+ assert_equal(r.status, 200)
44
+ end
45
+
46
+ test 'dispatch correct path for head' do |method|
47
+ r = DummyRounter.new(head: { '/path/' => 'hi' })
48
+ app = Fluent::PluginHelper::HttpServer::App.new(r, NULL_LOGGER)
49
+ m = flexmock('request', method: method, path: '/path')
50
+ r = app.call(m)
51
+ assert_equal(r.body.read, '')
52
+ assert_equal(r.status, 200)
53
+ end
54
+
55
+ test 'if path does not end with `/`' do |method|
56
+ r = DummyRounter.new(head: { '/path/' => 'hi' })
57
+ app = Fluent::PluginHelper::HttpServer::App.new(r, NULL_LOGGER)
58
+ m = flexmock('request', method: method, path: '/path')
59
+ r = app.call(m)
60
+ assert_equal(r.body.read, '')
61
+ assert_equal(r.status, 200)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,32 @@
1
+ require_relative '../../helper'
2
+ require 'flexmock/test_unit'
3
+
4
+ begin
5
+ require 'fluent/plugin_helper/http_server/router'
6
+ skip = false
7
+ rescue LoadError => _
8
+ skip = true
9
+ end
10
+
11
+ unless skip
12
+ class HtttpHelperRouterTest < Test::Unit::TestCase
13
+ sub_test_case '#mount' do
14
+ test 'mount with method and path' do
15
+ router = Fluent::PluginHelper::HttpServer::Router.new
16
+ router.mount(:get, '/path/', ->(req) { req })
17
+ assert_equal(router.route!(:get, '/path/', 'request'), 'request')
18
+ end
19
+
20
+ test 'use default app if path is not found' do
21
+ router = Fluent::PluginHelper::HttpServer::Router.new
22
+ req = flexmock('request', path: 'path/')
23
+ assert_equal(router.route!(:get, '/path/', req), [404, { 'Content-Type' => 'text/plain' }, "404 Not Found: #{req.path}\n"])
24
+ end
25
+
26
+ test 'default app is configurable' do
27
+ router = Fluent::PluginHelper::HttpServer::Router.new(->(req) { req })
28
+ assert_equal(router.route!(:get, '/path/', 'hello'), 'hello')
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/cert_option'
3
+
4
+ class CertOptionPluginHelperTest < Test::Unit::TestCase
5
+ class Dummy < Fluent::Plugin::TestBase
6
+ helpers :cert_option
7
+ end
8
+
9
+ test 'can load PEM encoded certificate file' do
10
+ d = Dummy.new
11
+ certs = d.cert_option_certificates_from_file("test/plugin_helper/data/cert/cert.pem")
12
+ assert_equal(1, certs.length)
13
+ certs = d.cert_option_certificates_from_file("test/plugin_helper/data/cert/cert-with-no-newline.pem")
14
+ assert_equal(1, certs.length)
15
+ end
16
+ end