logstash-core 5.6.16-java → 6.0.0.alpha1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/gemspec_jars.rb +4 -7
  3. data/lib/logstash-core/logstash-core.jar +0 -0
  4. data/lib/logstash-core/version.rb +4 -8
  5. data/lib/logstash-core_jars.rb +12 -26
  6. data/lib/logstash/agent.rb +261 -246
  7. data/lib/logstash/api/commands/default_metadata.rb +1 -1
  8. data/lib/logstash/api/commands/hot_threads_reporter.rb +5 -11
  9. data/lib/logstash/api/commands/node.rb +3 -2
  10. data/lib/logstash/api/commands/stats.rb +3 -2
  11. data/lib/logstash/bootstrap_check/bad_java.rb +16 -0
  12. data/lib/logstash/bootstrap_check/bad_ruby.rb +12 -0
  13. data/lib/logstash/bootstrap_check/default_config.rb +17 -0
  14. data/lib/logstash/compiler.rb +38 -0
  15. data/lib/logstash/compiler/lscl.rb +566 -0
  16. data/lib/logstash/compiler/lscl/lscl_grammar.rb +3503 -0
  17. data/lib/logstash/compiler/treetop_monkeypatches.rb +92 -0
  18. data/lib/logstash/config/config_ast.rb +4 -82
  19. data/lib/logstash/config/mixin.rb +73 -41
  20. data/lib/logstash/config/pipeline_config.rb +48 -0
  21. data/lib/logstash/config/source/base.rb +16 -0
  22. data/lib/logstash/config/source/local.rb +215 -0
  23. data/lib/logstash/config/source_loader.rb +125 -0
  24. data/lib/logstash/converge_result.rb +103 -0
  25. data/lib/logstash/environment.rb +6 -19
  26. data/lib/logstash/errors.rb +2 -0
  27. data/lib/logstash/execution_context.rb +4 -7
  28. data/lib/logstash/filter_delegator.rb +6 -9
  29. data/lib/logstash/inputs/base.rb +0 -2
  30. data/lib/logstash/instrument/collector.rb +5 -7
  31. data/lib/logstash/instrument/metric_store.rb +12 -12
  32. data/lib/logstash/instrument/metric_type/mean.rb +0 -5
  33. data/lib/logstash/instrument/namespaced_metric.rb +0 -4
  34. data/lib/logstash/instrument/namespaced_null_metric.rb +0 -4
  35. data/lib/logstash/instrument/null_metric.rb +0 -10
  36. data/lib/logstash/instrument/periodic_poller/cgroup.rb +85 -168
  37. data/lib/logstash/instrument/periodic_poller/jvm.rb +5 -5
  38. data/lib/logstash/instrument/periodic_poller/pq.rb +3 -7
  39. data/lib/logstash/instrument/periodic_pollers.rb +1 -3
  40. data/lib/logstash/instrument/wrapped_write_client.rb +24 -33
  41. data/lib/logstash/logging/logger.rb +15 -47
  42. data/lib/logstash/namespace.rb +0 -1
  43. data/lib/logstash/output_delegator.rb +5 -7
  44. data/lib/logstash/outputs/base.rb +0 -2
  45. data/lib/logstash/pipeline.rb +159 -87
  46. data/lib/logstash/pipeline_action.rb +13 -0
  47. data/lib/logstash/pipeline_action/base.rb +29 -0
  48. data/lib/logstash/pipeline_action/create.rb +47 -0
  49. data/lib/logstash/pipeline_action/reload.rb +48 -0
  50. data/lib/logstash/pipeline_action/stop.rb +23 -0
  51. data/lib/logstash/plugin.rb +0 -1
  52. data/lib/logstash/plugins/hooks_registry.rb +6 -0
  53. data/lib/logstash/plugins/registry.rb +0 -1
  54. data/lib/logstash/program.rb +14 -0
  55. data/lib/logstash/queue_factory.rb +5 -1
  56. data/lib/logstash/runner.rb +58 -80
  57. data/lib/logstash/settings.rb +3 -27
  58. data/lib/logstash/state_resolver.rb +41 -0
  59. data/lib/logstash/util/java_version.rb +6 -0
  60. data/lib/logstash/util/safe_uri.rb +12 -148
  61. data/lib/logstash/util/thread_dump.rb +4 -7
  62. data/lib/logstash/util/wrapped_acked_queue.rb +36 -39
  63. data/lib/logstash/util/wrapped_synchronous_queue.rb +29 -39
  64. data/lib/logstash/version.rb +10 -8
  65. data/locales/en.yml +3 -54
  66. data/logstash-core.gemspec +8 -35
  67. data/spec/{logstash/api/modules → api/lib/api}/logging_spec.rb +10 -1
  68. data/spec/{logstash/api/modules → api/lib/api}/node_plugins_spec.rb +2 -1
  69. data/spec/{logstash/api/modules → api/lib/api}/node_spec.rb +3 -3
  70. data/spec/{logstash/api/modules → api/lib/api}/node_stats_spec.rb +3 -7
  71. data/spec/{logstash/api/modules → api/lib/api}/plugins_spec.rb +3 -4
  72. data/spec/{logstash/api/modules → api/lib/api}/root_spec.rb +2 -2
  73. data/spec/api/lib/api/support/resource_dsl_methods.rb +87 -0
  74. data/spec/{logstash/api/commands/stats_spec.rb → api/lib/commands/stats.rb} +2 -7
  75. data/spec/{logstash/api → api/lib}/errors_spec.rb +1 -1
  76. data/spec/{logstash/api → api/lib}/rack_app_spec.rb +0 -0
  77. data/spec/api/spec_helper.rb +106 -0
  78. data/spec/logstash/agent/converge_spec.rb +286 -0
  79. data/spec/logstash/agent/metrics_spec.rb +244 -0
  80. data/spec/logstash/agent_spec.rb +213 -225
  81. data/spec/logstash/compiler/compiler_spec.rb +584 -0
  82. data/spec/logstash/config/config_ast_spec.rb +8 -47
  83. data/spec/logstash/config/mixin_spec.rb +2 -42
  84. data/spec/logstash/config/pipeline_config_spec.rb +75 -0
  85. data/spec/logstash/config/source/local_spec.rb +395 -0
  86. data/spec/logstash/config/source_loader_spec.rb +122 -0
  87. data/spec/logstash/converge_result_spec.rb +179 -0
  88. data/spec/logstash/event_spec.rb +0 -66
  89. data/spec/logstash/execution_context_spec.rb +8 -12
  90. data/spec/logstash/filter_delegator_spec.rb +12 -24
  91. data/spec/logstash/inputs/base_spec.rb +7 -5
  92. data/spec/logstash/instrument/periodic_poller/cgroup_spec.rb +92 -225
  93. data/spec/logstash/instrument/periodic_poller/jvm_spec.rb +1 -1
  94. data/spec/logstash/instrument/periodic_poller/os_spec.rb +32 -29
  95. data/spec/logstash/instrument/wrapped_write_client_spec.rb +33 -33
  96. data/spec/logstash/legacy_ruby_event_spec.rb +13 -4
  97. data/spec/logstash/output_delegator_spec.rb +11 -20
  98. data/spec/logstash/outputs/base_spec.rb +7 -5
  99. data/spec/logstash/pipeline_action/create_spec.rb +83 -0
  100. data/spec/logstash/pipeline_action/reload_spec.rb +83 -0
  101. data/spec/logstash/pipeline_action/stop_spec.rb +37 -0
  102. data/spec/logstash/pipeline_pq_file_spec.rb +1 -1
  103. data/spec/logstash/pipeline_spec.rb +81 -137
  104. data/spec/logstash/plugin_spec.rb +2 -1
  105. data/spec/logstash/plugins/hooks_registry_spec.rb +6 -0
  106. data/spec/logstash/queue_factory_spec.rb +13 -1
  107. data/spec/logstash/runner_spec.rb +29 -140
  108. data/spec/logstash/settings/writable_directory_spec.rb +10 -13
  109. data/spec/logstash/settings_spec.rb +0 -91
  110. data/spec/logstash/state_resolver_spec.rb +156 -0
  111. data/spec/logstash/timestamp_spec.rb +2 -6
  112. data/spec/logstash/util/java_version_spec.rb +22 -0
  113. data/spec/logstash/util/safe_uri_spec.rb +0 -56
  114. data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +22 -0
  115. data/spec/support/helpers.rb +9 -11
  116. data/spec/support/matchers.rb +96 -6
  117. data/spec/support/mocks_classes.rb +80 -0
  118. data/spec/support/shared_contexts.rb +2 -27
  119. metadata +100 -149
  120. data/lib/logstash/config/loader.rb +0 -107
  121. data/lib/logstash/config/modules_common.rb +0 -103
  122. data/lib/logstash/config/source/modules.rb +0 -55
  123. data/lib/logstash/config/string_escape.rb +0 -27
  124. data/lib/logstash/dependency_report.rb +0 -131
  125. data/lib/logstash/dependency_report_runner.rb +0 -17
  126. data/lib/logstash/elasticsearch_client.rb +0 -142
  127. data/lib/logstash/instrument/global_metrics.rb +0 -13
  128. data/lib/logstash/instrument/periodic_poller/dlq.rb +0 -24
  129. data/lib/logstash/modules/cli_parser.rb +0 -74
  130. data/lib/logstash/modules/elasticsearch_config.rb +0 -22
  131. data/lib/logstash/modules/elasticsearch_importer.rb +0 -37
  132. data/lib/logstash/modules/elasticsearch_resource.rb +0 -10
  133. data/lib/logstash/modules/file_reader.rb +0 -36
  134. data/lib/logstash/modules/kibana_base.rb +0 -24
  135. data/lib/logstash/modules/kibana_client.rb +0 -124
  136. data/lib/logstash/modules/kibana_config.rb +0 -105
  137. data/lib/logstash/modules/kibana_dashboards.rb +0 -36
  138. data/lib/logstash/modules/kibana_importer.rb +0 -17
  139. data/lib/logstash/modules/kibana_resource.rb +0 -10
  140. data/lib/logstash/modules/kibana_settings.rb +0 -40
  141. data/lib/logstash/modules/logstash_config.rb +0 -120
  142. data/lib/logstash/modules/resource_base.rb +0 -38
  143. data/lib/logstash/modules/scaffold.rb +0 -52
  144. data/lib/logstash/modules/settings_merger.rb +0 -23
  145. data/lib/logstash/modules/util.rb +0 -17
  146. data/lib/logstash/util/dead_letter_queue_manager.rb +0 -61
  147. data/lib/logstash/util/environment_variables.rb +0 -43
  148. data/spec/logstash/config/loader_spec.rb +0 -38
  149. data/spec/logstash/config/string_escape_spec.rb +0 -24
  150. data/spec/logstash/instrument/periodic_poller/dlq_spec.rb +0 -17
  151. data/spec/logstash/modules/logstash_config_spec.rb +0 -56
  152. data/spec/logstash/modules/scaffold_spec.rb +0 -234
  153. data/spec/logstash/pipeline_dlq_commit_spec.rb +0 -109
  154. data/spec/logstash/settings/splittable_string_array_spec.rb +0 -51
  155. data/spec/logstash/util/wrapped_acked_queue_spec.rb +0 -49
  156. data/versions-gem-copy.yml +0 -12
@@ -0,0 +1,584 @@
1
+ require "spec_helper"
2
+ require "logstash/compiler"
3
+ require "support/helpers"
4
+ java_import Java::OrgLogstashConfigIr::DSL
5
+
6
+ describe LogStash::Compiler do
7
+ def j
8
+ Java::OrgLogstashConfigIr::DSL
9
+ end
10
+
11
+ # Static import of these useful enums
12
+ INPUT = Java::OrgLogstashConfigIr::PluginDefinition::Type::INPUT
13
+ FILTER = Java::OrgLogstashConfigIr::PluginDefinition::Type::FILTER
14
+ OUTPUT = Java::OrgLogstashConfigIr::PluginDefinition::Type::OUTPUT
15
+ CODEC = Java::OrgLogstashConfigIr::PluginDefinition::Type::OUTPUT
16
+
17
+ describe "compiling to Pipeline" do
18
+ subject(:source_file) { "fake_sourcefile" }
19
+ subject(:compiled) { described_class.compile_pipeline(source, source_file) }
20
+
21
+ describe "complex configs" do
22
+ shared_examples_for "compilable LSCL files" do |path|
23
+ describe "parsing #{path}" do
24
+ let(:source) { File.read(path) }
25
+
26
+ it "should compile" do
27
+ expect(compiled).to be_java_kind_of(Java::OrgLogstashConfigIr::Pipeline)
28
+ end
29
+
30
+ it "should have a hash" do
31
+ expect(compiled.uniqueHash)
32
+ end
33
+ end
34
+ end
35
+
36
+ Dir.glob(File.join(SUPPORT_DIR, "lscl_configs", "*.conf")).each do |path|
37
+ it_should_behave_like "compilable LSCL files", path
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "compiling imperative" do
43
+ let(:source_file) { "fake_sourcefile" }
44
+ subject(:compiled) { described_class.compile_imperative(source, source_file) }
45
+
46
+ describe "an empty file" do
47
+ let(:source) { "input {} output {}" }
48
+
49
+ it "should have an empty input block" do
50
+ expect(compiled[:input]).to ir_eql(j.noop)
51
+ end
52
+
53
+ it "should have an empty filter block" do
54
+ expect(compiled[:filter]).to ir_eql(j.noop)
55
+ end
56
+
57
+ it "should have an empty output block" do
58
+ expect(compiled[:output]).to ir_eql(j.noop)
59
+ end
60
+ end
61
+
62
+ describe "SourceMetadata" do
63
+ let(:source) { "input { generator {} } output { }" }
64
+
65
+ it "should attach correct source text for components" do
66
+ expect(compiled[:input].get_meta.getText).to eql("generator {}")
67
+ end
68
+ end
69
+
70
+ context "plugins" do
71
+ subject(:c_plugin) { compiled[:input] }
72
+ let(:source) { "input { #{plugin_source} } " }
73
+
74
+ describe "a simple plugin" do
75
+ let(:plugin_source) { "generator {}" }
76
+
77
+ it "should contain the plugin" do
78
+ expect(c_plugin).to ir_eql(j.iPlugin(INPUT, "generator"))
79
+ end
80
+ end
81
+
82
+ describe "a plugin with mixed parameter types" do
83
+ let(:plugin_source) { "generator { aarg => [1] hasharg => {foo => bar} iarg => 123 farg => 123.123 sarg => 'hello'}" }
84
+ let(:expected_plugin_args) do
85
+ {
86
+ "aarg" => [1],
87
+ "hasharg" => {"foo" => "bar"},
88
+ "iarg" => 123,
89
+ "farg" => 123.123,
90
+ "sarg" => 'hello'
91
+ }
92
+ end
93
+
94
+ it "should contain the plugin" do
95
+ expect(c_plugin).to ir_eql(j.iPlugin(INPUT, "generator", expected_plugin_args))
96
+ end
97
+ end
98
+ end
99
+
100
+ context "inputs" do
101
+ subject(:input) { compiled[:input] }
102
+
103
+ describe "a single input" do
104
+ let(:source) { "input { generator {} }" }
105
+
106
+ it "should contain the single input" do
107
+ expect(input).to ir_eql(j.iPlugin(INPUT, "generator"))
108
+ end
109
+ end
110
+
111
+ describe "two inputs" do
112
+ let(:source) { "input { generator { count => 1 } generator { count => 2 } } output { }" }
113
+
114
+ it "should contain both inputs" do
115
+ expect(input).to ir_eql(j.iComposeParallel(
116
+ j.iPlugin(INPUT, "generator", {"count" => 1}),
117
+ j.iPlugin(INPUT, "generator", {"count" => 2})
118
+ ))
119
+ end
120
+ end
121
+ end
122
+
123
+ shared_examples_for "complex grammar" do |section|
124
+ let(:section_name_enum) {
125
+ case section
126
+ when :input
127
+ INPUT
128
+ when :filter
129
+ FILTER
130
+ when :output
131
+ OUTPUT
132
+ else
133
+ raise "Unknown section"
134
+ end
135
+ }
136
+
137
+ let(:section) { section }
138
+ let (:compiled_section) { compiled[section] }
139
+
140
+ def splugin(*args)
141
+ j.iPlugin(section_name_enum, *args)
142
+ end
143
+
144
+ def compose(*statements)
145
+ if section == :filter
146
+ j.iComposeSequence(*statements)
147
+ else
148
+ j.iComposeParallel(*statements)
149
+ end
150
+ end
151
+
152
+ describe "multiple section declarations" do
153
+ let(:source) do
154
+ <<-EOS
155
+ #{section} {
156
+ aplugin { count => 1 }
157
+ }
158
+
159
+ #{section} {
160
+ aplugin { count => 2 }
161
+ }
162
+ EOS
163
+ end
164
+
165
+
166
+ it "should contain both section declarations, in order" do
167
+ expect(compiled_section).to ir_eql(compose(
168
+ splugin("aplugin", {"count" => 1}),
169
+ splugin("aplugin", {"count" => 2})
170
+ ))
171
+ end
172
+ end
173
+
174
+ describe "two plugins" do
175
+ let(:source) do
176
+ # We care about line/column for this test, hence the indentation
177
+ <<-EOS
178
+ #{section} {
179
+ aplugin { count => 1 }
180
+ aplugin { count => 2 }
181
+ }
182
+ EOS
183
+ end
184
+
185
+ it "should contain both" do
186
+ expect(compiled_section).to ir_eql(compose(
187
+ splugin("aplugin", {"count" => 1}),
188
+ splugin("aplugin", {"count" => 2})
189
+ ))
190
+ end
191
+
192
+ it "should attach source_with_metadata with correct info to the statements" do
193
+ meta = compiled_section.statements.first.meta
194
+ expect(meta.text).to eql("aplugin { count => 1 }")
195
+ expect(meta.line).to eql(2)
196
+ expect(meta.column).to eql(13)
197
+ expect(meta.id).to eql(source_file)
198
+ expect(compiled_section.statements.first.meta)
199
+ expect(compiled_section)
200
+ end
201
+ end
202
+
203
+ describe "if conditions" do
204
+ describe "conditional expressions" do
205
+ let(:source) { "#{section} { if (#{expression}) { aplugin {} } }" }
206
+ let(:c_expression) { compiled_section.getBooleanExpression }
207
+
208
+ describe "logical expressions" do
209
+ describe "simple and" do
210
+ let(:expression) { "2 > 1 and 1 < 2" }
211
+
212
+ it "should compile correctly" do
213
+ expect(c_expression).to ir_eql(
214
+ j.eAnd(
215
+ j.eGt(j.eValue(2), j.eValue(1)),
216
+ j.eLt(j.eValue(1), j.eValue(2))
217
+ ))
218
+ end
219
+ end
220
+
221
+ describe "'in' array" do
222
+ let(:expression) { "'foo' in ['foo', 'bar']" }
223
+
224
+ it "should compile correctly" do
225
+ expect(c_expression).to ir_eql(
226
+ j.eIn(
227
+ j.eValue('foo'),
228
+ j.eValue(['foo', 'bar'])
229
+ ))
230
+ end
231
+ end
232
+
233
+ describe "'not in' array" do
234
+ let(:expression) { "'foo' not in ['foo', 'bar']" }
235
+
236
+ it "should compile correctly" do
237
+ expect(c_expression).to ir_eql(
238
+ j.eNot(
239
+ j.eIn(
240
+ j.eValue('foo'),
241
+ j.eValue(['foo', 'bar'])
242
+ )))
243
+ end
244
+ end
245
+
246
+ describe "'not'" do
247
+ let(:expression) { "!(1 > 2)" }
248
+
249
+ it "should compile correctly" do
250
+ expect(c_expression).to ir_eql(j.eNot(j.eGt(j.eValue(1), j.eValue(2))))
251
+ end
252
+ end
253
+
254
+ describe "and or precedence" do
255
+ let(:expression) { "2 > 1 and 1 < 2 or 3 < 2" }
256
+
257
+ it "should compile correctly" do
258
+ expect(c_expression).to ir_eql(
259
+ j.eOr(
260
+ j.eAnd(
261
+ j.eGt(j.eValue(2), j.eValue(1)),
262
+ j.eLt(j.eValue(1), j.eValue(2))
263
+ ),
264
+ j.eLt(j.eValue(3), j.eValue(2))
265
+ )
266
+ )
267
+ end
268
+
269
+ describe "multiple or" do
270
+ let(:expression) { "2 > 1 or 1 < 2 or 3 < 2" }
271
+
272
+ it "should compile correctly" do
273
+ expect(c_expression).to ir_eql(
274
+ j.eOr(
275
+ j.eGt(j.eValue(2), j.eValue(1)),
276
+ j.eOr(
277
+ j.eLt(j.eValue(1), j.eValue(2)),
278
+ j.eLt(j.eValue(3), j.eValue(2))
279
+ )
280
+ )
281
+ )
282
+ end
283
+ end
284
+
285
+ describe "a complex expression" do
286
+ let(:expression) { "1 > 2 and 3 > 4 or 6 > 7 and 8 > 9" }
287
+ false and false or true and true
288
+
289
+ it "should compile correctly" do
290
+ expect(c_expression).to ir_eql(
291
+ j.eOr(
292
+ j.eAnd(
293
+ j.eGt(j.eValue(1), j.eValue(2)),
294
+ j.eGt(j.eValue(3), j.eValue(4))
295
+ ),
296
+ j.eAnd(
297
+ j.eGt(j.eValue(6), j.eValue(7)),
298
+ j.eGt(j.eValue(8), j.eValue(9))
299
+ )
300
+ )
301
+ )
302
+ end
303
+ end
304
+
305
+ describe "a complex nested expression" do
306
+ let(:expression) { "1 > 2 and (1 > 2 and 3 > 4 or 6 > 7 and 8 > 9) or 6 > 7 and 8 > 9" }
307
+ false and false or true and true
308
+
309
+ it "should compile correctly" do
310
+ expect(c_expression).to ir_eql(
311
+ j.eOr(
312
+ j.eAnd(
313
+ j.eGt(j.eValue(1), j.eValue(2)),
314
+ j.eOr(
315
+ j.eAnd(
316
+ j.eGt(j.eValue(1), j.eValue(2)),
317
+ j.eGt(j.eValue(3), j.eValue(4))
318
+ ),
319
+ j.eAnd(
320
+ j.eGt(j.eValue(6), j.eValue(7)),
321
+ j.eGt(j.eValue(8), j.eValue(9))
322
+ )
323
+ )
324
+ ),
325
+ j.eAnd(
326
+ j.eGt(j.eValue(6), j.eValue(7)),
327
+ j.eGt(j.eValue(8), j.eValue(9))
328
+ )
329
+ )
330
+ )
331
+ end
332
+ end
333
+ end
334
+ end
335
+
336
+ describe "comparisons" do
337
+ describe "field not null" do
338
+ let(:expression) { "[foo]"}
339
+
340
+ it "should compile correctly" do
341
+ expect(c_expression).to ir_eql(j.eTruthy(j.eEventValue("[foo]")))
342
+ end
343
+ end
344
+
345
+ describe "'=='" do
346
+ let(:expression) { "[foo] == 5"}
347
+
348
+ it "should compile correctly" do
349
+ expect(c_expression).to ir_eql(j.eEq(j.eEventValue("[foo]"), j.eValue(5.to_java)))
350
+ end
351
+ end
352
+
353
+ describe "'!='" do
354
+ let(:expression) { "[foo] != 5"}
355
+
356
+ it "should compile correctly" do
357
+ expect(c_expression).to ir_eql(j.eNeq(j.eEventValue("[foo]"), j.eValue(5.to_java)))
358
+ end
359
+ end
360
+
361
+ describe "'>'" do
362
+ let(:expression) { "[foo] > 5"}
363
+
364
+ it "should compile correctly" do
365
+ expect(c_expression).to ir_eql(j.eGt(j.eEventValue("[foo]"), j.eValue(5.to_java)))
366
+ end
367
+ end
368
+
369
+ describe "'<'" do
370
+ let(:expression) { "[foo] < 5"}
371
+
372
+ it "should compile correctly" do
373
+ expect(c_expression).to ir_eql(j.eLt(j.eEventValue("[foo]"), j.eValue(5.to_java)))
374
+ end
375
+ end
376
+
377
+ describe "'>='" do
378
+ let(:expression) { "[foo] >= 5"}
379
+
380
+ it "should compile correctly" do
381
+ expect(c_expression).to ir_eql(j.eGte(j.eEventValue("[foo]"), j.eValue(5.to_java)))
382
+ end
383
+ end
384
+
385
+ describe "'<='" do
386
+ let(:expression) { "[foo] <= 5"}
387
+
388
+ it "should compile correctly" do
389
+ expect(c_expression).to ir_eql(j.eLte(j.eEventValue("[foo]"), j.eValue(5.to_java)))
390
+ end
391
+ end
392
+
393
+ describe "'=~'" do
394
+ let(:expression) { "[foo] =~ /^abc$/"}
395
+
396
+ it "should compile correctly" do
397
+ expect(c_expression).to ir_eql(j.eRegexEq(j.eEventValue("[foo]"), j.eRegex('^abc$')))
398
+ end
399
+
400
+ # Believe it or not, "\.\." is a valid regexp!
401
+ describe "when given a quoted regexp" do
402
+ let(:expression) { '[foo] =~ "\\.\\."' }
403
+
404
+ it "should compile correctly" do
405
+ expect(c_expression).to ir_eql(j.eRegexEq(j.eEventValue("[foo]"), j.eRegex('\\.\\.')))
406
+ end
407
+ end
408
+ end
409
+
410
+ describe "'!~'" do
411
+ let(:expression) { "[foo] !~ /^abc$/"}
412
+
413
+ it "should compile correctly" do
414
+ expect(c_expression).to ir_eql(j.eRegexNeq(j.eEventValue("[foo]"), j.eRegex('^abc$')))
415
+ end
416
+ end
417
+ end
418
+ end
419
+
420
+ describe "only true branch" do
421
+ let (:source) { "#{section} { if [foo] == [bar] { grok {} } }" }
422
+
423
+ it "should compile correctly" do
424
+ expect(compiled_section).to ir_eql(j.iIf(
425
+ j.eEq(j.eEventValue("[foo]"), j.eEventValue("[bar]")),
426
+ splugin("grok")
427
+ )
428
+ )
429
+ end
430
+ end
431
+
432
+ describe "only false branch" do
433
+ let (:source) { "#{section} { if [foo] == [bar] { } else { fplugin {} } }" }
434
+
435
+ it "should compile correctly" do
436
+ expect(compiled_section).to ir_eql(j.iIf(
437
+ j.eEq(j.eEventValue("[foo]"), j.eEventValue("[bar]")),
438
+ j.noop,
439
+ splugin("fplugin"),
440
+ )
441
+ )
442
+ end
443
+ end
444
+
445
+ describe "empty if statement" do
446
+ let (:source) { "#{section} { if [foo] == [bar] { } }" }
447
+
448
+ it "should compile correctly" do
449
+ expect(compiled_section).to ir_eql(j.iIf(
450
+ j.eEq(j.eEventValue("[foo]"), j.eEventValue("[bar]")),
451
+ j.noop,
452
+ j.noop
453
+ )
454
+ )
455
+ end
456
+ end
457
+
458
+ describe "if else" do
459
+ let (:source) { "#{section} { if [foo] == [bar] { tplugin {} } else { fplugin {} } }" }
460
+
461
+ it "should compile correctly" do
462
+ expect(compiled_section).to ir_eql(j.iIf(
463
+ j.eEq(j.eEventValue("[foo]"), j.eEventValue("[bar]")),
464
+ splugin("tplugin"),
465
+ splugin("fplugin")
466
+ )
467
+ )
468
+ end
469
+ end
470
+
471
+ describe "if elsif else" do
472
+ let (:source) { "#{section} { if [foo] == [bar] { tplugin {} } else if [bar] == [baz] { eifplugin {} } else { fplugin {} } }" }
473
+
474
+ it "should compile correctly" do
475
+ expect(compiled_section).to ir_eql(j.iIf(
476
+ j.eEq(j.eEventValue("[foo]"), j.eEventValue("[bar]")),
477
+ splugin("tplugin"),
478
+ j.iIf(
479
+ j.eEq(j.eEventValue("[bar]"), j.eEventValue("[baz]")),
480
+ splugin("eifplugin"),
481
+ splugin("fplugin")
482
+ )
483
+ )
484
+ )
485
+ end
486
+ end
487
+
488
+ describe "if elsif elsif else" do
489
+ let (:source) do
490
+ <<-EOS
491
+ #{section} {
492
+ if [foo] == [bar] { tplugin {} }
493
+ else if [bar] == [baz] { eifplugin {} }
494
+ else if [baz] == [bot] { eeifplugin {} }
495
+ else { fplugin {} }
496
+ }
497
+ EOS
498
+ end
499
+
500
+ it "should compile correctly" do
501
+ expect(compiled_section).to ir_eql(j.iIf(
502
+ j.eEq(j.eEventValue("[foo]"), j.eEventValue("[bar]")),
503
+ splugin("tplugin"),
504
+ j.iIf(
505
+ j.eEq(j.eEventValue("[bar]"), j.eEventValue("[baz]")),
506
+ splugin("eifplugin"),
507
+ j.iIf(
508
+ j.eEq(j.eEventValue("[baz]"), j.eEventValue("[bot]")),
509
+ splugin("eeifplugin"),
510
+ splugin("fplugin")
511
+ )
512
+ )
513
+ )
514
+ )
515
+ end
516
+
517
+ describe "nested ifs" do
518
+ let (:source) do
519
+ <<-EOS
520
+ #{section} {
521
+ if [foo] == [bar] {
522
+ if [bar] == [baz] { aplugin {} }
523
+ } else {
524
+ if [bar] == [baz] { bplugin {} }
525
+ else if [baz] == [bot] { cplugin {} }
526
+ else { dplugin {} }
527
+ }
528
+ }
529
+ EOS
530
+ end
531
+
532
+ it "should compile correctly" do
533
+ expect(compiled_section).to ir_eql(j.iIf(
534
+ j.eEq(j.eEventValue("[foo]"), j.eEventValue("[bar]")),
535
+ j.iIf(j.eEq(j.eEventValue("[bar]"), j.eEventValue("[baz]")),
536
+ splugin("aplugin"),
537
+ j.noop
538
+ ),
539
+ j.iIf(
540
+ j.eEq(j.eEventValue("[bar]"), j.eEventValue("[baz]")),
541
+ splugin("bplugin"),
542
+ j.iIf(
543
+ j.eEq(j.eEventValue("[baz]"), j.eEventValue("[bot]")),
544
+ splugin("cplugin"),
545
+ splugin("dplugin")
546
+ )
547
+ )
548
+ )
549
+ )
550
+ end
551
+ end
552
+ end
553
+ end
554
+ end
555
+
556
+ context "filters" do
557
+ subject(:filter) { compiled[:filter] }
558
+
559
+ describe "a single filter" do
560
+ let(:source) { "input { } filter { grok {} } output { }" }
561
+
562
+ it "should contain the single input" do
563
+ expect(filter).to ir_eql(j.iPlugin(FILTER, "grok"))
564
+ end
565
+ end
566
+
567
+ it_should_behave_like "complex grammar", :filter
568
+ end
569
+
570
+ context "outputs" do
571
+ subject(:output) { compiled[:output] }
572
+
573
+ describe "a single output" do
574
+ let(:source) { "input { } output { stdout {} }" }
575
+
576
+ it "should contain the single input" do
577
+ expect(output).to ir_eql(j.iPlugin(OUTPUT, "stdout"))
578
+ end
579
+ end
580
+
581
+ it_should_behave_like "complex grammar", :output
582
+ end
583
+ end
584
+ end