logger.test.js 10.6 KB
/*
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2016 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 */

/* eslint max-nested-callbacks: [2, 10]*/
/* eslint no-new: 0 */
/* globals console, sinon, describe, expect, it, beforeEach, afterEach */
define(['screens/player/log/logger'], function(Logger) {
    'use strict';

    var logger = null;

    var debugMessage = 'test the output';

    beforeEach(function() {
        logger = new Logger('test');
    });

    afterEach(function() {
        // @todo reset logger
        logger = null;
    });

    describe('screens/player/log/logger', function() {

        describe('# default writing', function() {


            it('must call custom writer', function() {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(message).to.contain(debugMessage);
                    }
                });

                logger.debug(debugMessage);
            });

            it('must output debug', function() {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.DEBUG);
                    }
                });

                logger.debug(debugMessage);
            });

            it('must output info', function() {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.INFO);
                    }
                });

                logger.info(debugMessage);
            });

            it('must output warn', function() {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.WARN);
                    }
                });

                logger.warn(debugMessage);
            });

            it('must output error', function() {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.ERROR);
                    }
                });

                logger.error(debugMessage);
            });

            it('must output trace', function() {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.DEBUG);
                    }
                });

                logger.trace();
            });

        });

        describe('# must patch the default browser console', function() {

            beforeEach(function() {
                Logger.patchConsole(logger);
            });

            afterEach(function() {
                Logger.patchConsole(false);
            });

            it('must override console.log()', function(done) {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.DEBUG);
                        expect(message).to.contain(debugMessage);
                        done();
                    }
                });

                console.log(debugMessage);
            });

            it('must override console.debug()', function(done) {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.DEBUG);
                        expect(message).to.contain(debugMessage);
                        done();
                    }
                });

                console.debug(debugMessage);
            });

            it('must override console.info()', function(done) {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.INFO);
                        expect(message).to.contain(debugMessage);
                        done();
                    }
                });

                console.info(debugMessage);
            });

            it('must override console.warn()', function(done) {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.WARN);
                        expect(message).to.contain(debugMessage);
                        done();
                    }
                });

                console.warn(debugMessage);
            });

            it('must override console.error()', function(done) {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.ERROR);
                        expect(message).to.contain(debugMessage);
                        done();
                    }
                });

                console.error(debugMessage);
            });

            it('must override console.trace()', function(done) {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.DEBUG);
                        done();
                    }
                });

                console.trace();
            });

        });

        describe('# print to the default browser console', function() {

            afterEach(function() {
                Logger.catchExceptions(false);
                Logger.patchConsole(false);
                logger.print(false);
            });

            it('must not print to the console by default', function(done) {
                console.info = function() {
                    done('Must not print to the console');
                };

                logger.setWriter({
                    write: function(date, level, message) {
                        done();
                    }
                });

                logger.info(debugMessage);
            });

            it('print() must activate output to the browser console', function(done) {
                console.info = function() {
                    done();
                };

                logger.print();
                logger.info(debugMessage);
            });

            it('print() and catchException() must output uncaught errors to the browser console', function(done) {
                Logger.catchExceptions(logger);

                var originalConsoleError = console.error;

                logger.setWriter({
                    write: function(date, level, message) {
                    }
                });

                console.error = function(e) {
                    expect(e.toString()).to.contain(debugMessage);
                    console.error = originalConsoleError;
                    done();
                };

                logger.print();

                // Throw Error in setTimout because a sync error will be
                // usually caught by the Testing Framework.
                setTimeout(function() {
                    throw new Error(debugMessage);
                }, 0);
            });

            it('print() and patchConsole() must output to the browser console and the log', function(done) {
                var callCount = 0;
                var callback = function() { // needs to be called twice
                    callCount++;

                    if (callCount === 2) {
                        done();
                    }
                };

                // set the writer
                logger.setWriter({
                    write: callback
                });
                logger.print();

                // set the console object
                console.info = callback;

                // let the logger patch the console
                Logger.patchConsole(logger);

                console.info(debugMessage);
            });

        });

        describe('# catch exceptions globally', function() {

            beforeEach(function() {
                Logger.catchExceptions(logger);
            });

            afterEach(function() {
                Logger.catchExceptions(false);
            });

            it('must catch uncaught Javascript exceptions', function(done) {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.ERROR);
                        expect(message).to.contain(debugMessage);
                        done();
                    }
                });

                setTimeout(function() {
                    throw new Error(debugMessage);
                }, 0);
            });

            it('must catch loading errors of scripts', function(done) {
                logger.setWriter({
                    write: function(date, level, message) {
                        expect(level).equals(Logger.LEVEL.ERROR);
                        expect(message).to.contain('Error during loading ');
                        expect(message).to.contain('/path/to/a/non/existing/file.js');
                        done();
                    }
                });

                setTimeout(function() {
                    var scriptEl = document.createElement('script');
                    scriptEl.src = '/path/to/a/non/existing/file.js';
                    window.document.body.appendChild(scriptEl);
                }, 0);
            });

        });

        describe('# limit log level', function() {

            beforeEach(function() {
                logger.setLevel(Logger.LEVEL.ERROR);
            });

            afterEach(function() {
                logger.setLevel(Logger.LEVEL.DEBUG);
            });

            it('must write the configured log level', function() {
                var spy = sinon.spy();
                logger.setWriter({
                    write: spy
                });

                logger.error(debugMessage);

                expect(spy.called).to.be.true;
            });

            it('must not write beneath the configured log level', function() {
                var spy = sinon.spy();
                logger.setWriter({
                    write: spy
                });

                logger.debug(debugMessage);

                expect(spy.called).to.be.false;
            });

        });

    });
});