blob: 5fe885b62defc1430750b5637d46b5345df05360 [file] [log] [blame]
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
'use strict'
const assert = require('node:assert')
const sinon = require('sinon')
const logging = require('selenium-webdriver/lib/logging')
describe('logging', function () {
let mgr, root, clock
beforeEach(function setUp() {
mgr = new logging.LogManager()
root = mgr.getLogger('')
clock = sinon.useFakeTimers()
})
afterEach(function tearDown() {
clock.restore()
})
describe('LogManager', function () {
describe('getLogger()', function () {
it('handles falsey input', function () {
assert.strictEqual(root, mgr.getLogger())
assert.strictEqual(root, mgr.getLogger(''))
assert.strictEqual(root, mgr.getLogger(null))
assert.strictEqual(root, mgr.getLogger(0))
})
it('creates parent loggers', function () {
let logger = mgr.getLogger('foo.bar.baz')
assert.strictEqual(logger.parent_, mgr.getLogger('foo.bar'))
logger = logger.parent_
assert.strictEqual(logger.parent_, mgr.getLogger('foo'))
logger = logger.parent_
assert.strictEqual(logger.parent_, mgr.getLogger(''))
assert.strictEqual(logger.parent_.parent_, null)
})
})
})
describe('Logger', function () {
describe('getEffectiveLevel()', function () {
it('defaults to OFF', function () {
assert.strictEqual(root.getLevel(), logging.Level.OFF)
assert.strictEqual(root.getEffectiveLevel(), logging.Level.OFF)
root.setLevel(null)
assert.strictEqual(root.getLevel(), null)
assert.strictEqual(root.getEffectiveLevel(), logging.Level.OFF)
})
it('uses own level if set', function () {
let logger = mgr.getLogger('foo.bar.baz')
assert.strictEqual(logger.getLevel(), null)
assert.strictEqual(logger.getEffectiveLevel(), logging.Level.OFF)
logger.setLevel(logging.Level.INFO)
assert.strictEqual(logger.getLevel(), logging.Level.INFO)
assert.strictEqual(logger.getEffectiveLevel(), logging.Level.INFO)
})
it('uses level from set on nearest parent', function () {
let ancestor = mgr.getLogger('foo')
ancestor.setLevel(logging.Level.SEVERE)
let logger = mgr.getLogger('foo.bar.baz')
assert.strictEqual(logger.getLevel(), null)
assert.strictEqual(logger.getEffectiveLevel(), logging.Level.SEVERE)
})
})
describe('isLoggable()', function () {
it("compares level against logger's effective level", function () {
const log1 = mgr.getLogger('foo')
log1.setLevel(logging.Level.WARNING)
const log2 = mgr.getLogger('foo.bar.baz')
assert(!log2.isLoggable(logging.Level.FINEST))
assert(!log2.isLoggable(logging.Level.INFO))
assert(log2.isLoggable(logging.Level.WARNING))
assert(log2.isLoggable(logging.Level.SEVERE))
log2.setLevel(logging.Level.INFO)
assert(!log2.isLoggable(logging.Level.FINEST))
assert(log2.isLoggable(logging.Level.INFO))
assert(log2.isLoggable(logging.Level.WARNING))
assert(log2.isLoggable(logging.Level.SEVERE))
log2.setLevel(logging.Level.ALL)
assert(log2.isLoggable(logging.Level.FINEST))
assert(log2.isLoggable(logging.Level.INFO))
assert(log2.isLoggable(logging.Level.WARNING))
assert(log2.isLoggable(logging.Level.SEVERE))
})
it('Level.OFF is never loggable', function () {
function test(level) {
root.setLevel(level)
assert(!root.isLoggable(logging.Level.OFF), 'OFF should not be loggable at ' + level)
}
test(logging.Level.ALL)
test(logging.Level.INFO)
test(logging.Level.OFF)
})
})
describe('log()', function () {
it('does not invoke loggable if message is not loggable', function () {
const log = mgr.getLogger('foo')
log.setLevel(logging.Level.OFF)
let callback = sinon.spy()
log.addHandler(callback)
root.addHandler(callback)
assert(!callback.called)
})
it('invokes handlers for each parent logger', function () {
const cb1 = sinon.spy()
const cb2 = sinon.spy()
const cb3 = sinon.spy()
const log1 = mgr.getLogger('foo')
const log2 = mgr.getLogger('foo.bar')
const log3 = mgr.getLogger('foo.bar.baz')
const log4 = mgr.getLogger('foo.bar.baz.quot')
log1.addHandler(cb1)
log1.setLevel(logging.Level.INFO)
log2.addHandler(cb2)
log2.setLevel(logging.Level.WARNING)
log3.addHandler(cb3)
log3.setLevel(logging.Level.FINER)
clock.tick(123456)
log4.finest('this is the finest message')
log4.finer('this is a finer message')
log4.info('this is an info message')
log4.warning('this is a warning message')
log4.severe('this is a severe message')
assert.strictEqual(4, cb1.callCount)
assert.strictEqual(4, cb2.callCount)
assert.strictEqual(4, cb3.callCount)
const entry1 = new logging.Entry(logging.Level.FINER, '[foo.bar.baz.quot] this is a finer message', 123456)
const entry2 = new logging.Entry(logging.Level.INFO, '[foo.bar.baz.quot] this is an info message', 123456)
const entry3 = new logging.Entry(logging.Level.WARNING, '[foo.bar.baz.quot] this is a warning message', 123456)
const entry4 = new logging.Entry(logging.Level.SEVERE, '[foo.bar.baz.quot] this is a severe message', 123456)
check(cb1.getCall(0).args[0], entry1)
check(cb1.getCall(1).args[0], entry2)
check(cb1.getCall(2).args[0], entry3)
check(cb1.getCall(3).args[0], entry4)
check(cb2.getCall(0).args[0], entry1)
check(cb2.getCall(1).args[0], entry2)
check(cb2.getCall(2).args[0], entry3)
check(cb2.getCall(3).args[0], entry4)
check(cb3.getCall(0).args[0], entry1)
check(cb3.getCall(1).args[0], entry2)
check(cb3.getCall(2).args[0], entry3)
check(cb3.getCall(3).args[0], entry4)
function check(entry, expected) {
assert.strictEqual(entry.level, expected.level, 'wrong level')
assert.strictEqual(entry.message, expected.message, 'wrong message')
assert.strictEqual(entry.timestamp, expected.timestamp, 'wrong time')
}
})
it('does not invoke removed handler', function () {
root.setLevel(logging.Level.INFO)
const cb = sinon.spy()
root.addHandler(cb)
root.info('hi')
assert.strictEqual(1, cb.callCount)
assert(root.removeHandler(cb))
root.info('bye')
assert.strictEqual(1, cb.callCount)
assert(!root.removeHandler(cb))
})
})
})
describe('getLevel()', function () {
it('converts named levels', function () {
assert.strictEqual(logging.Level.DEBUG, logging.getLevel('DEBUG'))
assert.strictEqual(logging.Level.ALL, logging.getLevel('FAKE'))
})
it('converts numeric levels', function () {
assert.strictEqual(logging.Level.DEBUG, logging.getLevel(logging.Level.DEBUG.value))
})
it('normalizes numeric levels', function () {
assert.strictEqual(logging.Level.OFF, logging.getLevel(logging.Level.OFF.value * 2))
let diff = logging.Level.SEVERE.value - logging.Level.WARNING.value
assert.strictEqual(logging.Level.WARNING, logging.getLevel(logging.Level.WARNING.value + diff * 0.5))
assert.strictEqual(logging.Level.ALL, logging.getLevel(0))
assert.strictEqual(logging.Level.ALL, logging.getLevel(-1))
})
})
describe('Preferences', function () {
it('can be converted to JSON', function () {
let prefs = new logging.Preferences()
assert.strictEqual('{}', JSON.stringify(prefs))
prefs.setLevel('foo', logging.Level.DEBUG)
assert.strictEqual('{"foo":"DEBUG"}', JSON.stringify(prefs))
prefs.setLevel(logging.Type.BROWSER, logging.Level.FINE)
assert.strictEqual('{"foo":"DEBUG","browser":"FINE"}', JSON.stringify(prefs))
})
})
})