fluentd 0.14.4-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (328) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +6 -0
  3. data/.gitignore +26 -0
  4. data/.travis.yml +45 -0
  5. data/AUTHORS +2 -0
  6. data/CONTRIBUTING.md +35 -0
  7. data/COPYING +14 -0
  8. data/ChangeLog +276 -0
  9. data/Gemfile +9 -0
  10. data/README.md +51 -0
  11. data/Rakefile +53 -0
  12. data/Vagrantfile +17 -0
  13. data/appveyor.yml +41 -0
  14. data/bin/fluent-debug +5 -0
  15. data/example/copy_roundrobin.conf +39 -0
  16. data/example/filter_stdout.conf +22 -0
  17. data/example/in_forward.conf +11 -0
  18. data/example/in_http.conf +14 -0
  19. data/example/in_out_forward.conf +17 -0
  20. data/example/in_syslog.conf +15 -0
  21. data/example/in_tail.conf +14 -0
  22. data/example/in_tcp.conf +13 -0
  23. data/example/in_udp.conf +13 -0
  24. data/example/multi_filters.conf +61 -0
  25. data/example/out_buffered_null.conf +32 -0
  26. data/example/out_copy.conf +20 -0
  27. data/example/out_file.conf +13 -0
  28. data/example/out_forward.conf +35 -0
  29. data/example/out_forward_buf_file.conf +23 -0
  30. data/example/v0_12_filter.conf +78 -0
  31. data/example/v1_literal_example.conf +36 -0
  32. data/fluent.conf +139 -0
  33. data/fluentd.gemspec +51 -0
  34. data/lib/fluent/agent.rb +194 -0
  35. data/lib/fluent/command/bundler_injection.rb +45 -0
  36. data/lib/fluent/command/cat.rb +319 -0
  37. data/lib/fluent/command/debug.rb +102 -0
  38. data/lib/fluent/command/fluentd.rb +273 -0
  39. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  40. data/lib/fluent/compat/exec_util.rb +129 -0
  41. data/lib/fluent/compat/file_util.rb +54 -0
  42. data/lib/fluent/compat/filter.rb +68 -0
  43. data/lib/fluent/compat/formatter.rb +111 -0
  44. data/lib/fluent/compat/formatter_utils.rb +85 -0
  45. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  46. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  47. data/lib/fluent/compat/input.rb +49 -0
  48. data/lib/fluent/compat/output.rb +677 -0
  49. data/lib/fluent/compat/output_chain.rb +60 -0
  50. data/lib/fluent/compat/parser.rb +180 -0
  51. data/lib/fluent/compat/parser_utils.rb +40 -0
  52. data/lib/fluent/compat/propagate_default.rb +62 -0
  53. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  54. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  55. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  56. data/lib/fluent/compat/socket_util.rb +165 -0
  57. data/lib/fluent/compat/string_util.rb +34 -0
  58. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  59. data/lib/fluent/compat/type_converter.rb +90 -0
  60. data/lib/fluent/config.rb +56 -0
  61. data/lib/fluent/config/basic_parser.rb +123 -0
  62. data/lib/fluent/config/configure_proxy.rb +366 -0
  63. data/lib/fluent/config/dsl.rb +149 -0
  64. data/lib/fluent/config/element.rb +218 -0
  65. data/lib/fluent/config/error.rb +26 -0
  66. data/lib/fluent/config/literal_parser.rb +251 -0
  67. data/lib/fluent/config/parser.rb +107 -0
  68. data/lib/fluent/config/section.rb +212 -0
  69. data/lib/fluent/config/types.rb +136 -0
  70. data/lib/fluent/config/v1_parser.rb +190 -0
  71. data/lib/fluent/configurable.rb +176 -0
  72. data/lib/fluent/daemon.rb +15 -0
  73. data/lib/fluent/engine.rb +220 -0
  74. data/lib/fluent/env.rb +27 -0
  75. data/lib/fluent/event.rb +287 -0
  76. data/lib/fluent/event_router.rb +259 -0
  77. data/lib/fluent/filter.rb +21 -0
  78. data/lib/fluent/formatter.rb +23 -0
  79. data/lib/fluent/input.rb +21 -0
  80. data/lib/fluent/label.rb +38 -0
  81. data/lib/fluent/load.rb +36 -0
  82. data/lib/fluent/log.rb +445 -0
  83. data/lib/fluent/match.rb +141 -0
  84. data/lib/fluent/mixin.rb +31 -0
  85. data/lib/fluent/msgpack_factory.rb +62 -0
  86. data/lib/fluent/output.rb +26 -0
  87. data/lib/fluent/output_chain.rb +23 -0
  88. data/lib/fluent/parser.rb +23 -0
  89. data/lib/fluent/plugin.rb +161 -0
  90. data/lib/fluent/plugin/bare_output.rb +63 -0
  91. data/lib/fluent/plugin/base.rb +130 -0
  92. data/lib/fluent/plugin/buf_file.rb +154 -0
  93. data/lib/fluent/plugin/buf_memory.rb +34 -0
  94. data/lib/fluent/plugin/buffer.rb +603 -0
  95. data/lib/fluent/plugin/buffer/chunk.rb +160 -0
  96. data/lib/fluent/plugin/buffer/file_chunk.rb +323 -0
  97. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  98. data/lib/fluent/plugin/exec_util.rb +22 -0
  99. data/lib/fluent/plugin/file_util.rb +22 -0
  100. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  101. data/lib/fluent/plugin/filter.rb +93 -0
  102. data/lib/fluent/plugin/filter_grep.rb +75 -0
  103. data/lib/fluent/plugin/filter_record_transformer.rb +342 -0
  104. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  105. data/lib/fluent/plugin/formatter.rb +45 -0
  106. data/lib/fluent/plugin/formatter_csv.rb +47 -0
  107. data/lib/fluent/plugin/formatter_hash.rb +29 -0
  108. data/lib/fluent/plugin/formatter_json.rb +44 -0
  109. data/lib/fluent/plugin/formatter_ltsv.rb +41 -0
  110. data/lib/fluent/plugin/formatter_msgpack.rb +29 -0
  111. data/lib/fluent/plugin/formatter_out_file.rb +78 -0
  112. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  113. data/lib/fluent/plugin/formatter_stdout.rb +74 -0
  114. data/lib/fluent/plugin/in_debug_agent.rb +64 -0
  115. data/lib/fluent/plugin/in_dummy.rb +135 -0
  116. data/lib/fluent/plugin/in_exec.rb +149 -0
  117. data/lib/fluent/plugin/in_forward.rb +366 -0
  118. data/lib/fluent/plugin/in_gc_stat.rb +52 -0
  119. data/lib/fluent/plugin/in_http.rb +422 -0
  120. data/lib/fluent/plugin/in_monitor_agent.rb +401 -0
  121. data/lib/fluent/plugin/in_object_space.rb +90 -0
  122. data/lib/fluent/plugin/in_syslog.rb +204 -0
  123. data/lib/fluent/plugin/in_tail.rb +838 -0
  124. data/lib/fluent/plugin/in_tcp.rb +41 -0
  125. data/lib/fluent/plugin/in_udp.rb +37 -0
  126. data/lib/fluent/plugin/in_unix.rb +201 -0
  127. data/lib/fluent/plugin/input.rb +33 -0
  128. data/lib/fluent/plugin/multi_output.rb +95 -0
  129. data/lib/fluent/plugin/out_buffered_null.rb +59 -0
  130. data/lib/fluent/plugin/out_buffered_stdout.rb +70 -0
  131. data/lib/fluent/plugin/out_copy.rb +42 -0
  132. data/lib/fluent/plugin/out_exec.rb +114 -0
  133. data/lib/fluent/plugin/out_exec_filter.rb +393 -0
  134. data/lib/fluent/plugin/out_file.rb +167 -0
  135. data/lib/fluent/plugin/out_forward.rb +646 -0
  136. data/lib/fluent/plugin/out_null.rb +27 -0
  137. data/lib/fluent/plugin/out_relabel.rb +28 -0
  138. data/lib/fluent/plugin/out_roundrobin.rb +80 -0
  139. data/lib/fluent/plugin/out_stdout.rb +48 -0
  140. data/lib/fluent/plugin/out_stream.rb +130 -0
  141. data/lib/fluent/plugin/output.rb +1020 -0
  142. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  143. data/lib/fluent/plugin/parser.rb +175 -0
  144. data/lib/fluent/plugin/parser_apache.rb +28 -0
  145. data/lib/fluent/plugin/parser_apache2.rb +84 -0
  146. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  147. data/lib/fluent/plugin/parser_csv.rb +33 -0
  148. data/lib/fluent/plugin/parser_json.rb +79 -0
  149. data/lib/fluent/plugin/parser_ltsv.rb +50 -0
  150. data/lib/fluent/plugin/parser_multiline.rb +104 -0
  151. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  152. data/lib/fluent/plugin/parser_none.rb +36 -0
  153. data/lib/fluent/plugin/parser_regexp.rb +73 -0
  154. data/lib/fluent/plugin/parser_syslog.rb +82 -0
  155. data/lib/fluent/plugin/parser_tsv.rb +37 -0
  156. data/lib/fluent/plugin/socket_util.rb +22 -0
  157. data/lib/fluent/plugin/storage.rb +84 -0
  158. data/lib/fluent/plugin/storage_local.rb +132 -0
  159. data/lib/fluent/plugin/string_util.rb +22 -0
  160. data/lib/fluent/plugin_helper.rb +42 -0
  161. data/lib/fluent/plugin_helper/child_process.rb +298 -0
  162. data/lib/fluent/plugin_helper/compat_parameters.rb +224 -0
  163. data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
  164. data/lib/fluent/plugin_helper/event_loop.rb +118 -0
  165. data/lib/fluent/plugin_helper/formatter.rb +149 -0
  166. data/lib/fluent/plugin_helper/inject.rb +125 -0
  167. data/lib/fluent/plugin_helper/parser.rb +147 -0
  168. data/lib/fluent/plugin_helper/retry_state.rb +177 -0
  169. data/lib/fluent/plugin_helper/storage.rb +331 -0
  170. data/lib/fluent/plugin_helper/thread.rb +147 -0
  171. data/lib/fluent/plugin_helper/timer.rb +90 -0
  172. data/lib/fluent/plugin_id.rb +63 -0
  173. data/lib/fluent/process.rb +504 -0
  174. data/lib/fluent/registry.rb +99 -0
  175. data/lib/fluent/root_agent.rb +314 -0
  176. data/lib/fluent/rpc.rb +94 -0
  177. data/lib/fluent/supervisor.rb +680 -0
  178. data/lib/fluent/system_config.rb +122 -0
  179. data/lib/fluent/test.rb +56 -0
  180. data/lib/fluent/test/base.rb +85 -0
  181. data/lib/fluent/test/driver/base.rb +179 -0
  182. data/lib/fluent/test/driver/base_owned.rb +70 -0
  183. data/lib/fluent/test/driver/base_owner.rb +125 -0
  184. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  185. data/lib/fluent/test/driver/filter.rb +57 -0
  186. data/lib/fluent/test/driver/formatter.rb +30 -0
  187. data/lib/fluent/test/driver/input.rb +31 -0
  188. data/lib/fluent/test/driver/multi_output.rb +52 -0
  189. data/lib/fluent/test/driver/output.rb +76 -0
  190. data/lib/fluent/test/driver/parser.rb +30 -0
  191. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  192. data/lib/fluent/test/filter_test.rb +77 -0
  193. data/lib/fluent/test/formatter_test.rb +65 -0
  194. data/lib/fluent/test/helpers.rb +79 -0
  195. data/lib/fluent/test/input_test.rb +172 -0
  196. data/lib/fluent/test/log.rb +73 -0
  197. data/lib/fluent/test/output_test.rb +156 -0
  198. data/lib/fluent/test/parser_test.rb +70 -0
  199. data/lib/fluent/time.rb +175 -0
  200. data/lib/fluent/timezone.rb +133 -0
  201. data/lib/fluent/unique_id.rb +39 -0
  202. data/lib/fluent/version.rb +21 -0
  203. data/lib/fluent/winsvc.rb +71 -0
  204. data/test/compat/test_calls_super.rb +166 -0
  205. data/test/compat/test_parser.rb +82 -0
  206. data/test/config/assertions.rb +42 -0
  207. data/test/config/test_config_parser.rb +507 -0
  208. data/test/config/test_configurable.rb +1194 -0
  209. data/test/config/test_configure_proxy.rb +386 -0
  210. data/test/config/test_dsl.rb +415 -0
  211. data/test/config/test_element.rb +403 -0
  212. data/test/config/test_literal_parser.rb +297 -0
  213. data/test/config/test_section.rb +184 -0
  214. data/test/config/test_system_config.rb +120 -0
  215. data/test/config/test_types.rb +171 -0
  216. data/test/helper.rb +119 -0
  217. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  218. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  219. data/test/plugin/data/2010/01/20100102.log +0 -0
  220. data/test/plugin/data/log/bar +0 -0
  221. data/test/plugin/data/log/foo/bar.log +0 -0
  222. data/test/plugin/data/log/test.log +0 -0
  223. data/test/plugin/test_bare_output.rb +118 -0
  224. data/test/plugin/test_base.rb +75 -0
  225. data/test/plugin/test_buf_file.rb +571 -0
  226. data/test/plugin/test_buf_memory.rb +42 -0
  227. data/test/plugin/test_buffer.rb +1200 -0
  228. data/test/plugin/test_buffer_chunk.rb +168 -0
  229. data/test/plugin/test_buffer_file_chunk.rb +771 -0
  230. data/test/plugin/test_buffer_memory_chunk.rb +265 -0
  231. data/test/plugin/test_file_util.rb +96 -0
  232. data/test/plugin/test_filter.rb +353 -0
  233. data/test/plugin/test_filter_grep.rb +119 -0
  234. data/test/plugin/test_filter_record_transformer.rb +600 -0
  235. data/test/plugin/test_filter_stdout.rb +211 -0
  236. data/test/plugin/test_formatter_csv.rb +94 -0
  237. data/test/plugin/test_formatter_json.rb +30 -0
  238. data/test/plugin/test_formatter_ltsv.rb +52 -0
  239. data/test/plugin/test_formatter_msgpack.rb +28 -0
  240. data/test/plugin/test_formatter_out_file.rb +95 -0
  241. data/test/plugin/test_formatter_single_value.rb +38 -0
  242. data/test/plugin/test_in_debug_agent.rb +28 -0
  243. data/test/plugin/test_in_dummy.rb +188 -0
  244. data/test/plugin/test_in_exec.rb +133 -0
  245. data/test/plugin/test_in_forward.rb +635 -0
  246. data/test/plugin/test_in_gc_stat.rb +39 -0
  247. data/test/plugin/test_in_http.rb +442 -0
  248. data/test/plugin/test_in_monitor_agent.rb +329 -0
  249. data/test/plugin/test_in_object_space.rb +64 -0
  250. data/test/plugin/test_in_syslog.rb +205 -0
  251. data/test/plugin/test_in_tail.rb +1001 -0
  252. data/test/plugin/test_in_tcp.rb +102 -0
  253. data/test/plugin/test_in_udp.rb +121 -0
  254. data/test/plugin/test_in_unix.rb +126 -0
  255. data/test/plugin/test_input.rb +122 -0
  256. data/test/plugin/test_multi_output.rb +180 -0
  257. data/test/plugin/test_out_buffered_null.rb +79 -0
  258. data/test/plugin/test_out_buffered_stdout.rb +122 -0
  259. data/test/plugin/test_out_copy.rb +160 -0
  260. data/test/plugin/test_out_exec.rb +155 -0
  261. data/test/plugin/test_out_exec_filter.rb +262 -0
  262. data/test/plugin/test_out_file.rb +383 -0
  263. data/test/plugin/test_out_forward.rb +590 -0
  264. data/test/plugin/test_out_null.rb +29 -0
  265. data/test/plugin/test_out_relabel.rb +28 -0
  266. data/test/plugin/test_out_roundrobin.rb +146 -0
  267. data/test/plugin/test_out_stdout.rb +92 -0
  268. data/test/plugin/test_out_stream.rb +93 -0
  269. data/test/plugin/test_output.rb +568 -0
  270. data/test/plugin/test_output_as_buffered.rb +1604 -0
  271. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  272. data/test/plugin/test_output_as_buffered_retries.rb +839 -0
  273. data/test/plugin/test_output_as_buffered_secondary.rb +817 -0
  274. data/test/plugin/test_output_as_standard.rb +374 -0
  275. data/test/plugin/test_owned_by.rb +35 -0
  276. data/test/plugin/test_parser_apache.rb +42 -0
  277. data/test/plugin/test_parser_apache2.rb +38 -0
  278. data/test/plugin/test_parser_apache_error.rb +45 -0
  279. data/test/plugin/test_parser_base.rb +32 -0
  280. data/test/plugin/test_parser_csv.rb +104 -0
  281. data/test/plugin/test_parser_json.rb +107 -0
  282. data/test/plugin/test_parser_labeled_tsv.rb +129 -0
  283. data/test/plugin/test_parser_multiline.rb +100 -0
  284. data/test/plugin/test_parser_nginx.rb +48 -0
  285. data/test/plugin/test_parser_none.rb +53 -0
  286. data/test/plugin/test_parser_regexp.rb +277 -0
  287. data/test/plugin/test_parser_syslog.rb +66 -0
  288. data/test/plugin/test_parser_time.rb +46 -0
  289. data/test/plugin/test_parser_tsv.rb +121 -0
  290. data/test/plugin/test_storage.rb +167 -0
  291. data/test/plugin/test_storage_local.rb +8 -0
  292. data/test/plugin/test_string_util.rb +26 -0
  293. data/test/plugin_helper/test_child_process.rb +608 -0
  294. data/test/plugin_helper/test_compat_parameters.rb +242 -0
  295. data/test/plugin_helper/test_event_emitter.rb +51 -0
  296. data/test/plugin_helper/test_event_loop.rb +52 -0
  297. data/test/plugin_helper/test_formatter.rb +252 -0
  298. data/test/plugin_helper/test_inject.rb +487 -0
  299. data/test/plugin_helper/test_parser.rb +263 -0
  300. data/test/plugin_helper/test_retry_state.rb +399 -0
  301. data/test/plugin_helper/test_storage.rb +521 -0
  302. data/test/plugin_helper/test_thread.rb +164 -0
  303. data/test/plugin_helper/test_timer.rb +131 -0
  304. data/test/scripts/exec_script.rb +32 -0
  305. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  306. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  307. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  308. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  309. data/test/test_config.rb +179 -0
  310. data/test/test_configdsl.rb +148 -0
  311. data/test/test_event.rb +329 -0
  312. data/test/test_event_router.rb +331 -0
  313. data/test/test_event_time.rb +184 -0
  314. data/test/test_filter.rb +121 -0
  315. data/test/test_formatter.rb +319 -0
  316. data/test/test_input.rb +31 -0
  317. data/test/test_log.rb +572 -0
  318. data/test/test_match.rb +137 -0
  319. data/test/test_mixin.rb +351 -0
  320. data/test/test_output.rb +214 -0
  321. data/test/test_plugin_classes.rb +136 -0
  322. data/test/test_plugin_helper.rb +81 -0
  323. data/test/test_process.rb +48 -0
  324. data/test/test_root_agent.rb +278 -0
  325. data/test/test_supervisor.rb +339 -0
  326. data/test/test_time_formatter.rb +186 -0
  327. data/test/test_unique_id.rb +47 -0
  328. metadata +823 -0
@@ -0,0 +1,42 @@
1
+ require 'test/unit/assertions'
2
+
3
+ module Test::Unit::Assertions
4
+ def assert_text_parsed_as(expected, actual)
5
+ msg = parse_text(actual).inspect rescue 'failed'
6
+ msg = "expected that #{actual.inspect} would be a parsed as #{expected.inspect} but got #{msg}"
7
+ assert_block(msg) {
8
+ v = parse_text(actual)
9
+ if expected.is_a?(Float)
10
+ v.is_a?(Float) && (v == obj || (v.nan? && obj.nan?) || (v - obj).abs < 0.000001)
11
+ else
12
+ v == expected
13
+ end
14
+ }
15
+ end
16
+
17
+ def assert_text_parsed_as_json(expected, actual)
18
+ msg = parse_text(actual).inspect rescue 'failed'
19
+ msg = "expected that #{actual.inspect} would be a parsed as #{expected.inspect} but got #{msg}"
20
+ assert_block(msg) {
21
+ v = JSON.parse(parse_text(actual))
22
+ v == expected
23
+ }
24
+ end
25
+
26
+ def assert_parse_error(actual)
27
+ msg = begin
28
+ parse_text(actual).inspect
29
+ rescue => e
30
+ e.inspect
31
+ end
32
+ msg = "expected that #{actual.inspect} would cause a parse error but got #{msg}"
33
+ assert_block(msg) {
34
+ begin
35
+ parse_text(actual)
36
+ false
37
+ rescue Fluent::ConfigParseError
38
+ true
39
+ end
40
+ }
41
+ end
42
+ end
@@ -0,0 +1,507 @@
1
+ require_relative '../helper'
2
+ require_relative "assertions"
3
+ require "json"
4
+ require "fluent/config/error"
5
+ require "fluent/config/basic_parser"
6
+ require "fluent/config/literal_parser"
7
+ require "fluent/config/v1_parser"
8
+ require 'fluent/config/parser'
9
+
10
+ module Fluent::Config
11
+ module V1TestHelper
12
+ def root(*elements)
13
+ if elements.first.is_a?(Fluent::Config::Element)
14
+ attrs = {}
15
+ else
16
+ attrs = elements.shift || {}
17
+ end
18
+ Fluent::Config::Element.new('ROOT', '', attrs, elements)
19
+ end
20
+
21
+ def e(name, arg='', attrs={}, elements=[])
22
+ Fluent::Config::Element.new(name, arg, attrs, elements)
23
+ end
24
+ end
25
+
26
+ class AllTypes
27
+ include Fluent::Configurable
28
+
29
+ config_param :param_string, :string
30
+ config_param :param_enum, :enum, list: [:foo, :bar, :baz]
31
+ config_param :param_integer, :integer
32
+ config_param :param_float, :float
33
+ config_param :param_size, :size
34
+ config_param :param_bool, :bool
35
+ config_param :param_time, :time
36
+ config_param :param_hash, :hash
37
+ config_param :param_array, :array
38
+ end
39
+
40
+ class TestV1Parser < ::Test::Unit::TestCase
41
+ def read_config(path)
42
+ path = File.expand_path(path)
43
+ data = File.read(path)
44
+ Fluent::Config::V1Parser.parse(data, File.basename(path), File.dirname(path))
45
+ end
46
+
47
+ def parse_text(text)
48
+ basepath = File.expand_path(File.dirname(__FILE__) + '/../../')
49
+ Fluent::Config::V1Parser.parse(text, '(test)', basepath, nil)
50
+ end
51
+
52
+ include V1TestHelper
53
+ extend V1TestHelper
54
+
55
+ sub_test_case 'attribute parsing' do
56
+ test "parses attributes" do
57
+ assert_text_parsed_as(e('ROOT', '', {"k1"=>"v1", "k2"=>"v2"}), %[
58
+ k1 v1
59
+ k2 v2
60
+ ])
61
+ end
62
+
63
+ test "allows attribute without value" do
64
+ assert_text_parsed_as(e('ROOT', '', {"k1"=>"", "k2"=>"v2"}), %[
65
+ k1
66
+ k2 v2
67
+ ])
68
+ end
69
+
70
+ test "parses attribute key always string" do
71
+ assert_text_parsed_as(e('ROOT', '', {"1" => "1"}), "1 1")
72
+ end
73
+
74
+ data("_.%$!," => "_.%$!,",
75
+ "/=~-~@\`:?" => "/=~-~@\`:?",
76
+ "()*{}.[]" => "()*{}.[]")
77
+ test "parses a value with symbols" do |v|
78
+ assert_text_parsed_as(e('ROOT', '', {"k" => v}), "k #{v}")
79
+ end
80
+
81
+ test "ignores spacing around value" do
82
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "a"}), " k1 a ")
83
+ end
84
+
85
+ test "allows spaces in value" do
86
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "a b c"}), "k1 a b c")
87
+ end
88
+
89
+ sub_test_case 'non-quoted string' do
90
+ test "remains text starting with '#'" do
91
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "#not_comment"}), " k1 #not_comment")
92
+ end
93
+
94
+ test "remains text just after '#'" do
95
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "a#not_comment"}), " k1 a#not_comment")
96
+ end
97
+
98
+ test "remove text after ` #` (comment)" do
99
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "a"}), " k1 a #comment")
100
+ end
101
+
102
+ test "does not require escaping backslash" do
103
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "\\\\"}), " k1 \\\\")
104
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "\\"}), " k1 \\")
105
+ end
106
+
107
+ test "remains backslash in front of a normal character" do
108
+ assert_text_parsed_as(e('ROOT', '', {"k1" => '\['}), " k1 \\[")
109
+ end
110
+
111
+ test "does not accept escape characters" do
112
+ assert_text_parsed_as(e('ROOT', '', {"k1" => '\n'}), " k1 \\n")
113
+ end
114
+ end
115
+
116
+ sub_test_case 'double quoted string' do
117
+ test "allows # in value" do
118
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "a#comment"}), ' k1 "a#comment"')
119
+ end
120
+
121
+ test "rejects characters after double quoted string" do
122
+ assert_parse_error(' k1 "a" 1')
123
+ end
124
+
125
+ test "requires escaping backslash" do
126
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "\\"}), ' k1 "\\\\"')
127
+ assert_parse_error(' k1 "\\"')
128
+ end
129
+
130
+ test "requires escaping double quote" do
131
+ assert_text_parsed_as(e('ROOT', '', {"k1" => '"'}), ' k1 "\\""')
132
+ assert_parse_error(' k1 """')
133
+ assert_parse_error(' k1 ""\'')
134
+ end
135
+
136
+ test "removes backslash in front of a normal character" do
137
+ assert_text_parsed_as(e('ROOT', '', {"k1" => '['}), ' k1 "\\["')
138
+ end
139
+
140
+ test "accepts escape characters" do
141
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "\n"}), ' k1 "\\n"')
142
+ end
143
+
144
+ test "support multiline string" do
145
+ assert_text_parsed_as(e('ROOT', '',
146
+ {"k1" => %[line1
147
+ line2]
148
+ }),
149
+ %[k1 "line1
150
+ line2"]
151
+ )
152
+ assert_text_parsed_as(e('ROOT', '',
153
+ {"k1" => %[line1 line2]
154
+ }),
155
+ %[k1 "line1\\
156
+ line2"]
157
+ )
158
+ assert_text_parsed_as(e('ROOT', '',
159
+ {"k1" => %[line1
160
+ line2
161
+ line3]
162
+ }),
163
+ %[k1 "line1
164
+ line2
165
+ line3"]
166
+ )
167
+ assert_text_parsed_as(e('ROOT', '',
168
+ {"k1" => %[line1
169
+ line2 line3]
170
+ }),
171
+ %[k1 "line1
172
+ line2\\
173
+ line3"]
174
+ )
175
+ end
176
+ end
177
+
178
+ sub_test_case 'single quoted string' do
179
+ test "allows # in value" do
180
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "a#comment"}), " k1 'a#comment'")
181
+ end
182
+
183
+ test "rejects characters after single quoted string" do
184
+ assert_parse_error(" k1 'a' 1")
185
+ end
186
+
187
+ test "requires escaping backslash" do
188
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "\\"}), " k1 '\\\\'")
189
+ assert_parse_error(" k1 '\\'")
190
+ end
191
+
192
+ test "requires escaping single quote" do
193
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "'"}), " k1 '\\''")
194
+ assert_parse_error(" k1 '''")
195
+ end
196
+
197
+ test "remains backslash in front of a normal character" do
198
+ assert_text_parsed_as(e('ROOT', '', {"k1" => '\\['}), " k1 '\\['")
199
+ end
200
+
201
+ test "does not accept escape characters" do
202
+ assert_text_parsed_as(e('ROOT', '', {"k1" => "\\n"}), " k1 '\\n'")
203
+ end
204
+ end
205
+
206
+ data(
207
+ "in match" => %[
208
+ <match>
209
+ @k v
210
+ </match>
211
+ ],
212
+ "in source" => %[
213
+ <source>
214
+ @k v
215
+ </source>
216
+ ],
217
+ "in filter" => %[
218
+ <filter>
219
+ @k v
220
+ </filter>
221
+ ],
222
+ "in top-level" => ' @k v '
223
+ )
224
+ def test_rejects_at_prefix_in_the_parameter_name(data)
225
+ assert_parse_error(data)
226
+ end
227
+
228
+ data(
229
+ "in nested" => %[
230
+ <match>
231
+ <record>
232
+ @k v
233
+ </record>
234
+ </match>
235
+ ]
236
+ )
237
+ def test_not_reject_at_prefix_in_the_parameter_name(data)
238
+ assert_nothing_raised { parse_text(data) }
239
+ end
240
+ end
241
+
242
+ sub_test_case 'element parsing' do
243
+ data(
244
+ 'root' => [root, ""],
245
+ "accepts empty element" => [root(e("test")), %[
246
+ <test>
247
+ </test>
248
+ ]],
249
+ "accepts argument and attributes" => [root(e("test", 'var', {'key'=>"val"})), %[
250
+ <test var>
251
+ key val
252
+ </test>
253
+ ]],
254
+ "accepts nested elements" => [root(
255
+ e("test", 'var', {'key'=>'1'}, [
256
+ e('nested1'),
257
+ e('nested2')
258
+ ])), %[
259
+ <test var>
260
+ key 1
261
+ <nested1>
262
+ </nested1>
263
+ <nested2>
264
+ </nested2>
265
+ </test>
266
+ ]],
267
+ "accepts multiline json values" => [root(e("test", 'var', {'key'=>"[\"a\",\"b\",\"c\",\"d\"]"})), %[
268
+ <test var>
269
+ key ["a",
270
+ "b", "c",
271
+ "d"]
272
+ </test>
273
+ ]],
274
+ "parses empty element argument to nil" => [root(e("test", '')), %[
275
+ <test >
276
+ </test>
277
+ ]],
278
+ "ignores spacing around element argument" => [root(e("test", "a")), %[
279
+ <test a >
280
+ </test>
281
+ ]],
282
+ "accepts spacing inside element argument (for multiple tags)" => [root(e("test", "a.** b.**")), %[
283
+ <test a.** b.** >
284
+ </test>
285
+ ]])
286
+ def test_parse_element(data)
287
+ expected, target = data
288
+ assert_text_parsed_as(expected, target)
289
+ end
290
+
291
+ [
292
+ "**",
293
+ "*.*",
294
+ "1",
295
+ "_.%$!",
296
+ "/",
297
+ "()*{}.[]",
298
+ ].each do |arg|
299
+ test "parses symbol element argument:#{arg}" do
300
+ assert_text_parsed_as(root(e("test", arg)), %[
301
+ <test #{arg}>
302
+ </test>
303
+ ])
304
+ end
305
+ end
306
+
307
+ data(
308
+ "considers comments in element argument" => %[
309
+ <test #a>
310
+ </test>
311
+ ],
312
+ "requires line_end after begin tag" => %[
313
+ <test></test>
314
+ ],
315
+ "requires line_end after end tag" => %[
316
+ <test>
317
+ </test><test>
318
+ </test>
319
+ ])
320
+ def test_parse_error(data)
321
+ assert_parse_error(data)
322
+ end
323
+ end
324
+
325
+ # port from test_config.rb
326
+ sub_test_case '@include parsing' do
327
+ TMP_DIR = File.dirname(__FILE__) + "/tmp/v1_config#{ENV['TEST_ENV_NUMBER']}"
328
+
329
+ def write_config(path, data)
330
+ FileUtils.mkdir_p(File.dirname(path))
331
+ File.open(path, "w") { |f| f.write data }
332
+ end
333
+
334
+ def prepare_config
335
+ write_config "#{TMP_DIR}/config_test_1.conf", %[
336
+ k1 root_config
337
+ include dir/config_test_2.conf #
338
+ @include #{TMP_DIR}/config_test_4.conf
339
+ include file://#{TMP_DIR}/config_test_5.conf
340
+ @include config.d/*.conf
341
+ ]
342
+ write_config "#{TMP_DIR}/dir/config_test_2.conf", %[
343
+ k2 relative_path_include
344
+ @include ../config_test_3.conf
345
+ ]
346
+ write_config "#{TMP_DIR}/config_test_3.conf", %[
347
+ k3 relative_include_in_included_file
348
+ ]
349
+ write_config "#{TMP_DIR}/config_test_4.conf", %[
350
+ k4 absolute_path_include
351
+ ]
352
+ write_config "#{TMP_DIR}/config_test_5.conf", %[
353
+ k5 uri_include
354
+ ]
355
+ write_config "#{TMP_DIR}/config.d/config_test_6.conf", %[
356
+ k6 wildcard_include_1
357
+ <elem1 name>
358
+ include normal_parameter
359
+ </elem1>
360
+ ]
361
+ write_config "#{TMP_DIR}/config.d/config_test_7.conf", %[
362
+ k7 wildcard_include_2
363
+ ]
364
+ write_config "#{TMP_DIR}/config.d/config_test_8.conf", %[
365
+ <elem2 name>
366
+ @include ../dir/config_test_9.conf
367
+ </elem2>
368
+ ]
369
+ write_config "#{TMP_DIR}/dir/config_test_9.conf", %[
370
+ k9 embeded
371
+ <elem3 name>
372
+ nested nested_value
373
+ include hoge
374
+ </elem3>
375
+ ]
376
+ write_config "#{TMP_DIR}/config.d/00_config_test_8.conf", %[
377
+ k8 wildcard_include_3
378
+ <elem4 name>
379
+ include normal_parameter
380
+ </elem4>
381
+ ]
382
+ end
383
+
384
+ test 'parses @include / include correctly' do
385
+ prepare_config
386
+ c = read_config("#{TMP_DIR}/config_test_1.conf")
387
+ assert_equal('root_config', c['k1'])
388
+ assert_equal('relative_path_include', c['k2'])
389
+ assert_equal('relative_include_in_included_file', c['k3'])
390
+ assert_equal('absolute_path_include', c['k4'])
391
+ assert_equal('uri_include', c['k5'])
392
+ assert_equal('wildcard_include_1', c['k6'])
393
+ assert_equal('wildcard_include_2', c['k7'])
394
+ assert_equal('wildcard_include_3', c['k8'])
395
+ assert_equal([
396
+ 'k1',
397
+ 'k2',
398
+ 'k3',
399
+ 'k4',
400
+ 'k5',
401
+ 'k8', # Because of the file name this comes first.
402
+ 'k6',
403
+ 'k7',
404
+ ], c.keys)
405
+
406
+ elem1 = c.elements.find { |e| e.name == 'elem1' }
407
+ assert(elem1)
408
+ assert_equal('name', elem1.arg)
409
+ assert_equal('normal_parameter', elem1['include'])
410
+
411
+ elem2 = c.elements.find { |e| e.name == 'elem2' }
412
+ assert(elem2)
413
+ assert_equal('name', elem2.arg)
414
+ assert_equal('embeded', elem2['k9'])
415
+ assert_not_include(elem2, 'include')
416
+
417
+ elem3 = elem2.elements.find { |e| e.name == 'elem3' }
418
+ assert(elem3)
419
+ assert_equal('nested_value', elem3['nested'])
420
+ assert_equal('hoge', elem3['include'])
421
+ end
422
+
423
+ # TODO: Add uri based include spec
424
+ end
425
+
426
+ sub_test_case '#to_s' do
427
+ test 'parses dumpped configuration' do
428
+ original = %q!a\\\n\r\f\b'"z!
429
+ expected = %q!a\\\n\r\f\b'"z!
430
+
431
+ conf = parse_text(%[k1 #{original}])
432
+ assert_equal(expected, conf['k1']) # escape check
433
+ conf2 = parse_text(conf.to_s) # use dumpped configuration to check unescape
434
+ assert_equal(expected, conf2.elements.first['k1'])
435
+ end
436
+
437
+ test 'all types' do
438
+ conf = parse_text(%[
439
+ param_string "value"
440
+ param_enum foo
441
+ param_integer 999
442
+ param_float 55.55
443
+ param_size 4k
444
+ param_bool true
445
+ param_time 10m
446
+ param_hash { "key1": "value1", "key2": 2 }
447
+ param_array ["value1", "value2", 100]
448
+ ])
449
+ target = AllTypes.new.configure(conf)
450
+ assert_equal(conf.to_s, target.config.to_s)
451
+ expected = <<DUMP
452
+ <ROOT>
453
+ param_string "value"
454
+ param_enum foo
455
+ param_integer 999
456
+ param_float 55.55
457
+ param_size 4k
458
+ param_bool true
459
+ param_time 10m
460
+ param_hash {"key1":"value1","key2":2}
461
+ param_array ["value1","value2",100]
462
+ </ROOT>
463
+ DUMP
464
+ assert_equal(expected, conf.to_s)
465
+ end
466
+ end
467
+ end
468
+
469
+ class TestV0Parser < ::Test::Unit::TestCase
470
+ def parse_text(text)
471
+ basepath = File.expand_path(File.dirname(__FILE__) + '/../../')
472
+ Fluent::Config::Parser.parse(StringIO.new(text), '(test)', basepath)
473
+ end
474
+
475
+ sub_test_case "Fluent::Config::Element#to_s" do
476
+ test 'all types' do
477
+ conf = parse_text(%[
478
+ param_string value
479
+ param_enum foo
480
+ param_integer 999
481
+ param_float 55.55
482
+ param_size 4k
483
+ param_bool true
484
+ param_time 10m
485
+ param_hash { "key1": "value1", "key2": 2 }
486
+ param_array ["value1", "value2", 100]
487
+ ])
488
+ target = AllTypes.new.configure(conf)
489
+ assert_equal(conf.to_s, target.config.to_s)
490
+ expected = <<DUMP
491
+ <ROOT>
492
+ param_string value
493
+ param_enum foo
494
+ param_integer 999
495
+ param_float 55.55
496
+ param_size 4k
497
+ param_bool true
498
+ param_time 10m
499
+ param_hash { "key1": "value1", "key2": 2 }
500
+ param_array ["value1", "value2", 100]
501
+ </ROOT>
502
+ DUMP
503
+ assert_equal(expected, conf.to_s)
504
+ end
505
+ end
506
+ end
507
+ end