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,1180 @@
1
+ require_relative '../helper'
2
+
3
+ require 'fluent/test/driver/input'
4
+ require 'fluent/test/startup_shutdown'
5
+ require 'base64'
6
+
7
+ require 'fluent/env'
8
+ require 'fluent/event'
9
+ require 'fluent/plugin/in_forward'
10
+ require 'fluent/plugin/compressable'
11
+
12
+ require 'timecop'
13
+
14
+ class ForwardInputTest < Test::Unit::TestCase
15
+ include Fluent::Plugin::Compressable
16
+
17
+ def setup
18
+ Fluent::Test.setup
19
+ @responses = [] # for testing responses after sending data
20
+ @d = nil
21
+ @port = unused_port
22
+ end
23
+
24
+ def teardown
25
+ @d.instance_shutdown if @d
26
+ @port = nil
27
+ end
28
+
29
+ SHARED_KEY = 'foobar1'
30
+ USER_NAME = 'tagomoris'
31
+ USER_PASSWORD = 'fluentd'
32
+
33
+ def base_config
34
+ %[
35
+ port #{@port}
36
+ bind 127.0.0.1
37
+ ]
38
+ end
39
+ LOCALHOST_HOSTNAME_GETTER = ->(){sock = UDPSocket.new(::Socket::AF_INET); sock.do_not_reverse_lookup = false; sock.connect("127.0.0.1", 2048); sock.peeraddr[2] }
40
+ LOCALHOST_HOSTNAME = LOCALHOST_HOSTNAME_GETTER.call
41
+ DUMMY_SOCK = Struct.new(:remote_host, :remote_addr, :remote_port).new(LOCALHOST_HOSTNAME, "127.0.0.1", 0)
42
+
43
+ def config_auth
44
+ base_config + %[
45
+ <security>
46
+ self_hostname localhost
47
+ shared_key foobar1
48
+ user_auth true
49
+ <user>
50
+ username #{USER_NAME}
51
+ password #{USER_PASSWORD}
52
+ </user>
53
+ <client>
54
+ network 127.0.0.0/8
55
+ shared_key #{SHARED_KEY}
56
+ users ["#{USER_NAME}"]
57
+ </client>
58
+ </security>
59
+ ]
60
+ end
61
+
62
+ def create_driver(conf=base_config)
63
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::ForwardInput).configure(conf)
64
+ end
65
+
66
+ sub_test_case '#configure' do
67
+ test 'simple' do
68
+ @d = d = create_driver
69
+ assert_equal @port, d.instance.port
70
+ assert_equal '127.0.0.1', d.instance.bind
71
+ assert_equal 0, d.instance.linger_timeout
72
+ assert_equal 0.5, d.instance.blocking_timeout
73
+ assert !d.instance.backlog
74
+ end
75
+
76
+ test 'auth' do
77
+ @d = d = create_driver(config_auth)
78
+ assert_equal @port, d.instance.port
79
+ assert_equal '127.0.0.1', d.instance.bind
80
+ assert_equal 0, d.instance.linger_timeout
81
+ assert !d.instance.backlog
82
+
83
+ assert d.instance.security
84
+ assert_equal 1, d.instance.security.users.size
85
+ assert_equal 1, d.instance.security.clients.size
86
+ end
87
+
88
+ data(tag: "tag",
89
+ add_tag_prefix: "add_tag_prefix")
90
+ test 'tag parameters' do |data|
91
+ assert_raise(Fluent::ConfigError.new("'#{data}' parameter must not be empty")) {
92
+ create_driver(base_config + "#{data} ''")
93
+ }
94
+ end
95
+
96
+ test 'send_keepalive_packet is disabled by default' do
97
+ @d = d = create_driver(config_auth)
98
+ assert_false d.instance.send_keepalive_packet
99
+ end
100
+
101
+ test 'send_keepalive_packet can be enabled' do
102
+ @d = d = create_driver(config_auth + %[
103
+ send_keepalive_packet true
104
+ ])
105
+ assert_true d.instance.send_keepalive_packet
106
+ end
107
+
108
+ test 'both send_keepalive_packet and deny_keepalive cannot be enabled' do
109
+ assert_raise(Fluent::ConfigError.new("both 'send_keepalive_packet' and 'deny_keepalive' cannot be set to true")) do
110
+ create_driver(config_auth + %[
111
+ send_keepalive_packet true
112
+ deny_keepalive true
113
+ ])
114
+ end
115
+ end
116
+ end
117
+
118
+ sub_test_case 'message' do
119
+ test 'time' do
120
+ time = event_time("2011-01-02 13:14:15 UTC")
121
+ begin
122
+ Timecop.freeze(Time.at(time))
123
+ @d = d = create_driver
124
+
125
+ records = [
126
+ ["tag1", time, {"a"=>1}],
127
+ ["tag2", time, {"a"=>2}],
128
+ ]
129
+
130
+ d.run(expect_records: records.length, timeout: 5) do
131
+ records.each {|tag, _time, record|
132
+ send_data packer.write([tag, 0, record]).to_s
133
+ }
134
+ end
135
+ assert_equal(records, d.events.sort_by {|a| a[0] })
136
+ ensure
137
+ Timecop.return
138
+ end
139
+ end
140
+
141
+ test 'plain' do
142
+ @d = d = create_driver
143
+
144
+ time = event_time("2011-01-02 13:14:15 UTC")
145
+
146
+ records = [
147
+ ["tag1", time, {"a"=>1}],
148
+ ["tag2", time, {"a"=>2}],
149
+ ]
150
+
151
+ d.run(expect_records: records.length, timeout: 5) do
152
+ records.each {|tag, _time, record|
153
+ send_data packer.write([tag, _time, record]).to_s
154
+ }
155
+ end
156
+ assert_equal(records, d.events)
157
+ end
158
+
159
+ test 'time_as_integer' do
160
+ @d = d = create_driver
161
+
162
+ time_i = event_time("2011-01-02 13:14:15 UTC").to_i
163
+
164
+ records = [
165
+ ["tag1", time_i, {"a"=>1}],
166
+ ["tag2", time_i, {"a"=>2}],
167
+ ]
168
+
169
+ d.run(expect_records: records.length, timeout: 5) do
170
+ records.each {|tag, _time, record|
171
+ send_data packer.write([tag, _time, record]).to_s
172
+ }
173
+ end
174
+
175
+ assert_equal(records, d.events)
176
+ end
177
+
178
+ test 'skip_invalid_event' do
179
+ @d = d = create_driver(base_config + "skip_invalid_event true")
180
+
181
+ time = event_time("2011-01-02 13:14:15 UTC")
182
+
183
+ records = [
184
+ ["tag1", time, {"a" => 1}],
185
+ ["tag2", time, {"a" => 2}],
186
+ ]
187
+
188
+ d.run(shutdown: false, expect_records: 2, timeout: 10) do
189
+ entries = []
190
+ # These entries are skipped
191
+ entries << ['tag1', true, {'a' => 3}] << ['tag2', time, 'invalid record']
192
+ entries += records.map { |tag, _time, record| [tag, _time, record] }
193
+
194
+ entries.each {|tag, _time, record|
195
+ # Without ack, logs are sometimes not saved to logs during test.
196
+ send_data packer.write([tag, _time, record]).to_s #, try_to_receive_response: true
197
+ }
198
+ end
199
+
200
+ logs = d.instance.log.logs
201
+ assert_equal 2, logs.count { |line| line =~ /got invalid event and drop it/ }
202
+ assert_equal records[0], d.events[0]
203
+ assert_equal records[1], d.events[1]
204
+
205
+ d.instance_shutdown
206
+ end
207
+
208
+ test 'json_using_integer_time' do
209
+ @d = d = create_driver
210
+
211
+ time_i = event_time("2011-01-02 13:14:15 UTC").to_i
212
+
213
+ records = [
214
+ ["tag1", time_i, {"a"=>1}],
215
+ ["tag2", time_i, {"a"=>2}],
216
+ ]
217
+
218
+ d.run(expect_records: records.length, timeout: 20) do
219
+ records.each {|tag, _time, record|
220
+ send_data [tag, _time, record].to_json
221
+ }
222
+ end
223
+
224
+ assert_equal(records, d.events.sort_by {|a| a[0] })
225
+ end
226
+
227
+ test 'json_with_newline' do
228
+ @d = d = create_driver
229
+
230
+ time_i = event_time("2011-01-02 13:14:15 UTC").to_i
231
+
232
+ records = [
233
+ ["tag1", time_i, {"a"=>1}],
234
+ ["tag2", time_i, {"a"=>2}],
235
+ ]
236
+
237
+ d.run(expect_records: records.length, timeout: 20, shutdown: true) do
238
+ records.each {|tag, _time, record|
239
+ send_data [tag, _time, record].to_json + "\n"
240
+ }
241
+ end
242
+
243
+ assert_equal(records, d.events.sort_by {|a| a[0] })
244
+ end
245
+ end
246
+
247
+ sub_test_case 'forward' do
248
+ data(tcp: {
249
+ options: {
250
+ auth: false
251
+ }
252
+ },
253
+ auth: {
254
+ options: {
255
+ auth: true
256
+ }
257
+ })
258
+ test 'plain' do |data|
259
+ options = data[:options]
260
+ config = options[:auth] ? config_auth : base_config
261
+ @d = d = create_driver(config)
262
+
263
+ time = event_time("2011-01-02 13:14:15 UTC")
264
+
265
+ records = [
266
+ ["tag1", time, {"a"=>1}],
267
+ ["tag1", time, {"a"=>2}]
268
+ ]
269
+
270
+ d.run(expect_records: records.length, timeout: 20) do
271
+ entries = []
272
+ records.each {|tag, _time, record|
273
+ entries << [_time, record]
274
+ }
275
+ send_data packer.write(["tag1", entries]).to_s, **options
276
+ end
277
+ assert_equal(records, d.events)
278
+ end
279
+
280
+ data(tag: {
281
+ param: "tag new_tag",
282
+ result: "new_tag"
283
+ },
284
+ add_tag_prefix: {
285
+ param: "add_tag_prefix new_prefix",
286
+ result: "new_prefix.tag1"
287
+ })
288
+ test 'tag parameters' do |data|
289
+ @d = create_driver(base_config + data[:param])
290
+ time = event_time("2011-01-02 13:14:15 UTC")
291
+ options = {auth: false}
292
+
293
+ records = [
294
+ ["tag1", time, {"a"=>1}],
295
+ ["tag1", time, {"a"=>2}],
296
+ ]
297
+
298
+ @d.run(expect_records: records.length, timeout: 20) do
299
+ entries = []
300
+ records.each {|tag, _time, record|
301
+ entries << [_time, record]
302
+ }
303
+ send_data packer.write(["tag1", entries]).to_s, **options
304
+ end
305
+ assert_equal(data[:result], @d.events[0][0])
306
+ end
307
+
308
+ data(tcp: {
309
+ options: {
310
+ auth: false
311
+ }
312
+ },
313
+ auth: {
314
+ options: {
315
+ auth: true
316
+ }
317
+ })
318
+ test 'time_as_integer' do |data|
319
+ options = data[:options]
320
+ config = options[:auth] ? config_auth : base_config
321
+ @d = d = create_driver(config)
322
+
323
+ time_i = event_time("2011-01-02 13:14:15 UTC")
324
+
325
+ records = [
326
+ ["tag1", time_i, {"a"=>1}],
327
+ ["tag1", time_i, {"a"=>2}]
328
+ ]
329
+
330
+ d.run(expect_records: records.length, timeout: 20) do
331
+ entries = []
332
+ records.each {|tag, _time, record|
333
+ entries << [_time, record]
334
+ }
335
+ send_data packer.write(["tag1", entries]).to_s, **options
336
+ end
337
+
338
+ assert_equal(records, d.events)
339
+ end
340
+
341
+ data(tcp: {
342
+ options: {
343
+ auth: false
344
+ }
345
+ },
346
+ auth: {
347
+ options: {
348
+ auth: true
349
+ }
350
+ })
351
+ test 'skip_invalid_event' do |data|
352
+ options = data[:options]
353
+ config = options[:auth] ? config_auth : base_config
354
+ @d = d = create_driver(config + "skip_invalid_event true")
355
+
356
+ time = event_time("2011-01-02 13:14:15 UTC")
357
+
358
+ records = [
359
+ ["tag1", time, {"a" => 1}],
360
+ ["tag1", time, {"a" => 2}],
361
+ ]
362
+
363
+ d.run(shutdown: false, expect_records: records.length, timeout: 20) do
364
+ entries = records.map { |tag, _time, record| [_time, record] }
365
+ # These entries are skipped
366
+ entries << ['invalid time', {'a' => 3}] << [time, 'invalid record']
367
+
368
+ send_data packer.write(["tag1", entries]).to_s, **options
369
+ end
370
+
371
+ logs = d.instance.log.out.logs
372
+ assert{ logs.select{|line| line =~ /skip invalid event/ }.size == 2 }
373
+
374
+ d.instance_shutdown
375
+ end
376
+ end
377
+
378
+ sub_test_case 'packed forward' do
379
+ data(tcp: {
380
+ options: {
381
+ auth: false
382
+ }
383
+ },
384
+ auth: {
385
+ options: {
386
+ auth: true
387
+ }
388
+ })
389
+ test 'plain' do |data|
390
+ options = data[:options]
391
+ config = options[:auth] ? config_auth : base_config
392
+ @d = d = create_driver(config)
393
+
394
+ time = event_time("2011-01-02 13:14:15 UTC")
395
+
396
+ records = [
397
+ ["tag1", time, {"a"=>1}],
398
+ ["tag1", time, {"a"=>2}],
399
+ ]
400
+
401
+ d.run(expect_records: records.length, timeout: 20) do
402
+ entries = ''
403
+ records.each {|_tag, _time, record|
404
+ packer(entries).write([_time, record]).flush
405
+ }
406
+ send_data packer.write(["tag1", entries]).to_s, **options
407
+ end
408
+ assert_equal(records, d.events)
409
+ end
410
+
411
+ data(tag: {
412
+ param: "tag new_tag",
413
+ result: "new_tag"
414
+ },
415
+ add_tag_prefix: {
416
+ param: "add_tag_prefix new_prefix",
417
+ result: "new_prefix.tag1"
418
+ })
419
+ test 'tag parameters' do |data|
420
+ @d = create_driver(base_config + data[:param])
421
+ time = event_time("2011-01-02 13:14:15 UTC")
422
+ options = {auth: false}
423
+
424
+ records = [
425
+ ["tag1", time, {"a"=>1}],
426
+ ["tag1", time, {"a"=>2}],
427
+ ]
428
+
429
+ @d.run(expect_records: records.length, timeout: 20) do
430
+ entries = ''
431
+ records.each {|_tag, _time, record|
432
+ packer(entries).write([_time, record]).flush
433
+ }
434
+ send_data packer.write(["tag1", entries]).to_s, **options
435
+ end
436
+ assert_equal(data[:result], @d.events[0][0])
437
+ end
438
+
439
+ data(tcp: {
440
+ options: {
441
+ auth: false
442
+ }
443
+ },
444
+ auth: {
445
+ options: {
446
+ auth: true
447
+ }
448
+ })
449
+ test 'time_as_integer' do |data|
450
+ options = data[:options]
451
+ config = options[:auth] ? config_auth : base_config
452
+ @d = d = create_driver(config)
453
+
454
+ time_i = event_time("2011-01-02 13:14:15 UTC").to_i
455
+
456
+ records = [
457
+ ["tag1", time_i, {"a"=>1}],
458
+ ["tag1", time_i, {"a"=>2}],
459
+ ]
460
+
461
+ d.run(expect_records: records.length, timeout: 20) do
462
+ entries = ''
463
+ records.each {|tag, _time, record|
464
+ packer(entries).write([_time, record]).flush
465
+ }
466
+ send_data packer.write(["tag1", entries]).to_s, **options
467
+ end
468
+ assert_equal(records, d.events)
469
+ end
470
+
471
+ data(tcp: {
472
+ options: {
473
+ auth: false
474
+ }
475
+ },
476
+ auth: {
477
+ options: {
478
+ auth: true
479
+ }
480
+ })
481
+ test 'skip_invalid_event' do |data|
482
+ options = data[:options]
483
+ config = options[:auth] ? config_auth : base_config
484
+ @d = d = create_driver(config + "skip_invalid_event true")
485
+
486
+ time = event_time("2011-01-02 13:14:15 UTC")
487
+
488
+ records = [
489
+ ["tag1", time, {"a" => 1}],
490
+ ["tag1", time, {"a" => 2}],
491
+ ]
492
+
493
+ d.run(shutdown: false, expect_records: records.length, timeout: 20) do
494
+ entries = records.map { |tag, _time, record| [_time, record] }
495
+ # These entries are skipped
496
+ entries << ['invalid time', {'a' => 3}] << [time, 'invalid record']
497
+
498
+ packed_entries = ''
499
+ entries.each { |_time, record|
500
+ packer(packed_entries).write([_time, record]).flush
501
+ }
502
+ send_data packer.write(["tag1", packed_entries]).to_s, **options
503
+ end
504
+
505
+ logs = d.instance.log.logs
506
+ assert_equal 2, logs.count { |line| line =~ /skip invalid event/ }
507
+
508
+ d.instance_shutdown
509
+ end
510
+ end
511
+
512
+ sub_test_case 'compressed packed forward' do
513
+ test 'set_compress_to_option' do
514
+ @d = d = create_driver
515
+
516
+ time_i = event_time("2011-01-02 13:14:15 UTC").to_i
517
+ events = [
518
+ ["tag1", time_i, {"a"=>1}],
519
+ ["tag1", time_i, {"a"=>2}]
520
+ ]
521
+
522
+ # create compressed entries
523
+ entries = ''
524
+ events.each do |_tag, _time, record|
525
+ v = [_time, record].to_msgpack
526
+ entries << compress(v)
527
+ end
528
+ chunk = ["tag1", entries, { 'compressed' => 'gzip' }].to_msgpack
529
+
530
+ d.run do
531
+ Fluent::MessagePackFactory.msgpack_unpacker.feed_each(chunk) do |obj|
532
+ option = d.instance.send(:on_message, obj, chunk.size, DUMMY_SOCK)
533
+ assert_equal 'gzip', option['compressed']
534
+ end
535
+ end
536
+
537
+ assert_equal events, d.events
538
+ end
539
+
540
+ test 'create_CompressedMessagePackEventStream_with_gzip_compress_option' do
541
+ @d = d = create_driver
542
+
543
+ time_i = event_time("2011-01-02 13:14:15 UTC").to_i
544
+ events = [
545
+ ["tag1", time_i, {"a"=>1}],
546
+ ["tag1", time_i, {"a"=>2}]
547
+ ]
548
+
549
+ # create compressed entries
550
+ entries = ''
551
+ events.each do |_tag, _time, record|
552
+ v = [_time, record].to_msgpack
553
+ entries << compress(v)
554
+ end
555
+ chunk = ["tag1", entries, { 'compressed' => 'gzip' }].to_msgpack
556
+
557
+ # check CompressedMessagePackEventStream is created
558
+ mock(Fluent::CompressedMessagePackEventStream).new(entries, nil, 0)
559
+
560
+ d.run do
561
+ Fluent::MessagePackFactory.msgpack_unpacker.feed_each(chunk) do |obj|
562
+ option = d.instance.send(:on_message, obj, chunk.size, DUMMY_SOCK)
563
+ assert_equal 'gzip', option['compressed']
564
+ end
565
+ end
566
+ end
567
+ end
568
+
569
+ sub_test_case 'warning' do
570
+ test 'send_large_chunk_warning' do
571
+ @d = d = create_driver(base_config + %[
572
+ chunk_size_warn_limit 16M
573
+ chunk_size_limit 32M
574
+ ])
575
+
576
+ time = event_time("2014-04-25 13:14:15 UTC")
577
+
578
+ # generate over 16M chunk
579
+ str = "X" * 1024 * 1024
580
+ chunk = [ "test.tag", (0...16).map{|i| [time + i, {"data" => str}] } ].to_msgpack
581
+ assert chunk.size > (16 * 1024 * 1024)
582
+ assert chunk.size < (32 * 1024 * 1024)
583
+
584
+ d.run(shutdown: false) do
585
+ Fluent::MessagePackFactory.msgpack_unpacker.feed_each(chunk) do |obj|
586
+ d.instance.send(:on_message, obj, chunk.size, DUMMY_SOCK)
587
+ end
588
+ end
589
+
590
+ # check emitted data
591
+ emits = d.events
592
+ assert_equal 16, emits.size
593
+ assert emits.map(&:first).all?{|t| t == "test.tag" }
594
+ assert_equal (0...16).to_a, emits.map{|_tag, t, _record| t - time }
595
+
596
+ # check log
597
+ logs = d.instance.log.logs
598
+ assert_equal 1, logs.select{|line|
599
+ line =~ / \[warn\]: Input chunk size is larger than 'chunk_size_warn_limit':/ &&
600
+ line =~ / tag="test.tag" host="#{LOCALHOST_HOSTNAME}" limit=16777216 size=16777501/
601
+ }.size, "large chunk warning is not logged"
602
+
603
+ d.instance_shutdown
604
+ end
605
+
606
+ test 'send_large_chunk_only_warning' do
607
+ @d = d = create_driver(base_config + %[
608
+ chunk_size_warn_limit 16M
609
+ ])
610
+ time = event_time("2014-04-25 13:14:15 UTC")
611
+
612
+ # generate over 16M chunk
613
+ str = "X" * 1024 * 1024
614
+ chunk = [ "test.tag", (0...16).map{|i| [time + i, {"data" => str}] } ].to_msgpack
615
+
616
+ d.run(shutdown: false) do
617
+ Fluent::MessagePackFactory.msgpack_unpacker.feed_each(chunk) do |obj|
618
+ d.instance.send(:on_message, obj, chunk.size, DUMMY_SOCK)
619
+ end
620
+ end
621
+
622
+ # check log
623
+ logs = d.instance.log.logs
624
+ assert_equal 1, logs.select{ |line|
625
+ line =~ / \[warn\]: Input chunk size is larger than 'chunk_size_warn_limit':/ &&
626
+ line =~ / tag="test.tag" host="#{LOCALHOST_HOSTNAME}" limit=16777216 size=16777501/
627
+ }.size, "large chunk warning is not logged"
628
+
629
+ d.instance_shutdown
630
+ end
631
+
632
+ test 'send_large_chunk_limit' do
633
+ @d = d = create_driver(base_config + %[
634
+ chunk_size_warn_limit 16M
635
+ chunk_size_limit 32M
636
+ ])
637
+
638
+ time = event_time("2014-04-25 13:14:15 UTC")
639
+
640
+ # generate over 32M chunk
641
+ str = "X" * 1024 * 1024
642
+ chunk = [ "test.tag", (0...32).map{|i| [time + i, {"data" => str}] } ].to_msgpack
643
+ assert chunk.size > (32 * 1024 * 1024)
644
+
645
+ # d.run => send_data
646
+ d.run(shutdown: false) do
647
+ Fluent::MessagePackFactory.msgpack_unpacker.feed_each(chunk) do |obj|
648
+ d.instance.send(:on_message, obj, chunk.size, DUMMY_SOCK)
649
+ end
650
+ end
651
+
652
+ # check emitted data
653
+ emits = d.events
654
+ assert_equal 0, emits.size
655
+
656
+ # check log
657
+ logs = d.instance.log.logs
658
+ assert_equal 1, logs.select{|line|
659
+ line =~ / \[warn\]: Input chunk size is larger than 'chunk_size_limit', dropped:/ &&
660
+ line =~ / tag="test.tag" host="#{LOCALHOST_HOSTNAME}" limit=33554432 size=33554989/
661
+ }.size, "large chunk warning is not logged"
662
+
663
+ d.instance_shutdown
664
+ end
665
+
666
+ data('string chunk' => 'broken string',
667
+ 'integer chunk' => 10)
668
+ test 'send_broken_chunk' do |data|
669
+ @d = d = create_driver
670
+
671
+ # d.run => send_data
672
+ d.run(shutdown: false) do
673
+ d.instance.send(:on_message, data, 1000000000, DUMMY_SOCK)
674
+ end
675
+
676
+ # check emitted data
677
+ assert_equal 0, d.events.size
678
+
679
+ # check log
680
+ logs = d.instance.log.logs
681
+ assert_equal 1, logs.select{|line|
682
+ line =~ / \[warn\]: incoming chunk is broken: host="#{LOCALHOST_HOSTNAME}" msg=#{data.inspect}/
683
+ }.size, "should not accept broken chunk"
684
+
685
+ d.instance_shutdown
686
+ end
687
+ end
688
+
689
+ sub_test_case 'respond to required ack' do
690
+ data(tcp: {
691
+ options: {
692
+ auth: false
693
+ }
694
+ },
695
+ auth: {
696
+ options: {
697
+ auth: true
698
+ }
699
+ })
700
+ test 'message' do |data|
701
+ options = data[:options]
702
+ config = options[:auth] ? config_auth : base_config
703
+ @d = d = create_driver(config)
704
+
705
+ time = event_time("2011-01-02 13:14:15 UTC")
706
+
707
+ events = [
708
+ ["tag1", time, {"a"=>1}],
709
+ ["tag2", time, {"a"=>2}]
710
+ ]
711
+
712
+ expected_acks = []
713
+
714
+ d.run(expect_records: events.size) do
715
+ events.each {|tag, _time, record|
716
+ op = { 'chunk' => Base64.encode64(record.object_id.to_s) }
717
+ expected_acks << op['chunk']
718
+ send_data([tag, _time, record, op].to_msgpack, try_to_receive_response: true, response_timeout: 1, **options)
719
+ }
720
+ end
721
+
722
+ assert_equal events, d.events
723
+ assert_equal expected_acks, @responses.map { |res| MessagePack.unpack(res)['ack'] }
724
+ end
725
+
726
+ # FIX: response is not pushed into @responses because IO.select has been blocked until InputForward shutdowns
727
+ data(tcp: {
728
+ options: {
729
+ auth: false
730
+ }
731
+ },
732
+ auth: {
733
+ options: {
734
+ auth: true
735
+ }
736
+ })
737
+ test 'forward' do |data|
738
+ options = data[:options]
739
+ config = options[:auth] ? config_auth : base_config
740
+ @d = d = create_driver(config)
741
+
742
+ time = event_time("2011-01-02 13:14:15 UTC")
743
+
744
+ events = [
745
+ ["tag1", time, {"a"=>1}],
746
+ ["tag1", time, {"a"=>2}]
747
+ ]
748
+
749
+ expected_acks = []
750
+
751
+ d.run(expect_records: events.size) do
752
+ entries = []
753
+ events.each {|_tag, _time, record|
754
+ entries << [_time, record]
755
+ }
756
+ op = { 'chunk' => Base64.encode64(entries.object_id.to_s) }
757
+ expected_acks << op['chunk']
758
+ send_data(["tag1", entries, op].to_msgpack, try_to_receive_response: true, response_timeout: 1, **options)
759
+ end
760
+
761
+ assert_equal events, d.events
762
+ assert_equal expected_acks, @responses.map { |res| MessagePack.unpack(res)['ack'] }
763
+ end
764
+
765
+ data(tcp: {
766
+ options: {
767
+ auth: false
768
+ }
769
+ },
770
+ auth: {
771
+ options: {
772
+ auth: true
773
+ }
774
+ })
775
+ test 'packed_forward' do |data|
776
+ options = data[:options]
777
+ config = options[:auth] ? config_auth : base_config
778
+ @d = d = create_driver(config)
779
+
780
+ time = event_time("2011-01-02 13:14:15 UTC")
781
+
782
+ events = [
783
+ ["tag1", time, {"a"=>1}],
784
+ ["tag1", time, {"a"=>2}]
785
+ ]
786
+
787
+ expected_acks = []
788
+
789
+ d.run(expect_records: events.size) do
790
+ entries = ''
791
+ events.each {|_tag, _time,record|
792
+ [time, record].to_msgpack(entries)
793
+ }
794
+ op = { 'chunk' => Base64.encode64(entries.object_id.to_s) }
795
+ expected_acks << op['chunk']
796
+ send_data(["tag1", entries, op].to_msgpack, try_to_receive_response: true, response_timeout: 1, **options)
797
+ end
798
+
799
+ assert_equal events, d.events
800
+ assert_equal expected_acks, @responses.map { |res| MessagePack.unpack(res)['ack'] }
801
+ end
802
+
803
+ data(
804
+ tcp: {
805
+ options: {
806
+ auth: false
807
+ }
808
+ },
809
+ ### Auth is not supported with json
810
+ # auth: {
811
+ # options: {
812
+ # auth: true
813
+ # }
814
+ # },
815
+ )
816
+ test 'message_json' do |data|
817
+ options = data[:options]
818
+ config = options[:auth] ? config_auth : base_config
819
+ @d = d = create_driver(config)
820
+
821
+ time_i = event_time("2011-01-02 13:14:15 UTC")
822
+
823
+ events = [
824
+ ["tag1", time_i, {"a"=>1}],
825
+ ["tag2", time_i, {"a"=>2}]
826
+ ]
827
+
828
+ expected_acks = []
829
+
830
+ d.run(expect_records: events.size, timeout: 20) do
831
+ events.each {|tag, _time, record|
832
+ op = { 'chunk' => Base64.encode64(record.object_id.to_s) }
833
+ expected_acks << op['chunk']
834
+ send_data([tag, _time, record, op].to_json, try_to_receive_response: true, response_timeout: 1, **options)
835
+ }
836
+ end
837
+
838
+ assert_equal events, d.events
839
+ assert_equal expected_acks, @responses.map { |res| JSON.parse(res)['ack'] }
840
+ end
841
+ end
842
+
843
+ sub_test_case 'not respond without required ack' do
844
+ data(tcp: {
845
+ options: {
846
+ auth: false
847
+ }
848
+ },
849
+ auth: {
850
+ options: {
851
+ auth: true
852
+ }
853
+ })
854
+ test 'message' do |data|
855
+ options = data[:options]
856
+ config = options[:auth] ? config_auth : base_config
857
+ @d = d = create_driver(config)
858
+
859
+ time = event_time("2011-01-02 13:14:15 UTC")
860
+
861
+ events = [
862
+ ["tag1", time, {"a"=>1}],
863
+ ["tag2", time, {"a"=>2}]
864
+ ]
865
+
866
+ d.run(expect_records: events.size, timeout: 20) do
867
+ events.each {|tag, _time, record|
868
+ send_data([tag, _time, record].to_msgpack, try_to_receive_response: true, response_timeout: 1, **options)
869
+ }
870
+ end
871
+
872
+ assert_equal events, d.events
873
+ assert_equal [nil, nil], @responses
874
+ end
875
+
876
+ data(tcp: {
877
+ options: {
878
+ auth: false
879
+ }
880
+ },
881
+ auth: {
882
+ options: {
883
+ auth: true
884
+ }
885
+ })
886
+ test 'forward' do |data|
887
+ options = data[:options]
888
+ config = options[:auth] ? config_auth : base_config
889
+ @d = d = create_driver(config)
890
+
891
+ time = event_time("2011-01-02 13:14:15 UTC")
892
+
893
+ events = [
894
+ ["tag1", time, {"a"=>1}],
895
+ ["tag1", time, {"a"=>2}]
896
+ ]
897
+
898
+ d.run(expect_records: events.size, timeout: 20) do
899
+ entries = []
900
+ events.each {|tag, _time, record|
901
+ entries << [_time, record]
902
+ }
903
+ send_data(["tag1", entries].to_msgpack, try_to_receive_response: true, response_timeout: 1, **options)
904
+ end
905
+
906
+ assert_equal events, d.events
907
+ assert_equal [nil], @responses
908
+ end
909
+
910
+ data(tcp: {
911
+ options: {
912
+ auth: false
913
+ }
914
+ },
915
+ auth: {
916
+ options: {
917
+ auth: true
918
+ }
919
+ })
920
+ test 'packed_forward' do |data|
921
+ options = data[:options]
922
+ config = options[:auth] ? config_auth : base_config
923
+ @d = d = create_driver(config)
924
+
925
+ time = event_time("2011-01-02 13:14:15 UTC")
926
+
927
+ events = [
928
+ ["tag1", time, {"a"=>1}],
929
+ ["tag1", time, {"a"=>2}]
930
+ ]
931
+
932
+ d.run(expect_records: events.size, timeout: 20) do
933
+ entries = ''
934
+ events.each {|tag, _time, record|
935
+ [_time, record].to_msgpack(entries)
936
+ }
937
+ send_data(["tag1", entries].to_msgpack, try_to_receive_response: true, response_timeout: 1, **options)
938
+ end
939
+
940
+ assert_equal events, d.events
941
+ assert_equal [nil], @responses
942
+ end
943
+
944
+ data(
945
+ tcp: {
946
+ options: {
947
+ auth: false
948
+ }
949
+ },
950
+ ### Auth is not supported with json
951
+ # auth: {
952
+ # config: config_auth,
953
+ # options: {
954
+ # auth: true
955
+ # }
956
+ # },
957
+ )
958
+ test 'message_json' do |data|
959
+ options = data[:options]
960
+ config = options[:auth] ? config_auth : base_config
961
+ @d = d = create_driver(config)
962
+
963
+ time_i = event_time("2011-01-02 13:14:15 UTC").to_i
964
+
965
+ events = [
966
+ ["tag1", time_i, {"a"=>1}],
967
+ ["tag2", time_i, {"a"=>2}]
968
+ ]
969
+
970
+ d.run(expect_records: events.size, timeout: 20) do
971
+ events.each {|tag, _time, record|
972
+ send_data([tag, _time, record].to_json, try_to_receive_response: true, response_timeout: 1, **options)
973
+ }
974
+ end
975
+
976
+ assert_equal events, d.events
977
+ assert_equal [nil, nil], @responses
978
+ end
979
+ end
980
+
981
+ def packer(*args)
982
+ Fluent::MessagePackFactory.msgpack_packer(*args)
983
+ end
984
+
985
+ def unpacker
986
+ Fluent::MessagePackFactory.msgpack_unpacker
987
+ end
988
+
989
+ # res
990
+ # '' : socket is disconnected without any data
991
+ # nil: socket read timeout
992
+ def read_data(io, timeout, &block)
993
+ res = ''
994
+ select_timeout = 0.5
995
+ clock_id = Process::CLOCK_MONOTONIC_RAW rescue Process::CLOCK_MONOTONIC
996
+ timeout_at = Process.clock_gettime(clock_id) + timeout
997
+ begin
998
+ buf = ''
999
+ io_activated = false
1000
+ while Process.clock_gettime(clock_id) < timeout_at
1001
+ if IO.select([io], nil, nil, select_timeout)
1002
+ io_activated = true
1003
+ buf = io.readpartial(2048)
1004
+ res ||= ''
1005
+ res << buf
1006
+
1007
+ break if block.call(res)
1008
+ end
1009
+ end
1010
+ res = nil unless io_activated # timeout without no data arrival
1011
+ rescue Errno::EAGAIN
1012
+ sleep 0.01
1013
+ retry if res == ''
1014
+ # if res is not empty, all data in socket buffer are read, so do not retry
1015
+ rescue IOError, EOFError, Errno::ECONNRESET
1016
+ # socket disconnected
1017
+ end
1018
+ res
1019
+ end
1020
+
1021
+ def simulate_auth_sequence(io, shared_key=SHARED_KEY, username=USER_NAME, password=USER_PASSWORD)
1022
+ auth_response_timeout = 30
1023
+ shared_key_salt = 'salt'
1024
+
1025
+ # reading helo
1026
+ helo_data = read_data(io, auth_response_timeout){|data| MessagePack.unpack(data) rescue nil }
1027
+ raise "Authentication packet timeout" unless helo_data
1028
+ raise "Authentication connection closed" if helo_data == ''
1029
+ # ['HELO', options(hash)]
1030
+ helo = MessagePack.unpack(helo_data)
1031
+ raise "Invalid HELO header" unless helo[0] == 'HELO'
1032
+ raise "Invalid HELO option object" unless helo[1].is_a?(Hash)
1033
+ @options = helo[1]
1034
+
1035
+ # sending ping
1036
+ ping = [
1037
+ 'PING',
1038
+ 'selfhostname',
1039
+ shared_key_salt,
1040
+ Digest::SHA512.new
1041
+ .update(shared_key_salt)
1042
+ .update('selfhostname')
1043
+ .update(@options['nonce'])
1044
+ .update(shared_key).hexdigest,
1045
+ ]
1046
+ if @options['auth'] # auth enabled -> value is auth salt
1047
+ pass_digest = Digest::SHA512.new.update(@options['auth']).update(username).update(password).hexdigest
1048
+ ping.push(username, pass_digest)
1049
+ else
1050
+ ping.push('', '')
1051
+ end
1052
+ io.write ping.to_msgpack
1053
+ io.flush
1054
+
1055
+ # reading pong
1056
+ pong_data = read_data(io, auth_response_timeout){|data| MessagePack.unpack(data) rescue nil }
1057
+ raise "PONG packet timeout" unless pong_data
1058
+ raise "PONG connection closed" if pong_data == ''
1059
+ # ['PING', bool(auth_result), string(reason_if_failed), self_hostname, shared_key_digest]
1060
+ pong = MessagePack.unpack(pong_data)
1061
+ raise "Invalid PONG header" unless pong[0] == 'PONG'
1062
+ raise "Authentication Failure: #{pong[2]}" unless pong[1]
1063
+ clientside_calculated = Digest::SHA512.new
1064
+ .update(shared_key_salt)
1065
+ .update(pong[3])
1066
+ .update(@options['nonce'])
1067
+ .update(shared_key).hexdigest
1068
+ raise "Shared key digest mismatch" unless clientside_calculated == pong[4]
1069
+
1070
+ # authentication success
1071
+ true
1072
+ end
1073
+
1074
+ def connect
1075
+ TCPSocket.new('127.0.0.1', @port)
1076
+ end
1077
+
1078
+ # Data ordering is not assured:
1079
+ # Records in different sockets are processed on different thread, so its scheduling make effect
1080
+ # on order of emitted records.
1081
+ # So, we MUST sort emitted records in different `send_data` before assertion.
1082
+ def send_data(data, try_to_receive_response: false, response_timeout: 5, auth: false)
1083
+ io = connect
1084
+
1085
+ if auth
1086
+ simulate_auth_sequence(io)
1087
+ end
1088
+
1089
+ io.write data
1090
+ io.flush
1091
+ if try_to_receive_response
1092
+ @responses << read_data(io, response_timeout){|d| MessagePack.unpack(d) rescue nil }
1093
+ end
1094
+ ensure
1095
+ io.close rescue nil # SSL socket requires any writes to close sockets
1096
+ end
1097
+
1098
+ sub_test_case 'source_hostname_key and source_address_key features' do
1099
+ data(
1100
+ both: [:hostname, :address],
1101
+ hostname: [:hostname],
1102
+ address: [:address],
1103
+ )
1104
+ test 'message protocol' do |keys|
1105
+ execute_test_with_source_hostname_key(*keys) { |events|
1106
+ events.each { |tag, time, record|
1107
+ send_data [tag, time, record].to_msgpack
1108
+ }
1109
+ }
1110
+ end
1111
+
1112
+ data(
1113
+ both: [:hostname, :address],
1114
+ hostname: [:hostname],
1115
+ address: [:address],
1116
+ )
1117
+ test 'forward protocol' do |keys|
1118
+ execute_test_with_source_hostname_key(*keys) { |events|
1119
+ entries = []
1120
+ events.each {|tag,time,record|
1121
+ entries << [time, record]
1122
+ }
1123
+ send_data ['tag1', entries].to_msgpack
1124
+ }
1125
+ end
1126
+
1127
+ data(
1128
+ both: [:hostname, :address],
1129
+ hostname: [:hostname],
1130
+ address: [:address],
1131
+ )
1132
+ test 'packed forward protocol' do |keys|
1133
+ execute_test_with_source_hostname_key(*keys) { |events|
1134
+ entries = ''
1135
+ events.each { |tag, time, record|
1136
+ Fluent::MessagePackFactory.msgpack_packer(entries).write([time, record]).flush
1137
+ }
1138
+ send_data Fluent::MessagePackFactory.msgpack_packer.write(["tag1", entries]).to_s
1139
+ }
1140
+ end
1141
+ end
1142
+
1143
+ def execute_test_with_source_hostname_key(*keys, &block)
1144
+ conf = base_config.dup
1145
+ if keys.include?(:hostname)
1146
+ conf << <<EOL
1147
+ source_hostname_key source_hostname
1148
+ EOL
1149
+ end
1150
+ if keys.include?(:address)
1151
+ conf << <<EOL
1152
+ source_address_key source_address
1153
+ EOL
1154
+ end
1155
+ @d = d = create_driver(conf)
1156
+
1157
+ time = event_time("2011-01-02 13:14:15 UTC")
1158
+ events = [
1159
+ ["tag1", time, {"a"=>1}],
1160
+ ["tag1", time, {"a"=>2}]
1161
+ ]
1162
+
1163
+ d.run(expect_records: events.size) do
1164
+ block.call(events)
1165
+ end
1166
+
1167
+ d.events.each { |tag, _time, record|
1168
+ if keys.include?(:hostname)
1169
+ assert_true record.has_key?('source_hostname')
1170
+ assert_equal DUMMY_SOCK.remote_host, record['source_hostname']
1171
+ end
1172
+ if keys.include?(:address)
1173
+ assert_true record.has_key?('source_address')
1174
+ assert_equal DUMMY_SOCK.remote_addr, record['source_address']
1175
+ end
1176
+ }
1177
+ end
1178
+
1179
+ # TODO heartbeat
1180
+ end