--- /dev/null
+#!/usr/bin/env rspec
+
+require 'spec_helper'
+
+module MCollective
+ describe Log do
+ before do
+ @logger = mock("logger provider")
+ @logger.stubs(:start)
+ @logger.stubs(:set_logging_level)
+ @logger.stubs(:valid_levels)
+ @logger.stubs(:should_log?).returns(true)
+ @logger.stubs(:new).returns(@logger)
+
+ # we stub it out at the top of the test suite
+ Log.unstub(:log)
+ Log.unstub(:logexception)
+ Log.unstub(:logmsg)
+
+ Log.unconfigure
+ Log.set_logger(@logger)
+ end
+
+ describe "#config_and_check_level" do
+ it "should configure then not already configured" do
+ Log.expects(:configure)
+ Log.config_and_check_level(:debug)
+ end
+
+ it "should not reconfigure the logger" do
+ Log.configure(@logger)
+ Log.expects(:configure).never
+ Log.config_and_check_level(:debug)
+ end
+
+ it "should check the level is valid" do
+ Log.configure(@logger)
+ Log.expects(:check_level).with(:debug)
+ Log.config_and_check_level(:debug)
+ end
+
+ it "should respect the loggers decision about levels" do
+ Log.configure(@logger)
+ @logger.expects(:should_log?).returns(false)
+ Log.config_and_check_level(:debug).should == false
+ end
+ end
+
+ describe "#valid_level?" do
+ it "should correctly report for valid levels" do
+ [:error, :fatal, :debug, :warn, :info].each {|level| Log.valid_level?(level).should == true }
+ Log.valid_level?(:rspec).should == false
+ end
+ end
+
+ describe "#message_for" do
+ it "should return the code and retrieved message" do
+ Util.expects(:t).with(:PLMC1, {:rspec => true}).returns("this is PLMC1")
+ Log.message_for(:PLMC1, {:rspec => true}).should == "PLMC1: this is PLMC1"
+ end
+ end
+
+ describe "#logexception" do
+ it "should short circuit messages below current level" do
+ Log.expects(:config_and_check_level).with(:debug).returns(false)
+ Log.expects(:log).never
+ Log.logexception(:PLMC1, :debug, Exception.new, {})
+ end
+
+ it "should request the message including the exception string and log it" do
+ Log.stubs(:config_and_check_level).returns(true)
+ Log.expects(:message_for).with(:PLMC1, {:rspec => "test", :error => "Exception: this is a test"}).returns("This is a test")
+ Log.expects(:log).with(:debug, "This is a test", "test:2")
+
+ e = Exception.new("this is a test")
+ e.set_backtrace ["/some/dir/test:1", "/some/dir/test:2"]
+
+ Log.logexception(:PLMC1, :debug, e, false, {:rspec => "test"})
+ end
+ end
+
+ describe "#logmsg" do
+ it "should short circuit messages below current level" do
+ Log.expects(:config_and_check_level).with(:debug).returns(false)
+ Log.expects(:log).never
+ Log.logmsg(:PLMC1, "", :debug, {})
+ end
+
+ it "should request the message and log it" do
+ Log.stubs(:config_and_check_level).returns(true)
+ Log.expects(:message_for).with(:PLMC1, {:rspec => "test", :default => "default"}).returns("This is a test")
+ Log.expects(:log).with(:debug, "This is a test")
+ Log.logmsg(:PLMC1, "default", :debug, :rspec => "test")
+ end
+ end
+
+ describe "#check_level" do
+ it "should check for valid levels" do
+ Log.expects(:valid_level?).with(:debug).returns(true)
+ Log.check_level(:debug)
+ end
+
+ it "should raise for invalid levels" do
+ expect { Log.check_level(:rspec) }.to raise_error("Unknown log level")
+ end
+ end
+
+ describe "#configure" do
+ it "should default to console logging if called prior to configuration" do
+ Config.instance.instance_variable_set("@configured", false)
+ Log.configure
+ Log.logger.should == MCollective::Logger::Console_logger
+ end
+ end
+
+ describe "#instance" do
+ it "should return the correct reference" do
+ Log.configure(@logger)
+ Log.instance.should == MCollective::Log
+ end
+ end
+
+ describe "#log" do
+ it "should log at the right levels" do
+ Log.configure(@logger)
+
+ [:debug, :info, :fatal, :error, :warn].each do |level|
+ @logger.expects(:log).with(level, anything, regexp_matches(/#{level} test/))
+ @logger.expects(:should_log?).with(level).returns(true)
+ Log.send(level, "#{level} test")
+ end
+ end
+ end
+
+ describe "#cycle_level" do
+ it "should cycle logger class levels" do
+ @logger.expects(:cycle_level)
+
+ Log.configure(@logger)
+ Log.cycle_level
+ end
+ end
+ end
+end