fluentd 1.11.5-x86-mingw32 → 1.12.4-x86-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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/.deepsource.toml +13 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  4. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. data/.github/workflows/linux-test.yaml +36 -0
  6. data/.github/workflows/macos-test.yaml +30 -0
  7. data/.github/workflows/stale-actions.yml +22 -0
  8. data/.github/workflows/windows-test.yaml +35 -0
  9. data/.gitlab-ci.yml +41 -19
  10. data/CHANGELOG.md +158 -0
  11. data/MAINTAINERS.md +5 -2
  12. data/README.md +7 -4
  13. data/bin/fluent-cap-ctl +7 -0
  14. data/bin/fluent-ctl +7 -0
  15. data/fluentd.gemspec +6 -4
  16. data/lib/fluent/capability.rb +87 -0
  17. data/lib/fluent/command/bundler_injection.rb +1 -1
  18. data/lib/fluent/command/ca_generate.rb +6 -3
  19. data/lib/fluent/command/cap_ctl.rb +174 -0
  20. data/lib/fluent/command/cat.rb +0 -1
  21. data/lib/fluent/command/ctl.rb +177 -0
  22. data/lib/fluent/command/fluentd.rb +4 -0
  23. data/lib/fluent/command/plugin_config_formatter.rb +18 -2
  24. data/lib/fluent/command/plugin_generator.rb +31 -1
  25. data/lib/fluent/compat/parser.rb +2 -2
  26. data/lib/fluent/config/section.rb +2 -2
  27. data/lib/fluent/config/types.rb +2 -2
  28. data/lib/fluent/env.rb +4 -0
  29. data/lib/fluent/event.rb +3 -13
  30. data/lib/fluent/load.rb +0 -1
  31. data/lib/fluent/plugin.rb +5 -0
  32. data/lib/fluent/plugin/buffer.rb +2 -21
  33. data/lib/fluent/plugin/file_wrapper.rb +39 -3
  34. data/lib/fluent/plugin/formatter.rb +2 -2
  35. data/lib/fluent/plugin/formatter_csv.rb +1 -1
  36. data/lib/fluent/plugin/formatter_hash.rb +1 -1
  37. data/lib/fluent/plugin/formatter_ltsv.rb +5 -5
  38. data/lib/fluent/plugin/formatter_out_file.rb +3 -3
  39. data/lib/fluent/plugin/formatter_single_value.rb +2 -2
  40. data/lib/fluent/plugin/formatter_tsv.rb +2 -2
  41. data/lib/fluent/plugin/in_http.rb +24 -3
  42. data/lib/fluent/plugin/in_monitor_agent.rb +1 -1
  43. data/lib/fluent/plugin/in_tail.rb +129 -41
  44. data/lib/fluent/plugin/in_tail/position_file.rb +53 -14
  45. data/lib/fluent/plugin/in_tcp.rb +1 -0
  46. data/lib/fluent/plugin/out_copy.rb +18 -5
  47. data/lib/fluent/plugin/out_exec_filter.rb +3 -3
  48. data/lib/fluent/plugin/out_forward.rb +61 -28
  49. data/lib/fluent/plugin/out_http.rb +9 -2
  50. data/lib/fluent/plugin/output.rb +18 -10
  51. data/lib/fluent/plugin/parser_csv.rb +2 -2
  52. data/lib/fluent/plugin/parser_syslog.rb +2 -2
  53. data/lib/fluent/plugin/storage_local.rb +4 -4
  54. data/lib/fluent/plugin_helper/http_server/compat/server.rb +1 -1
  55. data/lib/fluent/plugin_helper/inject.rb +4 -2
  56. data/lib/fluent/plugin_helper/retry_state.rb +4 -0
  57. data/lib/fluent/plugin_helper/server.rb +4 -2
  58. data/lib/fluent/plugin_helper/socket_option.rb +2 -2
  59. data/lib/fluent/supervisor.rb +153 -47
  60. data/lib/fluent/system_config.rb +2 -1
  61. data/lib/fluent/time.rb +58 -1
  62. data/lib/fluent/version.rb +1 -1
  63. data/lib/fluent/winsvc.rb +22 -4
  64. data/templates/new_gem/fluent-plugin.gemspec.erb +3 -3
  65. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  66. data/test/command/test_cap_ctl.rb +100 -0
  67. data/test/command/test_ctl.rb +57 -0
  68. data/test/command/test_fluentd.rb +38 -0
  69. data/test/command/test_plugin_config_formatter.rb +124 -2
  70. data/test/config/test_configurable.rb +1 -1
  71. data/test/plugin/in_tail/test_position_file.rb +100 -26
  72. data/test/plugin/test_file_wrapper.rb +105 -0
  73. data/test/plugin/test_in_exec.rb +1 -1
  74. data/test/plugin/test_in_http.rb +25 -0
  75. data/test/plugin/test_in_tail.rb +503 -42
  76. data/test/plugin/test_out_copy.rb +87 -0
  77. data/test/plugin/test_out_forward.rb +94 -6
  78. data/test/plugin/test_out_http.rb +20 -1
  79. data/test/plugin/test_output.rb +15 -3
  80. data/test/plugin/test_output_as_buffered_backup.rb +2 -0
  81. data/test/plugin/test_parser_csv.rb +14 -0
  82. data/test/plugin/test_parser_syslog.rb +16 -2
  83. data/test/plugin/test_sd_file.rb +1 -1
  84. data/test/plugin_helper/service_discovery/test_manager.rb +1 -1
  85. data/test/plugin_helper/test_child_process.rb +5 -2
  86. data/test/plugin_helper/test_http_server_helper.rb +4 -2
  87. data/test/plugin_helper/test_inject.rb +29 -0
  88. data/test/plugin_helper/test_server.rb +26 -7
  89. data/test/test_capability.rb +74 -0
  90. data/test/test_event.rb +16 -0
  91. data/test/test_formatter.rb +30 -0
  92. data/test/test_output.rb +2 -2
  93. data/test/test_supervisor.rb +133 -10
  94. data/test/test_time_parser.rb +109 -0
  95. metadata +85 -31
  96. data/.travis.yml +0 -57
  97. data/appveyor.yml +0 -28
@@ -2,8 +2,11 @@ require_relative '../helper'
2
2
  require 'fluent/test/driver/multi_output'
3
3
  require 'fluent/plugin/out_copy'
4
4
  require 'fluent/event'
5
+ require 'flexmock/test_unit'
5
6
 
6
7
  class CopyOutputTest < Test::Unit::TestCase
8
+ include FlexMock::TestCase
9
+
7
10
  class << self
8
11
  def startup
9
12
  $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'scripts'))
@@ -54,6 +57,48 @@ class CopyOutputTest < Test::Unit::TestCase
54
57
  assert_equal :no_copy, d.instance.copy_mode
55
58
  end
56
59
 
60
+ ERRORNEOUS_IGNORE_IF_PREV_SUCCESS_CONFIG = %[
61
+ <store ignore_if_prev_success ignore_error>
62
+ @type test
63
+ name c0
64
+ </store>
65
+ <store ignore_if_prev_success ignore_error>
66
+ @type test
67
+ name c1
68
+ </store>
69
+ <store ignore_if_prev_success>
70
+ @type test
71
+ name c2
72
+ </store>
73
+ ]
74
+ def test_configure_with_errorneus_ignore_if_prev_success
75
+ assert_raise(Fluent::ConfigError) do
76
+ create_driver(ERRORNEOUS_IGNORE_IF_PREV_SUCCESS_CONFIG)
77
+ end
78
+ end
79
+
80
+ ALL_IGNORE_ERROR_WITHOUT_IGNORE_IF_PREV_SUCCESS_CONFIG = %[
81
+ @log_level info
82
+ <store ignore_error>
83
+ @type test
84
+ name c0
85
+ </store>
86
+ <store ignore_error>
87
+ @type test
88
+ name c1
89
+ </store>
90
+ <store ignore_error>
91
+ @type test
92
+ name c2
93
+ </store>
94
+ ]
95
+ def test_configure_all_ignore_errors_without_ignore_if_prev_success
96
+ d = create_driver(ALL_IGNORE_ERROR_WITHOUT_IGNORE_IF_PREV_SUCCESS_CONFIG)
97
+ expected = /ignore_errors are specified in all <store>, but ignore_if_prev_success is not specified./
98
+ matches = d.logs.grep(expected)
99
+ assert_equal(1, matches.length, "Logs do not contain '#{expected}' '#{d.logs}'")
100
+ end
101
+
57
102
  def test_configure_with_deep_copy_and_use_shallow_copy_mode
58
103
  d = create_driver(%[
59
104
  deep_copy true
@@ -217,5 +262,47 @@ class CopyOutputTest < Test::Unit::TestCase
217
262
  end
218
263
  end
219
264
  end
265
+
266
+ IGNORE_IF_PREV_SUCCESS_CONFIG = %[
267
+ <store ignore_error>
268
+ @type test
269
+ name c0
270
+ </store>
271
+ <store ignore_if_prev_success ignore_error>
272
+ @type test
273
+ name c1
274
+ </store>
275
+ <store ignore_if_prev_success>
276
+ @type test
277
+ name c2
278
+ </store>
279
+ ]
280
+
281
+ def test_ignore_if_prev_success
282
+ d = create_driver(IGNORE_IF_PREV_SUCCESS_CONFIG)
283
+
284
+ # override to raise an error
285
+ d.instance.outputs[0].define_singleton_method(:process) do |tag, es|
286
+ raise ArgumentError, 'Failed'
287
+ end
288
+
289
+ # check ingore_if_prev_success functionality:
290
+ # 1. output 2 is succeeded.
291
+ # 2. output 3 is not called.
292
+ flexstub(d.instance.outputs[1]) do |output|
293
+ output.should_receive(:process).once
294
+ end
295
+ flexstub(d.instance.outputs[2]) do |output|
296
+ output.should_receive(:process).never
297
+ end
298
+
299
+ time = Time.parse("2011-01-02 13:14:15 UTC").to_i
300
+ assert_nothing_raised do
301
+ d.run(default_tag: 'test') do
302
+ d.feed(time, {"a"=>1})
303
+ end
304
+ end
305
+ end
306
+
220
307
  end
221
308
 
@@ -367,10 +367,31 @@ EOL
367
367
  require_ack_response true
368
368
  ack_response_timeout 2s
369
369
  ])
370
+ d.instance_start
370
371
  assert d.instance.require_ack_response
371
372
  assert_equal 2, d.instance.ack_response_timeout
372
373
  end
373
374
 
375
+ test 'suspend_flush is disable before before_shutdown' do
376
+ @d = d = create_driver(CONFIG + %[
377
+ require_ack_response true
378
+ ack_response_timeout 2s
379
+ ])
380
+ d.instance_start
381
+ assert_false d.instance.instance_variable_get(:@suspend_flush)
382
+ end
383
+
384
+ test 'suspend_flush should be enabled and try_flush returns nil after before_shutdown' do
385
+ @d = d = create_driver(CONFIG + %[
386
+ require_ack_response true
387
+ ack_response_timeout 2s
388
+ ])
389
+ d.instance_start
390
+ d.instance.before_shutdown
391
+ assert_true d.instance.instance_variable_get(:@suspend_flush)
392
+ assert_nil d.instance.try_flush
393
+ end
394
+
374
395
  test 'verify_connection_at_startup is disabled in default' do
375
396
  @d = d = create_driver(CONFIG)
376
397
  assert_false d.instance.verify_connection_at_startup
@@ -566,31 +587,88 @@ EOL
566
587
  flush_mode immediate
567
588
  retry_type periodic
568
589
  retry_wait 30s
569
- flush_at_shutdown false # suppress errors in d.instance_shutdown
590
+ flush_at_shutdown true
570
591
  </buffer>
571
592
  ])
572
593
 
573
594
  time = event_time("2011-01-02 13:14:15 UTC")
574
595
 
575
596
  acked_chunk_ids = []
597
+ nacked = false
576
598
  mock.proxy(d.instance.ack_handler).read_ack_from_sock(anything) do |info, success|
577
599
  if success
578
600
  acked_chunk_ids << info.chunk_id
601
+ else
602
+ nacked = true
579
603
  end
580
- [chunk_id, success]
604
+ [info, success]
581
605
  end
582
606
 
583
607
  records = [
584
608
  {"a" => 1},
585
609
  {"a" => 2}
586
610
  ]
587
- target_input_driver.run(expect_records: 2) do
588
- d.end_if { acked_chunk_ids.size > 0 }
611
+ target_input_driver.run(expect_records: 2, timeout: 5) do
612
+ d.end_if { acked_chunk_ids.size > 0 || nacked }
589
613
  d.run(default_tag: 'test', wait_flush_completion: false, shutdown: false) do
590
614
  d.feed([[time, records[0]], [time,records[1]]])
591
615
  end
592
616
  end
593
617
 
618
+ assert(!nacked, d.instance.log.logs.join)
619
+
620
+ events = target_input_driver.events
621
+ assert_equal ['test', time, records[0]], events[0]
622
+ assert_equal ['test', time, records[1]], events[1]
623
+
624
+ assert_equal 1, acked_chunk_ids.size
625
+ assert_equal d.instance.sent_chunk_ids.first, acked_chunk_ids.first
626
+ end
627
+
628
+ test 'a node supporting responses after stop' do
629
+ target_input_driver = create_target_input_driver
630
+
631
+ @d = d = create_driver(CONFIG + %[
632
+ require_ack_response true
633
+ ack_response_timeout 1s
634
+ <buffer tag>
635
+ flush_mode immediate
636
+ retry_type periodic
637
+ retry_wait 30s
638
+ flush_at_shutdown true
639
+ </buffer>
640
+ ])
641
+
642
+ time = event_time("2011-01-02 13:14:15 UTC")
643
+
644
+ acked_chunk_ids = []
645
+ nacked = false
646
+ mock.proxy(d.instance.ack_handler).read_ack_from_sock(anything) do |info, success|
647
+ if success
648
+ acked_chunk_ids << info.chunk_id
649
+ else
650
+ nacked = true
651
+ end
652
+ [info, success]
653
+ end
654
+
655
+ records = [
656
+ {"a" => 1},
657
+ {"a" => 2}
658
+ ]
659
+ target_input_driver.run(expect_records: 2, timeout: 5) do
660
+ d.end_if { acked_chunk_ids.size > 0 || nacked }
661
+ d.run(default_tag: 'test', wait_flush_completion: false, shutdown: false) do
662
+ d.instance.stop
663
+ d.feed([[time, records[0]], [time,records[1]]])
664
+ d.instance.before_shutdown
665
+ d.instance.shutdown
666
+ d.instance.after_shutdown
667
+ end
668
+ end
669
+
670
+ assert(!nacked, d.instance.log.logs.join)
671
+
594
672
  events = target_input_driver.events
595
673
  assert_equal ['test', time, records[0]], events[0]
596
674
  assert_equal ['test', time, records[1]], events[1]
@@ -995,7 +1073,7 @@ EOL
995
1073
  test 'when out_forward has @id' do
996
1074
  # cancel https://github.com/fluent/fluentd/blob/077508ac817b7637307434d0c978d7cdc3d1c534/lib/fluent/plugin_id.rb#L43-L53
997
1075
  # it always return true in test
998
- mock.proxy(Fluent::Plugin).new_sd(:static, anything) { |v|
1076
+ mock.proxy(Fluent::Plugin).new_sd(:static, parent: anything) { |v|
999
1077
  stub(v).plugin_id_for_test? { false }
1000
1078
  }.once
1001
1079
 
@@ -1137,6 +1215,8 @@ EOL
1137
1215
  end
1138
1216
 
1139
1217
  test 'Create new connection per send_data' do
1218
+ omit "Proxy of RR doesn't support kwargs of Ruby 3 yet" if RUBY_VERSION.split('.')[0].to_i >= 3
1219
+
1140
1220
  target_input_driver = create_target_input_driver(conf: TARGET_CONFIG)
1141
1221
  output_conf = CONFIG
1142
1222
  d = create_driver(output_conf)
@@ -1175,6 +1255,8 @@ EOL
1175
1255
 
1176
1256
  sub_test_case 'keepalive' do
1177
1257
  test 'Do not create connection per send_data' do
1258
+ omit "Proxy of RR doesn't support kwargs of Ruby 3 yet" if RUBY_VERSION.split('.')[0].to_i >= 3
1259
+
1178
1260
  target_input_driver = create_target_input_driver(conf: TARGET_CONFIG)
1179
1261
  output_conf = CONFIG + %[
1180
1262
  keepalive true
@@ -1222,7 +1304,13 @@ EOL
1222
1304
 
1223
1305
  begin
1224
1306
  chunk = Fluent::Plugin::Buffer::MemoryChunk.new(Fluent::Plugin::Buffer::Metadata.new(nil, nil, nil))
1225
- mock.proxy(d.instance).socket_create_tcp(TARGET_HOST, TARGET_PORT, anything) { |sock| mock(sock).close.once; sock }.twice
1307
+ mock.proxy(d.instance).socket_create_tcp(TARGET_HOST, TARGET_PORT,
1308
+ linger_timeout: anything,
1309
+ send_timeout: anything,
1310
+ recv_timeout: anything,
1311
+ connect_timeout: anything) { |sock|
1312
+ mock(sock).close.once; sock
1313
+ }.twice
1226
1314
 
1227
1315
  target_input_driver.run(timeout: 15) do
1228
1316
  d.run(shutdown: false) do
@@ -127,7 +127,7 @@ class HTTPOutputTest < Test::Unit::TestCase
127
127
  now = Time.now
128
128
  started = false
129
129
  until started
130
- raise "Server not started" if (now - Time.now > 10.0)
130
+ raise "Server not started" if (Time.now - now > 10.0)
131
131
  begin
132
132
  http_client { |c| c.request_get('/') }
133
133
  started = true
@@ -280,6 +280,25 @@ class HTTPOutputTest < Test::Unit::TestCase
280
280
  assert_equal "fluentd!", result.headers['test_header']
281
281
  end
282
282
 
283
+ def test_write_with_headers_from_placeholders
284
+ d = create_driver(config + %[
285
+ headers_from_placeholders {"x-test":"${$.foo.bar}-test","x-tag":"${tag}"}
286
+ <buffer tag,$.foo.bar>
287
+ </buffer>
288
+ ])
289
+ d.run(default_tag: 'test.http') do
290
+ test_events.each { |event|
291
+ ev = event.dup
292
+ ev['foo'] = {'bar' => 'abcd'}
293
+ d.feed(ev)
294
+ }
295
+ end
296
+
297
+ result = @@result
298
+ assert_equal "abcd-test", result.headers['x-test']
299
+ assert_equal "test.http", result.headers['x-tag']
300
+ end
301
+
283
302
  def test_write_with_retryable_response
284
303
  old_report_on_exception = Thread.report_on_exception
285
304
  Thread.report_on_exception = false # thread finished as invalid state since RetryableResponse raises.
@@ -390,6 +390,18 @@ class OutputTest < Test::Unit::TestCase
390
390
  assert { logs.none? { |log| log.include?("${chunk_id}") } }
391
391
  end
392
392
 
393
+ test '#extract_placeholders does not log for ${chunk_id} placeholder (with @chunk_keys)' do
394
+ @i.configure(config_element('ROOT', '', {}, [config_element('buffer', 'key1')]))
395
+ tmpl = "/mypath/${chunk_id}/${key1}/tail"
396
+ t = event_time('2016-04-11 20:30:00 +0900')
397
+ v = {key1: "value1", key2: "value2"}
398
+ c = create_chunk(timekey: t, tag: 'fluentd.test.output', variables: v)
399
+ @i.log.out.logs.clear
400
+ @i.extract_placeholders(tmpl, c)
401
+ logs = @i.log.out.logs
402
+ assert { logs.none? { |log| log.include?("${chunk_id}") } }
403
+ end
404
+
393
405
  test '#extract_placeholders logs warn message with not replaced key' do
394
406
  @i.configure(config_element('ROOT', '', {}, [config_element('buffer', '')]))
395
407
  tmpl = "/mypath/${key1}/test"
@@ -868,7 +880,7 @@ class OutputTest < Test::Unit::TestCase
868
880
  test "Warn if primary type is different from secondary type and either primary or secondary has custom_format" do
869
881
  o = create_output(:buffered)
870
882
  mock(o.log).warn("Use different plugin for secondary. Check the plugin works with primary like secondary_file",
871
- { primary: o.class.to_s, secondary: "Fluent::Plugin::TestOutput" })
883
+ primary: o.class.to_s, secondary: "Fluent::Plugin::TestOutput")
872
884
 
873
885
  o.configure(config_element('ROOT','',{},[config_element('secondary','',{'@type'=>'test', 'name' => "cool"})]))
874
886
  assert_not_nil o.instance_variable_get(:@secondary)
@@ -877,7 +889,7 @@ class OutputTest < Test::Unit::TestCase
877
889
  test "don't warn if primary type is the same as secondary type" do
878
890
  o = Fluent::Plugin::TestOutput.new
879
891
  mock(o.log).warn("Use different plugin for secondary. Check the plugin works with primary like secondary_file",
880
- { primary: o.class.to_s, secondary: "Fluent::Plugin::TestOutput" }).never
892
+ primary: o.class.to_s, secondary: "Fluent::Plugin::TestOutput" ).never
881
893
 
882
894
  o.configure(config_element('ROOT','',{'name' => "cool2"},
883
895
  [config_element('secondary','',{'@type'=>'test', 'name' => "cool"}),
@@ -889,7 +901,7 @@ class OutputTest < Test::Unit::TestCase
889
901
  test "don't warn if primary type is different from secondary type and both don't have custom_format" do
890
902
  o = create_output(:standard)
891
903
  mock(o.log).warn("Use different plugin for secondary. Check the plugin works with primary like secondary_file",
892
- { primary: o.class.to_s, secondary: "Fluent::Plugin::TestOutput" }).never
904
+ primary: o.class.to_s, secondary: "Fluent::Plugin::TestOutput").never
893
905
 
894
906
  o.configure(config_element('ROOT','',{},[config_element('secondary','',{'@type'=>'test', 'name' => "cool"})]))
895
907
  assert_not_nil o.instance_variable_get(:@secondary)
@@ -173,6 +173,8 @@ class BufferedOutputBackupTest < Test::Unit::TestCase
173
173
  waiting(5) {
174
174
  target_dir = File.join(File.dirname(target_file), "*")
175
175
  while Dir.glob(target_dir).size.zero?
176
+ # Avoid to lose globbed entries on Windows in busy loop
177
+ sleep 0.1 if Fluent.windows?
176
178
  end
177
179
  }
178
180
  end
@@ -183,4 +183,18 @@ class CSVParserTest < ::Test::Unit::TestCase
183
183
  # And more...
184
184
  end
185
185
  end
186
+
187
+ # "parser_type" config shouldn't hide Fluent::Plugin::Parser#plugin_type
188
+ # https://github.com/fluent/fluentd/issues/3296
189
+ data('normal' => :normal, 'fast' => :fast)
190
+ def test_parser_type_method(engine)
191
+ d = create_driver('keys' => '["time"]','time_key' => 'time', 'parser_type' => engine.to_s)
192
+ assert_equal(:text_per_line, d.instance.parser_type)
193
+ end
194
+
195
+ data('normal' => :normal, 'fast' => :fast)
196
+ def test_parser_engine(engine)
197
+ d = create_driver('keys' => '["time"]', 'time_key' => 'time', 'parser_engine' => engine.to_s)
198
+ assert_equal(engine, d.instance.parser_engine)
199
+ end
186
200
  end
@@ -38,7 +38,7 @@ class SyslogParserTest < ::Test::Unit::TestCase
38
38
  data('regexp' => 'regexp', 'string' => 'string')
39
39
  def test_parse_with_time_format2(param)
40
40
  @parser.configure('time_format' => '%Y-%m-%dT%H:%M:%SZ', 'parser_type' => param)
41
- @parser.instance.parse('2020-03-03T10:14:29Z 192.168.0.1 fluentd[11111]: [error] Syslog test') { |time, record|
41
+ @parser.instance.parse("#{Time.now.year}-03-03T10:14:29Z 192.168.0.1 fluentd[11111]: [error] Syslog test") { |time, record|
42
42
  assert_equal(event_time('Mar 03 10:14:29', format: '%b %d %H:%M:%S'), time)
43
43
  assert_equal(@expected, record)
44
44
  }
@@ -47,7 +47,7 @@ class SyslogParserTest < ::Test::Unit::TestCase
47
47
 
48
48
  def test_parse_with_time_format_rfc5424
49
49
  @parser.configure('time_format' => '%Y-%m-%dT%H:%M:%SZ', 'message_format' => 'rfc5424')
50
- @parser.instance.parse('2020-03-03T10:14:29Z 192.168.0.1 fluentd 11111 - - [error] Syslog test') { |time, record|
50
+ @parser.instance.parse("#{Time.now.year}-03-03T10:14:29Z 192.168.0.1 fluentd 11111 - - [error] Syslog test") { |time, record|
51
51
  assert_equal(event_time('Mar 03 10:14:29', format: '%b %d %H:%M:%S'), time)
52
52
  assert_equal(@expected.merge('host' => '192.168.0.1', 'msgid' => '-', 'extradata' => '-'), record)
53
53
  }
@@ -633,4 +633,18 @@ class SyslogParserTest < ::Test::Unit::TestCase
633
633
  end
634
634
  end
635
635
  end
636
+
637
+ # "parser_type" config shouldn't hide Fluent::Plugin::Parser#plugin_type
638
+ # https://github.com/fluent/fluentd/issues/3296
639
+ data('regexp' => :regexp, 'fast' => :string)
640
+ def test_parser_type_method(engine)
641
+ @parser.configure({'parser_type' => engine.to_s})
642
+ assert_equal(:text_per_line, @parser.instance.parser_type)
643
+ end
644
+
645
+ data('regexp' => :regexp, 'string' => :string)
646
+ def test_parser_engine(engine)
647
+ d = @parser.configure({'parser_engine' => engine.to_s})
648
+ assert_equal(engine, @parser.instance.parser_engine)
649
+ end
636
650
  end
@@ -149,7 +149,7 @@ class FileServiceDiscoveryTest < ::Test::Unit::TestCase
149
149
  assert_empty queue
150
150
  end
151
151
 
152
- test 'Skip if error is occured' do
152
+ test 'Skip if error is occurred' do
153
153
  @sd_file.extend(TestStatEventHelperWrapper)
154
154
 
155
155
  create_tmp_config('config.json', JSON.generate([{ port: 1233, host: '127.0.0.1' }]))
@@ -71,7 +71,7 @@ class TestServiceDiscoveryManager < ::Test::Unit::TestCase
71
71
  test 'if new service added and deleted' do
72
72
  sdm = Fluent::PluginHelper::ServiceDiscovery::Manager.new(log: $log)
73
73
  t = TestSdPlugin.new
74
- mock(Fluent::Plugin).new_sd(:sd_test, anything) { t }
74
+ mock(Fluent::Plugin).new_sd(:sd_test, parent: anything) { t }
75
75
  sdm.configure([{ type: :sd_test, conf: config_element('service_discovery', '', {})}])
76
76
  sdm.start
77
77
 
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require_relative '../helper'
2
3
  require 'fluent/plugin_helper/child_process'
3
4
  require 'fluent/plugin/base'
@@ -269,10 +270,12 @@ class ChildProcessTest < Test::Unit::TestCase
269
270
  Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
270
271
  ran = false
271
272
  @d.child_process_execute(:t4, "ruby -e 'Signal.trap(:TERM, nil); while sleep 0.1; puts 1; STDOUT.flush rescue nil; end'", mode: [:read]) do |io|
272
- m.lock
273
- ran = true
274
273
  begin
275
274
  while line = io.readline
275
+ unless ran
276
+ m.lock
277
+ ran = true
278
+ end
276
279
  ary << line
277
280
  end
278
281
  rescue