require File.dirname(__FILE__) + '/helper'
require 'fluent/config'
require 'fluent/config/parser'
require 'fluent/supervisor'
require 'fluent/load'
require 'fileutils'
class ConfigTest < Test::Unit::TestCase
include Fluent
TMP_DIR = File.dirname(__FILE__) + "/tmp/config#{ENV['TEST_ENV_NUMBER']}"
def read_config(path)
path = File.expand_path(path)
File.open(path) { |io|
Fluent::Config::Parser.parse(io, File.basename(path), File.dirname(path))
}
end
def prepare_config
write_config "#{TMP_DIR}/config_test_1.conf", %[
k1 root_config
include dir/config_test_2.conf #
include #{TMP_DIR}/config_test_4.conf
include file://#{TMP_DIR}/config_test_5.conf
]
write_config "#{TMP_DIR}/dir/config_test_2.conf", %[
k2 relative_path_include
include ../config_test_3.conf
]
write_config "#{TMP_DIR}/config_test_3.conf", %[
k3 relative_include_in_included_file
]
write_config "#{TMP_DIR}/config_test_4.conf", %[
k4 absolute_path_include
]
write_config "#{TMP_DIR}/config_test_5.conf", %[
k5 uri_include
]
write_config "#{TMP_DIR}/config.d/config_test_6.conf", %[
k6 wildcard_include_1
include normal_parameter
]
write_config "#{TMP_DIR}/config.d/config_test_7.conf", %[
k7 wildcard_include_2
]
write_config "#{TMP_DIR}/config.d/config_test_8.conf", %[
]
write_config "#{TMP_DIR}/dir/config_test_9.conf", %[
k9 embeded
nested nested_value
include hoge
]
write_config "#{TMP_DIR}/config.d/00_config_test_8.conf", %[
k8 wildcard_include_3
include normal_parameter
]
end
def test_include
prepare_config
c = read_config("#{TMP_DIR}/config_test_1.conf")
assert_equal 'root_config', c['k1']
assert_equal 'relative_path_include', c['k2']
assert_equal 'relative_include_in_included_file', c['k3']
assert_equal 'absolute_path_include', c['k4']
assert_equal 'uri_include', c['k5']
assert_equal 'wildcard_include_1', c['k6']
assert_equal 'wildcard_include_2', c['k7']
assert_equal 'wildcard_include_3', c['k8']
assert_equal [
'k1',
'k2',
'k3',
'k4',
'k5',
'k8', # Because of the file name this comes first.
'k6',
'k7',
], c.keys
elem1 = c.elements.find { |e| e.name == 'elem1' }
assert_not_nil elem1
assert_equal 'name', elem1.arg
assert_equal 'normal_parameter', elem1['include']
elem2 = c.elements.find { |e| e.name == 'elem2' }
assert_not_nil elem2
assert_equal 'name', elem2.arg
assert_equal 'embeded', elem2['k9']
assert !elem2.has_key?('include')
elem3 = elem2.elements.find { |e| e.name == 'elem3' }
assert_not_nil elem3
assert_equal 'nested_value', elem3['nested']
assert_equal 'hoge', elem3['include']
end
def test_check_not_fetchd
write_config "#{TMP_DIR}/config_test_not_fetched.conf", %[
type rewrite
add_prefix filtered
key path
pattern ^[A-Z]+
replace
]
root_conf = read_config("#{TMP_DIR}/config_test_not_fetched.conf")
match_conf = root_conf.elements.first
rule_conf = match_conf.elements.first
not_fetched = []; root_conf.check_not_fetched {|key, e| not_fetched << key }
assert_equal %w[type add_prefix key pattern replace], not_fetched
not_fetched = []; match_conf.check_not_fetched {|key, e| not_fetched << key }
assert_equal %w[type add_prefix key pattern replace], not_fetched
not_fetched = []; rule_conf.check_not_fetched {|key, e| not_fetched << key }
assert_equal %w[key pattern replace], not_fetched
# accessing should delete
match_conf['type']
rule_conf['key']
not_fetched = []; root_conf.check_not_fetched {|key, e| not_fetched << key }
assert_equal %w[add_prefix pattern replace], not_fetched
not_fetched = []; match_conf.check_not_fetched {|key, e| not_fetched << key }
assert_equal %w[add_prefix pattern replace], not_fetched
not_fetched = []; rule_conf.check_not_fetched {|key, e| not_fetched << key }
assert_equal %w[pattern replace], not_fetched
# repeateadly accessing should not grow memory usage
before_size = match_conf.unused.size
10.times { match_conf['type'] }
assert_equal before_size, match_conf.unused.size
end
def write_config(path, data)
FileUtils.mkdir_p(File.dirname(path))
File.open(path, "w") {|f| f.write data }
end
def test_inline
prepare_config
opts = {
:config_path => "#{TMP_DIR}/config_test_1.conf",
:inline_config => ""
}
assert_nothing_raised do
Fluent::Supervisor.new(opts)
end
end
end