logstash-core 2.1.3-java → 2.2.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of logstash-core might be problematic. Click here for more details.

Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/logstash-core.rb +1 -3
  3. data/lib/logstash-core/logstash-core.rb +3 -0
  4. data/lib/logstash-core/version.rb +8 -0
  5. data/lib/logstash/agent.rb +48 -20
  6. data/lib/logstash/codecs/base.rb +2 -2
  7. data/lib/logstash/config/config_ast.rb +8 -3
  8. data/lib/logstash/environment.rb +0 -16
  9. data/lib/logstash/filters/base.rb +9 -5
  10. data/lib/logstash/inputs/base.rb +1 -1
  11. data/lib/logstash/output_delegator.rb +150 -0
  12. data/lib/logstash/outputs/base.rb +37 -40
  13. data/lib/logstash/pipeline.rb +259 -178
  14. data/lib/logstash/pipeline_reporter.rb +114 -0
  15. data/lib/logstash/plugin.rb +1 -1
  16. data/lib/logstash/{shutdown_controller.rb → shutdown_watcher.rb} +10 -37
  17. data/lib/logstash/util.rb +17 -0
  18. data/lib/logstash/util/decorators.rb +14 -7
  19. data/lib/logstash/util/worker_threads_default_printer.rb +4 -4
  20. data/lib/logstash/util/wrapped_synchronous_queue.rb +41 -0
  21. data/lib/logstash/version.rb +10 -2
  22. data/locales/en.yml +8 -3
  23. data/logstash-core.gemspec +5 -3
  24. data/spec/{core/conditionals_spec.rb → conditionals_spec.rb} +0 -0
  25. data/spec/{core/config_spec.rb → logstash/config/config_ast_spec.rb} +0 -0
  26. data/spec/{core/config_cpu_core_strategy_spec.rb → logstash/config/cpu_core_strategy_spec.rb} +0 -0
  27. data/spec/{core/config_defaults_spec.rb → logstash/config/defaults_spec.rb} +0 -0
  28. data/spec/{core/config_mixin_spec.rb → logstash/config/mixin_spec.rb} +0 -0
  29. data/spec/{core → logstash}/environment_spec.rb +0 -0
  30. data/spec/{filters → logstash/filters}/base_spec.rb +0 -0
  31. data/spec/{inputs → logstash/inputs}/base_spec.rb +0 -0
  32. data/spec/{lib/logstash → logstash}/java_integration_spec.rb +0 -0
  33. data/spec/{util → logstash}/json_spec.rb +0 -0
  34. data/spec/logstash/output_delegator_spec.rb +126 -0
  35. data/spec/logstash/outputs/base_spec.rb +40 -0
  36. data/spec/logstash/pipeline_reporter_spec.rb +85 -0
  37. data/spec/{core → logstash}/pipeline_spec.rb +128 -16
  38. data/spec/{core → logstash}/plugin_spec.rb +47 -1
  39. data/spec/logstash/runner_spec.rb +68 -0
  40. data/spec/{core/shutdown_controller_spec.rb → logstash/shutdown_watcher_spec.rb} +17 -11
  41. data/spec/{util → logstash/util}/buftok_spec.rb +0 -0
  42. data/spec/{util → logstash/util}/charset_spec.rb +0 -0
  43. data/spec/{util → logstash/util}/defaults_printer_spec.rb +4 -4
  44. data/spec/{util → logstash/util}/java_version_spec.rb +0 -0
  45. data/spec/{util → logstash/util}/plugin_version_spec.rb +0 -0
  46. data/spec/{util → logstash/util}/unicode_trimmer_spec.rb +0 -0
  47. data/spec/{util → logstash/util}/worker_threads_default_printer_spec.rb +8 -8
  48. data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +28 -0
  49. data/spec/{util_spec.rb → logstash/util_spec.rb} +0 -0
  50. metadata +74 -81
  51. data/lib/logstash/event.rb +0 -275
  52. data/lib/logstash/patches/bundler.rb +0 -36
  53. data/lib/logstash/sized_queue.rb +0 -8
  54. data/lib/logstash/string_interpolation.rb +0 -140
  55. data/lib/logstash/timestamp.rb +0 -97
  56. data/lib/logstash/util/accessors.rb +0 -123
  57. data/spec/core/event_spec.rb +0 -518
  58. data/spec/core/runner_spec.rb +0 -40
  59. data/spec/core/timestamp_spec.rb +0 -84
  60. data/spec/coverage_helper.rb +0 -24
  61. data/spec/lib/logstash/bundler_spec.rb +0 -121
  62. data/spec/license_spec.rb +0 -67
  63. data/spec/outputs/base_spec.rb +0 -26
  64. data/spec/plugin_manager/install_spec.rb +0 -28
  65. data/spec/plugin_manager/update_spec.rb +0 -39
  66. data/spec/plugin_manager/util_spec.rb +0 -71
  67. data/spec/spec_helper.rb +0 -11
  68. data/spec/util/accessors_spec.rb +0 -170
  69. data/spec/util/compress_spec.rb +0 -121
  70. data/spec/util/gemfile_spec.rb +0 -212
  71. data/spec/util/retryable_spec.rb +0 -139
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+
4
+ # use a dummy NOOP output to test Outputs::Base
5
+ class LogStash::Outputs::NOOP < LogStash::Outputs::Base
6
+ config_name "noop"
7
+ milestone 2
8
+
9
+ config :dummy_option, :validate => :string
10
+
11
+ def register; end
12
+
13
+ def receive(event)
14
+ return output?(event)
15
+ end
16
+ end
17
+
18
+ class LogStash::Outputs::NOOPLegacyNoWorkers < ::LogStash::Outputs::Base
19
+ LEGACY_WORKERS_NOT_SUPPORTED_REASON = "legacy reason"
20
+
21
+ def register
22
+ workers_not_supported(LEGACY_WORKERS_NOT_SUPPORTED_REASON)
23
+ end
24
+ end
25
+
26
+ describe "LogStash::Outputs::Base#new" do
27
+ it "should instantiate cleanly" do
28
+ params = { "dummy_option" => "potatoes", "codec" => "json", "workers" => 2 }
29
+ worker_params = params.dup; worker_params["workers"] = 1
30
+
31
+ expect do
32
+ LogStash::Outputs::NOOP.new(params.dup)
33
+ end.not_to raise_error
34
+ end
35
+
36
+ it "should move workers_not_supported declarations up to the class level" do
37
+ LogStash::Outputs::NOOPLegacyNoWorkers.new.register
38
+ expect(LogStash::Outputs::NOOPLegacyNoWorkers.workers_not_supported?).to eql(true)
39
+ end
40
+ end
@@ -0,0 +1,85 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+ require "logstash/pipeline"
4
+ require "logstash/pipeline_reporter"
5
+
6
+ class DummyOutput < LogStash::Outputs::Base
7
+ config_name "dummyoutput"
8
+ milestone 2
9
+
10
+ attr_reader :num_closes, :events
11
+
12
+ def initialize(params={})
13
+ super
14
+ @num_closes = 0
15
+ @events = []
16
+ end
17
+
18
+ def register
19
+ end
20
+
21
+ def receive(event)
22
+ @events << event
23
+ end
24
+
25
+ def close
26
+ @num_closes += 1
27
+ end
28
+ end
29
+
30
+ #TODO: Figure out how to add more tests that actually cover inflight events
31
+ #This will require some janky multithreading stuff
32
+ describe LogStash::PipelineReporter do
33
+ let(:generator_count) { 5 }
34
+ let(:config) do
35
+ "input { generator { count => #{generator_count} } } output { dummyoutput {} } "
36
+ end
37
+ let(:pipeline) { LogStash::Pipeline.new(config)}
38
+ let(:reporter) { pipeline.reporter }
39
+
40
+ before do
41
+ allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(DummyOutput)
42
+ allow(LogStash::Plugin).to receive(:lookup).with("input", "generator").and_call_original
43
+ allow(LogStash::Plugin).to receive(:lookup).with("codec", "plain").and_call_original
44
+
45
+ @pre_snapshot = reporter.snapshot
46
+ pipeline.run
47
+ @post_snapshot = reporter.snapshot
48
+ end
49
+
50
+ describe "events filtered" do
51
+ it "should start at zero" do
52
+ expect(@pre_snapshot.events_filtered).to eql(0)
53
+ end
54
+
55
+ it "should end at the number of generated events" do
56
+ expect(@post_snapshot.events_filtered).to eql(generator_count)
57
+ end
58
+ end
59
+
60
+ describe "events consumed" do
61
+ it "should start at zero" do
62
+ expect(@pre_snapshot.events_consumed).to eql(0)
63
+ end
64
+
65
+ it "should end at the number of generated events" do
66
+ expect(@post_snapshot.events_consumed).to eql(generator_count)
67
+ end
68
+ end
69
+
70
+ describe "inflight count" do
71
+ it "should be zero before running" do
72
+ expect(@pre_snapshot.inflight_count).to eql(0)
73
+ end
74
+
75
+ it "should be zero after running" do
76
+ expect(@post_snapshot.inflight_count).to eql(0)
77
+ end
78
+ end
79
+
80
+ describe "output states" do
81
+ it "should include the count of received events" do
82
+ expect(@post_snapshot.output_info.first[:events_received]).to eql(generator_count)
83
+ end
84
+ end
85
+ end
@@ -1,5 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require "spec_helper"
3
+ require "logstash/inputs/generator"
4
+ require "logstash/filters/multiline"
3
5
 
4
6
  class DummyInput < LogStash::Inputs::Base
5
7
  config_name "dummyinput"
@@ -35,17 +37,19 @@ class DummyOutput < LogStash::Outputs::Base
35
37
  config_name "dummyoutput"
36
38
  milestone 2
37
39
 
38
- attr_reader :num_closes
40
+ attr_reader :num_closes, :events
39
41
 
40
42
  def initialize(params={})
41
43
  super
42
44
  @num_closes = 0
45
+ @events = []
43
46
  end
44
47
 
45
48
  def register
46
49
  end
47
-
50
+
48
51
  def receive(event)
52
+ @events << event
49
53
  end
50
54
 
51
55
  def close
@@ -80,22 +84,21 @@ class DummySafeFilter < LogStash::Filters::Base
80
84
  end
81
85
 
82
86
  class TestPipeline < LogStash::Pipeline
83
- attr_reader :outputs, :filter_threads, :settings, :logger
87
+ attr_reader :outputs, :settings, :logger
84
88
  end
85
89
 
86
90
  describe LogStash::Pipeline do
87
- let(:worker_thread_count) { 8 }
91
+ let(:worker_thread_count) { LogStash::Pipeline::DEFAULT_SETTINGS[:default_pipeline_workers] }
88
92
  let(:safe_thread_count) { 1 }
89
93
  let(:override_thread_count) { 42 }
90
94
 
91
- describe "defaulting the filter workers based on thread safety" do
95
+ describe "defaulting the pipeline workers based on thread safety" do
92
96
  before(:each) do
93
97
  allow(LogStash::Plugin).to receive(:lookup).with("input", "dummyinput").and_return(DummyInput)
94
98
  allow(LogStash::Plugin).to receive(:lookup).with("codec", "plain").and_return(DummyCodec)
95
99
  allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(DummyOutput)
96
100
  allow(LogStash::Plugin).to receive(:lookup).with("filter", "dummyfilter").and_return(DummyFilter)
97
101
  allow(LogStash::Plugin).to receive(:lookup).with("filter", "dummysafefilter").and_return(DummySafeFilter)
98
- allow(LogStash::Config::CpuCoreStrategy).to receive(:fifty_percent).and_return(worker_thread_count)
99
102
  end
100
103
 
101
104
  context "when there are some not threadsafe filters" do
@@ -117,13 +120,13 @@ describe LogStash::Pipeline do
117
120
 
118
121
  context "when there is no command line -w N set" do
119
122
  it "starts one filter thread" do
120
- msg = "Defaulting filter worker threads to 1 because there are some" +
123
+ msg = "Defaulting pipeline worker threads to 1 because there are some" +
121
124
  " filters that might not work with multiple worker threads"
122
125
  pipeline = TestPipeline.new(test_config_with_filters)
123
126
  expect(pipeline.logger).to receive(:warn).with(msg,
124
127
  {:count_was=>worker_thread_count, :filters=>["dummyfilter"]})
125
128
  pipeline.run
126
- expect(pipeline.filter_threads.size).to eq(safe_thread_count)
129
+ expect(pipeline.worker_threads.size).to eq(safe_thread_count)
127
130
  end
128
131
  end
129
132
 
@@ -134,9 +137,9 @@ describe LogStash::Pipeline do
134
137
  pipeline = TestPipeline.new(test_config_with_filters)
135
138
  expect(pipeline.logger).to receive(:warn).with(msg,
136
139
  {:worker_threads=> override_thread_count, :filters=>["dummyfilter"]})
137
- pipeline.configure("filter-workers", override_thread_count)
140
+ pipeline.configure(:pipeline_workers, override_thread_count)
138
141
  pipeline.run
139
- expect(pipeline.filter_threads.size).to eq(override_thread_count)
142
+ expect(pipeline.worker_threads.size).to eq(override_thread_count)
140
143
  end
141
144
  end
142
145
  end
@@ -161,7 +164,7 @@ describe LogStash::Pipeline do
161
164
  it "starts multiple filter threads" do
162
165
  pipeline = TestPipeline.new(test_config_with_filters)
163
166
  pipeline.run
164
- expect(pipeline.filter_threads.size).to eq(worker_thread_count)
167
+ expect(pipeline.worker_threads.size).to eq(worker_thread_count)
165
168
  end
166
169
  end
167
170
  end
@@ -206,8 +209,8 @@ describe LogStash::Pipeline do
206
209
  pipeline.run
207
210
 
208
211
  expect(pipeline.outputs.size ).to eq(1)
209
- expect(pipeline.outputs.first.worker_plugins.size ).to eq(1)
210
- expect(pipeline.outputs.first.worker_plugins.first.num_closes ).to eq(1)
212
+ expect(pipeline.outputs.first.workers.size ).to eq(pipeline.default_output_workers)
213
+ expect(pipeline.outputs.first.workers.first.num_closes ).to eq(1)
211
214
  end
212
215
 
213
216
  it "should call output close correctly with output workers" do
@@ -215,8 +218,13 @@ describe LogStash::Pipeline do
215
218
  pipeline.run
216
219
 
217
220
  expect(pipeline.outputs.size ).to eq(1)
218
- expect(pipeline.outputs.first.num_closes).to eq(0)
219
- pipeline.outputs.first.worker_plugins.each do |plugin|
221
+ # We even close the parent output worker, even though it doesn't receive messages
222
+
223
+ output_delegator = pipeline.outputs.first
224
+ output = output_delegator.workers.first
225
+
226
+ expect(output.num_closes).to eq(1)
227
+ output_delegator.workers.each do |plugin|
220
228
  expect(plugin.num_closes ).to eq(1)
221
229
  end
222
230
  end
@@ -268,6 +276,36 @@ describe LogStash::Pipeline do
268
276
  end
269
277
  end
270
278
 
279
+ describe "max inflight warning" do
280
+ let(:config) { "input { dummyinput {} } output { dummyoutput {} }" }
281
+ let(:batch_size) { 1 }
282
+ let(:pipeline) { LogStash::Pipeline.new(config, :pipeline_batch_size => batch_size, :pipeline_workers => 1) }
283
+ let(:logger) { pipeline.logger }
284
+ let(:warning_prefix) { /CAUTION: Recommended inflight events max exceeded!/ }
285
+
286
+ before(:each) do
287
+ allow(LogStash::Plugin).to receive(:lookup).with("input", "dummyinput").and_return(DummyInput)
288
+ allow(LogStash::Plugin).to receive(:lookup).with("codec", "plain").and_return(DummyCodec)
289
+ allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(DummyOutput)
290
+ allow(logger).to receive(:warn)
291
+ thread = Thread.new { pipeline.run }
292
+ pipeline.shutdown
293
+ thread.join
294
+ end
295
+
296
+ it "should not raise a max inflight warning if the max_inflight count isn't exceeded" do
297
+ expect(logger).not_to have_received(:warn).with(warning_prefix)
298
+ end
299
+
300
+ context "with a too large inflight count" do
301
+ let(:batch_size) { LogStash::Pipeline::MAX_INFLIGHT_WARN_THRESHOLD + 1 }
302
+
303
+ it "should raise a max inflight warning if the max_inflight count is exceeded" do
304
+ expect(logger).to have_received(:warn).with(warning_prefix)
305
+ end
306
+ end
307
+ end
308
+
271
309
  context "compiled filter funtions" do
272
310
 
273
311
  context "new events should propagate down the filters" do
@@ -318,8 +356,82 @@ describe LogStash::Pipeline do
318
356
  it "doesn't raise an error" do
319
357
  pipeline = TestPipeline.new(pipeline_with_no_filters)
320
358
  pipeline.run
321
- expect { pipeline.stalling_threads }.to_not raise_error
359
+ expect { pipeline.stalling_threads_info }.to_not raise_error
322
360
  end
323
361
  end
324
362
  end
363
+
364
+ context "Periodic Flush" do
365
+ let(:number_of_events) { 100 }
366
+ let(:config) do
367
+ <<-EOS
368
+ input {
369
+ generator {
370
+ count => #{number_of_events}
371
+ }
372
+ }
373
+ filter {
374
+ multiline {
375
+ pattern => "^NeverMatch"
376
+ negate => true
377
+ what => "previous"
378
+ }
379
+ }
380
+ output {
381
+ dummyoutput {}
382
+ }
383
+ EOS
384
+ end
385
+ let(:output) { DummyOutput.new }
386
+
387
+ before do
388
+ allow(DummyOutput).to receive(:new).with(any_args).and_return(output)
389
+ allow(LogStash::Plugin).to receive(:lookup).with("input", "generator").and_return(LogStash::Inputs::Generator)
390
+ allow(LogStash::Plugin).to receive(:lookup).with("codec", "plain").and_return(LogStash::Codecs::Plain)
391
+ allow(LogStash::Plugin).to receive(:lookup).with("filter", "multiline").and_return(LogStash::Filters::Multiline)
392
+ allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(DummyOutput)
393
+ end
394
+
395
+ it "flushes the buffered contents of the filter" do
396
+ Thread.abort_on_exception = true
397
+ pipeline = LogStash::Pipeline.new(config, { :flush_interval => 1 })
398
+ Thread.new { pipeline.run }
399
+ sleep 0.1 while !pipeline.ready?
400
+ # give us a bit of time to flush the events
401
+ wait(5).for do
402
+ next unless output && output.events && output.events.first
403
+ output.events.first["message"].split("\n").count
404
+ end.to eq(number_of_events)
405
+ pipeline.shutdown
406
+ end
407
+ end
408
+
409
+ context "Multiple pipelines" do
410
+ before do
411
+ allow(LogStash::Plugin).to receive(:lookup).with("input", "generator").and_return(LogStash::Inputs::Generator)
412
+ allow(LogStash::Plugin).to receive(:lookup).with("codec", "plain").and_return(DummyCodec)
413
+ allow(LogStash::Plugin).to receive(:lookup).with("filter", "dummyfilter").and_return(DummyFilter)
414
+ allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(DummyOutput)
415
+ end
416
+
417
+ let(:pipeline1) { LogStash::Pipeline.new("input { generator {} } filter { dummyfilter {} } output { dummyoutput {}}") }
418
+ let(:pipeline2) { LogStash::Pipeline.new("input { generator {} } filter { dummyfilter {} } output { dummyoutput {}}") }
419
+
420
+ it "should handle evaluating different config" do
421
+ # When the functions are compiled from the AST it will generate instance
422
+ # variables that are unique to the actual config, the intance are pointing
423
+ # to conditionals/plugins.
424
+ #
425
+ # Before the `defined_singleton_method`, the definition of the method was
426
+ # not unique per class, but the `instance variables` were unique per class.
427
+ #
428
+ # So the methods were trying to access instance variables that did not exist
429
+ # in the current instance and was returning an array containing nil values for
430
+ # the match.
431
+ expect(pipeline1.output_func(LogStash::Event.new)).not_to include(nil)
432
+ expect(pipeline1.filter_func(LogStash::Event.new)).not_to include(nil)
433
+ expect(pipeline2.output_func(LogStash::Event.new)).not_to include(nil)
434
+ expect(pipeline1.filter_func(LogStash::Event.new)).not_to include(nil)
435
+ end
436
+ end
325
437
  end
@@ -108,7 +108,7 @@ describe LogStash::Plugin do
108
108
 
109
109
  subject.validate({})
110
110
  end
111
-
111
+
112
112
 
113
113
  it 'logs a warning if the plugin use the milestone option' do
114
114
  expect_any_instance_of(Cabin::Channel).to receive(:warn)
@@ -120,4 +120,50 @@ describe LogStash::Plugin do
120
120
  end
121
121
  end
122
122
  end
123
+
124
+ describe "subclass initialize" do
125
+ let(:args) { Hash.new }
126
+
127
+ [
128
+ StromaeCodec = Class.new(LogStash::Codecs::Base) do
129
+ config_name "stromae"
130
+ config :foo_tag, :validate => :string, :default => "bar"
131
+ end,
132
+ StromaeFilter = Class.new(LogStash::Filters::Base) do
133
+ config_name "stromae"
134
+ config :foo_tag, :validate => :string, :default => "bar"
135
+ end,
136
+ StromaeInput = Class.new(LogStash::Inputs::Base) do
137
+ config_name "stromae"
138
+ config :foo_tag, :validate => :string, :default => "bar"
139
+ end,
140
+ StromaeOutput = Class.new(LogStash::Outputs::Base) do
141
+ config_name "stromae"
142
+ config :foo_tag, :validate => :string, :default => "bar"
143
+ end
144
+ ].each do |klass|
145
+
146
+ it "subclass #{klass.name} does not modify params" do
147
+ klass.new(args)
148
+ expect(args).to be_empty
149
+ end
150
+ end
151
+
152
+ context "codec initialization" do
153
+
154
+ class LogStash::Codecs::Noop < LogStash::Codecs::Base
155
+ config_name "noop"
156
+
157
+ config :format, :validate => :string
158
+ def register; end
159
+ end
160
+
161
+ it "should only register once" do
162
+ args = { "codec" => LogStash::Codecs::Noop.new("format" => ".") }
163
+ expect_any_instance_of(LogStash::Codecs::Noop).to receive(:register).once
164
+ LogStash::Plugin.new(args)
165
+ end
166
+
167
+ end
168
+ end
123
169
  end
@@ -0,0 +1,68 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+ require "logstash/runner"
4
+ require "stud/task"
5
+ require "stud/trap"
6
+
7
+ class NullRunner
8
+ def run(args); end
9
+ end
10
+
11
+ describe LogStash::Runner do
12
+
13
+ context "argument parsing" do
14
+ it "should run agent" do
15
+ expect(Stud::Task).to receive(:new).once.and_return(nil)
16
+ args = ["agent", "-e", ""]
17
+ expect(subject.run(args)).to eq(nil)
18
+ end
19
+
20
+ it "should run agent help" do
21
+ expect(subject).to receive(:show_help).once.and_return(nil)
22
+ args = ["agent", "-h"]
23
+ expect(subject.run(args).wait).to eq(0)
24
+ end
25
+
26
+ it "should show help with no arguments" do
27
+ expect($stderr).to receive(:puts).once.and_return("No command given")
28
+ expect($stderr).to receive(:puts).once
29
+ args = []
30
+ expect(subject.run(args).wait).to eq(1)
31
+ end
32
+
33
+ it "should show help for unknown commands" do
34
+ expect($stderr).to receive(:puts).once.and_return("No such command welp")
35
+ expect($stderr).to receive(:puts).once
36
+ args = ["welp"]
37
+ expect(subject.run(args).wait).to eq(1)
38
+ end
39
+ end
40
+
41
+ describe "pipeline settings" do
42
+ let(:pipeline_string) { "input { stdin {} } output { stdout {} }" }
43
+ let(:base_pipeline_settings) { { :pipeline_id => "base" } }
44
+ let(:pipeline) { double("pipeline") }
45
+
46
+ before(:each) do
47
+ task = Stud::Task.new { 1 }
48
+ allow(pipeline).to receive(:run).and_return(task)
49
+ end
50
+
51
+ context "when pipeline workers is not defined by the user" do
52
+ it "should not pass the value to the pipeline" do
53
+ expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, base_pipeline_settings).and_return(pipeline)
54
+ args = ["agent", "-e", pipeline_string]
55
+ subject.run(args).wait
56
+ end
57
+ end
58
+
59
+ context "when pipeline workers is defined by the user" do
60
+ it "should pass the value to the pipeline" do
61
+ base_pipeline_settings[:pipeline_workers] = 2
62
+ expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, base_pipeline_settings).and_return(pipeline)
63
+ args = ["agent", "-w", "2", "-e", pipeline_string]
64
+ subject.run(args).wait
65
+ end
66
+ end
67
+ end
68
+ end