require_relative '../helper' require 'fluent/plugin/filter_grep' require 'fluent/test/driver/filter' class GrepFilterTest < Test::Unit::TestCase include Fluent setup do Fluent::Test.setup @time = event_time end def create_driver(conf = '') Fluent::Test::Driver::Filter.new(Fluent::Plugin::GrepFilter).configure(conf) end sub_test_case 'configure' do test 'check default' do d = create_driver assert_empty(d.instance.regexps) assert_empty(d.instance.excludes) end test "regexpN can contain a space" do d = create_driver(%[regexp1 message foo]) assert_equal(Regexp.compile(/ foo/), d.instance._regexps['message']) end test "excludeN can contain a space" do d = create_driver(%[exclude1 message foo]) assert_equal(Regexp.compile(/ foo/), d.instance._excludes['message']) end sub_test_case "duplicate key" do test "flat" do conf = %[ regexp1 message test regexp2 message test2 ] assert_raise(Fluent::ConfigError) do create_driver(conf) end end test "section" do conf = %[ key message pattern test key message pattern test2 ] assert_raise(Fluent::ConfigError) do create_driver(conf) end end test "mix" do conf = %[ regexp1 message test key message pattern test ] assert_raise(Fluent::ConfigError) do create_driver(conf) end end end end sub_test_case 'filter_stream' do def messages [ "2013/01/13T07:02:11.124202 INFO GET /ping", "2013/01/13T07:02:13.232645 WARN POST /auth", "2013/01/13T07:02:21.542145 WARN GET /favicon.ico", "2013/01/13T07:02:43.632145 WARN POST /login", ] end def filter(config, msgs) d = create_driver(config) d.run { msgs.each { |msg| d.feed("filter.test", @time, {'foo' => 'bar', 'message' => msg}) } } d.filtered_records end test 'empty config' do filtered_records = filter('', messages) assert_equal(4, filtered_records.size) end test 'regexpN' do filtered_records = filter('regexp1 message WARN', messages) assert_equal(3, filtered_records.size) assert_block('only WARN logs') do filtered_records.all? { |r| !r['message'].include?('INFO') } end end test 'excludeN' do filtered_records = filter('exclude1 message favicon', messages) assert_equal(3, filtered_records.size) assert_block('remove favicon logs') do filtered_records.all? { |r| !r['message'].include?('favicon') } end end test 'regexps' do conf = %[ key message pattern WARN ] filtered_records = filter(conf, messages) assert_equal(3, filtered_records.size) assert_block('only WARN logs') do filtered_records.all? { |r| !r['message'].include?('INFO') } end end test 'excludes' do conf = %[ key message pattern favicon ] filtered_records = filter(conf, messages) assert_equal(3, filtered_records.size) assert_block('remove favicon logs') do filtered_records.all? { |r| !r['message'].include?('favicon') } end end sub_test_case 'with invalid sequence' do def messages [ "\xff".force_encoding('UTF-8'), ] end test "don't raise an exception" do assert_nothing_raised { filter(%[regexp1 message WARN], ["\xff".force_encoding('UTF-8')]) } end end end sub_test_case 'grep non-string jsonable values' do def filter(msg, config = 'regexp1 message 0') d = create_driver(config) d.run do d.feed("filter.test", @time, {'foo' => 'bar', 'message' => msg}) end d.filtered_records end data( 'array' => ["0"], 'hash' => ["0" => "0"], 'integer' => 0, 'float' => 0.1) test "value" do |data| filtered_records = filter(data) assert_equal(1, filtered_records.size) end test "value boolean" do filtered_records = filter(true, %[regexp1 message true]) assert_equal(1, filtered_records.size) end end end