sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
601 lines (521 loc) • 18.1 kB
HTML
<html>
<!--
Copyright 2008 The Closure Library Authors. All Rights Reserved.
Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<!--
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Closure Unit Tests - goog.gears.LogStore</title>
<script src="../base.js"></script>
<script>
goog.require('goog.debug.LogManager');
goog.require('goog.gears.Database');
goog.require('goog.gears.LogStore');
goog.require('goog.log');
goog.require('goog.testing.MockClock');
goog.require('goog.testing.asserts');
goog.require('goog.testing.jsunit');
</script>
</head>
<body>
<script>
function isGearsAllowed() {
return goog.gears.hasFactory() && goog.gears.getFactory().hasPermission;
}
var TEST_DB_NAME = 'my_test_db';
var TEST_TABLE_NAME = 'my_test_log_table';
var database_;
var logStore_;
var mockClock_ = new goog.testing.MockClock();
function setUpPage() {
if (isGearsAllowed()) {
// Remove table if already there
try {
database_ = new goog.gears.Database(
'me@mydomain.com', TEST_DB_NAME);
database_.execute('DROP TABLE IF EXISTS ' + TEST_TABLE_NAME);
} catch (ex) {
debug('Could not create the database');
}
}
setUpPageStatus = 'complete';
}
function setUp() {
if (isGearsAllowed()) {
logStore_ = new goog.gears.LogStore(database_, TEST_TABLE_NAME);
logStore_.removeStore();
logStore_.ensureStoreExists();
}
mockClock_.install();
mockClock_.tick(1);
}
function tearDown() {
if (logStore_) {
logStore_.removeStore();
}
mockClock_.reset();
mockClock_.uninstall();
}
function testStoreVersion() {
if (!isGearsAllowed()) {
return;
}
assertEquals(
'Bad initial store version', 1, logStore_.getStoreVersion());
}
function testSchema() {
if (!isGearsAllowed()) {
return;
}
assertTrue('Missing ' + TEST_TABLE_NAME, logStore_.hasTable(TEST_TABLE_NAME));
}
function testDefaultDbName() {
if (!isGearsAllowed()) {
return;
}
var aLogStore = new goog.gears.LogStore(database_);
aLogStore.removeStore();
aLogStore.ensureStoreExists();
assertTrue('Missing ' + goog.gears.LogStore.DEFAULT_TABLE_NAME_,
aLogStore.hasTable(goog.gears.LogStore.DEFAULT_TABLE_NAME_));
aLogStore.removeStore();
}
function assertLogRecord(actualRecord, expectedMinMillis,
expectedMaxMillis, expectedLevel, expectedMessage, expectedLoggerName,
expectedException) {
assertTrue('wrong millis: ' + actualRecord.getMillis(),
expectedMinMillis <= actualRecord.getMillis() &&
actualRecord.getMillis() <= expectedMaxMillis);
assertEquals('wrong level', expectedLevel, actualRecord.getLevel());
assertEquals('wrong message', expectedMessage, actualRecord.getMessage());
assertEquals('wrong logger', expectedLoggerName,
actualRecord.getLoggerName());
// Exception.
if (expectedException) {
assertObjectEquals('wrong exception', expectedException,
actualRecord.getException());
assertTrue('missing exception text', !!actualRecord.getExceptionText());
} else {
assertNull('unexpected exception', actualRecord.getException());
assertNull('unexpected exception text', actualRecord.getExceptionText());
}
}
function assertSequence(records) {
var lastSequenceNumber = -1;
var lastMillis = -1;
for (var i = records.length - 1; i >= 0; i--) {
var thisSequenceNumber = records[i].getSequenceNumber();
var thisMillis = records[i].getMillis();
assertTrue('not descending sequence numbers',
thisSequenceNumber > lastSequenceNumber);
assertTrue('not descending millis', thisMillis >= lastMillis);
lastSequenceNumber = thisSequenceNumber;
lastMillis = thisMillis;
}
}
function testSetCapturing() {
if (!isGearsAllowed()) {
return;
}
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.ALL);
// Create logger object.
var loggerName = 'my-logger';
var logger = goog.log.getLogger(loggerName);
// Disabled capturing. Select by logger to avoid other records.
assertFalse('capturing', logStore_.isCapturing());
goog.log.error(logger, 'not capturing');
var query = new goog.gears.LogStore.Query();
query.loggerLike = loggerName;
assertEquals('records found while not capturing',
0, logStore_.select(query).length);
// Enable capturing.
logStore_.setCapturing(true);
assertTrue('not capturing', logStore_.isCapturing());
goog.log.error(logger, 'capturing');
var count = logStore_.select(query).length;
assertTrue('no records found while capturing', count > 0);
// Disable capturing.
logStore_.setCapturing(false);
assertFalse('capturing', logStore_.isCapturing());
goog.log.error(logger, 'not capturing');
assertEquals('records found while not capturing',
count, logStore_.select(query).length);
}
function testLogException() {
if (!isGearsAllowed()) {
return;
}
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.ALL);
logStore_.setCapturing(true);
// Create logger object.
var loggerName = 'my-logger';
var logger = goog.log.getLogger(loggerName);
// Log message.
var beforeMillis = goog.now();
var msgs = ['my-message-0', 'my-message-1'];
var err = {
message: 'my-error-msg',
name: 'my-error',
lineNumber: 10,
fileName: 'my-file',
stack: 'my-stack'
};
goog.log.info(logger, msgs[0]);
goog.log.error(logger, msgs[1], err);
var afterMillis = goog.now();
// Select by logger to avoid other records.
var query = new goog.gears.LogStore.Query();
query.loggerLike = loggerName;
var records = logStore_.select(query);
// Validate records.
assertEquals('wrong # records', 2, records.length);
assertLogRecord(records[0], beforeMillis, afterMillis,
goog.log.Level.SEVERE, msgs[1], loggerName, err);
assertLogRecord(records[1], beforeMillis, afterMillis,
goog.log.Level.INFO, msgs[0], loggerName);
assertSequence(records);
}
function testSelectByLevel() {
if (!isGearsAllowed()) {
return;
}
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.ALL);
logStore_.setCapturing(true);
// Create logger object.
var loggerName = 'my-logger';
var logger = goog.log.getLogger(loggerName);
logger.setLevel(goog.log.Level.FINE);
// Log messages.
var msg = 'my-message';
var beforeMillis = goog.now();
goog.log.log(logger, goog.log.Level.FINEST, msg + 'FINEST');
goog.log.log(logger, goog.log.Level.FINER, msg + 'FINER');
goog.log.fine(logger, msg + 'FINE');
logger.config(msg + 'CONFIG');
goog.log.info(logger, msg + 'INFO');
goog.log.warning(logger, msg + 'WARNING');
goog.log.error(logger, msg + 'SEVERE');
var afterMillis = goog.now();
// Select FINE+ records. Select by logger to avoid other records.
var query = new goog.gears.LogStore.Query();
query.level = goog.log.Level.ALL;
query.loggerLike = loggerName;
var records = logStore_.select(query);
var expectedLevels = [
goog.log.Level.SEVERE,
goog.log.Level.WARNING,
goog.log.Level.INFO,
goog.log.Level.CONFIG,
goog.log.Level.FINE
];
assertEquals('wrong # records', 5, records.length);
for (var i = 0; i < records.length; i++) {
assertLogRecord(records[i], beforeMillis, afterMillis,
expectedLevels[i], msg + expectedLevels[i].name, loggerName);
}
assertSequence(records);
// Select INFO+ records.
query.level = goog.log.Level.INFO;
var records = logStore_.select(query);
expectedLevels = [
goog.log.Level.SEVERE,
goog.log.Level.WARNING,
goog.log.Level.INFO
];
assertEquals('wrong # records', 3, records.length);
for (var i = 0; i < records.length; i++) {
assertLogRecord(records[i], beforeMillis, afterMillis,
expectedLevels[i], msg + expectedLevels[i].name, loggerName);
}
assertSequence(records);
}
/**
* This tests selecting by clock time, and also tests log records added by
* logStore.
*/
function testSelectByMillis() {
if (!isGearsAllowed()) {
return;
}
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.ALL);
logStore_.setCapturing(true);
// Create logger object.
var loggerName = 'my-logger';
var logger = goog.log.getLogger(loggerName);
// Log messages.
var msg = 'my-message';
var millis0 = mockClock_.tick(100000);
goog.log.info(logger, msg + 0);
var millis1 = mockClock_.tick(100000);
goog.log.info(logger, msg + 1);
var millis2 = mockClock_.tick(100000);
goog.log.info(logger, msg + 2);
var millis3 = mockClock_.tick(0xfffffffffffffffffffffffff);
goog.log.info(logger, msg + 3);
var millis4 = mockClock_.tick(100000);
// Select before records. Select by logger to avoid other records.
var query = new goog.gears.LogStore.Query();
query.maxMillis = millis1;
query.loggerLike = loggerName;
var records = logStore_.select(query);
assertEquals('wrong # records', 2, records.length);
assertLogRecord(records[0], millis0, millis1,
goog.log.Level.INFO, msg + 1, loggerName);
assertLogRecord(records[1], millis0, millis1,
goog.log.Level.INFO, msg + 0, loggerName);
assertSequence(records);
// Select between records.
query.minMillis = millis2;
query.maxMillis = millis3;
records = logStore_.select(query);
assertEquals('wrong # records', 2, records.length);
assertLogRecord(records[0], millis2, millis3,
goog.log.Level.INFO, msg + 3, loggerName);
assertLogRecord(records[1], millis2, millis3,
goog.log.Level.INFO, msg + 2, loggerName);
assertSequence(records);
// Select after records.
query.minMillis = millis3;
query.maxMillis = Infinity;
records = logStore_.select(query);
assertEquals('wrong # records', 1, records.length);
assertLogRecord(records[0], millis3, millis4,
goog.log.Level.INFO, msg + 3, loggerName);
assertSequence(records);
}
function testSelectByMessage() {
if (!isGearsAllowed()) {
return;
}
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.ALL);
logStore_.setCapturing(true);
// Create logger object.
var loggerName = 'my-logger';
var logger = goog.log.getLogger(loggerName);
// Log messages.
var msg = 'my-message';
var beforeMillis = goog.now();
goog.log.info(logger, msg + '1');
goog.log.info(logger, msg + '20');
goog.log.info(logger, msg + '21');
goog.log.info(logger, msg + '3');
var afterMillis = goog.now();
// Select 2 records.
var query = new goog.gears.LogStore.Query();
query.msgLike = '%2%';
var records = logStore_.select(query);
assertEquals('wrong # records', 2, records.length);
assertLogRecord(records[0], beforeMillis, afterMillis,
goog.log.Level.INFO, msg + '21', loggerName);
assertLogRecord(records[1], beforeMillis, afterMillis,
goog.log.Level.INFO, msg + '20', loggerName);
assertSequence(records);
}
function testSelectByLogger() {
if (!isGearsAllowed()) {
return;
}
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.ALL);
logStore_.setCapturing(true);
// Create logger object.
var loggerName = 'my-logger';
var logger1 = goog.log.getLogger(loggerName + 1);
var logger2 = goog.log.getLogger(loggerName + 2);
var logger3 = goog.log.getLogger(loggerName + 3);
// Log messages.
var msg = 'my-message';
var beforeMillis = goog.now();
logger1.info(msg + '1');
mockClock_.tick();
logger2.info(msg + '2');
mockClock_.tick();
logger3.info(msg + '3');
mockClock_.tick();
var afterMillis = goog.now();
// Select 1 records.
var query = new goog.gears.LogStore.Query();
query.loggerLike = '%2%';
var records = logStore_.select(query);
assertEquals('wrong # records', 1, records.length);
assertLogRecord(records[0], beforeMillis, afterMillis,
goog.log.Level.INFO, msg + '2', loggerName + 2);
assertSequence(records);
}
function testSelectLimit() {
if (!isGearsAllowed()) {
return;
}
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.ALL);
logStore_.setCapturing(true);
// Create logger object.
var loggerName = 'my-logger';
var logger = goog.log.getLogger(loggerName);
// Log messages.
var msg = 'my-message';
var beforeMillis = goog.now();
goog.log.info(logger, msg + '1');
mockClock_.tick();
goog.log.info(logger, msg + '2');
mockClock_.tick();
goog.log.info(logger, msg + '3');
mockClock_.tick();
goog.log.info(logger, msg + '4');
mockClock_.tick();
goog.log.info(logger, msg + '5');
mockClock_.tick();
var afterMillis = goog.now();
// Select 5 records.
var query = new goog.gears.LogStore.Query();
query.loggerLike = loggerName;
records = logStore_.select(query);
assertEquals('wrong # records', 5, records.length);
assertSequence(records);
// Select last 3 records.
query.limit = 3;
records = logStore_.select(query);
assertEquals('wrong # records', 3, records.length);
assertLogRecord(records[0], beforeMillis, afterMillis,
goog.log.Level.INFO, msg + '5', loggerName);
assertLogRecord(records[1], beforeMillis, afterMillis,
goog.log.Level.INFO, msg + '4', loggerName);
assertLogRecord(records[2], beforeMillis, afterMillis,
goog.log.Level.INFO, msg + '3', loggerName);
assertSequence(records);
}
function testPruneBeforeCount() {
if (!isGearsAllowed()) {
return;
}
logStore_.setCapturing(true);
// Set to WARNING to avoid database and other logging.
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.WARNING);
// Create logger object.
var loggerName = 'my-logger';
var logger = goog.log.getLogger(loggerName);
// Log messages.
var msg = 'my-message';
goog.log.error(logger, msg + '1!');
mockClock_.tick();
goog.log.warning(logger, msg + '2');
mockClock_.tick();
goog.log.error(logger, msg + '3!');
var betweenMillis = mockClock_.tick();
goog.log.warning(logger, msg + '4');
mockClock_.tick();
goog.log.error(logger, msg + '5!');
mockClock_.tick();
goog.log.warning(logger, msg + '6');
mockClock_.tick();
// Select by logger to avoid other records.
var query = new goog.gears.LogStore.Query();
query.loggerLike = loggerName;
assertEquals('wrong # records', 6, logStore_.select(query).length);
logStore_.pruneBeforeCount(3);
assertEquals('wrong # records', 3, logStore_.select(query).length);
}
function testPruneBeforeSequenceNumber() {
if (!isGearsAllowed()) {
return;
}
logStore_.setCapturing(true);
// Set to WARNING to avoid database and other logging.
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.WARNING);
// Create logger object.
var loggerName = 'my-logger';
var logger = goog.log.getLogger(loggerName);
// Log messages.
var msg = 'my-message';
goog.log.error(logger, msg + '1!');
mockClock_.tick();
goog.log.warning(logger, msg + '2');
mockClock_.tick();
goog.log.error(logger, msg + '3!');
var betweenMillis = mockClock_.tick();
goog.log.warning(logger, msg + '4');
mockClock_.tick();
goog.log.error(logger, msg + '5!');
mockClock_.tick();
goog.log.warning(logger, msg + '6');
mockClock_.tick();
// Select by logger to avoid other records.
var query = new goog.gears.LogStore.Query();
query.loggerLike = loggerName;
var records = logStore_.select(query);
assertEquals('wrong # records', 6, records.length);
logStore_.pruneBeforeSequenceNumber(records[3].getSequenceNumber());
assertEquals('wrong # records', 3, logStore_.select(query).length);
}
function testAutoPrune() {
if (!isGearsAllowed()) {
return;
}
logStore_.setCapturing(true);
// Set to WARNING to avoid database and other logging.
goog.debug.LogManager.getRoot().setLevel(goog.log.Level.WARNING);
// Create logger object.
var loggerName = 'my-logger';
var logger = goog.log.getLogger(loggerName);
// Log messages.
var msg = 'my-message';
mockClock_.tick(100);
goog.log.error(logger, msg + '1!');
mockClock_.tick(100);
goog.log.warning(logger, msg + '2');
mockClock_.tick(100);
goog.log.error(logger, msg + '3!');
mockClock_.tick(100);
goog.log.warning(logger, msg + '4');
mockClock_.tick(100);
goog.log.error(logger, msg + '5!');
mockClock_.tick(100);
goog.log.warning(logger, msg + '6');
mockClock_.tick(100);
// Auto-prune specified interval (100).
assertFalse('auto prune should not be active', logStore_.isAutoPruneActive());
var query = new goog.gears.LogStore.Query();
query.loggerLike = loggerName;
assertEquals('wrong # records', 6,
logStore_.select(query).length);
logStore_.createAutoPruneDelay(3, 100);
logStore_.startAutoPrune();
assertTrue('auto prune should be active', logStore_.isAutoPruneActive());
assertEquals('wrong # records', 3, logStore_.select(query).length);
goog.log.warning(logger, msg + '7');
mockClock_.tick(50);
assertEquals('wrong # records', 4, logStore_.select(query).length);
mockClock_.tick(50);
assertEquals('wrong # records', 3, logStore_.select(query).length);
// Stop autoprune.
logStore_.stopAutoPrune();
assertFalse('auto prune should not be active', logStore_.isAutoPruneActive());
goog.log.warning(logger, msg + '8');
mockClock_.tick(200);
assertEquals('wrong # records', 4, logStore_.select(query).length);
// Auto-prune default interval (600000).
logStore_.createAutoPruneDelay(3);
logStore_.startAutoPrune(3);
assertTrue('auto prune should be active', logStore_.isAutoPruneActive());
assertEquals('wrong # records', 3, logStore_.select(query).length);
goog.log.warning(logger, msg + '7');
goog.log.error(logger, msg + '8!');
goog.log.warning(logger, msg + '9');
mockClock_.tick(50);
assertEquals('wrong # records', 6, logStore_.select(query).length);
mockClock_.tick(50);
assertEquals('wrong # records', 6, logStore_.select(query).length);
mockClock_.tick(599900);
assertEquals('wrong # records', 3, logStore_.select(query).length);
goog.log.warning(logger, msg + '10');
mockClock_.tick(100);
assertEquals('wrong # records', 4, logStore_.select(query).length);
// Stop autoprune.
logStore_.stopAutoPrune();
assertFalse('auto prune should not be active', logStore_.isAutoPruneActive());
}
</script>
</body>
</html>