broadcast_logger_test.rb 4.9 KB
Newer Older
1
# frozen_string_literal: true
2

3
require "abstract_unit"
4 5 6

module ActiveSupport
  class BroadcastLoggerTest < TestCase
7
    attr_reader :logger, :log1, :log2
8 9

    setup do
10 11 12 13
      @log1 = FakeLogger.new
      @log2 = FakeLogger.new
      @log1.extend Logger.broadcast @log2
      @logger = @log1
14
    end
15

16 17 18 19 20 21 22 23 24 25
    Logger::Severity.constants.each do |level_name|
      method = level_name.downcase
      level = Logger::Severity.const_get(level_name)

      test "##{method} adds the message to all loggers" do
        logger.send(method, "msg")

        assert_equal [level, "msg", nil], log1.adds.first
        assert_equal [level, "msg", nil], log2.adds.first
      end
26 27
    end

28
    test "#close broadcasts to all loggers" do
29
      logger.close
30

31 32
      assert log1.closed, "should be closed"
      assert log2.closed, "should be closed"
33 34
    end

35
    test "#<< shovels the value into all loggers" do
36
      logger << "foo"
37

38 39
      assert_equal %w{ foo }, log1.chevrons
      assert_equal %w{ foo }, log2.chevrons
40 41
    end

42 43 44 45 46 47
    test "#level= assigns the level to all loggers" do
      assert_equal ::Logger::DEBUG, logger.level
      logger.level = ::Logger::FATAL

      assert_equal ::Logger::FATAL, log1.level
      assert_equal ::Logger::FATAL, log2.level
48 49
    end

50
    test "#progname= assigns to all the loggers" do
51
      assert_nil logger.progname
52 53 54 55
      logger.progname = ::Logger::FATAL

      assert_equal ::Logger::FATAL, log1.progname
      assert_equal ::Logger::FATAL, log2.progname
56 57
    end

58
    test "#formatter= assigns to all the loggers" do
59
      assert_nil logger.formatter
60 61 62 63 64 65 66 67 68 69 70 71 72 73
      logger.formatter = ::Logger::FATAL

      assert_equal ::Logger::FATAL, log1.formatter
      assert_equal ::Logger::FATAL, log2.formatter
    end

    test "#local_level= assigns the local_level to all loggers" do
      assert_equal ::Logger::DEBUG, logger.local_level
      logger.local_level = ::Logger::FATAL

      assert_equal ::Logger::FATAL, log1.local_level
      assert_equal ::Logger::FATAL, log2.local_level
    end

74 75 76 77 78 79 80 81 82 83 84 85 86 87
    test "#silence does not break custom loggers" do
      new_logger = FakeLogger.new
      custom_logger = CustomLogger.new
      custom_logger.extend(Logger.broadcast(new_logger))

      custom_logger.silence do
        custom_logger.error "from error"
        custom_logger.unknown "from unknown"
      end

      assert_equal [[::Logger::ERROR, "from error", nil], [::Logger::UNKNOWN, "from unknown", nil]], custom_logger.adds
      assert_equal [[::Logger::ERROR, "from error", nil], [::Logger::UNKNOWN, "from unknown", nil]], new_logger.adds
    end

88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
    test "#silence silences all loggers below the default level of ERROR" do
      logger.silence do
        logger.debug "test"
      end

      assert_equal [], log1.adds
      assert_equal [], log2.adds
    end

    test "#silence does not silence at or above ERROR" do
      logger.silence do
        logger.error "from error"
        logger.unknown "from unknown"
      end

      assert_equal [[::Logger::ERROR, "from error", nil], [::Logger::UNKNOWN, "from unknown", nil]], log1.adds
      assert_equal [[::Logger::ERROR, "from error", nil], [::Logger::UNKNOWN, "from unknown", nil]], log2.adds
    end

    test "#silence allows you to override the silence level" do
      logger.silence(::Logger::FATAL) do
        logger.error "unseen"
        logger.fatal "seen"
      end

      assert_equal [[::Logger::FATAL, "seen", nil]], log1.adds
      assert_equal [[::Logger::FATAL, "seen", nil]], log2.adds
115 116
    end

117 118 119 120 121 122 123 124
    test "Including top constant LoggerSilence is deprecated" do
      assert_deprecated("Please use `ActiveSupport::LoggerSilence`") do
        logger = Class.new(CustomLogger) do
          include ::LoggerSilence
        end
      end
    end

125
    class CustomLogger
126
      attr_reader :adds, :closed, :chevrons
127
      attr_accessor :level, :progname, :formatter, :local_level
128 129

      def initialize
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
        @adds        = []
        @closed      = false
        @chevrons    = []
        @level       = ::Logger::DEBUG
        @local_level = ::Logger::DEBUG
        @progname    = nil
        @formatter   = nil
      end

      def debug(message, &block)
        add(::Logger::DEBUG, message, &block)
      end

      def info(message, &block)
        add(::Logger::INFO, message, &block)
      end

      def warn(message, &block)
        add(::Logger::WARN, message, &block)
      end

      def error(message, &block)
        add(::Logger::ERROR, message, &block)
      end

      def fatal(message, &block)
        add(::Logger::FATAL, message, &block)
157 158
      end

159 160
      def unknown(message, &block)
        add(::Logger::UNKNOWN, message, &block)
161 162
      end

163
      def <<(x)
164 165 166
        @chevrons << x
      end

167
      def add(message_level, message = nil, progname = nil, &block)
168
        @adds << [message_level, message, progname] if message_level >= local_level
169 170 171 172 173 174
      end

      def close
        @closed = true
      end
    end
175 176

    class FakeLogger < CustomLogger
177
      include ActiveSupport::LoggerSilence
178
    end
179 180
  end
end