Testing Nginx Log Parser Implementation in Fluentd
This test suite validates the Nginx log parser functionality in Fluentd, ensuring accurate parsing of various Nginx access log formats. The tests verify parsing of standard log entries, handling of HTTP headers, and proper extraction of forwarded IP addresses.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
fluent/fluentd
test/plugin/test_parser_nginx.rb
require_relative '../helper'
require 'fluent/test/driver/parser'
require 'fluent/plugin/parser_nginx'
class NginxParserTest < ::Test::Unit::TestCase
def setup
Fluent::Test.setup
@expected = {
'remote' => '127.0.0.1',
'host' => '192.168.0.1',
'user' => '-',
'method' => 'GET',
'path' => '/',
'code' => '200',
'size' => '777',
'referer' => '-',
'agent' => 'Opera/12.0'
}
@expected_extended = {
'remote' => '127.0.0.1',
'host' => '192.168.0.1',
'user' => '-',
'method' => 'GET',
'path' => '/',
'code' => '200',
'size' => '777',
'referer' => '-',
'agent' => 'Opera/12.0',
'http_x_forwarded_for' => '-'
}
@expected_extended_multiple_ip = {
'remote' => '127.0.0.1',
'host' => '192.168.0.1',
'user' => '-',
'method' => 'GET',
'path' => '/',
'code' => '200',
'size' => '777',
'referer' => '-',
'agent' => 'Opera/12.0',
'http_x_forwarded_for' => '127.0.0.1, 192.168.0.1'
}
end
def create_driver
Fluent::Test::Driver::Parser.new(Fluent::Plugin::NginxParser.new).configure({})
end
def test_parse
d = create_driver
d.instance.parse('127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0"') { |time, record|
assert_equal(event_time('28/Feb/2013:12:00:00 +0900', format: '%d/%b/%Y:%H:%M:%S %z'), time)
assert_equal(@expected, record)
}
end
def test_parse_with_empty_included_path
d = create_driver
d.instance.parse('127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00 +0900] "GET /a[ ]b HTTP/1.1" 200 777 "-" "Opera/12.0"') { |time, record|
assert_equal(event_time('28/Feb/2013:12:00:00 +0900', format: '%d/%b/%Y:%H:%M:%S %z'), time)
assert_equal(@expected.merge('path' => '/a[ ]b'), record)
}
end
def test_parse_without_http_version
d = create_driver
d.instance.parse('127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00 +0900] "GET /" 200 777 "-" "Opera/12.0"') { |time, record|
assert_equal(event_time('28/Feb/2013:12:00:00 +0900', format: '%d/%b/%Y:%H:%M:%S %z'), time)
assert_equal(@expected, record)
}
end
def test_parse_with_http_x_forwarded_for
d = create_driver
d.instance.parse('127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0" -') { |time, record|
assert_equal(event_time('28/Feb/2013:12:00:00 +0900', format: '%d/%b/%Y:%H:%M:%S %z'), time)
assert_equal(@expected_extended, record)
}
end
def test_parse_with_http_x_forwarded_for_multiple_ip
d = create_driver
d.instance.parse('127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0" "127.0.0.1, 192.168.0.1"') { |time, record|
assert_equal(event_time('28/Feb/2013:12:00:00 +0900', format: '%d/%b/%Y:%H:%M:%S %z'), time)
assert_equal(@expected_extended_multiple_ip, record)
}
end
end