fluentd 1.14.4-x64-mingw-ucrt

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 (558) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.drone.yml +35 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
  7. data/.github/ISSUE_TEMPLATE.md +17 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. data/.github/workflows/issue-auto-closer.yml +12 -0
  10. data/.github/workflows/linux-test.yaml +36 -0
  11. data/.github/workflows/macos-test.yaml +30 -0
  12. data/.github/workflows/stale-actions.yml +22 -0
  13. data/.github/workflows/windows-test.yaml +46 -0
  14. data/.gitignore +30 -0
  15. data/.gitlab-ci.yml +103 -0
  16. data/ADOPTERS.md +5 -0
  17. data/AUTHORS +2 -0
  18. data/CHANGELOG.md +2409 -0
  19. data/CONTRIBUTING.md +45 -0
  20. data/GOVERNANCE.md +55 -0
  21. data/Gemfile +9 -0
  22. data/GithubWorkflow.md +78 -0
  23. data/LICENSE +202 -0
  24. data/MAINTAINERS.md +11 -0
  25. data/README.md +97 -0
  26. data/Rakefile +79 -0
  27. data/SECURITY.md +18 -0
  28. data/bin/fluent-binlog-reader +7 -0
  29. data/bin/fluent-ca-generate +6 -0
  30. data/bin/fluent-cap-ctl +7 -0
  31. data/bin/fluent-cat +5 -0
  32. data/bin/fluent-ctl +7 -0
  33. data/bin/fluent-debug +5 -0
  34. data/bin/fluent-gem +9 -0
  35. data/bin/fluent-plugin-config-format +5 -0
  36. data/bin/fluent-plugin-generate +5 -0
  37. data/bin/fluentd +15 -0
  38. data/code-of-conduct.md +3 -0
  39. data/docs/SECURITY_AUDIT.pdf +0 -0
  40. data/example/copy_roundrobin.conf +39 -0
  41. data/example/counter.conf +18 -0
  42. data/example/filter_stdout.conf +22 -0
  43. data/example/in_forward.conf +14 -0
  44. data/example/in_forward_client.conf +37 -0
  45. data/example/in_forward_shared_key.conf +15 -0
  46. data/example/in_forward_tls.conf +14 -0
  47. data/example/in_forward_users.conf +24 -0
  48. data/example/in_forward_workers.conf +21 -0
  49. data/example/in_http.conf +16 -0
  50. data/example/in_out_forward.conf +17 -0
  51. data/example/in_sample_blocks.conf +17 -0
  52. data/example/in_sample_with_compression.conf +23 -0
  53. data/example/in_syslog.conf +15 -0
  54. data/example/in_tail.conf +14 -0
  55. data/example/in_tcp.conf +13 -0
  56. data/example/in_udp.conf +13 -0
  57. data/example/logevents.conf +25 -0
  58. data/example/multi_filters.conf +61 -0
  59. data/example/out_copy.conf +20 -0
  60. data/example/out_exec_filter.conf +42 -0
  61. data/example/out_file.conf +13 -0
  62. data/example/out_forward.conf +35 -0
  63. data/example/out_forward_buf_file.conf +23 -0
  64. data/example/out_forward_client.conf +109 -0
  65. data/example/out_forward_heartbeat_none.conf +16 -0
  66. data/example/out_forward_sd.conf +17 -0
  67. data/example/out_forward_shared_key.conf +36 -0
  68. data/example/out_forward_tls.conf +18 -0
  69. data/example/out_forward_users.conf +65 -0
  70. data/example/out_null.conf +36 -0
  71. data/example/sd.yaml +8 -0
  72. data/example/secondary_file.conf +42 -0
  73. data/example/suppress_config_dump.conf +7 -0
  74. data/example/v0_12_filter.conf +78 -0
  75. data/example/v1_literal_example.conf +36 -0
  76. data/example/worker_section.conf +36 -0
  77. data/fluent.conf +139 -0
  78. data/fluentd.gemspec +55 -0
  79. data/lib/fluent/agent.rb +168 -0
  80. data/lib/fluent/capability.rb +87 -0
  81. data/lib/fluent/clock.rb +66 -0
  82. data/lib/fluent/command/binlog_reader.rb +244 -0
  83. data/lib/fluent/command/bundler_injection.rb +45 -0
  84. data/lib/fluent/command/ca_generate.rb +184 -0
  85. data/lib/fluent/command/cap_ctl.rb +174 -0
  86. data/lib/fluent/command/cat.rb +365 -0
  87. data/lib/fluent/command/ctl.rb +177 -0
  88. data/lib/fluent/command/debug.rb +103 -0
  89. data/lib/fluent/command/fluentd.rb +374 -0
  90. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  91. data/lib/fluent/command/plugin_generator.rb +365 -0
  92. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  93. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  94. data/lib/fluent/compat/exec_util.rb +129 -0
  95. data/lib/fluent/compat/file_util.rb +54 -0
  96. data/lib/fluent/compat/filter.rb +68 -0
  97. data/lib/fluent/compat/formatter.rb +111 -0
  98. data/lib/fluent/compat/formatter_utils.rb +85 -0
  99. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  100. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  101. data/lib/fluent/compat/input.rb +49 -0
  102. data/lib/fluent/compat/output.rb +721 -0
  103. data/lib/fluent/compat/output_chain.rb +60 -0
  104. data/lib/fluent/compat/parser.rb +310 -0
  105. data/lib/fluent/compat/parser_utils.rb +40 -0
  106. data/lib/fluent/compat/propagate_default.rb +62 -0
  107. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  108. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  109. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  110. data/lib/fluent/compat/socket_util.rb +165 -0
  111. data/lib/fluent/compat/string_util.rb +34 -0
  112. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  113. data/lib/fluent/compat/type_converter.rb +90 -0
  114. data/lib/fluent/config/basic_parser.rb +123 -0
  115. data/lib/fluent/config/configure_proxy.rb +424 -0
  116. data/lib/fluent/config/dsl.rb +152 -0
  117. data/lib/fluent/config/element.rb +265 -0
  118. data/lib/fluent/config/error.rb +32 -0
  119. data/lib/fluent/config/literal_parser.rb +286 -0
  120. data/lib/fluent/config/parser.rb +107 -0
  121. data/lib/fluent/config/section.rb +272 -0
  122. data/lib/fluent/config/types.rb +249 -0
  123. data/lib/fluent/config/v1_parser.rb +192 -0
  124. data/lib/fluent/config.rb +76 -0
  125. data/lib/fluent/configurable.rb +201 -0
  126. data/lib/fluent/counter/base_socket.rb +44 -0
  127. data/lib/fluent/counter/client.rb +297 -0
  128. data/lib/fluent/counter/error.rb +86 -0
  129. data/lib/fluent/counter/mutex_hash.rb +163 -0
  130. data/lib/fluent/counter/server.rb +273 -0
  131. data/lib/fluent/counter/store.rb +205 -0
  132. data/lib/fluent/counter/validator.rb +145 -0
  133. data/lib/fluent/counter.rb +23 -0
  134. data/lib/fluent/daemon.rb +15 -0
  135. data/lib/fluent/daemonizer.rb +88 -0
  136. data/lib/fluent/engine.rb +253 -0
  137. data/lib/fluent/env.rb +40 -0
  138. data/lib/fluent/error.rb +34 -0
  139. data/lib/fluent/event.rb +326 -0
  140. data/lib/fluent/event_router.rb +297 -0
  141. data/lib/fluent/ext_monitor_require.rb +28 -0
  142. data/lib/fluent/filter.rb +21 -0
  143. data/lib/fluent/fluent_log_event_router.rb +141 -0
  144. data/lib/fluent/formatter.rb +23 -0
  145. data/lib/fluent/input.rb +21 -0
  146. data/lib/fluent/label.rb +46 -0
  147. data/lib/fluent/load.rb +34 -0
  148. data/lib/fluent/log.rb +713 -0
  149. data/lib/fluent/match.rb +187 -0
  150. data/lib/fluent/mixin.rb +31 -0
  151. data/lib/fluent/msgpack_factory.rb +106 -0
  152. data/lib/fluent/oj_options.rb +62 -0
  153. data/lib/fluent/output.rb +29 -0
  154. data/lib/fluent/output_chain.rb +23 -0
  155. data/lib/fluent/parser.rb +23 -0
  156. data/lib/fluent/plugin/bare_output.rb +104 -0
  157. data/lib/fluent/plugin/base.rb +197 -0
  158. data/lib/fluent/plugin/buf_file.rb +213 -0
  159. data/lib/fluent/plugin/buf_file_single.rb +225 -0
  160. data/lib/fluent/plugin/buf_memory.rb +34 -0
  161. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  162. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  163. data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
  164. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  165. data/lib/fluent/plugin/buffer.rb +918 -0
  166. data/lib/fluent/plugin/compressable.rb +96 -0
  167. data/lib/fluent/plugin/exec_util.rb +22 -0
  168. data/lib/fluent/plugin/file_util.rb +22 -0
  169. data/lib/fluent/plugin/file_wrapper.rb +187 -0
  170. data/lib/fluent/plugin/filter.rb +127 -0
  171. data/lib/fluent/plugin/filter_grep.rb +189 -0
  172. data/lib/fluent/plugin/filter_parser.rb +130 -0
  173. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  174. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  175. data/lib/fluent/plugin/formatter.rb +75 -0
  176. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  177. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  178. data/lib/fluent/plugin/formatter_json.rb +59 -0
  179. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  180. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  181. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  182. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  183. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  184. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  185. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  186. data/lib/fluent/plugin/in_dummy.rb +18 -0
  187. data/lib/fluent/plugin/in_exec.rb +110 -0
  188. data/lib/fluent/plugin/in_forward.rb +473 -0
  189. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  190. data/lib/fluent/plugin/in_http.rb +667 -0
  191. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  192. data/lib/fluent/plugin/in_object_space.rb +93 -0
  193. data/lib/fluent/plugin/in_sample.rb +141 -0
  194. data/lib/fluent/plugin/in_syslog.rb +276 -0
  195. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  196. data/lib/fluent/plugin/in_tail.rb +1228 -0
  197. data/lib/fluent/plugin/in_tcp.rb +181 -0
  198. data/lib/fluent/plugin/in_udp.rb +92 -0
  199. data/lib/fluent/plugin/in_unix.rb +195 -0
  200. data/lib/fluent/plugin/input.rb +75 -0
  201. data/lib/fluent/plugin/metrics.rb +119 -0
  202. data/lib/fluent/plugin/metrics_local.rb +96 -0
  203. data/lib/fluent/plugin/multi_output.rb +195 -0
  204. data/lib/fluent/plugin/out_copy.rb +120 -0
  205. data/lib/fluent/plugin/out_exec.rb +105 -0
  206. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  207. data/lib/fluent/plugin/out_file.rb +334 -0
  208. data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
  209. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  210. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  211. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  212. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  213. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  214. data/lib/fluent/plugin/out_forward/socket_cache.rb +140 -0
  215. data/lib/fluent/plugin/out_forward.rb +826 -0
  216. data/lib/fluent/plugin/out_http.rb +275 -0
  217. data/lib/fluent/plugin/out_null.rb +74 -0
  218. data/lib/fluent/plugin/out_relabel.rb +32 -0
  219. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  220. data/lib/fluent/plugin/out_secondary_file.rb +131 -0
  221. data/lib/fluent/plugin/out_stdout.rb +74 -0
  222. data/lib/fluent/plugin/out_stream.rb +130 -0
  223. data/lib/fluent/plugin/output.rb +1556 -0
  224. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  225. data/lib/fluent/plugin/parser.rb +275 -0
  226. data/lib/fluent/plugin/parser_apache.rb +28 -0
  227. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  228. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  229. data/lib/fluent/plugin/parser_csv.rb +114 -0
  230. data/lib/fluent/plugin/parser_json.rb +96 -0
  231. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  232. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  233. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  234. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  235. data/lib/fluent/plugin/parser_none.rb +36 -0
  236. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  237. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  238. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  239. data/lib/fluent/plugin/sd_file.rb +156 -0
  240. data/lib/fluent/plugin/sd_srv.rb +135 -0
  241. data/lib/fluent/plugin/sd_static.rb +58 -0
  242. data/lib/fluent/plugin/service_discovery.rb +65 -0
  243. data/lib/fluent/plugin/socket_util.rb +22 -0
  244. data/lib/fluent/plugin/storage.rb +84 -0
  245. data/lib/fluent/plugin/storage_local.rb +162 -0
  246. data/lib/fluent/plugin/string_util.rb +22 -0
  247. data/lib/fluent/plugin.rb +206 -0
  248. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  249. data/lib/fluent/plugin_helper/child_process.rb +366 -0
  250. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  251. data/lib/fluent/plugin_helper/counter.rb +51 -0
  252. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  253. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  254. data/lib/fluent/plugin_helper/extract.rb +104 -0
  255. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  256. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  257. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  258. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  259. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  260. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  261. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  262. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  263. data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
  264. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  265. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  266. data/lib/fluent/plugin_helper/inject.rb +154 -0
  267. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  268. data/lib/fluent/plugin_helper/parser.rb +147 -0
  269. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  270. data/lib/fluent/plugin_helper/retry_state.rb +209 -0
  271. data/lib/fluent/plugin_helper/server.rb +801 -0
  272. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  273. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  274. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  275. data/lib/fluent/plugin_helper/socket.rb +277 -0
  276. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  277. data/lib/fluent/plugin_helper/storage.rb +349 -0
  278. data/lib/fluent/plugin_helper/thread.rb +180 -0
  279. data/lib/fluent/plugin_helper/timer.rb +92 -0
  280. data/lib/fluent/plugin_helper.rb +75 -0
  281. data/lib/fluent/plugin_id.rb +93 -0
  282. data/lib/fluent/process.rb +22 -0
  283. data/lib/fluent/registry.rb +116 -0
  284. data/lib/fluent/root_agent.rb +372 -0
  285. data/lib/fluent/rpc.rb +94 -0
  286. data/lib/fluent/static_config_analysis.rb +194 -0
  287. data/lib/fluent/supervisor.rb +1054 -0
  288. data/lib/fluent/system_config.rb +187 -0
  289. data/lib/fluent/test/base.rb +78 -0
  290. data/lib/fluent/test/driver/base.rb +225 -0
  291. data/lib/fluent/test/driver/base_owned.rb +83 -0
  292. data/lib/fluent/test/driver/base_owner.rb +135 -0
  293. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  294. data/lib/fluent/test/driver/filter.rb +57 -0
  295. data/lib/fluent/test/driver/formatter.rb +30 -0
  296. data/lib/fluent/test/driver/input.rb +31 -0
  297. data/lib/fluent/test/driver/multi_output.rb +53 -0
  298. data/lib/fluent/test/driver/output.rb +102 -0
  299. data/lib/fluent/test/driver/parser.rb +30 -0
  300. data/lib/fluent/test/driver/storage.rb +30 -0
  301. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  302. data/lib/fluent/test/filter_test.rb +77 -0
  303. data/lib/fluent/test/formatter_test.rb +65 -0
  304. data/lib/fluent/test/helpers.rb +134 -0
  305. data/lib/fluent/test/input_test.rb +174 -0
  306. data/lib/fluent/test/log.rb +79 -0
  307. data/lib/fluent/test/output_test.rb +156 -0
  308. data/lib/fluent/test/parser_test.rb +70 -0
  309. data/lib/fluent/test/startup_shutdown.rb +46 -0
  310. data/lib/fluent/test.rb +58 -0
  311. data/lib/fluent/time.rb +512 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +81 -0
  314. data/lib/fluent/unique_id.rb +39 -0
  315. data/lib/fluent/variable_store.rb +40 -0
  316. data/lib/fluent/version.rb +21 -0
  317. data/lib/fluent/winsvc.rb +103 -0
  318. data/templates/new_gem/Gemfile +3 -0
  319. data/templates/new_gem/README.md.erb +43 -0
  320. data/templates/new_gem/Rakefile +13 -0
  321. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  322. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  323. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  324. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  325. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  326. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  327. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  328. data/templates/new_gem/test/helper.rb.erb +8 -0
  329. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  330. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  331. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  335. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  336. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  337. data/templates/plugin_config_formatter/param.md.erb +34 -0
  338. data/templates/plugin_config_formatter/section.md.erb +12 -0
  339. data/test/command/test_binlog_reader.rb +362 -0
  340. data/test/command/test_ca_generate.rb +70 -0
  341. data/test/command/test_cap_ctl.rb +100 -0
  342. data/test/command/test_cat.rb +128 -0
  343. data/test/command/test_ctl.rb +57 -0
  344. data/test/command/test_fluentd.rb +1106 -0
  345. data/test/command/test_plugin_config_formatter.rb +398 -0
  346. data/test/command/test_plugin_generator.rb +109 -0
  347. data/test/compat/test_calls_super.rb +166 -0
  348. data/test/compat/test_parser.rb +92 -0
  349. data/test/config/assertions.rb +42 -0
  350. data/test/config/test_config_parser.rb +551 -0
  351. data/test/config/test_configurable.rb +1784 -0
  352. data/test/config/test_configure_proxy.rb +604 -0
  353. data/test/config/test_dsl.rb +415 -0
  354. data/test/config/test_element.rb +518 -0
  355. data/test/config/test_literal_parser.rb +309 -0
  356. data/test/config/test_plugin_configuration.rb +56 -0
  357. data/test/config/test_section.rb +191 -0
  358. data/test/config/test_system_config.rb +199 -0
  359. data/test/config/test_types.rb +408 -0
  360. data/test/counter/test_client.rb +563 -0
  361. data/test/counter/test_error.rb +44 -0
  362. data/test/counter/test_mutex_hash.rb +179 -0
  363. data/test/counter/test_server.rb +589 -0
  364. data/test/counter/test_store.rb +258 -0
  365. data/test/counter/test_validator.rb +137 -0
  366. data/test/helper.rb +155 -0
  367. data/test/helpers/fuzzy_assert.rb +89 -0
  368. data/test/helpers/process_extenstion.rb +33 -0
  369. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  370. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  371. data/test/plugin/data/2010/01/20100102.log +0 -0
  372. data/test/plugin/data/log/bar +0 -0
  373. data/test/plugin/data/log/foo/bar.log +0 -0
  374. data/test/plugin/data/log/foo/bar2 +0 -0
  375. data/test/plugin/data/log/test.log +0 -0
  376. data/test/plugin/data/sd_file/config +11 -0
  377. data/test/plugin/data/sd_file/config.json +17 -0
  378. data/test/plugin/data/sd_file/config.yaml +11 -0
  379. data/test/plugin/data/sd_file/config.yml +11 -0
  380. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  381. data/test/plugin/in_tail/test_fifo.rb +121 -0
  382. data/test/plugin/in_tail/test_io_handler.rb +140 -0
  383. data/test/plugin/in_tail/test_position_file.rb +379 -0
  384. data/test/plugin/out_forward/test_ack_handler.rb +101 -0
  385. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  386. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  387. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  388. data/test/plugin/out_forward/test_socket_cache.rb +149 -0
  389. data/test/plugin/test_bare_output.rb +131 -0
  390. data/test/plugin/test_base.rb +115 -0
  391. data/test/plugin/test_buf_file.rb +1275 -0
  392. data/test/plugin/test_buf_file_single.rb +833 -0
  393. data/test/plugin/test_buf_memory.rb +42 -0
  394. data/test/plugin/test_buffer.rb +1383 -0
  395. data/test/plugin/test_buffer_chunk.rb +198 -0
  396. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  397. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  398. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  399. data/test/plugin/test_compressable.rb +87 -0
  400. data/test/plugin/test_file_util.rb +96 -0
  401. data/test/plugin/test_file_wrapper.rb +126 -0
  402. data/test/plugin/test_filter.rb +368 -0
  403. data/test/plugin/test_filter_grep.rb +697 -0
  404. data/test/plugin/test_filter_parser.rb +731 -0
  405. data/test/plugin/test_filter_record_transformer.rb +577 -0
  406. data/test/plugin/test_filter_stdout.rb +207 -0
  407. data/test/plugin/test_formatter_csv.rb +136 -0
  408. data/test/plugin/test_formatter_hash.rb +38 -0
  409. data/test/plugin/test_formatter_json.rb +61 -0
  410. data/test/plugin/test_formatter_ltsv.rb +70 -0
  411. data/test/plugin/test_formatter_msgpack.rb +28 -0
  412. data/test/plugin/test_formatter_out_file.rb +116 -0
  413. data/test/plugin/test_formatter_single_value.rb +44 -0
  414. data/test/plugin/test_formatter_tsv.rb +76 -0
  415. data/test/plugin/test_in_debug_agent.rb +49 -0
  416. data/test/plugin/test_in_exec.rb +261 -0
  417. data/test/plugin/test_in_forward.rb +1180 -0
  418. data/test/plugin/test_in_gc_stat.rb +62 -0
  419. data/test/plugin/test_in_http.rb +1080 -0
  420. data/test/plugin/test_in_monitor_agent.rb +923 -0
  421. data/test/plugin/test_in_object_space.rb +60 -0
  422. data/test/plugin/test_in_sample.rb +190 -0
  423. data/test/plugin/test_in_syslog.rb +505 -0
  424. data/test/plugin/test_in_tail.rb +2363 -0
  425. data/test/plugin/test_in_tcp.rb +243 -0
  426. data/test/plugin/test_in_udp.rb +268 -0
  427. data/test/plugin/test_in_unix.rb +181 -0
  428. data/test/plugin/test_input.rb +137 -0
  429. data/test/plugin/test_metadata.rb +89 -0
  430. data/test/plugin/test_metrics.rb +294 -0
  431. data/test/plugin/test_metrics_local.rb +96 -0
  432. data/test/plugin/test_multi_output.rb +204 -0
  433. data/test/plugin/test_out_copy.rb +308 -0
  434. data/test/plugin/test_out_exec.rb +312 -0
  435. data/test/plugin/test_out_exec_filter.rb +606 -0
  436. data/test/plugin/test_out_file.rb +1037 -0
  437. data/test/plugin/test_out_forward.rb +1348 -0
  438. data/test/plugin/test_out_http.rb +428 -0
  439. data/test/plugin/test_out_null.rb +105 -0
  440. data/test/plugin/test_out_relabel.rb +28 -0
  441. data/test/plugin/test_out_roundrobin.rb +146 -0
  442. data/test/plugin/test_out_secondary_file.rb +458 -0
  443. data/test/plugin/test_out_stdout.rb +205 -0
  444. data/test/plugin/test_out_stream.rb +103 -0
  445. data/test/plugin/test_output.rb +1065 -0
  446. data/test/plugin/test_output_as_buffered.rb +2024 -0
  447. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  448. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  449. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  450. data/test/plugin/test_output_as_buffered_retries.rb +919 -0
  451. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  452. data/test/plugin/test_output_as_standard.rb +374 -0
  453. data/test/plugin/test_owned_by.rb +35 -0
  454. data/test/plugin/test_parser.rb +399 -0
  455. data/test/plugin/test_parser_apache.rb +42 -0
  456. data/test/plugin/test_parser_apache2.rb +47 -0
  457. data/test/plugin/test_parser_apache_error.rb +45 -0
  458. data/test/plugin/test_parser_csv.rb +200 -0
  459. data/test/plugin/test_parser_json.rb +138 -0
  460. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  461. data/test/plugin/test_parser_multiline.rb +111 -0
  462. data/test/plugin/test_parser_nginx.rb +88 -0
  463. data/test/plugin/test_parser_none.rb +52 -0
  464. data/test/plugin/test_parser_regexp.rb +289 -0
  465. data/test/plugin/test_parser_syslog.rb +650 -0
  466. data/test/plugin/test_parser_tsv.rb +122 -0
  467. data/test/plugin/test_sd_file.rb +228 -0
  468. data/test/plugin/test_sd_srv.rb +230 -0
  469. data/test/plugin/test_storage.rb +167 -0
  470. data/test/plugin/test_storage_local.rb +335 -0
  471. data/test/plugin/test_string_util.rb +26 -0
  472. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  473. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  474. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  475. data/test/plugin_helper/data/cert/cert.pem +19 -0
  476. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  477. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  478. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  479. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  480. data/test/plugin_helper/data/cert/empty.pem +0 -0
  481. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  482. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  483. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  484. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  485. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  486. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  487. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  488. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  489. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  490. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  491. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  492. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  493. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  494. data/test/plugin_helper/http_server/test_app.rb +65 -0
  495. data/test/plugin_helper/http_server/test_route.rb +32 -0
  496. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  497. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  498. data/test/plugin_helper/test_cert_option.rb +25 -0
  499. data/test/plugin_helper/test_child_process.rb +840 -0
  500. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  501. data/test/plugin_helper/test_event_emitter.rb +80 -0
  502. data/test/plugin_helper/test_event_loop.rb +52 -0
  503. data/test/plugin_helper/test_extract.rb +194 -0
  504. data/test/plugin_helper/test_formatter.rb +255 -0
  505. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  506. data/test/plugin_helper/test_inject.rb +561 -0
  507. data/test/plugin_helper/test_metrics.rb +137 -0
  508. data/test/plugin_helper/test_parser.rb +264 -0
  509. data/test/plugin_helper/test_record_accessor.rb +238 -0
  510. data/test/plugin_helper/test_retry_state.rb +442 -0
  511. data/test/plugin_helper/test_server.rb +1823 -0
  512. data/test/plugin_helper/test_service_discovery.rb +165 -0
  513. data/test/plugin_helper/test_socket.rb +146 -0
  514. data/test/plugin_helper/test_storage.rb +542 -0
  515. data/test/plugin_helper/test_thread.rb +164 -0
  516. data/test/plugin_helper/test_timer.rb +130 -0
  517. data/test/scripts/exec_script.rb +32 -0
  518. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  519. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  520. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  521. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  522. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  523. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  524. data/test/test_capability.rb +74 -0
  525. data/test/test_clock.rb +164 -0
  526. data/test/test_config.rb +202 -0
  527. data/test/test_configdsl.rb +148 -0
  528. data/test/test_daemonizer.rb +91 -0
  529. data/test/test_engine.rb +203 -0
  530. data/test/test_event.rb +531 -0
  531. data/test/test_event_router.rb +331 -0
  532. data/test/test_event_time.rb +199 -0
  533. data/test/test_filter.rb +121 -0
  534. data/test/test_fluent_log_event_router.rb +99 -0
  535. data/test/test_formatter.rb +366 -0
  536. data/test/test_input.rb +31 -0
  537. data/test/test_log.rb +994 -0
  538. data/test/test_logger_initializer.rb +46 -0
  539. data/test/test_match.rb +148 -0
  540. data/test/test_mixin.rb +351 -0
  541. data/test/test_msgpack_factory.rb +18 -0
  542. data/test/test_oj_options.rb +55 -0
  543. data/test/test_output.rb +278 -0
  544. data/test/test_plugin.rb +251 -0
  545. data/test/test_plugin_classes.rb +370 -0
  546. data/test/test_plugin_helper.rb +81 -0
  547. data/test/test_plugin_id.rb +119 -0
  548. data/test/test_process.rb +14 -0
  549. data/test/test_root_agent.rb +951 -0
  550. data/test/test_static_config_analysis.rb +177 -0
  551. data/test/test_supervisor.rb +601 -0
  552. data/test/test_test_drivers.rb +136 -0
  553. data/test/test_time_formatter.rb +301 -0
  554. data/test/test_time_parser.rb +362 -0
  555. data/test/test_tls.rb +65 -0
  556. data/test/test_unique_id.rb +47 -0
  557. data/test/test_variable_store.rb +65 -0
  558. metadata +1261 -0
@@ -0,0 +1,255 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/formatter'
3
+ require 'fluent/plugin/base'
4
+
5
+ class FormatterHelperTest < Test::Unit::TestCase
6
+ class ExampleFormatter < Fluent::Plugin::Formatter
7
+ Fluent::Plugin.register_formatter('example', self)
8
+ def format(tag, time, record)
9
+ "#{tag},#{time.to_i},#{record.keys.sort.join(',')}" # hey, you miss values! :P
10
+ end
11
+ end
12
+ class Example2Formatter < Fluent::Plugin::Formatter
13
+ Fluent::Plugin.register_formatter('example2', self)
14
+ def format(tag, time, record)
15
+ "#{tag},#{time.to_i},#{record.values.sort.join(',')}" # key...
16
+ end
17
+ end
18
+ class Dummy < Fluent::Plugin::TestBase
19
+ helpers :formatter
20
+ config_section :format do
21
+ config_set_default :@type, 'example'
22
+ end
23
+ end
24
+
25
+ class Dummy2 < Fluent::Plugin::TestBase
26
+ helpers :formatter
27
+ config_section :format do
28
+ config_set_default :@type, 'example2'
29
+ end
30
+ end
31
+
32
+ setup do
33
+ @d = nil
34
+ end
35
+
36
+ teardown do
37
+ if @d
38
+ @d.stop unless @d.stopped?
39
+ @d.shutdown unless @d.shutdown?
40
+ @d.close unless @d.closed?
41
+ @d.terminate unless @d.terminated?
42
+ end
43
+ end
44
+
45
+ test 'can be initialized without any formatters at first' do
46
+ d = Dummy.new
47
+ assert_equal 0, d._formatters.size
48
+ end
49
+
50
+ test 'can override default configuration parameters, but not overwrite whole definition' do
51
+ d = Dummy.new
52
+ assert_equal [], d.formatter_configs
53
+
54
+ d = Dummy2.new
55
+ d.configure(config_element('ROOT', '', {}, [config_element('format', '', {}, [])]))
56
+ assert_raise NoMethodError do
57
+ d.format
58
+ end
59
+ assert_equal 1, d.formatter_configs.size
60
+ assert_equal 'example2', d.formatter_configs.first[:@type]
61
+ end
62
+
63
+ test 'creates instance of type specified by conf, or default_type if @type is missing in conf' do
64
+ d = Dummy2.new
65
+ d.configure(config_element())
66
+ i = d.formatter_create(conf: config_element('format', '', {'@type' => 'example'}), default_type: 'example2')
67
+ assert{ i.is_a?(ExampleFormatter) }
68
+
69
+ d = Dummy2.new
70
+ d.configure(config_element())
71
+ i = d.formatter_create(conf: nil, default_type: 'example2')
72
+ assert{ i.is_a?(Example2Formatter) }
73
+ end
74
+
75
+ test 'raises config error if config section is specified, but @type is not specified' do
76
+ d = Dummy2.new
77
+ d.configure(config_element())
78
+ assert_raise Fluent::ConfigError.new("@type is required in <format>") do
79
+ d.formatter_create(conf: config_element('format', '', {}), default_type: 'example2')
80
+ end
81
+ end
82
+
83
+ test 'can be configured with default type without format sections' do
84
+ d = Dummy.new
85
+ assert_nothing_raised do
86
+ d.configure(config_element())
87
+ end
88
+ assert_equal 1, d._formatters.size
89
+ end
90
+
91
+ test 'can be configured with a format section' do
92
+ d = Dummy.new
93
+ conf = config_element('ROOT', '', {}, [
94
+ config_element('format', '', {'@type' => 'example'})
95
+ ])
96
+ assert_nothing_raised do
97
+ d.configure(conf)
98
+ end
99
+ assert_equal 1, d._formatters.size
100
+ assert{ d._formatters.values.all?{ |formatter| !formatter.started? } }
101
+ end
102
+
103
+ test 'can be configured with 2 or more format sections with different usages with each other' do
104
+ d = Dummy.new
105
+ conf = config_element('ROOT', '', {}, [
106
+ config_element('format', 'default', {'@type' => 'example'}),
107
+ config_element('format', 'extra', {'@type' => 'example2'}),
108
+ ])
109
+ assert_nothing_raised do
110
+ d.configure(conf)
111
+ end
112
+ assert_equal 2, d._formatters.size
113
+ assert{ d._formatters.values.all?{ |formatter| !formatter.started? } }
114
+ end
115
+
116
+ test 'cannot be configured with 2 format sections with same usage' do
117
+ d = Dummy.new
118
+ conf = config_element('ROOT', '', {}, [
119
+ config_element('format', 'default', {'@type' => 'example'}),
120
+ config_element('format', 'extra', {'@type' => 'example2'}),
121
+ config_element('format', 'extra', {'@type' => 'example2'}),
122
+ ])
123
+ assert_raises Fluent::ConfigError do
124
+ d.configure(conf)
125
+ end
126
+ end
127
+
128
+ test 'creates a format plugin instance which is already configured without usage' do
129
+ @d = d = Dummy.new
130
+ conf = config_element('ROOT', '', {}, [
131
+ config_element('format', '', {'@type' => 'example'})
132
+ ])
133
+ d.configure(conf)
134
+ d.start
135
+
136
+ formatter = d.formatter_create
137
+ assert{ formatter.is_a? ExampleFormatter }
138
+ assert formatter.started?
139
+ end
140
+
141
+ test 'creates a formatter plugin instance which is already configured with usage' do
142
+ @d = d = Dummy.new
143
+ conf = config_element('ROOT', '', {}, [
144
+ config_element('format', 'mydata', {'@type' => 'example'})
145
+ ])
146
+ d.configure(conf)
147
+ d.start
148
+
149
+ formatter = d.formatter_create(usage: 'mydata')
150
+ assert{ formatter.is_a? ExampleFormatter }
151
+ assert formatter.started?
152
+ end
153
+
154
+ test 'creates a formatter plugin without configurations' do
155
+ @d = d = Dummy.new
156
+ d.configure(config_element())
157
+ d.start
158
+
159
+ formatter = d.formatter_create(usage: 'mydata', type: 'example', conf: config_element('format', 'mydata'))
160
+ assert{ formatter.is_a? ExampleFormatter }
161
+ assert formatter.started?
162
+ end
163
+
164
+ test 'creates 2 or more formatter plugin instances' do
165
+ @d = d = Dummy.new
166
+ conf = config_element('ROOT', '', {}, [
167
+ config_element('format', 'mydata', {'@type' => 'example'}),
168
+ config_element('format', 'secret', {'@type' => 'example2'})
169
+ ])
170
+ d.configure(conf)
171
+ d.start
172
+
173
+ p1 = d.formatter_create(usage: 'mydata')
174
+ p2 = d.formatter_create(usage: 'secret')
175
+ assert{ p1.is_a? ExampleFormatter }
176
+ assert p1.started?
177
+ assert{ p2.is_a? Example2Formatter }
178
+ assert p2.started?
179
+ end
180
+
181
+ test 'calls lifecycle methods for all plugin instances via owner plugin' do
182
+ @d = d = Dummy.new
183
+ conf = config_element('ROOT', '', {}, [ config_element('format', '', {'@type' => 'example'}), config_element('format', 'e2', {'@type' => 'example'}) ])
184
+ d.configure(conf)
185
+ d.start
186
+
187
+ i1 = d.formatter_create(usage: '')
188
+ i2 = d.formatter_create(usage: 'e2')
189
+ i3 = d.formatter_create(usage: 'e3', type: 'example2')
190
+
191
+ assert i1.started?
192
+ assert i2.started?
193
+ assert i3.started?
194
+
195
+ assert !i1.stopped?
196
+ assert !i2.stopped?
197
+ assert !i3.stopped?
198
+
199
+ d.stop
200
+
201
+ assert i1.stopped?
202
+ assert i2.stopped?
203
+ assert i3.stopped?
204
+
205
+ assert !i1.before_shutdown?
206
+ assert !i2.before_shutdown?
207
+ assert !i3.before_shutdown?
208
+
209
+ d.before_shutdown
210
+
211
+ assert i1.before_shutdown?
212
+ assert i2.before_shutdown?
213
+ assert i3.before_shutdown?
214
+
215
+ assert !i1.shutdown?
216
+ assert !i2.shutdown?
217
+ assert !i3.shutdown?
218
+
219
+ d.shutdown
220
+
221
+ assert i1.shutdown?
222
+ assert i2.shutdown?
223
+ assert i3.shutdown?
224
+
225
+ assert !i1.after_shutdown?
226
+ assert !i2.after_shutdown?
227
+ assert !i3.after_shutdown?
228
+
229
+ d.after_shutdown
230
+
231
+ assert i1.after_shutdown?
232
+ assert i2.after_shutdown?
233
+ assert i3.after_shutdown?
234
+
235
+ assert !i1.closed?
236
+ assert !i2.closed?
237
+ assert !i3.closed?
238
+
239
+ d.close
240
+
241
+ assert i1.closed?
242
+ assert i2.closed?
243
+ assert i3.closed?
244
+
245
+ assert !i1.terminated?
246
+ assert !i2.terminated?
247
+ assert !i3.terminated?
248
+
249
+ d.terminate
250
+
251
+ assert i1.terminated?
252
+ assert i2.terminated?
253
+ assert i3.terminated?
254
+ end
255
+ end
@@ -0,0 +1,372 @@
1
+ require_relative '../helper'
2
+ require 'flexmock/test_unit'
3
+ require 'fluent/plugin_helper/http_server'
4
+ require 'fluent/plugin/output'
5
+ require 'fluent/event'
6
+ require 'net/http'
7
+ require 'uri'
8
+ require 'openssl'
9
+ require 'async'
10
+
11
+ class HttpHelperTest < Test::Unit::TestCase
12
+ NULL_LOGGER = Logger.new(nil)
13
+ CERT_DIR = File.expand_path(File.dirname(__FILE__) + '/data/cert/without_ca')
14
+ CERT_CA_DIR = File.expand_path(File.dirname(__FILE__) + '/data/cert/with_ca')
15
+
16
+ def setup
17
+ @port = unused_port
18
+ end
19
+
20
+ def teardown
21
+ @port = nil
22
+ end
23
+
24
+ class Dummy < Fluent::Plugin::TestBase
25
+ helpers :http_server
26
+ end
27
+
28
+ def on_driver(config = nil)
29
+ config ||= Fluent::Config.parse(config || '', '(name)', '')
30
+ Fluent::Test.setup
31
+ driver = Dummy.new
32
+ driver.configure(config)
33
+ driver.start
34
+ driver.after_start
35
+
36
+ yield(driver)
37
+ ensure
38
+ unless driver.stopped?
39
+ driver.stop rescue nil
40
+ end
41
+
42
+ unless driver.before_shutdown?
43
+ driver.before_shutdown rescue nil
44
+ end
45
+
46
+ unless driver.shutdown?
47
+ driver.shutdown rescue nil
48
+ end
49
+
50
+ unless driver.after_shutdown?
51
+ driver.after_shutdown rescue nil
52
+ end
53
+
54
+ unless driver.closed?
55
+ driver.close rescue nil
56
+ end
57
+
58
+ unless driver.terminated?
59
+ driver.terminated rescue nil
60
+ end
61
+ end
62
+
63
+ def on_driver_transport(opts = {}, &block)
64
+ transport_conf = config_element('transport', 'tls', opts)
65
+ c = config_element('ROOT', '', {}, [transport_conf])
66
+ on_driver(c, &block)
67
+ end
68
+
69
+ %w[get head].each do |n|
70
+ define_method(n) do |uri, header = {}|
71
+ url = URI.parse(uri)
72
+ headers = { 'Content-Type' => 'application/x-www-form-urlencoded/' }.merge(header)
73
+ req = Net::HTTP.const_get(n.capitalize).new(url, headers)
74
+ Net::HTTP.start(url.host, url.port) do |http|
75
+ http.request(req)
76
+ end
77
+ end
78
+
79
+ define_method("secure_#{n}") do |uri, header = {}, verify: true, cert_path: nil, selfsigned: true, hostname: false|
80
+ url = URI.parse(uri)
81
+ headers = { 'Content-Type' => 'application/x-www-form-urlencoded/' }.merge(header)
82
+ start_https_request(url.host, url.port, verify: verify, cert_path: cert_path, selfsigned: selfsigned) do |https|
83
+ https.send(n, url.path, headers.to_a)
84
+ end
85
+ end
86
+ end
87
+
88
+ %w[post put patch delete options trace].each do |n|
89
+ define_method(n) do |uri, body = '', header = {}|
90
+ url = URI.parse(uri)
91
+ headers = { 'Content-Type' => 'application/x-www-form-urlencoded/' }.merge(header)
92
+ req = Net::HTTP.const_get(n.capitalize).new(url, headers)
93
+ req.body = body
94
+ Net::HTTP.start(url.host, url.port) do |http|
95
+ http.request(req)
96
+ end
97
+ end
98
+ end
99
+
100
+ # wrapper for net/http
101
+ Response = Struct.new(:code, :body, :headers)
102
+
103
+ # Use async-http as http client since net/http can't be set verify_hostname= now
104
+ # will be replaced when net/http supports verify_hostname=
105
+ def start_https_request(addr, port, verify: true, cert_path: nil, selfsigned: true, hostname: nil)
106
+ context = OpenSSL::SSL::SSLContext.new
107
+ context.set_params({})
108
+ if verify
109
+ cert_store = OpenSSL::X509::Store.new
110
+ cert_store.set_default_paths
111
+ if selfsigned && OpenSSL::X509.const_defined?('V_FLAG_CHECK_SS_SIGNATURE')
112
+ cert_store.flags = OpenSSL::X509::V_FLAG_CHECK_SS_SIGNATURE
113
+ end
114
+
115
+ if cert_path
116
+ cert_store.add_file(cert_path)
117
+ end
118
+
119
+ context.cert_store = cert_store
120
+ if !hostname
121
+ context.verify_hostname = false # In test code, using hostname to be connected is very difficult
122
+ end
123
+
124
+ context.verify_mode = OpenSSL::SSL::VERIFY_PEER
125
+ else
126
+ context.verify_mode = OpenSSL::SSL::VERIFY_NONE
127
+ end
128
+
129
+ client = Async::HTTP::Client.new(Async::HTTP::Endpoint.parse("https://#{addr}:#{port}", ssl_context: context))
130
+ reactor = Async::Reactor.new(nil, logger: NULL_LOGGER)
131
+
132
+ resp = nil
133
+ error = nil
134
+
135
+ reactor.run do
136
+ begin
137
+ response = yield(client)
138
+ rescue => e # Async::Reactor rescue all error. handle it by myself
139
+ error = e
140
+ end
141
+
142
+ if response
143
+ resp = Response.new(response.status.to_s, response.body.read, response.headers)
144
+ end
145
+ end
146
+
147
+ if error
148
+ raise error
149
+ else
150
+ resp
151
+ end
152
+ end
153
+
154
+ sub_test_case 'Create a HTTP server' do
155
+ test 'monunt given path' do
156
+ on_driver do |driver|
157
+ driver.http_server_create_http_server(:http_server_helper_test, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER) do |s|
158
+ s.get('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
159
+ s.post('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello post'] }
160
+ s.head('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello head'] }
161
+ s.put('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello put'] }
162
+ s.patch('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello patch'] }
163
+ s.delete('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello delete'] }
164
+ s.trace('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello trace'] }
165
+ s.options('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello options'] }
166
+ end
167
+
168
+ resp = head("http://127.0.0.1:#{@port}/example/hello")
169
+ assert_equal('200', resp.code)
170
+ assert_equal(nil, resp.body)
171
+ assert_equal('text/plain', resp['Content-Type'])
172
+
173
+ %w[get put post put delete options trace].each do |n|
174
+ resp = send(n, "http://127.0.0.1:#{@port}/example/hello")
175
+ assert_equal('200', resp.code)
176
+ assert_equal("hello #{n}", resp.body)
177
+ assert_equal('text/plain', resp['Content-Type'])
178
+ end
179
+ end
180
+ end
181
+
182
+ test 'when path does not start with `/` or ends with `/`' do
183
+ on_driver do |driver|
184
+ driver.http_server_create_http_server(:http_server_helper_test, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER) do |s|
185
+ s.get('example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
186
+ s.get('/example/hello2/') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
187
+ end
188
+
189
+ resp = get("http://127.0.0.1:#{@port}/example/hello")
190
+ assert_equal('404', resp.code)
191
+
192
+ resp = get("http://127.0.0.1:#{@port}/example/hello2")
193
+ assert_equal('200', resp.code)
194
+ end
195
+ end
196
+
197
+ test 'when error raised' do
198
+ on_driver do |driver|
199
+ driver.http_server_create_http_server(:http_server_helper_test, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER) do |s|
200
+ s.get('/example/hello') { raise 'error!' }
201
+ end
202
+
203
+ resp = get("http://127.0.0.1:#{@port}/example/hello")
204
+ assert_equal('500', resp.code)
205
+ end
206
+ end
207
+
208
+ test 'when path is not found' do
209
+ on_driver do |driver|
210
+ driver.http_server_create_http_server(:http_server_helper_test, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER) do |s|
211
+ s.get('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
212
+ end
213
+
214
+ resp = get("http://127.0.0.1:#{@port}/example/hello/not_found")
215
+ assert_equal('404', resp.code)
216
+ end
217
+ end
218
+
219
+ test 'params and body' do
220
+ on_driver do |driver|
221
+ driver.http_server_create_http_server(:http_server_helper_test, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER) do |s|
222
+ s.get('/example/hello') do |req|
223
+ assert_equal(req.query_string, nil)
224
+ assert_equal(req.body, nil)
225
+ [200, { 'Content-Type' => 'text/plain' }, 'hello get']
226
+ end
227
+
228
+ s.post('/example/hello') do |req|
229
+ assert_equal(req.query_string, nil)
230
+ assert_equal(req.body, 'this is body')
231
+ [200, { 'Content-Type' => 'text/plain' }, 'hello post']
232
+ end
233
+
234
+ s.get('/example/hello/params') do |req|
235
+ assert_equal(req.query_string, 'test=true')
236
+ assert_equal(req.body, nil)
237
+ [200, { 'Content-Type' => 'text/plain' }, 'hello get']
238
+ end
239
+
240
+ s.post('/example/hello/params') do |req|
241
+ assert_equal(req.query_string, 'test=true')
242
+ assert_equal(req.body, 'this is body')
243
+ [200, { 'Content-Type' => 'text/plain' }, 'hello post']
244
+ end
245
+ end
246
+
247
+ resp = get("http://127.0.0.1:#{@port}/example/hello")
248
+ assert_equal('200', resp.code)
249
+
250
+ resp = post("http://127.0.0.1:#{@port}/example/hello", 'this is body')
251
+ assert_equal('200', resp.code)
252
+
253
+ resp = get("http://127.0.0.1:#{@port}/example/hello/params?test=true")
254
+ assert_equal('200', resp.code)
255
+
256
+ resp = post("http://127.0.0.1:#{@port}/example/hello/params?test=true", 'this is body')
257
+ assert_equal('200', resp.code)
258
+ end
259
+ end
260
+
261
+ sub_test_case 'create a HTTPS server' do
262
+ test '#configure' do
263
+ driver = Dummy.new
264
+
265
+ transport_conf = config_element('transport', 'tls', { 'version' => 'TLSv1_1' })
266
+ driver.configure(config_element('ROOT', '', {}, [transport_conf]))
267
+ assert_equal :tls, driver.transport_config.protocol
268
+ assert_equal :TLSv1_1, driver.transport_config.version
269
+ end
270
+
271
+ sub_test_case '#http_server_create_https_server' do
272
+ test 'can overwrite settings by using tls_context' do
273
+ on_driver_transport({ 'insecure' => 'false' }) do |driver|
274
+ tls = { 'insecure' => 'true' } # overwrite
275
+ driver.http_server_create_https_server(:http_server_helper_test_tls, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER, tls_opts: tls) do |s|
276
+ s.get('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
277
+ end
278
+
279
+ resp = secure_get("https://127.0.0.1:#{@port}/example/hello", verify: false)
280
+ assert_equal('200', resp.code)
281
+ assert_equal('hello get', resp.body)
282
+ end
283
+ end
284
+
285
+ test 'with insecure in transport section' do
286
+ on_driver_transport({ 'insecure' => 'true' }) do |driver|
287
+ driver.http_server_create_https_server(:http_server_helper_test_tls, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER) do |s|
288
+ s.get('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
289
+ end
290
+ omit "TLS connection should be aborted due to `Errno::ECONNABORTED`. Need to debug." if Fluent.windows?
291
+
292
+ resp = secure_get("https://127.0.0.1:#{@port}/example/hello", verify: false)
293
+ assert_equal('200', resp.code)
294
+ assert_equal('hello get', resp.body)
295
+
296
+ assert_raise OpenSSL::SSL::SSLError do
297
+ secure_get("https://127.0.0.1:#{@port}/example/hello")
298
+ end
299
+ end
300
+ end
301
+
302
+ data(
303
+ 'with passphrase' => ['apple', 'cert-pass.pem', 'cert-key-pass.pem'],
304
+ 'without passphrase' => [nil, 'cert.pem', 'cert-key.pem'])
305
+ test 'load self-signed cert/key pair, verified from clients using cert files' do |(passphrase, cert, private_key)|
306
+ omit "Self signed certificate blocks TLS connection. Need to debug." if Fluent.windows?
307
+
308
+ cert_path = File.join(CERT_DIR, cert)
309
+ private_key_path = File.join(CERT_DIR, private_key)
310
+ opt = { 'insecure' => 'false', 'private_key_path' => private_key_path, 'cert_path' => cert_path }
311
+ if passphrase
312
+ opt['private_key_passphrase'] = passphrase
313
+ end
314
+
315
+ on_driver_transport(opt) do |driver|
316
+ driver.http_server_create_https_server(:http_server_helper_test_tls, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER) do |s|
317
+ s.get('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
318
+ end
319
+
320
+ resp = secure_get("https://127.0.0.1:#{@port}/example/hello", cert_path: cert_path)
321
+ assert_equal('200', resp.code)
322
+ assert_equal('hello get', resp.body)
323
+ end
324
+ end
325
+
326
+ data(
327
+ 'with passphrase' => ['apple', 'cert-pass.pem', 'cert-key-pass.pem', 'ca-cert-pass.pem'],
328
+ 'without passphrase' => [nil, 'cert.pem', 'cert-key.pem', 'ca-cert.pem'])
329
+ test 'load cert by private CA cert file, verified from clients using CA cert file' do |(passphrase, cert, cert_key, ca_cert)|
330
+ omit "Self signed certificate blocks TLS connection. Need to debug." if Fluent.windows?
331
+
332
+ cert_path = File.join(CERT_CA_DIR, cert)
333
+ private_key_path = File.join(CERT_CA_DIR, cert_key)
334
+
335
+ ca_cert_path = File.join(CERT_CA_DIR, ca_cert)
336
+
337
+ opt = { 'insecure' => 'false', 'cert_path' => cert_path, 'private_key_path' => private_key_path }
338
+ if passphrase
339
+ opt['private_key_passphrase'] = passphrase
340
+ end
341
+
342
+ on_driver_transport(opt) do |driver|
343
+ driver.http_server_create_https_server(:http_server_helper_test_tls, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER) do |s|
344
+ s.get('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
345
+ end
346
+
347
+ resp = secure_get("https://127.0.0.1:#{@port}/example/hello", cert_path: ca_cert_path)
348
+ assert_equal('200', resp.code)
349
+ assert_equal('hello get', resp.body)
350
+ end
351
+ end
352
+ end
353
+ end
354
+
355
+ test 'must be called #start and #stop' do
356
+ on_driver do |driver|
357
+ server = flexmock('Server') do |watcher|
358
+ watcher.should_receive(:start).once.and_return do |que|
359
+ que.push(:start)
360
+ end
361
+ watcher.should_receive(:stop).once
362
+ end
363
+
364
+ stub(Fluent::PluginHelper::HttpServer::Server).new(addr: anything, port: anything, logger: anything, default_app: anything) { server }
365
+ driver.http_server_create_http_server(:http_server_helper_test, addr: '127.0.0.1', port: @port, logger: NULL_LOGGER) do
366
+ # nothing
367
+ end
368
+ driver.stop
369
+ end
370
+ end
371
+ end
372
+ end