fluentd 1.17.0 → 1.17.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (259) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -0
  3. data/README.md +1 -0
  4. data/SECURITY.md +2 -2
  5. data/fluent.conf +14 -14
  6. data/lib/fluent/command/cap_ctl.rb +4 -4
  7. data/lib/fluent/compat/call_super_mixin.rb +3 -3
  8. data/lib/fluent/compat/propagate_default.rb +4 -4
  9. data/lib/fluent/config/yaml_parser/parser.rb +4 -0
  10. data/lib/fluent/log/console_adapter.rb +4 -2
  11. data/lib/fluent/plugin/in_exec.rb +14 -2
  12. data/lib/fluent/plugin/in_http.rb +1 -1
  13. data/lib/fluent/plugin/in_sample.rb +13 -7
  14. data/lib/fluent/plugin/in_tail.rb +65 -23
  15. data/lib/fluent/plugin/out_copy.rb +1 -1
  16. data/lib/fluent/plugin/out_file.rb +8 -0
  17. data/lib/fluent/plugin/out_http.rb +12 -0
  18. data/lib/fluent/plugin/parser_json.rb +4 -12
  19. data/lib/fluent/plugin_helper/http_server/server.rb +1 -1
  20. data/lib/fluent/version.rb +1 -1
  21. data/templates/new_gem/fluent-plugin.gemspec.erb +6 -5
  22. metadata +25 -472
  23. data/.github/DISCUSSION_TEMPLATE/q-a-japanese.yml +0 -50
  24. data/.github/DISCUSSION_TEMPLATE/q-a.yml +0 -47
  25. data/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
  26. data/.github/ISSUE_TEMPLATE/config.yml +0 -5
  27. data/.github/ISSUE_TEMPLATE/feature_request.yml +0 -39
  28. data/.github/ISSUE_TEMPLATE.md +0 -17
  29. data/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  30. data/.github/workflows/stale-actions.yml +0 -24
  31. data/.github/workflows/test-ruby-head.yml +0 -31
  32. data/.github/workflows/test.yml +0 -32
  33. data/.gitignore +0 -30
  34. data/Gemfile +0 -9
  35. data/fluentd.gemspec +0 -62
  36. data/test/command/test_binlog_reader.rb +0 -362
  37. data/test/command/test_ca_generate.rb +0 -70
  38. data/test/command/test_cap_ctl.rb +0 -100
  39. data/test/command/test_cat.rb +0 -128
  40. data/test/command/test_ctl.rb +0 -56
  41. data/test/command/test_fluentd.rb +0 -1291
  42. data/test/command/test_plugin_config_formatter.rb +0 -397
  43. data/test/command/test_plugin_generator.rb +0 -109
  44. data/test/compat/test_calls_super.rb +0 -166
  45. data/test/compat/test_parser.rb +0 -92
  46. data/test/config/assertions.rb +0 -42
  47. data/test/config/test_config_parser.rb +0 -551
  48. data/test/config/test_configurable.rb +0 -1784
  49. data/test/config/test_configure_proxy.rb +0 -604
  50. data/test/config/test_dsl.rb +0 -415
  51. data/test/config/test_element.rb +0 -518
  52. data/test/config/test_literal_parser.rb +0 -309
  53. data/test/config/test_plugin_configuration.rb +0 -56
  54. data/test/config/test_section.rb +0 -191
  55. data/test/config/test_system_config.rb +0 -195
  56. data/test/config/test_types.rb +0 -408
  57. data/test/counter/test_client.rb +0 -563
  58. data/test/counter/test_error.rb +0 -44
  59. data/test/counter/test_mutex_hash.rb +0 -179
  60. data/test/counter/test_server.rb +0 -589
  61. data/test/counter/test_store.rb +0 -258
  62. data/test/counter/test_validator.rb +0 -137
  63. data/test/helper.rb +0 -155
  64. data/test/helpers/fuzzy_assert.rb +0 -89
  65. data/test/helpers/process_extenstion.rb +0 -33
  66. data/test/log/test_console_adapter.rb +0 -117
  67. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  68. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  69. data/test/plugin/data/2010/01/20100102.log +0 -0
  70. data/test/plugin/data/log/bar +0 -0
  71. data/test/plugin/data/log/foo/bar.log +0 -0
  72. data/test/plugin/data/log/foo/bar2 +0 -0
  73. data/test/plugin/data/log/test.log +0 -0
  74. data/test/plugin/data/log_numeric/01.log +0 -0
  75. data/test/plugin/data/log_numeric/02.log +0 -0
  76. data/test/plugin/data/log_numeric/12.log +0 -0
  77. data/test/plugin/data/log_numeric/14.log +0 -0
  78. data/test/plugin/data/sd_file/config +0 -11
  79. data/test/plugin/data/sd_file/config.json +0 -17
  80. data/test/plugin/data/sd_file/config.yaml +0 -11
  81. data/test/plugin/data/sd_file/config.yml +0 -11
  82. data/test/plugin/data/sd_file/invalid_config.yml +0 -7
  83. data/test/plugin/in_tail/test_fifo.rb +0 -121
  84. data/test/plugin/in_tail/test_io_handler.rb +0 -150
  85. data/test/plugin/in_tail/test_position_file.rb +0 -346
  86. data/test/plugin/out_forward/test_ack_handler.rb +0 -140
  87. data/test/plugin/out_forward/test_connection_manager.rb +0 -145
  88. data/test/plugin/out_forward/test_handshake_protocol.rb +0 -112
  89. data/test/plugin/out_forward/test_load_balancer.rb +0 -106
  90. data/test/plugin/out_forward/test_socket_cache.rb +0 -174
  91. data/test/plugin/test_bare_output.rb +0 -131
  92. data/test/plugin/test_base.rb +0 -247
  93. data/test/plugin/test_buf_file.rb +0 -1314
  94. data/test/plugin/test_buf_file_single.rb +0 -898
  95. data/test/plugin/test_buf_memory.rb +0 -42
  96. data/test/plugin/test_buffer.rb +0 -1493
  97. data/test/plugin/test_buffer_chunk.rb +0 -209
  98. data/test/plugin/test_buffer_file_chunk.rb +0 -871
  99. data/test/plugin/test_buffer_file_single_chunk.rb +0 -611
  100. data/test/plugin/test_buffer_memory_chunk.rb +0 -339
  101. data/test/plugin/test_compressable.rb +0 -87
  102. data/test/plugin/test_file_util.rb +0 -96
  103. data/test/plugin/test_filter.rb +0 -368
  104. data/test/plugin/test_filter_grep.rb +0 -697
  105. data/test/plugin/test_filter_parser.rb +0 -731
  106. data/test/plugin/test_filter_record_transformer.rb +0 -577
  107. data/test/plugin/test_filter_stdout.rb +0 -207
  108. data/test/plugin/test_formatter_csv.rb +0 -136
  109. data/test/plugin/test_formatter_hash.rb +0 -38
  110. data/test/plugin/test_formatter_json.rb +0 -61
  111. data/test/plugin/test_formatter_ltsv.rb +0 -70
  112. data/test/plugin/test_formatter_msgpack.rb +0 -28
  113. data/test/plugin/test_formatter_out_file.rb +0 -116
  114. data/test/plugin/test_formatter_single_value.rb +0 -44
  115. data/test/plugin/test_formatter_tsv.rb +0 -76
  116. data/test/plugin/test_in_debug_agent.rb +0 -49
  117. data/test/plugin/test_in_exec.rb +0 -261
  118. data/test/plugin/test_in_forward.rb +0 -1178
  119. data/test/plugin/test_in_gc_stat.rb +0 -62
  120. data/test/plugin/test_in_http.rb +0 -1124
  121. data/test/plugin/test_in_monitor_agent.rb +0 -922
  122. data/test/plugin/test_in_object_space.rb +0 -66
  123. data/test/plugin/test_in_sample.rb +0 -190
  124. data/test/plugin/test_in_syslog.rb +0 -505
  125. data/test/plugin/test_in_tail.rb +0 -3429
  126. data/test/plugin/test_in_tcp.rb +0 -328
  127. data/test/plugin/test_in_udp.rb +0 -296
  128. data/test/plugin/test_in_unix.rb +0 -181
  129. data/test/plugin/test_input.rb +0 -137
  130. data/test/plugin/test_metadata.rb +0 -89
  131. data/test/plugin/test_metrics.rb +0 -294
  132. data/test/plugin/test_metrics_local.rb +0 -96
  133. data/test/plugin/test_multi_output.rb +0 -204
  134. data/test/plugin/test_out_copy.rb +0 -308
  135. data/test/plugin/test_out_exec.rb +0 -312
  136. data/test/plugin/test_out_exec_filter.rb +0 -606
  137. data/test/plugin/test_out_file.rb +0 -1038
  138. data/test/plugin/test_out_forward.rb +0 -1349
  139. data/test/plugin/test_out_http.rb +0 -557
  140. data/test/plugin/test_out_null.rb +0 -105
  141. data/test/plugin/test_out_relabel.rb +0 -28
  142. data/test/plugin/test_out_roundrobin.rb +0 -146
  143. data/test/plugin/test_out_secondary_file.rb +0 -458
  144. data/test/plugin/test_out_stdout.rb +0 -205
  145. data/test/plugin/test_out_stream.rb +0 -103
  146. data/test/plugin/test_output.rb +0 -1334
  147. data/test/plugin/test_output_as_buffered.rb +0 -2024
  148. data/test/plugin/test_output_as_buffered_backup.rb +0 -363
  149. data/test/plugin/test_output_as_buffered_compress.rb +0 -179
  150. data/test/plugin/test_output_as_buffered_overflow.rb +0 -250
  151. data/test/plugin/test_output_as_buffered_retries.rb +0 -966
  152. data/test/plugin/test_output_as_buffered_secondary.rb +0 -882
  153. data/test/plugin/test_output_as_standard.rb +0 -374
  154. data/test/plugin/test_owned_by.rb +0 -34
  155. data/test/plugin/test_parser.rb +0 -399
  156. data/test/plugin/test_parser_apache.rb +0 -42
  157. data/test/plugin/test_parser_apache2.rb +0 -47
  158. data/test/plugin/test_parser_apache_error.rb +0 -45
  159. data/test/plugin/test_parser_csv.rb +0 -200
  160. data/test/plugin/test_parser_json.rb +0 -244
  161. data/test/plugin/test_parser_labeled_tsv.rb +0 -160
  162. data/test/plugin/test_parser_msgpack.rb +0 -127
  163. data/test/plugin/test_parser_multiline.rb +0 -111
  164. data/test/plugin/test_parser_nginx.rb +0 -88
  165. data/test/plugin/test_parser_none.rb +0 -52
  166. data/test/plugin/test_parser_regexp.rb +0 -284
  167. data/test/plugin/test_parser_syslog.rb +0 -650
  168. data/test/plugin/test_parser_tsv.rb +0 -122
  169. data/test/plugin/test_sd_file.rb +0 -228
  170. data/test/plugin/test_sd_srv.rb +0 -230
  171. data/test/plugin/test_storage.rb +0 -166
  172. data/test/plugin/test_storage_local.rb +0 -335
  173. data/test/plugin/test_string_util.rb +0 -26
  174. data/test/plugin_helper/data/cert/cert-key.pem +0 -27
  175. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +0 -19
  176. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +0 -19
  177. data/test/plugin_helper/data/cert/cert.pem +0 -19
  178. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +0 -27
  179. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +0 -20
  180. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +0 -27
  181. data/test/plugin_helper/data/cert/cert_chains/cert.pem +0 -40
  182. data/test/plugin_helper/data/cert/empty.pem +0 -0
  183. data/test/plugin_helper/data/cert/generate_cert.rb +0 -125
  184. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +0 -30
  185. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +0 -27
  186. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +0 -20
  187. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +0 -20
  188. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +0 -30
  189. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +0 -27
  190. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +0 -21
  191. data/test/plugin_helper/data/cert/with_ca/cert.pem +0 -21
  192. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +0 -30
  193. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +0 -27
  194. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +0 -20
  195. data/test/plugin_helper/data/cert/without_ca/cert.pem +0 -20
  196. data/test/plugin_helper/http_server/test_app.rb +0 -65
  197. data/test/plugin_helper/http_server/test_route.rb +0 -32
  198. data/test/plugin_helper/service_discovery/test_manager.rb +0 -93
  199. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +0 -21
  200. data/test/plugin_helper/test_cert_option.rb +0 -25
  201. data/test/plugin_helper/test_child_process.rb +0 -862
  202. data/test/plugin_helper/test_compat_parameters.rb +0 -358
  203. data/test/plugin_helper/test_event_emitter.rb +0 -80
  204. data/test/plugin_helper/test_event_loop.rb +0 -52
  205. data/test/plugin_helper/test_extract.rb +0 -194
  206. data/test/plugin_helper/test_formatter.rb +0 -255
  207. data/test/plugin_helper/test_http_server_helper.rb +0 -372
  208. data/test/plugin_helper/test_inject.rb +0 -561
  209. data/test/plugin_helper/test_metrics.rb +0 -137
  210. data/test/plugin_helper/test_parser.rb +0 -264
  211. data/test/plugin_helper/test_record_accessor.rb +0 -238
  212. data/test/plugin_helper/test_retry_state.rb +0 -1006
  213. data/test/plugin_helper/test_server.rb +0 -1895
  214. data/test/plugin_helper/test_service_discovery.rb +0 -165
  215. data/test/plugin_helper/test_socket.rb +0 -146
  216. data/test/plugin_helper/test_storage.rb +0 -542
  217. data/test/plugin_helper/test_thread.rb +0 -164
  218. data/test/plugin_helper/test_timer.rb +0 -130
  219. data/test/scripts/exec_script.rb +0 -32
  220. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +0 -7
  221. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +0 -7
  222. data/test/scripts/fluent/plugin/formatter_known.rb +0 -8
  223. data/test/scripts/fluent/plugin/out_test.rb +0 -81
  224. data/test/scripts/fluent/plugin/out_test2.rb +0 -80
  225. data/test/scripts/fluent/plugin/parser_known.rb +0 -4
  226. data/test/test_capability.rb +0 -74
  227. data/test/test_clock.rb +0 -164
  228. data/test/test_config.rb +0 -369
  229. data/test/test_configdsl.rb +0 -148
  230. data/test/test_daemonizer.rb +0 -91
  231. data/test/test_engine.rb +0 -203
  232. data/test/test_event.rb +0 -531
  233. data/test/test_event_router.rb +0 -348
  234. data/test/test_event_time.rb +0 -199
  235. data/test/test_file_wrapper.rb +0 -53
  236. data/test/test_filter.rb +0 -121
  237. data/test/test_fluent_log_event_router.rb +0 -99
  238. data/test/test_formatter.rb +0 -369
  239. data/test/test_input.rb +0 -31
  240. data/test/test_log.rb +0 -1076
  241. data/test/test_match.rb +0 -148
  242. data/test/test_mixin.rb +0 -351
  243. data/test/test_msgpack_factory.rb +0 -50
  244. data/test/test_oj_options.rb +0 -55
  245. data/test/test_output.rb +0 -278
  246. data/test/test_plugin.rb +0 -251
  247. data/test/test_plugin_classes.rb +0 -370
  248. data/test/test_plugin_helper.rb +0 -81
  249. data/test/test_plugin_id.rb +0 -119
  250. data/test/test_process.rb +0 -14
  251. data/test/test_root_agent.rb +0 -951
  252. data/test/test_static_config_analysis.rb +0 -177
  253. data/test/test_supervisor.rb +0 -821
  254. data/test/test_test_drivers.rb +0 -136
  255. data/test/test_time_formatter.rb +0 -301
  256. data/test/test_time_parser.rb +0 -362
  257. data/test/test_tls.rb +0 -65
  258. data/test/test_unique_id.rb +0 -47
  259. data/test/test_variable_store.rb +0 -65
@@ -1,92 +0,0 @@
1
- require_relative '../helper'
2
- require 'fluent/plugin/parser'
3
-
4
- class TextParserTest < ::Test::Unit::TestCase
5
- def setup
6
- Fluent::Test.setup
7
- end
8
-
9
- class MultiEventTestParser < ::Fluent::Parser
10
- include Fluent::Configurable
11
-
12
- def parse(text)
13
- 2.times { |i|
14
- record = {}
15
- record['message'] = text
16
- record['number'] = i
17
- yield Fluent::Engine.now, record
18
- }
19
- end
20
- end
21
-
22
- Fluent::TextParser.register_template('multi_event_test', Proc.new { MultiEventTestParser.new })
23
-
24
- def test_lookup_unknown_format
25
- assert_raise Fluent::NotFoundPluginError do
26
- Fluent::Plugin.new_parser('unknown')
27
- end
28
- end
29
-
30
- data('register_formatter' => 'known', 'register_template' => 'known_old')
31
- def test_lookup_known_parser(data)
32
- $LOAD_PATH.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'scripts'))
33
- assert_nothing_raised Fluent::ConfigError do
34
- Fluent::Plugin.new_parser(data)
35
- end
36
- $LOAD_PATH.shift
37
- end
38
-
39
- def test_parse_with_return
40
- parser = Fluent::TextParser.new
41
- parser.configure(config_element('test', '', 'format' => 'none'))
42
- _time, record = parser.parse('log message!')
43
- assert_equal({'message' => 'log message!'}, record)
44
- end
45
-
46
- def test_parse_with_block
47
- parser = Fluent::TextParser.new
48
- parser.configure(config_element('test', '', 'format' => 'none'))
49
- parser.parse('log message!') { |time, record|
50
- assert_equal({'message' => 'log message!'}, record)
51
- }
52
- end
53
-
54
- def test_multi_event_parser
55
- parser = Fluent::TextParser.new
56
- parser.configure(config_element('test', '', 'format' => 'multi_event_test'))
57
- i = 0
58
- parser.parse('log message!') { |time, record|
59
- assert_equal('log message!', record['message'])
60
- assert_equal(i, record['number'])
61
- i += 1
62
- }
63
- end
64
-
65
- def test_setting_estimate_current_event_value
66
- p1 = Fluent::TextParser.new
67
- assert_nil p1.estimate_current_event
68
- assert_nil p1.parser
69
-
70
- p1.configure(config_element('test', '', 'format' => 'none'))
71
- assert_equal true, p1.parser.estimate_current_event
72
-
73
- p2 = Fluent::TextParser.new
74
- assert_nil p2.estimate_current_event
75
- assert_nil p2.parser
76
-
77
- p2.estimate_current_event = false
78
-
79
- p2.configure(config_element('test', '', 'format' => 'none'))
80
- assert_equal false, p2.parser.estimate_current_event
81
- end
82
-
83
- data(ignorecase: Regexp::IGNORECASE,
84
- multiline: Regexp::MULTILINE,
85
- both: Regexp::IGNORECASE & Regexp::MULTILINE)
86
- def test_regexp_parser_config(options)
87
- source = "(?<test>.*)"
88
- parser = Fluent::TextParser::RegexpParser.new(Regexp.new(source, options), { "dummy" => "dummy" })
89
- regexp = parser.instance_variable_get("@regexp")
90
- assert_equal(options, regexp.options)
91
- end
92
- end
@@ -1,42 +0,0 @@
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
@@ -1,551 +0,0 @@
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
- config_param :param_regexp, :regexp
39
- end
40
-
41
- class TestV1Parser < ::Test::Unit::TestCase
42
- def read_config(path)
43
- path = File.expand_path(path)
44
- data = File.read(path)
45
- Fluent::Config::V1Parser.parse(data, File.basename(path), File.dirname(path))
46
- end
47
-
48
- def parse_text(text)
49
- basepath = File.expand_path(File.dirname(__FILE__) + '/../../')
50
- Fluent::Config::V1Parser.parse(text, '(test)', basepath, nil)
51
- end
52
-
53
- include V1TestHelper
54
- extend V1TestHelper
55
-
56
- sub_test_case 'attribute parsing' do
57
- test "parses attributes" do
58
- assert_text_parsed_as(e('ROOT', '', {"k1"=>"v1", "k2"=>"v2"}), %[
59
- k1 v1
60
- k2 v2
61
- ])
62
- end
63
-
64
- test "allows attribute without value" do
65
- assert_text_parsed_as(e('ROOT', '', {"k1"=>"", "k2"=>"v2"}), %[
66
- k1
67
- k2 v2
68
- ])
69
- end
70
-
71
- test "parses attribute key always string" do
72
- assert_text_parsed_as(e('ROOT', '', {"1" => "1"}), "1 1")
73
- end
74
-
75
- data("_.%$!," => "_.%$!,",
76
- "/=~-~@\`:?" => "/=~-~@\`:?",
77
- "()*{}.[]" => "()*{}.[]")
78
- test "parses a value with symbols" do |v|
79
- assert_text_parsed_as(e('ROOT', '', {"k" => v}), "k #{v}")
80
- end
81
-
82
- test "ignores spacing around value" do
83
- assert_text_parsed_as(e('ROOT', '', {"k1" => "a"}), " k1 a ")
84
- end
85
-
86
- test "allows spaces in value" do
87
- assert_text_parsed_as(e('ROOT', '', {"k1" => "a b c"}), "k1 a b c")
88
- end
89
-
90
- test "parses value into empty string if only key exists" do
91
- # value parser parses empty string as true for bool type
92
- assert_text_parsed_as(e('ROOT', '', {"k1" => ""}), "k1\n")
93
- assert_text_parsed_as(e('ROOT', '', {"k1" => ""}), "k1")
94
- end
95
-
96
- sub_test_case 'non-quoted string' do
97
- test "remains text starting with '#'" do
98
- assert_text_parsed_as(e('ROOT', '', {"k1" => "#not_comment"}), " k1 #not_comment")
99
- end
100
-
101
- test "remains text just after '#'" do
102
- assert_text_parsed_as(e('ROOT', '', {"k1" => "a#not_comment"}), " k1 a#not_comment")
103
- end
104
-
105
- test "remove text after ` #` (comment)" do
106
- assert_text_parsed_as(e('ROOT', '', {"k1" => "a"}), " k1 a #comment")
107
- end
108
-
109
- test "does not require escaping backslash" do
110
- assert_text_parsed_as(e('ROOT', '', {"k1" => "\\\\"}), " k1 \\\\")
111
- assert_text_parsed_as(e('ROOT', '', {"k1" => "\\"}), " k1 \\")
112
- end
113
-
114
- test "remains backslash in front of a normal character" do
115
- assert_text_parsed_as(e('ROOT', '', {"k1" => '\['}), " k1 \\[")
116
- end
117
-
118
- test "does not accept escape characters" do
119
- assert_text_parsed_as(e('ROOT', '', {"k1" => '\n'}), " k1 \\n")
120
- end
121
- end
122
-
123
- sub_test_case 'double quoted string' do
124
- test "allows # in value" do
125
- assert_text_parsed_as(e('ROOT', '', {"k1" => "a#comment"}), ' k1 "a#comment"')
126
- end
127
-
128
- test "rejects characters after double quoted string" do
129
- assert_parse_error(' k1 "a" 1')
130
- end
131
-
132
- test "requires escaping backslash" do
133
- assert_text_parsed_as(e('ROOT', '', {"k1" => "\\"}), ' k1 "\\\\"')
134
- assert_parse_error(' k1 "\\"')
135
- end
136
-
137
- test "requires escaping double quote" do
138
- assert_text_parsed_as(e('ROOT', '', {"k1" => '"'}), ' k1 "\\""')
139
- assert_parse_error(' k1 """')
140
- assert_parse_error(' k1 ""\'')
141
- end
142
-
143
- test "removes backslash in front of a normal character" do
144
- assert_text_parsed_as(e('ROOT', '', {"k1" => '['}), ' k1 "\\["')
145
- end
146
-
147
- test "accepts escape characters" do
148
- assert_text_parsed_as(e('ROOT', '', {"k1" => "\n"}), ' k1 "\\n"')
149
- end
150
-
151
- test "support multiline string" do
152
- assert_text_parsed_as(e('ROOT', '',
153
- {"k1" => %[line1
154
- line2]
155
- }),
156
- %[k1 "line1
157
- line2"]
158
- )
159
- assert_text_parsed_as(e('ROOT', '',
160
- {"k1" => %[line1 line2]
161
- }),
162
- %[k1 "line1\\
163
- line2"]
164
- )
165
- assert_text_parsed_as(e('ROOT', '',
166
- {"k1" => %[line1
167
- line2
168
- line3]
169
- }),
170
- %[k1 "line1
171
- line2
172
- line3"]
173
- )
174
- assert_text_parsed_as(e('ROOT', '',
175
- {"k1" => %[line1
176
- line2 line3]
177
- }),
178
- %[k1 "line1
179
- line2\\
180
- line3"]
181
- )
182
- end
183
- end
184
-
185
- sub_test_case 'single quoted string' do
186
- test "allows # in value" do
187
- assert_text_parsed_as(e('ROOT', '', {"k1" => "a#comment"}), " k1 'a#comment'")
188
- end
189
-
190
- test "rejects characters after single quoted string" do
191
- assert_parse_error(" k1 'a' 1")
192
- end
193
-
194
- test "requires escaping backslash" do
195
- assert_text_parsed_as(e('ROOT', '', {"k1" => "\\"}), " k1 '\\\\'")
196
- assert_parse_error(" k1 '\\'")
197
- end
198
-
199
- test "requires escaping single quote" do
200
- assert_text_parsed_as(e('ROOT', '', {"k1" => "'"}), " k1 '\\''")
201
- assert_parse_error(" k1 '''")
202
- end
203
-
204
- test "remains backslash in front of a normal character" do
205
- assert_text_parsed_as(e('ROOT', '', {"k1" => '\\['}), " k1 '\\['")
206
- end
207
-
208
- test "does not accept escape characters" do
209
- assert_text_parsed_as(e('ROOT', '', {"k1" => "\\n"}), " k1 '\\n'")
210
- end
211
- end
212
-
213
- data(
214
- "in match" => %[
215
- <match>
216
- @k v
217
- </match>
218
- ],
219
- "in source" => %[
220
- <source>
221
- @k v
222
- </source>
223
- ],
224
- "in filter" => %[
225
- <filter>
226
- @k v
227
- </filter>
228
- ],
229
- "in top-level" => ' @k v '
230
- )
231
- def test_rejects_at_prefix_in_the_parameter_name(data)
232
- assert_parse_error(data)
233
- end
234
-
235
- data(
236
- "in nested" => %[
237
- <match>
238
- <record>
239
- @k v
240
- </record>
241
- </match>
242
- ]
243
- )
244
- def test_not_reject_at_prefix_in_the_parameter_name(data)
245
- assert_nothing_raised { parse_text(data) }
246
- end
247
- end
248
-
249
- sub_test_case 'element parsing' do
250
- data(
251
- 'root' => [root, ""],
252
- "accepts empty element" => [root(e("test")), %[
253
- <test>
254
- </test>
255
- ]],
256
- "accepts argument and attributes" => [root(e("test", 'var', {'key'=>"val"})), %[
257
- <test var>
258
- key val
259
- </test>
260
- ]],
261
- "accepts nested elements" => [root(
262
- e("test", 'var', {'key'=>'1'}, [
263
- e('nested1'),
264
- e('nested2')
265
- ])), %[
266
- <test var>
267
- key 1
268
- <nested1>
269
- </nested1>
270
- <nested2>
271
- </nested2>
272
- </test>
273
- ]],
274
- "accepts multiline json values" => [root(e("test", 'var', {'key'=>"[\"a\",\"b\",\"c\",\"d\"]"})), %[
275
- <test var>
276
- key ["a",
277
- "b", "c",
278
- "d"]
279
- </test>
280
- ]],
281
- "parses empty element argument to nil" => [root(e("test", '')), %[
282
- <test >
283
- </test>
284
- ]],
285
- "ignores spacing around element argument" => [root(e("test", "a")), %[
286
- <test a >
287
- </test>
288
- ]],
289
- "accepts spacing inside element argument (for multiple tags)" => [root(e("test", "a.** b.**")), %[
290
- <test a.** b.** >
291
- </test>
292
- ]])
293
- def test_parse_element(data)
294
- expected, target = data
295
- assert_text_parsed_as(expected, target)
296
- end
297
-
298
- [
299
- "**",
300
- "*.*",
301
- "1",
302
- "_.%$!",
303
- "/",
304
- "()*{}.[]",
305
- ].each do |arg|
306
- test "parses symbol element argument:#{arg}" do
307
- assert_text_parsed_as(root(e("test", arg)), %[
308
- <test #{arg}>
309
- </test>
310
- ])
311
- end
312
- end
313
-
314
- data(
315
- "considers comments in element argument" => %[
316
- <test #a>
317
- </test>
318
- ],
319
- "requires line_end after begin tag" => %[
320
- <test></test>
321
- ],
322
- "requires line_end after end tag" => %[
323
- <test>
324
- </test><test>
325
- </test>
326
- ])
327
- def test_parse_error(data)
328
- assert_parse_error(data)
329
- end
330
- end
331
-
332
- sub_test_case "Embedded Ruby Code in section attributes" do
333
- setup do
334
- ENV["EMBEDDED_VAR"] = "embedded"
335
- ENV["NESTED_EMBEDDED_VAR"] = "nested-embedded"
336
- @hostname = Socket.gethostname
337
- end
338
-
339
- teardown do
340
- ENV["EMBEDDED_VAR"] = nil
341
- ENV["NESTED_EMBEDDED_VAR"] = nil
342
- end
343
-
344
- test "embedded Ruby code should be expanded" do
345
- assert_text_parsed_as(root(
346
- e("test", 'embedded', {'key'=>'1'}, [
347
- e('nested1', 'nested-embedded'),
348
- e('nested2', "#{@hostname}")
349
- ])), <<-EOF
350
- <test "#{ENV["EMBEDDED_VAR"]}">
351
- key 1
352
- <nested1 "#{ENV["NESTED_EMBEDDED_VAR"]}">
353
- </nested1>
354
- <nested2 "#{Socket.gethostname}">
355
- </nested2>
356
- </test>
357
- EOF
358
- )
359
- end
360
- end
361
-
362
- # port from test_config.rb
363
- sub_test_case '@include parsing' do
364
- TMP_DIR = File.dirname(__FILE__) + "/tmp/v1_config#{ENV['TEST_ENV_NUMBER']}"
365
- TMP_DIR_WITH_SPACES = File.dirname(__FILE__) + "/tmp/folder with spaces/v1_config#{ENV['TEST_ENV_NUMBER']}"
366
-
367
- def write_config(path, data)
368
- FileUtils.mkdir_p(File.dirname(path))
369
- File.open(path, "w") { |f| f.write data }
370
- end
371
-
372
- def prepare_config(tmp_dir)
373
- write_config "#{tmp_dir}/config_test_1.conf", %[
374
- k1 root_config
375
- include dir/config_test_2.conf #
376
- @include #{tmp_dir}/config_test_4.conf
377
- include file://#{tmp_dir}/config_test_5.conf
378
- @include config.d/*.conf
379
- ]
380
- write_config "#{tmp_dir}/dir/config_test_2.conf", %[
381
- k2 relative_path_include
382
- @include ../config_test_3.conf
383
- ]
384
- write_config "#{tmp_dir}/config_test_3.conf", %[
385
- k3 relative_include_in_included_file
386
- ]
387
- write_config "#{tmp_dir}/config_test_4.conf", %[
388
- k4 absolute_path_include
389
- ]
390
- write_config "#{tmp_dir}/config_test_5.conf", %[
391
- k5 uri_include
392
- ]
393
- write_config "#{tmp_dir}/config.d/config_test_6.conf", %[
394
- k6 wildcard_include_1
395
- <elem1 name>
396
- include normal_parameter
397
- </elem1>
398
- ]
399
- write_config "#{tmp_dir}/config.d/config_test_7.conf", %[
400
- k7 wildcard_include_2
401
- ]
402
- write_config "#{tmp_dir}/config.d/config_test_8.conf", %[
403
- <elem2 name>
404
- @include ../dir/config_test_9.conf
405
- </elem2>
406
- ]
407
- write_config "#{tmp_dir}/dir/config_test_9.conf", %[
408
- k9 embedded
409
- <elem3 name>
410
- nested nested_value
411
- include hoge
412
- </elem3>
413
- ]
414
- write_config "#{tmp_dir}/config.d/00_config_test_8.conf", %[
415
- k8 wildcard_include_3
416
- <elem4 name>
417
- include normal_parameter
418
- </elem4>
419
- ]
420
- end
421
-
422
- data("TMP_DIR without spaces" => TMP_DIR,
423
- "TMP_DIR with spaces" => TMP_DIR_WITH_SPACES)
424
- test 'parses @include / include correctly' do |data|
425
- prepare_config(data)
426
- c = read_config("#{data}/config_test_1.conf")
427
- assert_equal('root_config', c['k1'])
428
- assert_equal('relative_path_include', c['k2'])
429
- assert_equal('relative_include_in_included_file', c['k3'])
430
- assert_equal('absolute_path_include', c['k4'])
431
- assert_equal('uri_include', c['k5'])
432
- assert_equal('wildcard_include_1', c['k6'])
433
- assert_equal('wildcard_include_2', c['k7'])
434
- assert_equal('wildcard_include_3', c['k8'])
435
- assert_equal([
436
- 'k1',
437
- 'k2',
438
- 'k3',
439
- 'k4',
440
- 'k5',
441
- 'k8', # Because of the file name this comes first.
442
- 'k6',
443
- 'k7',
444
- ], c.keys)
445
-
446
- elem1 = c.elements.find { |e| e.name == 'elem1' }
447
- assert(elem1)
448
- assert_equal('name', elem1.arg)
449
- assert_equal('normal_parameter', elem1['include'])
450
-
451
- elem2 = c.elements.find { |e| e.name == 'elem2' }
452
- assert(elem2)
453
- assert_equal('name', elem2.arg)
454
- assert_equal('embedded', elem2['k9'])
455
- assert_not_include(elem2, 'include')
456
-
457
- elem3 = elem2.elements.find { |e| e.name == 'elem3' }
458
- assert(elem3)
459
- assert_equal('nested_value', elem3['nested'])
460
- assert_equal('hoge', elem3['include'])
461
- end
462
-
463
- # TODO: Add uri based include spec
464
- end
465
-
466
- sub_test_case '#to_s' do
467
- test 'parses dumpped configuration' do
468
- original = %q!a\\\n\r\f\b'"z!
469
- expected = %q!a\\\n\r\f\b'"z!
470
-
471
- conf = parse_text(%[k1 #{original}])
472
- assert_equal(expected, conf['k1']) # escape check
473
- conf2 = parse_text(conf.to_s) # use dumpped configuration to check unescape
474
- assert_equal(expected, conf2.elements.first['k1'])
475
- end
476
-
477
- test 'all types' do
478
- conf = parse_text(%[
479
- param_string "value"
480
- param_enum foo
481
- param_integer 999
482
- param_float 55.55
483
- param_size 4k
484
- param_bool true
485
- param_time 10m
486
- param_hash { "key1": "value1", "key2": 2 }
487
- param_array ["value1", "value2", 100]
488
- param_regexp /pattern/
489
- ])
490
- target = AllTypes.new.configure(conf)
491
- assert_equal(conf.to_s, target.config.to_s)
492
- expected = <<DUMP
493
- <ROOT>
494
- param_string "value"
495
- param_enum foo
496
- param_integer 999
497
- param_float 55.55
498
- param_size 4k
499
- param_bool true
500
- param_time 10m
501
- param_hash {"key1":"value1","key2":2}
502
- param_array ["value1","value2",100]
503
- param_regexp /pattern/
504
- </ROOT>
505
- DUMP
506
- assert_equal(expected, conf.to_s)
507
- end
508
- end
509
- end
510
-
511
- class TestV0Parser < ::Test::Unit::TestCase
512
- def parse_text(text)
513
- basepath = File.expand_path(File.dirname(__FILE__) + '/../../')
514
- Fluent::Config::Parser.parse(StringIO.new(text), '(test)', basepath)
515
- end
516
-
517
- sub_test_case "Fluent::Config::Element#to_s" do
518
- test 'all types' do
519
- conf = parse_text(%[
520
- param_string value
521
- param_enum foo
522
- param_integer 999
523
- param_float 55.55
524
- param_size 4k
525
- param_bool true
526
- param_time 10m
527
- param_hash { "key1": "value1", "key2": 2 }
528
- param_array ["value1", "value2", 100]
529
- param_regexp /pattern/
530
- ])
531
- target = AllTypes.new.configure(conf)
532
- assert_equal(conf.to_s, target.config.to_s)
533
- expected = <<DUMP
534
- <ROOT>
535
- param_string value
536
- param_enum foo
537
- param_integer 999
538
- param_float 55.55
539
- param_size 4k
540
- param_bool true
541
- param_time 10m
542
- param_hash { "key1": "value1", "key2": 2 }
543
- param_array ["value1", "value2", 100]
544
- param_regexp /pattern/
545
- </ROOT>
546
- DUMP
547
- assert_equal(expected, conf.to_s)
548
- end
549
- end
550
- end
551
- end