fluentd 1.11.5-x64-mingw32 → 1.12.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 (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
@@ -27,7 +27,7 @@ module Fluent
27
27
  :log_event_verbose, :ignore_repeated_log_interval, :ignore_same_log_interval,
28
28
  :without_source, :rpc_endpoint, :enable_get_dump, :process_name,
29
29
  :file_permission, :dir_permission, :counter_server, :counter_client,
30
- :strict_config_value, :enable_msgpack_time_support
30
+ :strict_config_value, :enable_msgpack_time_support, :disable_shared_socket
31
31
  ]
32
32
 
33
33
  config_param :workers, :integer, default: 1
@@ -45,6 +45,7 @@ module Fluent
45
45
  config_param :process_name, :string, default: nil
46
46
  config_param :strict_config_value, :bool, default: nil
47
47
  config_param :enable_msgpack_time_support, :bool, default: nil
48
+ config_param :disable_shared_socket, :bool, default: nil
48
49
  config_param :file_permission, default: nil do |v|
49
50
  v.to_i(8)
50
51
  end
data/lib/fluent/time.rb CHANGED
@@ -50,6 +50,7 @@ module Fluent
50
50
  def to_int
51
51
  @sec
52
52
  end
53
+ alias :to_i :to_int
53
54
 
54
55
  def to_f
55
56
  @sec + @nsec / 1_000_000_000.0
@@ -131,13 +132,14 @@ module Fluent
131
132
  end
132
133
 
133
134
  module TimeMixin
134
- TIME_TYPES = ['string', 'unixtime', 'float']
135
+ TIME_TYPES = ['string', 'unixtime', 'float', 'mixed']
135
136
 
136
137
  TIME_PARAMETERS = [
137
138
  [:time_format, :string, {default: nil}],
138
139
  [:localtime, :bool, {default: true}], # UTC if :localtime is false and :timezone is nil
139
140
  [:utc, :bool, {default: false}], # to turn :localtime false
140
141
  [:timezone, :string, {default: nil}],
142
+ [:time_format_fallbacks, :array, {default: []}], # try time_format, then try fallbacks
141
143
  ]
142
144
  TIME_FULL_PARAMETERS = [
143
145
  # To avoid to define :time_type twice (in plugin_helper/inject)
@@ -169,6 +171,12 @@ module Fluent
169
171
  raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
170
172
  end
171
173
 
174
+ if conf.has_key?('time_type') and @time_type == :mixed
175
+ if @time_format.nil? and @time_format_fallbacks.empty?
176
+ raise Fluent::ConfigError, "time_type is :mixed but time_format and time_format_fallbacks is empty."
177
+ end
178
+ end
179
+
172
180
  Fluent::Timezone.validate!(@timezone) if @timezone
173
181
  end
174
182
  end
@@ -179,6 +187,7 @@ module Fluent
179
187
  end
180
188
 
181
189
  def time_parser_create(type: @time_type, format: @time_format, timezone: @timezone, force_localtime: false)
190
+ return MixedTimeParser.new(type, format, @localtime, timezone, @utc, force_localtime, @time_format_fallbacks) if type == :mixed
182
191
  return NumericTimeParser.new(type) if type != :string
183
192
  return TimeParser.new(format, true, nil) if force_localtime
184
193
 
@@ -451,4 +460,52 @@ module Fluent
451
460
  end
452
461
  end
453
462
  end
463
+
464
+ # MixedTimeParser is available when time_type is set to :mixed
465
+ #
466
+ # Use Case 1: primary format is specified explicitly in time_format
467
+ # time_type mixed
468
+ # time_format %iso8601
469
+ # time_format_fallbacks unixtime
470
+ # Use Case 2: time_format is omitted
471
+ # time_type mixed
472
+ # time_format_fallbacks %iso8601, unixtime
473
+ #
474
+ class MixedTimeParser < TimeParser # to include TimeParseError
475
+ def initialize(type, format = nil, localtime = nil, timezone = nil, utc = nil, force_localtime = nil, fallbacks = [])
476
+ @parsers = []
477
+ fallbacks.unshift(format).each do |fallback|
478
+ next unless fallback
479
+ case fallback
480
+ when 'unixtime', 'float'
481
+ @parsers << NumericTimeParser.new(fallback, localtime, timezone)
482
+ else
483
+ if force_localtime
484
+ @parsers << TimeParser.new(fallback, true, nil)
485
+ else
486
+ localtime = localtime && (timezone.nil? && !utc)
487
+ @parsers << TimeParser.new(fallback, localtime, timezone)
488
+ end
489
+ end
490
+ end
491
+ end
492
+
493
+ def parse(value)
494
+ @parsers.each do |parser|
495
+ begin
496
+ Float(value) if parser.class == Fluent::NumericTimeParser
497
+ rescue
498
+ next
499
+ end
500
+ begin
501
+ return parser.parse(value)
502
+ rescue
503
+ # skip TimeParseError
504
+ end
505
+ end
506
+ fallback_class = @parsers.collect do |parser| parser.class end.join(",")
507
+ raise TimeParseError, "invalid time format: value = #{value}, even though fallbacks: #{fallback_class}"
508
+ end
509
+ end
510
+
454
511
  end
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Fluent
18
18
 
19
- VERSION = '1.11.5'
19
+ VERSION = '1.12.4'
20
20
 
21
21
  end
data/lib/fluent/winsvc.rb CHANGED
@@ -61,7 +61,6 @@ begin
61
61
  end
62
62
 
63
63
  def service_main
64
-
65
64
  @pid = service_main_start(@service_name)
66
65
  while running?
67
66
  sleep 10
@@ -69,13 +68,32 @@ begin
69
68
  end
70
69
 
71
70
  def service_stop
72
- ev = Win32::Event.open(@service_name)
73
- ev.set
74
- ev.close
71
+ set_event(@service_name)
75
72
  if @pid > 0
76
73
  Process.waitpid(@pid)
77
74
  end
78
75
  end
76
+
77
+ def service_paramchange
78
+ set_event("#{@service_name}_USR2")
79
+ end
80
+
81
+ def service_user_defined_control(code)
82
+ case code
83
+ when 128
84
+ set_event("#{@service_name}_HUP")
85
+ when 129
86
+ set_event("#{@service_name}_USR1")
87
+ end
88
+ end
89
+
90
+ private
91
+
92
+ def set_event(event_name)
93
+ ev = Win32::Event.open(event_name)
94
+ ev.set
95
+ ev.close
96
+ end
79
97
  end
80
98
 
81
99
  FluentdService.new(opts[:service_name]).mainloop
@@ -20,8 +20,8 @@ Gem::Specification.new do |spec|
20
20
  spec.test_files = test_files
21
21
  spec.require_paths = ["lib"]
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.14"
24
- spec.add_development_dependency "rake", "~> 12.0"
25
- spec.add_development_dependency "test-unit", "~> 3.0"
23
+ spec.add_development_dependency "bundler", "~> <%= bundler_version %>"
24
+ spec.add_development_dependency "rake", "~> <%= rake_version %>"
25
+ spec.add_development_dependency "test-unit", "~> <%= test_unit_version %>"
26
26
  spec.add_runtime_dependency "fluentd", [">= 0.14.10", "< 2"]
27
27
  end
@@ -0,0 +1,10 @@
1
+ <%-
2
+ type = config[:type]
3
+ required_label = config[:required] ? "required" : "optional"
4
+ default = config[:default]
5
+ alias_name = config[:alias]
6
+ deprecated = config[:deprecated]
7
+ obsoleted = config[:obsoleted]
8
+ description = config[:desc]
9
+ -%>
10
+ |<%= name %>|<%= type %> (<%= required_label %>)|<%= description %><%- if type == :enum -%> (<%= config[:list].map{|x| "`#{x}`"}.join(", ") %>)<%- end -%><%- if alias_name -%><br>Alias: <%= alias_name %><%- end -%><%- if deprecated -%><br>Deprecated: <%= deprecated %><%- end -%><%- if obsoleted -%><br>Obsoleted: <%= :obsoleted %><%- end -%>|<%- if default -%>`<%= default %>`<%- end -%>|
@@ -0,0 +1,100 @@
1
+ require_relative '../helper'
2
+
3
+ require 'tempfile'
4
+ require 'fluent/command/cap_ctl'
5
+
6
+ class TestFluentCapCtl < Test::Unit::TestCase
7
+ setup do
8
+ omit "This environment does not handle Linux capability" unless defined?(CapNG)
9
+ end
10
+
11
+ sub_test_case "success" do
12
+ test "clear capability" do
13
+ logs = capture_stdout do
14
+ Fluent::CapCtl.new(["--clear"]).call
15
+ end
16
+ expression = /\AClear capabilities .*\n/m
17
+ assert_match expression, logs
18
+ end
19
+
20
+ test "add capability" do
21
+ logs = capture_stdout do
22
+ Fluent::CapCtl.new(["--add", "dac_override"]).call
23
+ end
24
+ expression = /\AUpdating .* done.\nAdding .*\n/m
25
+ assert_match expression, logs
26
+ end
27
+
28
+ test "drop capability" do
29
+ logs = capture_stdout do
30
+ Fluent::CapCtl.new(["--drop", "chown"]).call
31
+ end
32
+ expression = /\AUpdating .* done.\nDropping .*\n/m
33
+ assert_match expression, logs
34
+ end
35
+
36
+ test "get capability" do
37
+ logs = capture_stdout do
38
+ Fluent::CapCtl.new(["--get"]).call
39
+ end
40
+ expression = /\ACapabilities in .*,\nEffective: .*\nInheritable: .*\nPermitted: .*/m
41
+ assert_match expression, logs
42
+ end
43
+ end
44
+
45
+ sub_test_case "success with file" do
46
+ test "clear capability" do
47
+ logs = capture_stdout do
48
+ Tempfile.create("fluent-cap-") do |tempfile|
49
+ Fluent::CapCtl.new(["--clear-cap", "-f", tempfile.path]).call
50
+ end
51
+ end
52
+ expression = /\AClear capabilities .*\n/m
53
+ assert_match expression, logs
54
+ end
55
+
56
+ test "add capability" do
57
+ logs = capture_stdout do
58
+ Tempfile.create("fluent-cap-") do |tempfile|
59
+ Fluent::CapCtl.new(["--add", "dac_override", "-f", tempfile.path]).call
60
+ end
61
+ end
62
+ expression = /\AUpdating .* done.\nAdding .*\n/m
63
+ assert_match expression, logs
64
+ end
65
+
66
+ test "drop capability" do
67
+ logs = capture_stdout do
68
+ Tempfile.create("fluent-cap-") do |tempfile|
69
+ Fluent::CapCtl.new(["--drop", "chown", "-f", tempfile.path]).call
70
+ end
71
+ end
72
+ expression = /\AUpdating .* done.\nDropping .*\n/m
73
+ assert_match expression, logs
74
+ end
75
+
76
+ test "get capability" do
77
+ logs = capture_stdout do
78
+ Tempfile.create("fluent-cap-") do |tempfile|
79
+ Fluent::CapCtl.new(["--get", "-f", tempfile.path]).call
80
+ end
81
+ end
82
+ expression = /\ACapabilities in .*,\nEffective: .*\nInheritable: .*\nPermitted: .*/m
83
+ assert_match expression, logs
84
+ end
85
+ end
86
+
87
+ sub_test_case "invalid" do
88
+ test "add capability" do
89
+ assert_raise(ArgumentError) do
90
+ Fluent::CapCtl.new(["--add", "nonexitent"]).call
91
+ end
92
+ end
93
+
94
+ test "drop capability" do
95
+ assert_raise(ArgumentError) do
96
+ Fluent::CapCtl.new(["--drop", "invalid"]).call
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,57 @@
1
+ require_relative '../helper'
2
+
3
+ require 'test-unit'
4
+ require 'win32/event' if Fluent.windows?
5
+
6
+ require 'fluent/command/ctl'
7
+
8
+ class TestFluentdCtl < ::Test::Unit::TestCase
9
+ def assert_win32_event(event_name, command, pid_or_svcname)
10
+ command, event_suffix = data
11
+ event = Win32::Event.new(event_name)
12
+ ipc = Win32::Ipc.new(event.handle)
13
+ ret = Win32::Ipc::TIMEOUT
14
+
15
+ wait_thread = Thread.new do
16
+ ret = ipc.wait(1)
17
+ end
18
+ Fluent::Ctl.new([command, pid_or_svcname]).call
19
+ wait_thread.join
20
+ assert_equal(Win32::Ipc::SIGNALED, ret)
21
+ end
22
+
23
+ data("shutdown" => ["shutdown", "TERM", ""],
24
+ "restart" => ["restart", "HUP", "HUP"],
25
+ "flush" => ["flush", "USR1", "USR1"],
26
+ "reload" => ["reload", "USR2", "USR2"])
27
+ def test_commands(data)
28
+ command, signal, event_suffix = data
29
+
30
+ if Fluent.windows?
31
+ event_name = "fluentd_54321"
32
+ event_name << "_#{event_suffix}" unless event_suffix.empty?
33
+ assert_win32_event(event_name, command, "54321")
34
+ else
35
+ got_signal = false
36
+ Signal.trap(signal) do
37
+ got_signal = true
38
+ end
39
+ Fluent::Ctl.new([command, "#{$$}"]).call
40
+ assert_true(got_signal)
41
+ end
42
+ end
43
+
44
+ data("shutdown" => ["shutdown", ""],
45
+ "restart" => ["restart", "HUP"],
46
+ "flush" => ["flush", "USR1"],
47
+ "reload" => ["reload", "USR2"])
48
+ def test_commands_with_winsvcname(data)
49
+ omit "Only for Windows" unless Fluent.windows?
50
+
51
+ command, event_suffix = data
52
+ event_name = "testfluentdwinsvc"
53
+ event_name << "_#{event_suffix}" unless event_suffix.empty?
54
+
55
+ assert_win32_event(event_name, command, "testfluentdwinsvc")
56
+ end
57
+ end
@@ -878,6 +878,8 @@ CONF
878
878
  end
879
879
 
880
880
  test "without RUBYOPT" do
881
+ saved_ruby_opt = ENV["RUBYOPT"]
882
+ ENV["RUBYOPT"] = nil
881
883
  conf = <<CONF
882
884
  <source>
883
885
  @type dummy
@@ -889,6 +891,8 @@ CONF
889
891
  CONF
890
892
  conf_path = create_conf_file('rubyopt_test.conf', conf)
891
893
  assert_log_matches(create_cmdline(conf_path), '-Eascii-8bit:ascii-8bit')
894
+ ensure
895
+ ENV["RUBYOPT"] = saved_ruby_opt
892
896
  end
893
897
 
894
898
  test 'invalid values are set to RUBYOPT' do
@@ -912,6 +916,8 @@ CONF
912
916
 
913
917
  # https://github.com/fluent/fluentd/issues/2915
914
918
  test "ruby path contains spaces" do
919
+ saved_ruby_opt = ENV["RUBYOPT"]
920
+ ENV["RUBYOPT"] = nil
915
921
  conf = <<CONF
916
922
  <source>
917
923
  @type dummy
@@ -940,6 +946,8 @@ CONF
940
946
  'spawn command to main:',
941
947
  '-Eascii-8bit:ascii-8bit'
942
948
  )
949
+ ensure
950
+ ENV["RUBYOPT"] = saved_ruby_opt
943
951
  end
944
952
 
945
953
  test 'success to start workers when file buffer is configured in non-workers way only for specific worker' do
@@ -1065,4 +1073,34 @@ CONF
1065
1073
  "secret xxxxxx", patterns_not_match: ["secret secret0", "secret secret1"])
1066
1074
  end
1067
1075
  end
1076
+
1077
+ sub_test_case 'sahred socket options' do
1078
+ test 'enable shared socket by default' do
1079
+ conf = ""
1080
+ conf_path = create_conf_file('empty.conf', conf)
1081
+ assert File.exist?(conf_path)
1082
+ assert_log_matches(create_cmdline(conf_path),
1083
+ patterns_not_match: ["shared socket for multiple workers is disabled"])
1084
+ end
1085
+
1086
+ test 'disable shared socket by command line option' do
1087
+ conf = ""
1088
+ conf_path = create_conf_file('empty.conf', conf)
1089
+ assert File.exist?(conf_path)
1090
+ assert_log_matches(create_cmdline(conf_path, "--disable-shared-socket"),
1091
+ "shared socket for multiple workers is disabled",)
1092
+ end
1093
+
1094
+ test 'disable shared socket by system config' do
1095
+ conf = <<CONF
1096
+ <system>
1097
+ disable_shared_socket
1098
+ </system>
1099
+ CONF
1100
+ conf_path = create_conf_file('empty.conf', conf)
1101
+ assert File.exist?(conf_path)
1102
+ assert_log_matches(create_cmdline(conf_path, "--disable-shared-socket"),
1103
+ "shared socket for multiple workers is disabled",)
1104
+ end
1105
+ end
1068
1106
  end
@@ -56,6 +56,32 @@ class TestFluentPluginConfigFormatter < Test::Unit::TestCase
56
56
  end
57
57
  end
58
58
 
59
+ class FakeStorage < ::Fluent::Plugin::Storage
60
+ ::Fluent::Plugin.register_storage('fake', self)
61
+
62
+ def get(key)
63
+ end
64
+
65
+ def fetch(key, defval)
66
+ end
67
+
68
+ def put(key, value)
69
+ end
70
+
71
+ def delete(key)
72
+ end
73
+
74
+ def update(key, &block)
75
+ end
76
+ end
77
+
78
+ class FakeServiceDiscovery < ::Fluent::Plugin::ServiceDiscovery
79
+ ::Fluent::Plugin.register_sd('fake', self)
80
+
81
+ desc "hostname"
82
+ config_param :hostname, :string
83
+ end
84
+
59
85
  class SimpleInput < ::Fluent::Plugin::Input
60
86
  ::Fluent::Plugin.register_input("simple", self)
61
87
  helpers :inject, :compat_parameters
@@ -88,6 +114,13 @@ class TestFluentPluginConfigFormatter < Test::Unit::TestCase
88
114
  end
89
115
  end
90
116
 
117
+ class SimpleServiceDiscovery < ::Fluent::Plugin::ServiceDiscovery
118
+ ::Fluent::Plugin.register_sd('simple', self)
119
+
120
+ desc "servers"
121
+ config_param :servers, :array
122
+ end
123
+
91
124
  sub_test_case "json" do
92
125
  data(input: [FakeInput, "input"],
93
126
  output: [FakeOutput, "output"],
@@ -196,6 +229,52 @@ TEXT
196
229
  assert_equal(expected, dumped_config)
197
230
  end
198
231
 
232
+ test "input simple (table)" do
233
+ dumped_config = capture_stdout do
234
+ FluentPluginConfigFormatter.new(["--format=markdown", "--table", "input", "simple"]).call
235
+ end
236
+ expected = <<TEXT
237
+ ## Plugin helpers
238
+
239
+ * [inject](https://docs.fluentd.org/v/1.0/plugin-helper-overview/api-plugin-helper-inject)
240
+ * [compat_parameters](https://docs.fluentd.org/v/1.0/plugin-helper-overview/api-plugin-helper-compat_parameters)
241
+
242
+ * See also: [Input Plugin Overview](https://docs.fluentd.org/v/1.0/input#overview)
243
+
244
+ ## TestFluentPluginConfigFormatter::SimpleInput
245
+
246
+ ### Configuration
247
+
248
+ |parameter|type|description|default|
249
+ |---|---|---|---|
250
+ |path|string (required)|path to something||
251
+
252
+ TEXT
253
+ assert_equal(expected, dumped_config)
254
+ end
255
+
256
+ data("abbrev" => "sd",
257
+ "normal" => "service_discovery")
258
+ test "service_discovery simple" do |data|
259
+ plugin_type = data
260
+ dumped_config = capture_stdout do
261
+ FluentPluginConfigFormatter.new(["--format=markdown", plugin_type, "simple"]).call
262
+ end
263
+ expected = <<TEXT
264
+ * See also: [ServiceDiscovery Plugin Overview](https://docs.fluentd.org/v/1.0/servicediscovery#overview)
265
+
266
+ ## TestFluentPluginConfigFormatter::SimpleServiceDiscovery
267
+
268
+ ### servers (array) (required)
269
+
270
+ servers
271
+
272
+
273
+ TEXT
274
+ assert_equal(expected, dumped_config)
275
+ end
276
+
277
+
199
278
  test "output complex" do
200
279
  dumped_config = capture_stdout do
201
280
  FluentPluginConfigFormatter.new(["--format=markdown", "output", "complex"]).call
@@ -243,6 +322,49 @@ Default value: `normal`.
243
322
 
244
323
 
245
324
 
325
+ TEXT
326
+ assert_equal(expected, dumped_config)
327
+ end
328
+
329
+ test "output complex (table)" do
330
+ dumped_config = capture_stdout do
331
+ FluentPluginConfigFormatter.new(["--format=markdown", "--table", "output", "complex"]).call
332
+ end
333
+ expected = <<TEXT
334
+ ## Plugin helpers
335
+
336
+ * [inject](https://docs.fluentd.org/v/1.0/plugin-helper-overview/api-plugin-helper-inject)
337
+ * [compat_parameters](https://docs.fluentd.org/v/1.0/plugin-helper-overview/api-plugin-helper-compat_parameters)
338
+
339
+ * See also: [Output Plugin Overview](https://docs.fluentd.org/v/1.0/output#overview)
340
+
341
+ ## TestFluentPluginConfigFormatter::ComplexOutput
342
+
343
+
344
+ ### \\<authentication\\> section (required) (single)
345
+
346
+ ### Configuration
347
+
348
+ |parameter|type|description|default|
349
+ |---|---|---|---|
350
+ |username|string (required)|username||
351
+ |password|string (required)|password||
352
+
353
+
354
+ ### \\<parent\\> section (optional) (multiple)
355
+
356
+
357
+ #### \\<child\\> section (optional) (multiple)
358
+
359
+ ### Configuration
360
+
361
+ |parameter|type|description|default|
362
+ |---|---|---|---|
363
+ |names|array (required)|names||
364
+ |difficulty|enum (optional)|difficulty (`easy`, `normal`, `hard`)|`normal`|
365
+
366
+
367
+
246
368
  TEXT
247
369
  assert_equal(expected, dumped_config)
248
370
  end
@@ -251,7 +373,7 @@ TEXT
251
373
  sub_test_case "arguments" do
252
374
  data do
253
375
  hash = {}
254
- ["input", "output", "filter", "parser", "formatter"].each do |type|
376
+ ["input", "output", "filter", "parser", "formatter", "storage", "service_discovery"].each do |type|
255
377
  ["txt", "json", "markdown"].each do |format|
256
378
  argv = ["--format=#{format}"]
257
379
  [
@@ -259,7 +381,7 @@ TEXT
259
381
  ["--verbose"],
260
382
  ["--compact"]
261
383
  ].each do |options|
262
- hash[(argv + options).join(" ")] = argv + options + [type, "fake"]
384
+ hash["[#{type}] " + (argv + options).join(" ")] = argv + options + [type, "fake"]
263
385
  end
264
386
  end
265
387
  end