text: // Copyright 2013 The Closure Library Authors. All Rights Reserved.
  //
  // Licensed 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.
  
  /**
   * @fileoverview Unit tests for goog.log.
   */
  
  /** @suppress {extraProvide} */
  goog.provide('goog.logTest');
  
  goog.require('goog.debug.LogManager');
  goog.require('goog.log');
  goog.require('goog.log.Level');
  goog.require('goog.testing.jsunit');
  
  
  
  goog.setTestOnly('goog.logTest');
  
  
  
  /**
   * A simple log handler that remembers the last record published.
   * @constructor
   * @private
   */
  function TestHandler_() {
    this.logRecord = null;
  }
  
  TestHandler_.prototype.onPublish = function(logRecord) {
    this.logRecord = logRecord;
  };
  
  
  TestHandler_.prototype.reset = function() {
    this.logRecord = null;
  };
  
  
  function testParents() {
    var logger2sibling1 = goog.log.getLogger('goog.test');
    var logger2sibling2 = goog.log.getLogger('goog.bar');
    var logger3sibling1 = goog.log.getLogger('goog.bar.foo');
    var logger3siblint2 = goog.log.getLogger('goog.bar.baaz');
    var rootLogger = goog.debug.LogManager.getRoot();
    var googLogger = goog.log.getLogger('goog');
    assertEquals(rootLogger, googLogger.getParent());
    assertEquals(googLogger, logger2sibling1.getParent());
    assertEquals(googLogger, logger2sibling2.getParent());
    assertEquals(logger2sibling2, logger3sibling1.getParent());
    assertEquals(logger2sibling2, logger3siblint2.getParent());
  }
  
  function testLogging1() {
    var root = goog.debug.LogManager.getRoot();
    var handler = new TestHandler_();
    var f = goog.bind(handler.onPublish, handler);
    goog.log.addHandler(root, f);
    var logger = goog.log.getLogger('goog.bar.baaz');
    goog.log.log(logger, goog.log.Level.WARNING, 'foo');
    assertNotNull(handler.logRecord);
    assertEquals(goog.log.Level.WARNING, handler.logRecord.getLevel());
    assertEquals('foo', handler.logRecord.getMessage());
    handler.logRecord = null;
  
    goog.log.removeHandler(root, f);
    goog.log.log(logger, goog.log.Level.WARNING, 'foo');
    assertNull(handler.logRecord);
  }
  
  function testLogging2() {
    var root = goog.debug.LogManager.getRoot();
    var handler = new TestHandler_();
    var f = goog.bind(handler.onPublish, handler);
    goog.log.addHandler(root, f);
    var logger = goog.log.getLogger('goog.bar.baaz');
    goog.log.warning(logger, 'foo');
    assertNotNull(handler.logRecord);
    assertEquals(goog.log.Level.WARNING, handler.logRecord.getLevel());
    assertEquals('foo', handler.logRecord.getMessage());
    handler.logRecord = null;
  
    goog.log.removeHandler(root, f);
    goog.log.log(logger, goog.log.Level.WARNING, 'foo');
    assertNull(handler.logRecord);
  }
  
  
  function testFiltering() {
    var root = goog.debug.LogManager.getRoot();
    var handler = new TestHandler_();
    var f = goog.bind(handler.onPublish, handler);
    root.addHandler(f);
    var logger1 = goog.log.getLogger('goog.bar.foo', goog.log.Level.WARNING);
    var logger2 = goog.log.getLogger('goog.bar.baaz', goog.log.Level.INFO);
    goog.log.warning(logger2, 'foo');
    assertNotNull(handler.logRecord);
    assertEquals(goog.log.Level.WARNING, handler.logRecord.getLevel());
    assertEquals('foo', handler.logRecord.getMessage());
    handler.reset();
    goog.log.info(logger1, 'bar');
    assertNull(handler.logRecord);
    goog.log.warning(logger1, 'baaz');
    assertNotNull(handler.logRecord);
    handler.reset();
    goog.log.error(logger1, 'baaz');
    assertNotNull(handler.logRecord);
  }
  
  
  function testException() {
    var root = goog.debug.LogManager.getRoot();
    var handler = new TestHandler_();
    var f = goog.bind(handler.onPublish, handler);
    root.addHandler(f);
    var logger = goog.log.getLogger('goog.debug.logger_test');
    var ex = Error('boo!');
    goog.log.error(logger, 'hello', ex);
    assertNotNull(handler.logRecord);
    assertEquals(goog.log.Level.SEVERE, handler.logRecord.getLevel());
    assertEquals('hello', handler.logRecord.getMessage());
    assertEquals(ex, handler.logRecord.getException());
  }
  
  
  function testMessageCallbacks() {
    var root = goog.debug.LogManager.getRoot();
    var handler = new TestHandler_();
    var f = goog.bind(handler.onPublish, handler);
    root.addHandler(f);
    var logger = goog.log.getLogger('goog.bar.foo');
    logger.setLevel(goog.log.Level.WARNING);
  
    logger.log(goog.log.Level.INFO, function() {
      throw "Message callback shouldn't be called when below logger's level!";
    });
    assertNull(handler.logRecord);
  
    logger.log(goog.log.Level.WARNING, function() {
      return 'heya';
    });
    assertNotNull(handler.logRecord);
    assertEquals(goog.log.Level.WARNING, handler.logRecord.getLevel());
    assertEquals('heya', handler.logRecord.getMessage());
  }
  
  
  function testGetLogRecord() {
    var name = 'test.get.log.record';
    var level = goog.log.Level.FINE;
    var msg = 'msg';
  
    var logger = goog.log.getLogger(name);
    var logRecord = logger.getLogRecord(level, msg);
  
    assertEquals(name, logRecord.getLoggerName());
    assertEquals(level, logRecord.getLevel());
    assertEquals(msg, logRecord.getMessage());
  
    assertNull(logRecord.getException());
  }
  
  function testGetLogRecordWithException() {
    var name = 'test.get.log.record';
    var level = goog.log.Level.FINE;
    var msg = 'msg';
    var ex = Error('Hi');
  
    var logger = goog.log.getLogger(name);
    var logRecord = logger.getLogRecord(level, msg, ex);
  
    assertEquals(name, logRecord.getLoggerName());
    assertEquals(level, logRecord.getLevel());
    assertEquals(msg, logRecord.getMessage());
    assertEquals(ex, logRecord.getException());
  }
  