require_relative '../helper' require 'fluent/configurable' require 'fluent/config/element' require 'fluent/config/section' require 'fluent/system_config' module Fluent::Config class FakeLoggerInitializer attr_accessor :level def initalize @level = nil end end class FakeSupervisor attr_writer :log_level def initialize @workers = nil @root_dir = nil @log = FakeLoggerInitializer.new @log_level = Fluent::Log::LEVEL_INFO @suppress_interval = nil @suppress_config_dump = nil @suppress_repeated_stacktrace = nil @log_event_label = nil @log_event_verbose = nil @without_source = nil @emit_error_log_interval = nil @file_permission = nil @dir_permission = nil end end class TestSystemConfig < ::Test::Unit::TestCase TMP_DIR = File.expand_path(File.dirname(__FILE__) + "/tmp/system_config/#{ENV['TEST_ENV_NUMBER']}") def parse_text(text) basepath = File.expand_path(File.dirname(__FILE__) + '/../../') Fluent::Config.parse(text, '(test)', basepath, true).elements.find { |e| e.name == 'system' } end test 'should not override default configurations when no parameters' do conf = parse_text(<<-EOS) EOS s = FakeSupervisor.new sc = Fluent::SystemConfig.new(conf) sc.apply(s) assert_equal(1, sc.workers) assert_nil(sc.root_dir) assert_nil(sc.log_level) assert_nil(sc.suppress_repeated_stacktrace) assert_nil(sc.emit_error_log_interval) assert_nil(sc.suppress_config_dump) assert_nil(sc.without_source) assert_equal(:text, sc.log.format) assert_equal('%Y-%m-%d %H:%M:%S %z', sc.log.time_format) assert_equal(1, s.instance_variable_get(:@workers)) assert_nil(s.instance_variable_get(:@root_dir)) assert_equal(Fluent::Log::LEVEL_INFO, s.instance_variable_get(:@log_level)) assert_nil(s.instance_variable_get(:@suppress_repeated_stacktrace)) assert_nil(s.instance_variable_get(:@emit_error_log_interval)) assert_nil(s.instance_variable_get(:@suppress_config_dump)) assert_nil(s.instance_variable_get(:@log_event_verbose)) assert_nil(s.instance_variable_get(:@without_source)) assert_nil(s.instance_variable_get(:@file_permission)) assert_nil(s.instance_variable_get(:@dir_permission)) end data( 'workers' => ['workers', 3], 'root_dir' => ['root_dir', File.join(TMP_DIR, 'root')], 'log_level' => ['log_level', 'error'], 'suppress_repeated_stacktrace' => ['suppress_repeated_stacktrace', true], 'emit_error_log_interval' => ['emit_error_log_interval', 60], 'log_event_verbose' => ['log_event_verbose', true], 'suppress_config_dump' => ['suppress_config_dump', true], 'without_source' => ['without_source', true], ) test "accepts parameters" do |(k, v)| conf = parse_text(<<-EOS) #{k} #{v} EOS s = FakeSupervisor.new sc = Fluent::SystemConfig.new(conf) sc.apply(s) assert_not_nil(sc.instance_variable_get("@#{k}")) key = (k == 'emit_error_log_interval' ? 'suppress_interval' : k) assert_not_nil(s.instance_variable_get("@#{key}")) end test "log parameters" do conf = parse_text(<<-EOS) format json time_format %Y EOS s = FakeSupervisor.new sc = Fluent::SystemConfig.new(conf) sc.apply(s) assert_equal(:json, sc.log.format) assert_equal('%Y', sc.log.time_format) end data( 'foo' => ['foo', 'bar'], 'hoge' => ['hoge', 'fuga'], ) test "should not affect settable parameters with unknown parameters" do |(k, v)| s = FakeSupervisor.new sc = Fluent::SystemConfig.new({k => v}) sc.apply(s) assert_equal(1, s.instance_variable_get(:@workers)) assert_nil(s.instance_variable_get(:@root_dir)) assert_equal(Fluent::Log::LEVEL_INFO, s.instance_variable_get(:@log_level)) assert_nil(s.instance_variable_get(:@suppress_repeated_stacktrace)) assert_nil(s.instance_variable_get(:@emit_error_log_interval)) assert_nil(s.instance_variable_get(:@suppress_config_dump)) assert_nil(s.instance_variable_get(:@log_event_verbose)) assert_nil(s.instance_variable_get(:@without_source)) assert_nil(s.instance_variable_get(:@file_permission)) assert_nil(s.instance_variable_get(:@dir_permission)) end data('trace' => Fluent::Log::LEVEL_TRACE, 'debug' => Fluent::Log::LEVEL_DEBUG, 'info' => Fluent::Log::LEVEL_INFO, 'warn' => Fluent::Log::LEVEL_WARN, 'error' => Fluent::Log::LEVEL_ERROR, 'fatal' => Fluent::Log::LEVEL_FATAL) test 'log_level is applied when log_level related command line option is not passed' do |level| conf = parse_text(<<-EOS) log_level #{Fluent::Log::LEVEL_TEXT[level]} EOS s = FakeSupervisor.new sc = Fluent::SystemConfig.new(conf) sc.attach(s) sc.apply(s) assert_equal(level, s.instance_variable_get("@log").level) end # info is removed because info level can't be specified via command line data('trace' => Fluent::Log::LEVEL_TRACE, 'debug' => Fluent::Log::LEVEL_DEBUG, 'warn' => Fluent::Log::LEVEL_WARN, 'error' => Fluent::Log::LEVEL_ERROR, 'fatal' => Fluent::Log::LEVEL_FATAL) test 'log_level is ignored when log_level related command line option is passed' do |level| conf = parse_text(<<-EOS) log_level info EOS s = FakeSupervisor.new s.log_level = level sc = Fluent::SystemConfig.new(conf) sc.attach(s) sc.apply(s) assert_equal(level, s.instance_variable_get("@log").level) end test 'process global overridable variables' do conf = parse_text(<<-EOS) file_permission 0655 dir_permission 0765 EOS s = FakeSupervisor.new sc = Fluent::SystemConfig.new(conf) sc.attach(s) sc.apply(s) assert_equal(0655, s.instance_variable_get(:@file_permission)) assert_equal(0765, s.instance_variable_get(:@dir_permission)) end end end