Skip to content

Commit d9f4f1f

Browse files
integration and regression spec for Java ArrayList merge
1 parent 0248997 commit d9f4f1f

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

logstash-filter-multiline.gemspec

+4
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,9 @@ Gem::Specification.new do |s|
2626
s.add_runtime_dependency 'jls-grok', '~> 0.11.0'
2727

2828
s.add_development_dependency 'logstash-devutils'
29+
30+
# input-generator and codec-json for the integration specs
31+
s.add_development_dependency 'logstash-input-generator'
32+
s.add_development_dependency 'logstash-codec-json'
2933
end
3034

spec/filters/multiline_spec.rb

+57
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,61 @@
245245
end
246246
end
247247

248+
249+
describe "integrations" do
250+
251+
it "should merge messages arrays as Java ArrayList from json codec using JrJackson" do
252+
253+
config = <<-CONFIG
254+
input {
255+
generator {
256+
lines => [
257+
'{"message": ["first", ">>second"]}',
258+
'{"message": [">>third", ">>fourth"]}'
259+
]
260+
count => 1
261+
codec => "json"
262+
}
263+
}
264+
CONFIG
265+
266+
# first generate events from generator input with json codec with array messages
267+
# so that JrJackson generates Java ArrayList objects
268+
269+
events = []
270+
queue = Queue.new
271+
pipeline = LogStash::Pipeline.new(config)
272+
pipeline.instance_eval do
273+
@output_func = lambda { |event| queue << event }
274+
end
275+
runner = Thread.new { pipeline.run }
276+
sleep 0.1 while !pipeline.ready?
277+
278+
events << queue.pop
279+
events << queue.pop
280+
281+
pipeline.shutdown
282+
runner.join
283+
284+
expect(events.size).to eq(2)
285+
286+
# next run these 2 events into the multiline filter.
287+
# before v0.1.4 this would trigger NoMethodError: undefined method `|' for #<Java::JavaUtil::ArrayList
288+
# we don't want to run this filter through the pipeline because the filter worker rescues
289+
# all exceptions.
290+
291+
filter = LogStash::Filters::Multiline.new({"pattern" => "^>>.*", "what" => "previous", "periodic_flush" => false })
292+
filter.register
293+
294+
results = []
295+
events.each do |event|
296+
filter.filter(event) { |new_event| results << new_event }
297+
results.unshift(event) unless event.cancelled?
298+
end
299+
results += filter.flush(:final => true)
300+
301+
expect(results[0]["message"]).to eq("first\n>>second\n>>third\n>>fourth")
302+
end
303+
end
304+
248305
end

0 commit comments

Comments
 (0)