fluentd 0.14.11 → 0.14.12

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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -5
  3. data/ChangeLog +54 -2
  4. data/example/in_dummy_blocks.conf +17 -0
  5. data/example/in_forward_tls.conf +14 -0
  6. data/example/in_forward_workers.conf +21 -0
  7. data/example/logevents.conf +25 -0
  8. data/example/out_forward_heartbeat_none.conf +16 -0
  9. data/example/out_forward_tls.conf +18 -0
  10. data/example/suppress_config_dump.conf +7 -0
  11. data/lib/fluent/agent.rb +3 -32
  12. data/lib/fluent/clock.rb +62 -0
  13. data/lib/fluent/command/fluentd.rb +12 -0
  14. data/lib/fluent/compat/input.rb +10 -1
  15. data/lib/fluent/compat/output.rb +40 -1
  16. data/lib/fluent/config/configure_proxy.rb +30 -7
  17. data/lib/fluent/config/section.rb +4 -0
  18. data/lib/fluent/config/types.rb +2 -2
  19. data/lib/fluent/configurable.rb +31 -5
  20. data/lib/fluent/engine.rb +61 -12
  21. data/lib/fluent/event_router.rb +6 -0
  22. data/lib/fluent/load.rb +0 -1
  23. data/lib/fluent/log.rb +118 -42
  24. data/lib/fluent/match.rb +37 -0
  25. data/lib/fluent/plugin.rb +25 -3
  26. data/lib/fluent/plugin/base.rb +4 -0
  27. data/lib/fluent/plugin/buf_file.rb +38 -14
  28. data/lib/fluent/plugin/buffer.rb +20 -20
  29. data/lib/fluent/plugin/buffer/file_chunk.rb +2 -2
  30. data/lib/fluent/plugin/compressable.rb +1 -0
  31. data/lib/fluent/plugin/filter_record_transformer.rb +3 -6
  32. data/lib/fluent/plugin/formatter_csv.rb +4 -1
  33. data/lib/fluent/plugin/formatter_hash.rb +5 -1
  34. data/lib/fluent/plugin/formatter_json.rb +10 -0
  35. data/lib/fluent/plugin/formatter_ltsv.rb +2 -1
  36. data/lib/fluent/plugin/in_dummy.rb +4 -0
  37. data/lib/fluent/plugin/in_exec.rb +4 -0
  38. data/lib/fluent/plugin/in_forward.rb +11 -3
  39. data/lib/fluent/plugin/in_gc_stat.rb +4 -0
  40. data/lib/fluent/plugin/in_http.rb +4 -0
  41. data/lib/fluent/plugin/in_monitor_agent.rb +29 -2
  42. data/lib/fluent/plugin/in_object_space.rb +4 -1
  43. data/lib/fluent/plugin/in_syslog.rb +4 -0
  44. data/lib/fluent/plugin/in_tail.rb +193 -116
  45. data/lib/fluent/plugin/in_tcp.rb +5 -1
  46. data/lib/fluent/plugin/in_udp.rb +4 -0
  47. data/lib/fluent/plugin/input.rb +4 -0
  48. data/lib/fluent/plugin/out_copy.rb +4 -0
  49. data/lib/fluent/plugin/out_exec.rb +4 -0
  50. data/lib/fluent/plugin/out_exec_filter.rb +4 -0
  51. data/lib/fluent/plugin/out_file.rb +70 -30
  52. data/lib/fluent/plugin/out_forward.rb +132 -28
  53. data/lib/fluent/plugin/out_null.rb +10 -0
  54. data/lib/fluent/plugin/out_relabel.rb +4 -0
  55. data/lib/fluent/plugin/out_roundrobin.rb +4 -0
  56. data/lib/fluent/plugin/out_secondary_file.rb +5 -0
  57. data/lib/fluent/plugin/out_stdout.rb +5 -0
  58. data/lib/fluent/plugin/output.rb +18 -9
  59. data/lib/fluent/plugin/storage_local.rb +25 -2
  60. data/lib/fluent/plugin_helper/cert_option.rb +159 -0
  61. data/lib/fluent/plugin_helper/child_process.rb +6 -6
  62. data/lib/fluent/plugin_helper/compat_parameters.rb +1 -1
  63. data/lib/fluent/plugin_helper/event_loop.rb +29 -4
  64. data/lib/fluent/plugin_helper/inject.rb +14 -1
  65. data/lib/fluent/plugin_helper/server.rb +275 -31
  66. data/lib/fluent/plugin_helper/socket.rb +144 -4
  67. data/lib/fluent/plugin_helper/socket_option.rb +2 -17
  68. data/lib/fluent/plugin_helper/storage.rb +7 -1
  69. data/lib/fluent/plugin_helper/thread.rb +16 -4
  70. data/lib/fluent/registry.rb +26 -9
  71. data/lib/fluent/root_agent.rb +7 -3
  72. data/lib/fluent/supervisor.rb +37 -15
  73. data/lib/fluent/system_config.rb +37 -10
  74. data/lib/fluent/test.rb +2 -0
  75. data/lib/fluent/test/driver/base.rb +24 -26
  76. data/lib/fluent/test/helpers.rb +21 -0
  77. data/lib/fluent/version.rb +1 -1
  78. data/test/command/test_fluentd.rb +274 -4
  79. data/test/config/test_configurable.rb +154 -0
  80. data/test/config/test_configure_proxy.rb +180 -1
  81. data/test/config/test_system_config.rb +10 -0
  82. data/test/config/test_types.rb +1 -0
  83. data/test/plugin/test_base.rb +4 -0
  84. data/test/plugin/test_buf_file.rb +241 -9
  85. data/test/plugin/test_buffer.rb +11 -11
  86. data/test/plugin/test_buffer_file_chunk.rb +6 -6
  87. data/test/plugin/test_compressable.rb +3 -0
  88. data/test/plugin/test_filter.rb +4 -0
  89. data/test/plugin/test_filter_record_transformer.rb +20 -0
  90. data/test/plugin/test_formatter_csv.rb +9 -0
  91. data/test/plugin/test_formatter_hash.rb +35 -0
  92. data/test/plugin/test_formatter_json.rb +8 -0
  93. data/test/plugin/test_formatter_ltsv.rb +7 -0
  94. data/test/plugin/test_in_dummy.rb +7 -3
  95. data/test/plugin/test_in_monitor_agent.rb +43 -5
  96. data/test/plugin/test_in_tail.rb +97 -4
  97. data/test/plugin/test_input.rb +4 -0
  98. data/test/plugin/test_out_file.rb +46 -7
  99. data/test/plugin/test_out_forward.rb +59 -7
  100. data/test/plugin/test_output.rb +10 -4
  101. data/test/plugin/test_output_as_buffered.rb +37 -25
  102. data/test/plugin/test_output_as_buffered_compress.rb +1 -1
  103. data/test/plugin/test_output_as_buffered_retries.rb +6 -6
  104. data/test/plugin/test_output_as_buffered_secondary.rb +91 -31
  105. data/test/plugin/test_storage_local.rb +40 -1
  106. data/test/plugin_helper/test_child_process.rb +29 -28
  107. data/test/plugin_helper/test_compat_parameters.rb +1 -1
  108. data/test/plugin_helper/test_inject.rb +27 -9
  109. data/test/plugin_helper/test_server.rb +822 -50
  110. data/test/plugin_helper/test_storage.rb +11 -0
  111. data/test/plugin_helper/test_timer.rb +1 -0
  112. data/test/test_clock.rb +164 -0
  113. data/test/test_log.rb +146 -15
  114. data/test/test_plugin.rb +251 -0
  115. data/test/test_supervisor.rb +65 -57
  116. data/test/test_test_drivers.rb +2 -2
  117. metadata +18 -7
  118. data/lib/fluent/process.rb +0 -504
  119. data/test/test_process.rb +0 -48
@@ -24,6 +24,12 @@ module ConfigurableSpec
24
24
  end
25
25
  end
26
26
 
27
+ class Base1Safe < Base1
28
+ config_set_default :name1, "basex1"
29
+ config_set_default :name2, "basex2"
30
+ config_set_default :opt1, :baz
31
+ end
32
+
27
33
  class Base2 < Base1
28
34
  config_set_default :name2, "base2"
29
35
  config_set_default :name4, "base2"
@@ -89,6 +95,40 @@ module ConfigurableSpec
89
95
  end
90
96
  end
91
97
 
98
+ class Base4Safe < Base4
99
+ # config_section :node, param_name: :nodes do
100
+ # config_argument :num, :integer
101
+ # config_param :name, :string, default: "node"
102
+ # config_param :type, :string, default: "b4"
103
+ # end
104
+ # config_section :description1, required: false, multi: false do
105
+ # config_argument :note, :string, default: "desc1"
106
+ # config_param :text, :string
107
+ # end
108
+ # config_section :description2, required: true, multi: false do
109
+ # config_argument :note, :string, default: "desc2"
110
+ # config_param :text, :string
111
+ # end
112
+ # config_section :description3, required: true, multi: true do
113
+ # config_argument :note, default: "desc3" do |val|
114
+ # "desc3: #{val}"
115
+ # end
116
+ # config_param :text, :string
117
+ # end
118
+ config_section :node do
119
+ config_set_default :num, 0
120
+ end
121
+ config_section :description1 do
122
+ config_set_default :text, "teeeext"
123
+ end
124
+ config_section :description2 do
125
+ config_set_default :text, nil
126
+ end
127
+ config_section :description3 do
128
+ config_set_default :text, "yay"
129
+ end
130
+ end
131
+
92
132
  class Init0
93
133
  include Fluent::Configurable
94
134
  config_section :sec1, init: true, multi: false do
@@ -407,6 +447,61 @@ module Fluent::Config
407
447
  end
408
448
  end
409
449
 
450
+ sub_test_case '#configured_section_create' do
451
+ test 'raises configuration error if required param exists but no configuration element is specified' do
452
+ obj = ConfigurableSpec::Base1.new
453
+ assert_raise(Fluent::ConfigError.new("'name1' parameter is required")) do
454
+ obj.configured_section_create(nil)
455
+ end
456
+ end
457
+
458
+ test 'creates root section with default values if name and config are specified with nil' do
459
+ obj = ConfigurableSpec::Base1Safe.new
460
+ root = obj.configured_section_create(nil)
461
+
462
+ assert_equal "node", root.node
463
+ assert_false root.flag1
464
+ assert_true root.flag2
465
+ assert_equal "basex1", root.name1
466
+ assert_equal "basex2", root.name2
467
+ assert_equal "base1", root.name3
468
+ assert_equal "base1", root.name4
469
+ assert_equal :baz, root.opt1
470
+ assert_equal :foo, root.opt2
471
+ end
472
+
473
+ test 'creates root section with default values if name is nil and config is empty element' do
474
+ obj = ConfigurableSpec::Base1Safe.new
475
+ root = obj.configured_section_create(nil, config_element())
476
+
477
+ assert_equal "node", root.node
478
+ assert_false root.flag1
479
+ assert_true root.flag2
480
+ assert_equal "basex1", root.name1
481
+ assert_equal "basex2", root.name2
482
+ assert_equal "base1", root.name3
483
+ assert_equal "base1", root.name4
484
+ assert_equal :baz, root.opt1
485
+ assert_equal :foo, root.opt2
486
+ end
487
+
488
+ test 'creates root section with specified value if name is nil and configuration element is specified' do
489
+ obj = ConfigurableSpec::Base1Safe.new
490
+ root = obj.configured_section_create(nil, config_element('match', '', {'node' => "nodename", 'flag1' => 'true', 'name1' => 'fixed1', 'opt1' => 'foo'}))
491
+
492
+ assert_equal "nodename", root.node
493
+ assert_equal "fixed1", root.name1
494
+ assert_true root.flag1
495
+ assert_equal :foo, root.opt1
496
+
497
+ assert_true root.flag2
498
+ assert_equal "basex2", root.name2
499
+ assert_equal "base1", root.name3
500
+ assert_equal "base1", root.name4
501
+ assert_equal :foo, root.opt2
502
+ end
503
+ end
504
+
410
505
  sub_test_case '#configure' do
411
506
  test 'returns configurable object itself' do
412
507
  b2 = ConfigurableSpec::Base2.new
@@ -526,6 +621,65 @@ module Fluent::Config
526
621
  end
527
622
  end
528
623
 
624
+ sub_test_case '#configured_section_create' do
625
+ test 'raises configuration error if required param exists but no configuration element is specified' do
626
+ obj = ConfigurableSpec::Base4.new
627
+ assert_raise(Fluent::ConfigError.new("'<node ARG>' section requires argument")) do
628
+ obj.configured_section_create(:node)
629
+ end
630
+ assert_raise(Fluent::ConfigError.new("'text' parameter is required")) do
631
+ obj.configured_section_create(:description1)
632
+ end
633
+ end
634
+
635
+ test 'creates any defined section with default values if name is nil and config is not specified' do
636
+ obj = ConfigurableSpec::Base4Safe.new
637
+ node = obj.configured_section_create(:node)
638
+ assert_equal 0, node.num
639
+ assert_equal "node", node.name
640
+ assert_equal "b4", node.type
641
+
642
+ desc1 = obj.configured_section_create(:description1)
643
+ assert_equal "desc1", desc1.note
644
+ assert_equal "teeeext", desc1.text
645
+ end
646
+
647
+ test 'creates any defined section with default values if name is nil and config is empty element' do
648
+ obj = ConfigurableSpec::Base4Safe.new
649
+ node = obj.configured_section_create(:node, config_element())
650
+ assert_equal 0, node.num
651
+ assert_equal "node", node.name
652
+ assert_equal "b4", node.type
653
+
654
+ desc1 = obj.configured_section_create(:description1, config_element())
655
+ assert_equal "desc1", desc1.note
656
+ assert_equal "teeeext", desc1.text
657
+ end
658
+
659
+ test 'creates any defined section with specified value if name is nil and configuration element is specified' do
660
+ obj = ConfigurableSpec::Base4Safe.new
661
+ node = obj.configured_section_create(:node, config_element('node', '1', {'name' => 'node1', 'type' => 'b1'}))
662
+ assert_equal 1, node.num
663
+ assert_equal "node1", node.name
664
+ assert_equal "b1", node.type
665
+
666
+ desc1 = obj.configured_section_create(:description1, config_element('description1', 'desc one', {'text' => 't'}))
667
+ assert_equal "desc one", desc1.note
668
+ assert_equal "t", desc1.text
669
+ end
670
+
671
+ test 'creates a defined section instance even if it is defined as multi:true' do
672
+ obj = ConfigurableSpec::Base4Safe.new
673
+ desc3 = obj.configured_section_create(:description3)
674
+ assert_equal "desc3", desc3.note
675
+ assert_equal "yay", desc3.text
676
+
677
+ desc3 = obj.configured_section_create(:description3, config_element('description3', 'foo'))
678
+ assert_equal "desc3: foo", desc3.note
679
+ assert_equal "yay", desc3.text
680
+ end
681
+ end
682
+
529
683
  sub_test_case '#configure' do
530
684
  BASE_ATTRS = {
531
685
  "name1" => "1", "name2" => "2", "name3" => "3",
@@ -45,7 +45,7 @@ module Fluent::Config
45
45
  assert_false(proxy.multi?)
46
46
  end
47
47
  test 'raise error if both of init and required are true' do
48
- assert_raise "init and required are exclusive" do
48
+ assert_raise RuntimeError.new("init and required are exclusive") do
49
49
  Fluent::Config::ConfigureProxy.new(:section, init: true, required: true, type_lookup: @type_lookup)
50
50
  end
51
51
  end
@@ -164,6 +164,185 @@ module Fluent::Config
164
164
  @proxy = Fluent::Config::ConfigureProxy.new(:section, type_lookup: @type_lookup)
165
165
  end
166
166
 
167
+ test 'handles configuration parameters without type as string' do
168
+ @proxy.config_argument(:label)
169
+ @proxy.config_param(:name)
170
+ assert_equal :label, @proxy.argument[0]
171
+ assert_equal :string, @proxy.argument[2][:type]
172
+ assert_equal :string, @proxy.params[:name][1][:type]
173
+ end
174
+
175
+ data(
176
+ default: [:default, nil],
177
+ alias: [:alias, :alias_name_in_config],
178
+ secret: [:secret, true],
179
+ skip_accessor: [:skip_accessor, true],
180
+ deprecated: [:deprecated, 'it is deprecated'],
181
+ obsoleted: [:obsoleted, 'it is obsoleted'],
182
+ desc: [:desc, "description"],
183
+ )
184
+ test 'always allow options for all types' do |(option, value)|
185
+ opt = {option => value}
186
+ assert_nothing_raised{ @proxy.config_argument(:param0, **opt) }
187
+ assert_nothing_raised{ @proxy.config_param(:p1, :string, **opt) }
188
+ assert_nothing_raised{ @proxy.config_param(:p2, :enum, list: [:a, :b, :c], **opt) }
189
+ assert_nothing_raised{ @proxy.config_param(:p3, :integer, **opt) }
190
+ assert_nothing_raised{ @proxy.config_param(:p4, :float, **opt) }
191
+ assert_nothing_raised{ @proxy.config_param(:p5, :size, **opt) }
192
+ assert_nothing_raised{ @proxy.config_param(:p6, :bool, **opt) }
193
+ assert_nothing_raised{ @proxy.config_param(:p7, :time, **opt) }
194
+ assert_nothing_raised{ @proxy.config_param(:p8, :hash, **opt) }
195
+ assert_nothing_raised{ @proxy.config_param(:p9, :array, **opt) }
196
+ end
197
+
198
+ data(string: :string, integer: :integer, float: :float, size: :size, bool: :bool, time: :time, hash: :hash, array: :array)
199
+ test 'deny list for non-enum types' do |type|
200
+ assert_raise ArgumentError.new(":list is valid only for :enum type, but #{type}: arg") do
201
+ @proxy.config_argument(:arg, type, list: [:a, :b])
202
+ end
203
+ assert_raise ArgumentError.new(":list is valid only for :enum type, but #{type}: p1") do
204
+ @proxy.config_param(:p1, type, list: [:a, :b])
205
+ end
206
+ end
207
+
208
+ data(string: :string, integer: :integer, float: :float, size: :size, bool: :bool, time: :time)
209
+ test 'deny value_type for non-hash/array types' do |type|
210
+ assert_raise ArgumentError.new(":value_type is valid only for :hash and :array, but #{type}: arg") do
211
+ @proxy.config_argument(:arg, type, value_type: :string)
212
+ end
213
+ assert_raise ArgumentError.new(":value_type is valid only for :hash and :array, but #{type}: p1") do
214
+ @proxy.config_param(:p1, type, value_type: :integer)
215
+ end
216
+ end
217
+
218
+ data(string: :string, integer: :integer, float: :float, size: :size, bool: :bool, time: :time, array: :array)
219
+ test 'deny symbolize_keys for non-hash types' do |type|
220
+ assert_raise ArgumentError.new(":symbolize_keys is valid only for :hash, but #{type}: arg") do
221
+ @proxy.config_argument(:arg, type, symbolize_keys: true)
222
+ end
223
+ assert_raise ArgumentError.new(":symbolize_keys is valid only for :hash, but #{type}: p1") do
224
+ @proxy.config_param(:p1, type, symbolize_keys: true)
225
+ end
226
+ end
227
+
228
+ data(string: :string, integer: :integer, float: :float, size: :size, bool: :bool, time: :time, hash: :hash, array: :array)
229
+ test 'deny unknown options' do |type|
230
+ assert_raise ArgumentError.new("unknown option 'required' for configuration parameter: arg") do
231
+ @proxy.config_argument(:arg, type, required: true)
232
+ end
233
+ assert_raise ArgumentError.new("unknown option 'param_name' for configuration parameter: p1") do
234
+ @proxy.config_argument(:p1, type, param_name: :yay)
235
+ end
236
+ end
237
+
238
+ test 'desc gets string' do
239
+ assert_nothing_raised do
240
+ @proxy.config_param(:name, :string, desc: "it is description")
241
+ end
242
+ assert_raise ArgumentError.new("name1: desc must be a String, but Symbol") do
243
+ @proxy.config_param(:name1, :string, desc: :yaaaaaaaay)
244
+ end
245
+ end
246
+
247
+ test 'alias gets symbol' do
248
+ assert_nothing_raised do
249
+ @proxy.config_param(:name, :string, alias: :label)
250
+ end
251
+ assert_raise ArgumentError.new("name1: alias must be a Symbol, but String") do
252
+ @proxy.config_param(:name1, :string, alias: 'label1')
253
+ end
254
+ end
255
+
256
+ test 'secret gets true/false' do
257
+ assert_nothing_raised do
258
+ @proxy.config_param(:name1, :string, secret: false)
259
+ end
260
+ assert_nothing_raised do
261
+ @proxy.config_param(:name2, :string, secret: true)
262
+ end
263
+ assert_raise ArgumentError.new("name3: secret must be true or false, but String") do
264
+ @proxy.config_param(:name3, :string, secret: 'yes')
265
+ end
266
+ assert_raise ArgumentError.new("name4: secret must be true or false, but NilClass") do
267
+ @proxy.config_param(:name4, :string, secret: nil)
268
+ end
269
+ end
270
+
271
+ test 'symbolize_keys gets true/false' do
272
+ assert_nothing_raised do
273
+ @proxy.config_param(:data1, :hash, symbolize_keys: false)
274
+ end
275
+ assert_nothing_raised do
276
+ @proxy.config_param(:data2, :hash, symbolize_keys: true)
277
+ end
278
+ assert_raise ArgumentError.new("data3: symbolize_keys must be true or false, but NilClass") do
279
+ @proxy.config_param(:data3, :hash, symbolize_keys: nil)
280
+ end
281
+ end
282
+
283
+ test 'value_type gets symbol' do
284
+ assert_nothing_raised do
285
+ @proxy.config_param(:data1, :array, value_type: :integer)
286
+ end
287
+ assert_raise ArgumentError.new("data2: value_type must be a Symbol, but Class") do
288
+ @proxy.config_param(:data2, :array, value_type: Integer)
289
+ end
290
+ end
291
+
292
+ test 'list gets an array of symbols' do
293
+ assert_nothing_raised do
294
+ @proxy.config_param(:proto1, :enum, list: [:a, :b])
295
+ end
296
+ assert_raise ArgumentError.new("proto2: enum parameter requires :list of Symbols") do
297
+ @proxy.config_param(:proto2, :enum, list: nil)
298
+ end
299
+ assert_raise ArgumentError.new("proto3: enum parameter requires :list of Symbols") do
300
+ @proxy.config_param(:proto3, :enum, list: ['a', 'b'])
301
+ end
302
+ assert_raise ArgumentError.new("proto4: enum parameter requires :list of Symbols") do
303
+ @proxy.config_param(:proto4, :enum, list: [])
304
+ end
305
+ end
306
+
307
+ test 'deprecated gets string' do
308
+ assert_nothing_raised do
309
+ @proxy.config_param(:name1, :string, deprecated: "use name2 instead")
310
+ end
311
+ assert_raise ArgumentError.new("name2: deprecated must be a String, but TrueClass") do
312
+ @proxy.config_param(:name2, :string, deprecated: true)
313
+ end
314
+ end
315
+
316
+ test 'obsoleted gets string' do
317
+ assert_nothing_raised do
318
+ @proxy.config_param(:name1, :string, obsoleted: "use name2 instead")
319
+ end
320
+ assert_raise ArgumentError.new("name2: obsoleted must be a String, but TrueClass") do
321
+ @proxy.config_param(:name2, :string, obsoleted: true)
322
+ end
323
+ end
324
+
325
+ test 'skip_accessor gets true/false' do
326
+ assert_nothing_raised do
327
+ @proxy.config_param(:format1, :string, skip_accessor: false)
328
+ end
329
+ assert_nothing_raised do
330
+ @proxy.config_param(:format2, :string, skip_accessor: true)
331
+ end
332
+ assert_raise ArgumentError.new("format2: skip_accessor must be true or false, but String") do
333
+ @proxy.config_param(:format2, :string, skip_accessor: 'yes')
334
+ end
335
+ end
336
+
337
+ test 'list is required for :enum' do
338
+ assert_nothing_raised do
339
+ @proxy.config_param(:proto1, :enum, list: [:a, :b])
340
+ end
341
+ assert_raise ArgumentError.new("proto1: enum parameter requires :list of Symbols") do
342
+ @proxy.config_param(:proto1, :enum, default: :a)
343
+ end
344
+ end
345
+
167
346
  test 'does not permit config_set_default for param w/ :default option' do
168
347
  @proxy.config_param(:name, :string, default: "name1")
169
348
  assert_raise(ArgumentError) { @proxy.config_set_default(:name, "name2") }
@@ -14,12 +14,15 @@ module Fluent::Config
14
14
 
15
15
  class FakeSupervisor
16
16
  def initialize
17
+ @workers = nil
17
18
  @root_dir = nil
18
19
  @log = FakeLoggerInitializer.new
19
20
  @log_level = nil
20
21
  @suppress_interval = nil
21
22
  @suppress_config_dump = nil
22
23
  @suppress_repeated_stacktrace = nil
24
+ @log_event_label = nil
25
+ @log_event_verbose = nil
23
26
  @without_source = nil
24
27
  @emit_error_log_interval = nil
25
28
  @file_permission = nil
@@ -43,27 +46,32 @@ module Fluent::Config
43
46
  s = FakeSupervisor.new
44
47
  sc = Fluent::SystemConfig.new(conf)
45
48
  sc.apply(s)
49
+ assert_equal(1, sc.workers)
46
50
  assert_nil(sc.root_dir)
47
51
  assert_nil(sc.log_level)
48
52
  assert_nil(sc.suppress_repeated_stacktrace)
49
53
  assert_nil(sc.emit_error_log_interval)
50
54
  assert_nil(sc.suppress_config_dump)
51
55
  assert_nil(sc.without_source)
56
+ assert_equal(1, s.instance_variable_get(:@workers))
52
57
  assert_nil(s.instance_variable_get(:@root_dir))
53
58
  assert_nil(s.instance_variable_get(:@log_level))
54
59
  assert_nil(s.instance_variable_get(:@suppress_repeated_stacktrace))
55
60
  assert_nil(s.instance_variable_get(:@emit_error_log_interval))
56
61
  assert_nil(s.instance_variable_get(:@suppress_config_dump))
62
+ assert_nil(s.instance_variable_get(:@log_event_verbose))
57
63
  assert_nil(s.instance_variable_get(:@without_source))
58
64
  assert_nil(s.instance_variable_get(:@file_permission))
59
65
  assert_nil(s.instance_variable_get(:@dir_permission))
60
66
  end
61
67
 
62
68
  data(
69
+ 'workers' => ['workers', 3],
63
70
  'root_dir' => ['root_dir', File.join(TMP_DIR, 'root')],
64
71
  'log_level' => ['log_level', 'error'],
65
72
  'suppress_repeated_stacktrace' => ['suppress_repeated_stacktrace', true],
66
73
  'emit_error_log_interval' => ['emit_error_log_interval', 60],
74
+ 'log_event_verbose' => ['log_event_verbose', true],
67
75
  'suppress_config_dump' => ['suppress_config_dump', true],
68
76
  'without_source' => ['without_source', true],
69
77
  )
@@ -89,11 +97,13 @@ module Fluent::Config
89
97
  s = FakeSupervisor.new
90
98
  sc = Fluent::SystemConfig.new({k => v})
91
99
  sc.apply(s)
100
+ assert_equal(1, s.instance_variable_get(:@workers))
92
101
  assert_nil(s.instance_variable_get(:@root_dir))
93
102
  assert_nil(s.instance_variable_get(:@log_level))
94
103
  assert_nil(s.instance_variable_get(:@suppress_repeated_stacktrace))
95
104
  assert_nil(s.instance_variable_get(:@emit_error_log_interval))
96
105
  assert_nil(s.instance_variable_get(:@suppress_config_dump))
106
+ assert_nil(s.instance_variable_get(:@log_event_verbose))
97
107
  assert_nil(s.instance_variable_get(:@without_source))
98
108
  assert_nil(s.instance_variable_get(:@file_permission))
99
109
  assert_nil(s.instance_variable_get(:@dir_permission))
@@ -66,6 +66,7 @@ class TestConfigTypes < ::Test::Unit::TestCase
66
66
  assert_equal 'test', Config::STRING_TYPE.call('test', {})
67
67
  assert_equal '1', Config::STRING_TYPE.call('1', {})
68
68
  assert_equal ' ', Config::STRING_TYPE.call(' ', {})
69
+ assert_equal Encoding::UTF_8, Config::STRING_TYPE.call('test', {}).encoding
69
70
  end
70
71
 
71
72
  test 'enum' do
@@ -93,6 +93,10 @@ class BaseTest < Test::Unit::TestCase
93
93
  assert_equal 99, p2.mysection.myparam2
94
94
  end
95
95
 
96
+ test 'plugins are available with multi worker configuration in default' do
97
+ assert @p.multi_workers_ready?
98
+ end
99
+
96
100
  test 'provides #string_safe_encoding to scrub invalid sequence string with info logging' do
97
101
  logger = Fluent::Test::TestLogger.new
98
102
  m = Module.new do