test/config/test_dsl.rb in fluentd-0.14.0 vs test/config/test_dsl.rb in fluentd-0.14.1

- old
+ new

@@ -1,9 +1,69 @@ require_relative '../helper' require 'fluent/config/element' require "fluent/config/dsl" +TMP_DIR = File.dirname(__FILE__) + "/tmp/config_dsl#{ENV['TEST_ENV_NUMBER']}" +def write_config(path, data) + FileUtils.mkdir_p(File.dirname(path)) + File.open(path, "w") {|f| f.write data } +end + +def prepare_config1 + 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 + @include config.d/*.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 + <elem1 name> + include normal_parameter + </elem1> +] + write_config "#{TMP_DIR}/config.d/config_test_7.conf", %[ + k7 wildcard_include_2 +] + write_config "#{TMP_DIR}/config.d/config_test_8.conf", %[ + <elem2 name> + @include ../dir/config_test_9.conf + </elem2> +] + write_config "#{TMP_DIR}/dir/config_test_9.conf", %[ + k9 embeded + <elem3 name> + nested nested_value + include hoge + </elem3> +] + write_config "#{TMP_DIR}/config.d/00_config_test_8.conf", %[ + k8 wildcard_include_3 + <elem4 name> + include normal_parameter + </elem4> +] +end + +def prepare_config2 + write_config "#{TMP_DIR}/config_test_1.rb", DSL_CONFIG_EXAMPLE +end + DSL_CONFIG_EXAMPLE = %q[ worker { hostname = "myhostname" (0..9).each { |i| @@ -55,10 +115,18 @@ path "/var/log/httpd/access.full.log" } } ] +DSL_CONFIG_EXAMPLE_FOR_INCLUDE_CONF = %q[ +include "#{TMP_DIR}/config_test_1.conf" +] + +DSL_CONFIG_EXAMPLE_FOR_INCLUDE_RB = %q[ +include "#{TMP_DIR}/config_test_1.rb" +] + DSL_CONFIG_RETURNS_NON_ELEMENT = %q[ worker { } [] ] @@ -72,10 +140,13 @@ } ] DSL_CONFIG_WRONG_SYNTAX3 = %q[ match('aa','bb') ] +DSL_CONFIG_WRONG_SYNTAX4 = %q[ +include +] module Fluent::Config class TestDSLParser < ::Test::Unit::TestCase sub_test_case 'with worker tag on top level' do def setup @@ -156,10 +227,116 @@ refute(@root.elements.find { |e| e.name == 'worker' }) end end end + sub_test_case 'with include conf' do + def setup + prepare_config1 + @root = Fluent::Config::DSL::Parser.parse(DSL_CONFIG_EXAMPLE_FOR_INCLUDE_CONF, 'dsl_config_for_include.conf') + end + test 'include config' do + assert_equal('root_config', @root['k1']) + assert_equal('relative_path_include', @root['k2']) + assert_equal('relative_include_in_included_file', @root['k3']) + assert_equal('absolute_path_include', @root['k4']) + assert_equal('uri_include', @root['k5']) + assert_equal('wildcard_include_1', @root['k6']) + assert_equal('wildcard_include_2', @root['k7']) + assert_equal('wildcard_include_3', @root['k8']) + assert_equal([ + 'k1', + 'k2', + 'k3', + 'k4', + 'k5', + 'k8', # Because of the file name this comes first. + 'k6', + 'k7', + ], @root.keys) + + elem1 = @root.elements.find { |e| e.name == 'elem1' } + assert(elem1) + assert_equal('name', elem1.arg) + assert_equal('normal_parameter', elem1['include']) + + elem2 = @root.elements.find { |e| e.name == 'elem2' } + assert(elem2) + assert_equal('name', elem2.arg) + assert_equal('embeded', elem2['k9']) + assert_not_include(elem2, 'include') + + elem3 = elem2.elements.find { |e| e.name == 'elem3' } + assert(elem3) + assert_equal('nested_value', elem3['nested']) + assert_equal('hoge', elem3['include']) + end + + # TODO: Add uri based include spec + end + + sub_test_case 'with include rb' do + def setup + prepare_config2 + @root = Fluent::Config::DSL::Parser.parse(DSL_CONFIG_EXAMPLE_FOR_INCLUDE_RB, 'dsl_config_for_include.rb') + end + sub_test_case '.parse' do + test 'makes root element' do + assert_equal('ROOT', @root.name) + assert_predicate(@root.arg, :empty?) + assert_equal(0, @root.keys.size) + end + + test 'makes worker element for worker tag' do + assert_equal(1, @root.elements.size) + + worker = @root.elements.first + assert_equal('worker', worker.name) + assert_predicate(worker.arg, :empty?) + assert_equal(0, worker.keys.size) + assert_equal(10, worker.elements.size) + end + + test 'makes subsections for blocks, with variable substitution' do + ele4 = @root.elements.first.elements[4] + + assert_equal('source', ele4.name) + assert_predicate(ele4.arg, :empty?) + assert_equal(2, ele4.keys.size) + assert_equal('tail', ele4['type']) + assert_equal("/var/log/httpd/access.part4.log", ele4['path']) + end + + test 'makes user-defined sections with blocks' do + filter0 = @root.elements.first.elements[4].elements.first + + assert_equal('filter', filter0.name) + assert_equal('bar.**', filter0.arg) + assert_equal('hoge', filter0['type']) + assert_equal('moge', filter0['val1']) + assert_equal(JSON.dump(['foo', 'bar', 'baz']), filter0['val2']) + assert_equal('10', filter0['val3']) + assert_equal('hoge', filter0['id']) + + assert_equal(2, filter0.elements.size) + assert_equal('subsection', filter0.elements[0].name) + assert_equal('bar', filter0.elements[0]['foo']) + assert_equal('subsection', filter0.elements[1].name) + assert_equal('baz', filter0.elements[1]['foo']) + end + + test 'makes values with user-assigned variable substitutions' do + match0 = @root.elements.first.elements[4].elements.last + + assert_equal('match', match0.name) + assert_equal('{foo,bar}.**', match0.arg) + assert_equal('file', match0['type']) + assert_equal('/var/log/httpd/access.myhostname.4.log', match0['path']) + end + end + end + sub_test_case 'with configuration that returns non element on top' do sub_test_case '.parse' do test 'does not crash' do Fluent::Config::DSL::Parser.parse(DSL_CONFIG_RETURNS_NON_ELEMENT, 'dsl_config_returns_non_element.rb') end @@ -168,11 +345,12 @@ sub_test_case 'with configuration with wrong arguments for specific elements' do sub_test_case '.parse' do test 'raises ArgumentError correctly' do assert_raise(ArgumentError) { Fluent::Config::DSL::Parser.parse(DSL_CONFIG_WRONG_SYNTAX1, 'dsl_config_wrong_syntax1') } - assert_raise(ArgumentError) { Fluent::Config::DSL::Parser.parse(DSL_CONFIG_WRONG_SYNTAX2, 'dsl_config_wrong_syntax1') } - assert_raise(ArgumentError) { Fluent::Config::DSL::Parser.parse(DSL_CONFIG_WRONG_SYNTAX3, 'dsl_config_wrong_syntax1') } + assert_raise(ArgumentError) { Fluent::Config::DSL::Parser.parse(DSL_CONFIG_WRONG_SYNTAX2, 'dsl_config_wrong_syntax2') } + assert_raise(ArgumentError) { Fluent::Config::DSL::Parser.parse(DSL_CONFIG_WRONG_SYNTAX3, 'dsl_config_wrong_syntax3') } + assert_raise(ArgumentError) { Fluent::Config::DSL::Parser.parse(DSL_CONFIG_WRONG_SYNTAX4, 'dsl_config_wrong_syntax4') } end end end sub_test_case 'with ruby keyword, that provides ruby Kernel module features' do