require_relative "test_helper.rb"

module LogjamAgent
  class SelectiveLoggingTest < MiniTest::Test
    class MockLogDev
      attr_reader :lines
      def initialize
        @lines = []
      end
      def write(s)
        @lines << s
      end
    end

    def setup
      @request = LogjamAgent.request = Request.new("app", "env", {})
      @lines = @request.instance_variable_get :@lines
      @logger = BufferedLogger.new(File::NULL)
      @device = MockLogDev.new
      @logger.logdev = @device
    end

    def teardown
      LogjamAgent.request = nil
      LogjamAgent.selective_logging_enabled = true
    end

    def test_normal_logging_adds_line_to_request_and_logdevice
      refute LogjamAgent.logjam_only?
      refute LogjamAgent.logdevice_only?
      @logger.info("normal")
      assert_equal 1, @lines.size
      assert_equal "normal", @lines.first.last
      assert_equal 1, @device.lines.size
      assert_match(/normal\n/, @device.lines.first)
    end

    def test_logjam_only_logging_adds_line_to_request_but_not_to_logdevice
      LogjamAgent.logjam_only do
        assert LogjamAgent.logjam_only?
        refute LogjamAgent.logdevice_only?
        @logger.info("logjam_only")
      end
      assert_equal 1, @lines.size
      assert_equal "logjam_only", @lines.first.last
      assert_equal 0, @device.lines.size
    end

    def test_logdevice_only_logging_adds_line_to_logdevice_but_not_to_request
      LogjamAgent.logdevice_only do
        refute LogjamAgent.logjam_only?
        assert LogjamAgent.logdevice_only?
        @logger.info("logdevice_only")
      end
      assert_equal [], @lines
      assert_equal 1, @device.lines.size
      assert_match(/logdevice_only\n/, @device.lines.first)
    end

    def test_select_logging_can_be_globally_disabled
      LogjamAgent.selective_logging_enabled = false
      LogjamAgent.logdevice_only do
        refute LogjamAgent.logdevice_only?
      end
      LogjamAgent.logjam_only do
        refute LogjamAgent.logjam_only?
      end
    end
  end
end