@@ -185,6 +185,10 @@ def event_router
185
185
186
186
sub_test_case 'filter' do
187
187
test 'filter should be called when tag matched' do
188
+ filter = Class . new ( FluentTestFilter ) { |x |
189
+ def filter_stream ( _tag , es ) ; end
190
+ } . new
191
+
188
192
event_router . add_rule ( 'test' , filter )
189
193
190
194
assert_rr do
@@ -229,6 +233,89 @@ def event_router
229
233
end
230
234
end
231
235
236
+ sub_test_case 'optimized filter' do
237
+ setup do
238
+ @record = { 'k' => 'v' }
239
+ @now = Engine . now
240
+ end
241
+
242
+ test 'call optimized filter when the filter plugin implements #filter without #filter_stream' do
243
+ event_router . add_rule ( 'test' , filter )
244
+
245
+ assert_rr do
246
+ mock ( filter ) . filter ( 'test' , @now , @record ) { @record }
247
+ event_router . emit ( 'test' , @now , @record )
248
+ end
249
+ end
250
+
251
+ test 'call optimized filter when the filter plugin implements #filter_with_time without #filter_stream' do
252
+ filter = Class . new ( FluentTestFilter ) {
253
+ undef_method :filter
254
+ def filter_with_time ( tag , time , record ) ; end
255
+ } . new
256
+
257
+ event_router . add_rule ( 'test' , filter )
258
+
259
+ assert_rr do
260
+ mock ( filter ) . filter_with_time ( 'test' , @now , @record ) { [ time , @record ] }
261
+ event_router . emit ( 'test' , @now , @record )
262
+ end
263
+ end
264
+
265
+ test "don't call optimized filter when filter plugins implement #filter_stream" do
266
+ filter = Class . new ( FluentTestFilter ) {
267
+ undef_method :filter
268
+ def filter_stream ( tag , time , record ) ; end
269
+ } . new
270
+
271
+ event_router . add_rule ( 'test' , filter )
272
+
273
+ assert_rr do
274
+ mock ( filter ) . filter_stream ( 'test' , is_a ( OneEventStream ) ) { OneEventStream . new ( @now , @record ) }
275
+ event_router . emit ( 'test' , @now , @record )
276
+ end
277
+ end
278
+
279
+ test 'call optimized filter when filter plugins have #filter_with_time instead of #filter' do
280
+ filter_with_time = Class . new ( FluentTestFilter ) {
281
+ undef_method :filter
282
+ def filter_with_time ( tag , time , record ) ; end
283
+ } . new
284
+
285
+ event_router . add_rule ( 'test' , filter_with_time )
286
+ event_router . add_rule ( 'test' , filter )
287
+
288
+ assert_rr do
289
+ mock ( filter_with_time ) . filter_with_time ( 'test' , @now , @record ) { [ @now + 1 , @record ] }
290
+ mock ( filter ) . filter ( 'test' , @now + 1 , @record ) { @record }
291
+ event_router . emit ( 'test' , @now , @record )
292
+ end
293
+ end
294
+
295
+ test "don't call optimized filter even if just a filter of some filters implements #filter_stream method" do
296
+ filter_stream = Class . new ( FluentTestFilter ) {
297
+ def filter_stream ( tag , record ) ; end
298
+ } . new
299
+
300
+ filter_with_time = Class . new ( FluentTestFilter ) {
301
+ undef_method :filter
302
+ def filter_with_time ( tag , time , record ) ; end
303
+ } . new
304
+
305
+ filters = [ filter_stream , filter_with_time , filter ]
306
+ filters . each { |f | event_router . add_rule ( 'test' , f ) }
307
+
308
+ e = OneEventStream . new ( @now , @record )
309
+ assert_rr do
310
+ mock ( $log) . info ( "Filtering works with worse performance, because #{ [ filter_stream ] . map ( &:class ) } uses `#filter_stream` method." )
311
+ mock ( filter_stream ) . filter_stream ( 'test' , is_a ( OneEventStream ) ) { e }
312
+ mock ( filter ) . filter_stream ( 'test' , is_a ( OneEventStream ) ) { e }
313
+ mock ( filter_with_time ) . filter_stream ( 'test' , is_a ( OneEventStream ) ) { e }
314
+ event_router . emit ( 'test' , @now , @record )
315
+ end
316
+ end
317
+ end
318
+
232
319
sub_test_case 'emit_error_handler' do
233
320
test 'call handle_emits_error when emit failed' do
234
321
event_router . add_rule ( 'test' , error_output )
0 commit comments