Path: blob/trunk/rb/spec/unit/selenium/webdriver/common/logger_spec.rb
1865 views
# frozen_string_literal: true12# Licensed to the Software Freedom Conservancy (SFC) under one3# or more contributor license agreements. See the NOTICE file4# distributed with this work for additional information5# regarding copyright ownership. The SFC licenses this file6# to you under the Apache License, Version 2.0 (the7# "License"); you may not use this file except in compliance8# with the License. You may obtain a copy of the License at9#10# http://www.apache.org/licenses/LICENSE-2.011#12# Unless required by applicable law or agreed to in writing,13# software distributed under the License is distributed on an14# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY15# KIND, either express or implied. See the License for the16# specific language governing permissions and limitations17# under the License.1819require File.expand_path('../spec_helper', __dir__)2021module Selenium22module WebDriver23describe Logger do24subject(:logger) { described_class.new('Selenium', default_level: :info, ignored: [:logger_info]) }2526around do |example|27debug = $DEBUG28$DEBUG = false29example.call30$DEBUG = debug31end3233describe '#new' do34it 'allows creating a logger with a different progname' do35other_logger = described_class.new('NotSelenium')36msg = /WARN NotSelenium message/37expect { other_logger.warn('message') }.to output(msg).to_stderr_from_any_process38end3940it 'does not log info from constructor' do41expect {42described_class.new('Selenium')43}.not_to output(/.+/).to_stdout_from_any_process44end45end4647describe '#level' do48it 'logs at warn level by default' do49expect(logger.level).to eq(1)50expect(logger).to be_info51end5253it 'logs at debug level if $DEBUG is set to true' do54$DEBUG = true55logger = described_class.new('Selenium')56$DEBUG = nil57expect(logger.level).to eq(0)58expect(logger).to be_debug59end6061it 'allows changing level by name during execution' do62logger.level = :error63expect(logger.level).to eq(3)64expect(logger).to be_error65end6667it 'allows changing level by integer during execution' do68logger.level = 169expect(logger).to be_info70end71end7273describe '#output' do74it 'outputs to stderr by default' do75expect { logger.warn('message') }.to output(/WARN Selenium message/).to_stderr_from_any_process76end7778it 'allows output to file' do79logger.output = 'test.log'80logger.warn('message')81expect(File.read('test.log')).to include('WARN Selenium message')82ensure83logger.close84File.delete('test.log')85end86end8788describe '#debug' do89before { logger.level = :debug }9091it 'logs message' do92expect { logger.debug 'String Value' }.to output(/DEBUG Selenium String Value/).to_stderr_from_any_process93end9495it 'logs single id when set' do96msg = /DEBUG Selenium \[:foo\] debug message/97expect { logger.debug('debug message', id: :foo) }.to output(msg).to_stderr_from_any_process98end99100it 'logs multiple ids when set' do101msg = /DEBUG Selenium \[:foo, :bar\] debug message/102expect { logger.debug('debug message', id: %i[foo bar]) }.to output(msg).to_stderr_from_any_process103end104end105106describe '#info' do107it 'logs info on first displayed logging only' do108logger = described_class.new('Selenium', default_level: :info)109110logger.debug('first')111expect { logger.info('first') }.to output(/:logger_info/).to_stderr_from_any_process112expect { logger.info('second') }.not_to output(/:logger_info/).to_stderr_from_any_process113end114115it 'logs message' do116expect { logger.info 'String Value' }.to output(/INFO Selenium String Value/).to_stderr_from_any_process117end118119it 'logs single id when set' do120msg = /INFO Selenium \[:foo\] info message/121expect { logger.info('info message', id: :foo) }.to output(msg).to_stderr_from_any_process122end123124it 'logs multiple ids when set' do125msg = /INFO Selenium \[:foo, :bar\] info message/126expect { logger.info('info message', id: %i[foo bar]) }.to output(msg).to_stderr_from_any_process127end128end129130describe '#warn' do131it 'logs message' do132expect { logger.warn 'String Value' }.to output(/WARN Selenium String Value/).to_stderr_from_any_process133end134135it 'logs single id when set' do136msg = /WARN Selenium \[:foo\] warning message/137expect { logger.warn('warning message', id: :foo) }.to output(msg).to_stderr_from_any_process138end139140it 'logs multiple ids when set' do141msg = /WARN Selenium \[:foo, :bar\] warning message/142expect { logger.warn('warning message', id: %i[foo bar]) }.to output(msg).to_stderr_from_any_process143end144end145146describe '#deprecate' do147it 'allows to deprecate functionality with replacement' do148message = /WARN Selenium \[DEPRECATION\] #old is deprecated\. Use #new instead\./149expect { logger.deprecate('#old', '#new') }.to output(message).to_stderr_from_any_process150end151152it 'allows to deprecate functionality without replacement' do153message = /WARN Selenium \[DEPRECATION\] #old is deprecated and will be removed in a future release\./154expect { logger.deprecate('#old') }.to output(message).to_stderr_from_any_process155end156157it 'allows to deprecate functionality with a reference message' do158ref_url = 'https://selenium.dev'159warn_msg = 'WARN Selenium \[DEPRECATION\] #old is deprecated\. Use #new instead\.'160message = /#{warn_msg} See explanation for this deprecation: #{ref_url}/161expect { logger.deprecate('#old', '#new', reference: ref_url) }.to output(message).to_stderr_from_any_process162end163164it 'appends deprecation message with provided block' do165message = /WARN Selenium \[DEPRECATION\] #old is deprecated\. Use #new instead\. More Details\./166expect { logger.deprecate('#old', '#new') { 'More Details.' } }.to output(message).to_stderr_from_any_process167end168169it 'logs single id when set' do170msg = /WARN Selenium \[:foo\] warning message/171expect { logger.warn('warning message', id: :foo) }.to output(msg).to_stderr_from_any_process172end173174it 'logs multiple ids when set' do175msg = /WARN Selenium \[:foo, :bar\] warning message/176expect { logger.warn('warning message', id: %i[foo bar]) }.to output(msg).to_stderr_from_any_process177end178end179180describe '#ignore' do181it 'prevents logging when id' do182logger.ignore(:foo)183expect { logger.deprecate('#old', '#new', id: :foo) }.not_to output.to_stderr_from_any_process184end185186it 'prevents logging when ignoring multiple ids' do187logger.ignore(:foo)188logger.ignore(:bar)189expect { logger.deprecate('#old', '#new', id: :foo) }.not_to output.to_stderr_from_any_process190expect { logger.deprecate('#old', '#new', id: :bar) }.not_to output.to_stderr_from_any_process191end192193it 'prevents logging when ignoring Array of ids' do194logger.ignore(%i[foo bar])195expect { logger.deprecate('#old', '#new', id: %i[foo foobar]) }.not_to output.to_stderr_from_any_process196end197198it 'prevents logging any deprecation when ignoring :deprecations' do199logger.ignore(:deprecations)200expect { logger.deprecate('#old', '#new') }.not_to output.to_stderr_from_any_process201end202end203204describe '#allow' do205it 'logs only allowed ids from method' do206logger.allow(:foo)207logger.allow(:bar)208expect { logger.deprecate('#old', '#new', id: :foo) }.to output(/foo/).to_stderr_from_any_process209expect { logger.deprecate('#old', '#new', id: :bar) }.to output(/bar/).to_stderr_from_any_process210expect { logger.deprecate('#old', '#new', id: :foobar) }.not_to output.to_stderr_from_any_process211end212213it 'logs only allowed ids from Array' do214logger.allow(%i[foo bar])215expect { logger.deprecate('#old', '#new', id: :foo) }.to output(/foo/).to_stderr_from_any_process216expect { logger.deprecate('#old', '#new', id: :bar) }.to output(/bar/).to_stderr_from_any_process217expect { logger.deprecate('#old', '#new', id: :foobar) }.not_to output.to_stderr_from_any_process218end219220it 'prevents logging any deprecation when ignoring :deprecations' do221logger.allow(:deprecations)222expect { logger.deprecate('#old', '#new') }.to output(/new/).to_stderr_from_any_process223end224end225end226end # WebDriver227end # Selenium228229230