blob: 55bd2ca955e0468261d8e9f63a1ca776f9b038c2 [file] [log] [blame]
/**
* Copyright 2013 Tim Down.
*
* 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.
*/
function array_contains(arr, val) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == val) {
return true;
}
}
return false;
}
// Recursively checks that obj2's interface contains all of obj1's
// interface (functions and objects only)
function compareObjectInterface(obj1, obj1_name, obj2, obj2_name, namePrefix) {
if (!namePrefix) {
namePrefix = "";
}
var obj1PropertyNames = new Array();
for (var i in obj1) {
if (i != "prototype" && i != "arguments") {
obj1PropertyNames.push(i);
}
}
if (obj1 && obj1.prototype && !array_contains(obj1PropertyNames, "prototype")) {
//obj1PropertyNames.push("prototype");
}
for (var j = 0; j < obj1PropertyNames.length; j++) {
var propertyName = obj1PropertyNames[j];
if ((typeof obj1[propertyName] == "function" || typeof obj1[propertyName] == "object") && !(obj1[propertyName] instanceof Array)) {
var propertyFullyQualifiedName = (namePrefix == "") ? propertyName : namePrefix + "." + propertyName;
try {
if (typeof obj2[propertyName] == "undefined") {
throw new Error(obj2_name + " does not contain " + propertyFullyQualifiedName + " in " + obj1_name);
} else if (typeof obj2[propertyName] != typeof obj1[propertyName]){
throw new Error(obj2_name + "'s " + propertyFullyQualifiedName + " is of the wrong type: " + typeof obj2[propertyName] + " when it is type " + typeof obj1[propertyName] + " in " + obj1_name);
} else if (obj1[propertyName] != Function.prototype.apply) {
if (!compareObjectInterface(obj1[propertyName], obj1_name, obj2[propertyName], obj2_name, propertyFullyQualifiedName)) {
throw new Error("Interfaces don't match");
}
}
} catch(ex) {
throw new Error("Exception while checking property name " + propertyFullyQualifiedName + " in " + obj2_name + ": " + ex.message);
}
}
}
return true;
};
// Simply tests a layout for exceptions when formatting
var testLayoutWithVariables = function(layout, t) {
var emptyObject = {};
var emptyArray = [];
var emptyString = "";
var localUndefined = emptyArray[0];
var oneLevelObject = {
"name": "One-level object"
};
var twoLevelObject = {
"name": "Two-level object",
"data": oneLevelObject
};
var threeLevelObject = {
"name": "Three-level object",
"data": twoLevelObject
};
var anArray = [
3,
"stuff",
true,
false,
0,
null,
localUndefined,
3.14,
function(p) { return "I'm a function"; },
[1, "things"]
];
var arrayOfTestItems = [emptyObject, emptyString, emptyString, localUndefined, oneLevelObject,
twoLevelObject, threeLevelObject, anArray];
t.log("Testing layout " + layout)
for (var i = 0; i < arrayOfTestItems.length; i++) {
var ex = new Error("Test error");
var loggingEvent = new log4javascript.LoggingEvent(t.logger, new Date(), log4javascript.Level.INFO,
[arrayOfTestItems[i]], null);
t.log("Formatting", arrayOfTestItems[i], result);
var result = layout.format(loggingEvent);
// Now try with an exception
loggingEvent.exception = ex;
t.log("Formatting with exception", arrayOfTestItems[i], result);
result = layout.format(loggingEvent);
}
};
xn.test.enableTestDebug = true;
xn.test.enable_log4javascript = false;
xn.test.suite("log4javascript tests", function(s) {
log4javascript.logLog.setQuietMode(true);
var ArrayAppender = function(layout) {
if (layout) {
this.setLayout(layout);
}
this.logMessages = [];
};
ArrayAppender.prototype = new log4javascript.Appender();
ArrayAppender.prototype.layout = new log4javascript.NullLayout();
ArrayAppender.prototype.append = function(loggingEvent) {
var formattedMessage = this.getLayout().format(loggingEvent);
if (this.getLayout().ignoresThrowable()) {
formattedMessage += loggingEvent.getThrowableStrRep();
}
this.logMessages.push(formattedMessage);
};
ArrayAppender.prototype.toString = function() {
return "[ArrayAppender]";
};
s.setUp = function(t) {
t.logger = log4javascript.getLogger("test");
t.logger.removeAllAppenders();
t.appender = new ArrayAppender();
t.logger.addAppender(t.appender);
};
s.tearDown = function(t) {
t.logger.removeAppender(t.appender);
log4javascript.resetConfiguration();
};
s.test("Stub script interface test", function(t) {
try {
compareObjectInterface(log4javascript, "log4javascript", log4javascript_stub, "log4javascript_stub");
} catch (ex) {
t.fail(ex);
}
});
s.test("Disable log4javascript test", function(t) {
log4javascript.setEnabled(false);
t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages.length, 0);
log4javascript.setEnabled(true);
});
s.test("Array.splice test 1", function(t) {
var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
var deletedItems = a.splice(1, 2);
t.assertEquals(a.join(","), "Marlon,Lloyd");
t.assertEquals(deletedItems.join(","), "Ashley,Darius");
});
s.test("Array.splice test 2", function(t) {
var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
var deletedItems = a.splice(1, 1, "Malky", "Jay");
t.assertEquals(a.join(","), "Marlon,Malky,Jay,Darius,Lloyd");
t.assertEquals(deletedItems.join(","), "Ashley");
});
s.test("array_remove test", function(t) {
var array_remove = log4javascript.evalInScope("array_remove");
var a = ["Marlon", "Ashley", "Darius"];
array_remove(a, "Darius");
t.assertEquals(a.join(","), "Marlon,Ashley");
});
s.test("array_remove with empty array test", function(t) {
var array_remove = log4javascript.evalInScope("array_remove");
var a = [];
array_remove(a, "Darius");
t.assertEquals(a.join(","), "");
});
s.test("Logger logging test", function(t) {
// Should log since the default level for loggers is DEBUG and
// the default threshold for appenders is ALL
t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages.length, 1);
});
s.test("Logger levels test", function(t) {
var originalLevel = t.logger.getEffectiveLevel();
t.logger.setLevel(log4javascript.Level.INFO);
t.logger.debug("TEST");
t.logger.setLevel(originalLevel);
t.assertEquals(t.appender.logMessages.length, 0);
});
s.test("Logger getEffectiveLevel inheritance test 1", function(t) {
var parentLogger = log4javascript.getLogger("test1");
var childLogger = log4javascript.getLogger("test1.test2");
parentLogger.setLevel(log4javascript.Level.ERROR);
t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.ERROR);
});
s.test("Logger getEffectiveLevel inheritance test 2", function(t) {
var grandParentLogger = log4javascript.getLogger("test1");
var childLogger = log4javascript.getLogger("test1.test2.test3");
grandParentLogger.setLevel(log4javascript.Level.ERROR);
t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.ERROR);
});
s.test("Logger getEffectiveLevel inheritance test 3", function(t) {
var parentLogger = log4javascript.getLogger("test1");
var childLogger = log4javascript.getLogger("test1.test2");
parentLogger.setLevel(log4javascript.Level.ERROR);
childLogger.setLevel(log4javascript.Level.INFO);
t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.INFO);
});
s.test("Logger getEffectiveLevel root inheritance test", function(t) {
var rootLogger = log4javascript.getRootLogger();
var childLogger = log4javascript.getLogger("test1.test2.test3");
rootLogger.setLevel(log4javascript.Level.WARN);
t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.WARN);
});
s.test("Logger null level test", function(t) {
t.logger.setLevel(null);
// Should default to root logger level, which is DEBUG
t.assertEquals(t.logger.getEffectiveLevel(), log4javascript.Level.DEBUG);
});
s.test("Logger appender additivity test 1", function(t) {
var parentLogger = log4javascript.getLogger("test1");
var childLogger = log4javascript.getLogger("test1.test2");
var parentLoggerAppender = new ArrayAppender();
var childLoggerAppender = new ArrayAppender();
parentLogger.addAppender(parentLoggerAppender);
childLogger.addAppender(childLoggerAppender);
parentLogger.info("Parent logger test message");
childLogger.info("Child logger test message");
t.assertEquals(parentLoggerAppender.logMessages.length, 2);
t.assertEquals(childLoggerAppender.logMessages.length, 1);
});
s.test("Logger appender additivity test 2", function(t) {
var parentLogger = log4javascript.getLogger("test1");
var childLogger = log4javascript.getLogger("test1.test2");
var parentLoggerAppender = new ArrayAppender();
var childLoggerAppender = new ArrayAppender();
parentLogger.addAppender(parentLoggerAppender);
childLogger.addAppender(childLoggerAppender);
childLogger.setAdditivity(false);
parentLogger.info("Parent logger test message");
childLogger.info("Child logger test message");
t.assertEquals(parentLoggerAppender.logMessages.length, 1);
t.assertEquals(childLoggerAppender.logMessages.length, 1);
});
s.test("Logger appender additivity test 3", function(t) {
var parentLogger = log4javascript.getLogger("test1");
var childLogger = log4javascript.getLogger("test1.test2");
var parentLoggerAppender = new ArrayAppender();
var childLoggerAppender = new ArrayAppender();
parentLogger.addAppender(parentLoggerAppender);
childLogger.addAppender(childLoggerAppender);
childLogger.setAdditivity(false);
parentLogger.info("Parent logger test message");
childLogger.info("Child logger test message");
childLogger.setAdditivity(true);
childLogger.info("Child logger test message 2");
t.assertEquals(parentLoggerAppender.logMessages.length, 2);
t.assertEquals(childLoggerAppender.logMessages.length, 2);
});
s.test("Appender threshold test", function(t) {
t.appender.setThreshold(log4javascript.Level.INFO);
t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages.length, 0);
});
s.test("Basic appender / layout test", function(t) {
t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages[0], "TEST");
});
s.test("Appender uniqueness within logger test", function(t) {
// Add the same appender to the logger for a second time
t.logger.addAppender(t.appender);
t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages.length, 1);
});
s.test("Logger remove appender test", function(t) {
t.logger.debug("TEST");
t.logger.removeAppender(t.appender);
t.logger.debug("TEST AGAIN");
t.assertEquals(t.appender.logMessages.length, 1);
});
s.test("", function(t) {
t.logger.debug("TEST");
t.logger.removeAppender(t.appender);
t.logger.debug("TEST AGAIN");
t.assertEquals(t.appender.logMessages.length, 1);
});
s.test("SimpleLayout format test", function(t) {
var layout = new log4javascript.SimpleLayout();
testLayoutWithVariables(layout, t);
});
s.test("SimpleLayout test", function(t) {
t.appender.setLayout(new log4javascript.SimpleLayout());
t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages[0], "DEBUG - TEST");
});
s.test("NullLayout format test", function(t) {
var layout = new log4javascript.NullLayout();
testLayoutWithVariables(layout, t);
});
s.test("NullLayout test", function(t) {
t.appender.setLayout(new log4javascript.NullLayout());
t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages[0], "TEST");
});
s.test("XmlLayout format test", function(t) {
var layout = new log4javascript.XmlLayout();
testLayoutWithVariables(layout, t);
});
s.test("XmlLayout test", function(t) {
t.appender.setLayout(new log4javascript.XmlLayout());
t.logger.debug("TEST");
t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
});
s.test("XmlLayout with exception test", function(t) {
t.appender.setLayout(new log4javascript.XmlLayout());
t.logger.debug("TEST", new Error("Test error"));
t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<log4javascript:exception>\s*<!\[CDATA\[.*\]\]><\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
});
var setUpXmlLayoutMillisecondsTest = function(t) {
t.date = new Date();
t.timeInMilliseconds = t.date.getTime();
t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);
t.milliseconds = t.date.getMilliseconds();
t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);
t.layout = new log4javascript.XmlLayout();
}
s.test("XmlLayout seconds/milliseconds test 1", function(t) {
setUpXmlLayoutMillisecondsTest(t);
// Test default (i.e. timestamps in milliseconds) first
var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInMilliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');
t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
});
s.test("XmlLayout seconds/milliseconds test 2", function(t) {
setUpXmlLayoutMillisecondsTest(t);
// Change the global setting
log4javascript.setTimeStampsInMilliseconds(false);
var formatted = t.layout.format(t.loggingEvent);
log4javascript.setTimeStampsInMilliseconds(true);
var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInSeconds + '" milliseconds="' + t.milliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');
t.assertRegexMatches(regex, formatted);
});
s.test("XmlLayout seconds/milliseconds test 3", function(t) {
setUpXmlLayoutMillisecondsTest(t);
// Change the layout setting
t.layout.setTimeStampsInMilliseconds(false);
var formatted = t.layout.format(t.loggingEvent);
var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInSeconds + '" milliseconds="' + t.milliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');
t.assertRegexMatches(regex, formatted);
});
s.test("escapeNewLines test", function(t) {
var escapeNewLines = log4javascript.evalInScope("escapeNewLines");
var str = "1\r2\n3\n4\r\n5\r6\r\n7";
t.assertEquals(escapeNewLines(str), "1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");
});
s.test("JsonLayout format test", function(t) {
var layout = new log4javascript.JsonLayout();
testLayoutWithVariables(layout, t);
});
s.test("JsonLayout test", function(t) {
t.appender.setLayout(new log4javascript.JsonLayout());
t.logger.debug("TEST");
t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/, t.appender.logMessages[0]);
});
s.test("JsonLayout JSON validity test", function(t) {
t.appender.setLayout(new log4javascript.JsonLayout());
t.logger.debug("TEST");
eval("var o = " + t.appender.logMessages[0]);
t.assertEquals(o.message, "TEST");
});
s.test("JsonLayout with number type message test", function(t) {
t.appender.setLayout(new log4javascript.JsonLayout());
t.logger.debug(15);
t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/, t.appender.logMessages[0]);
});
s.test("JsonLayout with object type message test", function(t) {
t.appender.setLayout(new log4javascript.JsonLayout());
t.logger.debug({});
t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/, t.appender.logMessages[0]);
});
s.test("JsonLayout with boolean type message test", function(t) {
t.appender.setLayout(new log4javascript.JsonLayout());
t.logger.debug(false);
t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/, t.appender.logMessages[0]);
});
s.test("JsonLayout with quote test", function(t) {
t.appender.setLayout(new log4javascript.JsonLayout());
t.logger.debug("TE\"S\"T");
t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/, t.appender.logMessages[0]);
});
s.test("JsonLayout with exception test", function(t) {
t.appender.setLayout(new log4javascript.JsonLayout());
t.logger.debug("TEST", new Error("Test error"));
t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/, t.appender.logMessages[0]);
});
var setUpJsonLayoutMillisecondsTest = function(t) {
t.date = new Date();
t.timeInMilliseconds = t.date.getTime();
t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);
t.milliseconds = t.date.getMilliseconds();
t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);
t.layout = new log4javascript.JsonLayout();
};
s.test("JsonLayout seconds/milliseconds test 1", function(t) {
setUpJsonLayoutMillisecondsTest(t);
// Test default (i.e. timestamps in milliseconds) first
var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInMilliseconds + ',"level":"DEBUG","url":".*","message":"TEST"}$');
t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
});
s.test("JsonLayout seconds/milliseconds test 2", function(t) {
setUpJsonLayoutMillisecondsTest(t);
// Change the global setting
log4javascript.setTimeStampsInMilliseconds(false);
var formatted = t.layout.format(t.loggingEvent);
log4javascript.setTimeStampsInMilliseconds(true);
var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
t.assertRegexMatches(regex, formatted);
});
s.test("JsonLayout seconds/milliseconds test 3", function(t) {
setUpJsonLayoutMillisecondsTest(t);
// Change the layout setting
t.layout.setTimeStampsInMilliseconds(false);
var formatted = t.layout.format(t.loggingEvent);
var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
t.assertRegexMatches(regex, formatted);
});
s.test("HttpPostDataLayout format test", function(t) {
var layout = new log4javascript.HttpPostDataLayout();
testLayoutWithVariables(layout, t);
});
s.test("HttpPostDataLayout test", function(t) {
t.appender.setLayout(new log4javascript.HttpPostDataLayout());
t.logger.debug("TEST");
t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST$/, t.appender.logMessages[0]);
});
s.test("HttpPostDataLayout URL encoding test", function(t) {
t.appender.setLayout(new log4javascript.HttpPostDataLayout());
t.logger.debug("TEST +\"1\"");
t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/, t.appender.logMessages[0]);
});
s.test("HttpPostDataLayout with exception test", function(t) {
t.appender.setLayout(new log4javascript.HttpPostDataLayout());
t.logger.debug("TEST", new Error("Test error"));
t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/, t.appender.logMessages[0]);
});
(function() {
var formatObjectExpansion = log4javascript.evalInScope("formatObjectExpansion");
var newLine = log4javascript.evalInScope("newLine");
var arr = [
null,
undefined,
1.2,
"A string",
[1, "test"],
{
a: {
b: 1
}
}
];
s.test("Basic formatObjectExpansion array test (depth: 1)", function(t) {
t.assertEquals(formatObjectExpansion(arr, 1),
"[" + newLine +
" null," + newLine +
" undefined," + newLine +
" 1.2," + newLine +
" A string," + newLine +
" 1,test," + newLine +
" [object Object]" + newLine +
"]"
);
});
s.test("Basic formatObjectExpansion array test (depth: 2)", function(t) {
t.assertEquals(formatObjectExpansion(arr, 2),
"[" + newLine +
" null," + newLine +
" undefined," + newLine +
" 1.2," + newLine +
" A string," + newLine +
" [" + newLine +
" 1," + newLine +
" test" + newLine +
" ]," + newLine +
" {" + newLine +
" a: [object Object]" + newLine +
" }" + newLine +
"]"
);
});
s.test("formatObjectExpansion simple object test", function(t) {
var obj = {
STRING: "A string"
};
t.assertEquals(formatObjectExpansion(obj, 1),
"{" + newLine +
" STRING: A string" + newLine +
"}"
);
});
s.test("formatObjectExpansion simple circular object test", function(t) {
var obj = {};
obj.a = obj;
t.assertEquals(formatObjectExpansion(obj, 2),
"{" + newLine +
" a: [object Object] [already expanded]" + newLine +
"}"
);
});
})(); /* ---------------------------------------------------------- */
var getSampleDate = function() {
var date = new Date();
date.setFullYear(2006);
date.setMonth(7);
date.setDate(30);
date.setHours(15);
date.setMinutes(38);
date.setSeconds(45);
return date;
};
/* ---------------------------------------------------------- */
s.test("String.replace test", function(t) {
t.assertEquals("Hello world".replace(/o/g, "Z"), "HellZ wZrld");
});
s.test("PatternLayout format test", function(t) {
var layout = new log4javascript.PatternLayout();
testLayoutWithVariables(layout, t);
});
s.test("PatternLayout dates test", function(t) {
var layout = new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");
t.appender.setLayout(layout);
t.logger.debug("TEST");
t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/, t.appender.logMessages[0]);
});
s.test("PatternLayout modifiers test", function(t) {
var layout = new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");
t.appender.setLayout(layout);
t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages[0], "TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");
});
s.test("PatternLayout conversion characters test", function(t) {
var layout = new log4javascript.PatternLayout("%c %n %p %r literal %%");
t.appender.setLayout(layout);
t.logger.debug("TEST");
t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/, t.appender.logMessages[0]);
});
s.test("PatternLayout message test", function(t) {
var layout = new log4javascript.PatternLayout("%m{1} %m{2}");
t.appender.setLayout(layout);
var testObj = {
strikers: {
quick: "Marlon"
}
};
t.logger.debug(testObj);
t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}", t.appender.logMessages[0]);
});
// Tests for exceptions when logging
s.test("Logging/grouping test", function(t) {
var browserConsoleAppender = new log4javascript.BrowserConsoleAppender();
t.logger.addAppender(browserConsoleAppender);
// Test each level
t.logger.trace("TEST TRACE");
t.logger.debug("TEST DEBUG");
t.logger.info("TEST INFO");
t.logger.warn("TEST WARN");
t.logger.error("TEST ERROR");
t.logger.fatal("TEST FATAL");
// Test with exception
t.logger.fatal("TEST FATAL", new Error("Fake error"));
// Test multiple messages
t.logger.info("TEST INFO", "Second message", ["a", "b", "c"]);
// Test groups
t.logger.group("TEST GROUP");
t.logger.info("TEST INFO");
t.logger.groupEnd("TEST GROUP");
t.logger.info("TEST INFO");
t.logger.removeAppender(browserConsoleAppender);
});
/*
s.test("AjaxAppender JsonLayout single message test", function(t) {
t.async(10000);
// Create and add an Ajax appender
var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");
ajaxAppender.setLayout(new log4javascript.JsonLayout());
ajaxAppender.setRequestSuccessCallback(
function(xmlHttp) {
// Response comes back as JSON array of messages logged
var jsonResponse = xmlHttp.responseText;
var arr = eval(jsonResponse);
t.assertEquals(arr.length, 1);
t.assertEquals(arr[0], "TEST");
t.succeed();
}
);
ajaxAppender.setFailCallback(
function(msg) {
t.fail(msg);
ajaxErrorMessage = msg;
}
);
t.logger.addAppender(ajaxAppender);
t.logger.debug("TEST");
});
s.test("AjaxAppender JsonLayout batched messages test", function(t) {
t.async(10000);
var message1 = "TEST 1";
var message2 = "String with \"lots of 'quotes'\" + plusses in";
var message3 = "A non-threatening string";
// Create and add an Ajax appender
var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");
ajaxAppender.setLayout(new log4javascript.JsonLayout());
ajaxAppender.setBatchSize(3);
ajaxAppender.setRequestSuccessCallback(
function(xmlHttp) {
// Response comes back as JSON array of messages logged
var jsonResponse = xmlHttp.responseText;
var arr = eval(jsonResponse);
t.assertEquals(arr.length, 3);
t.assertEquals(arr[0], message1);
t.assertEquals(arr[1], message2);
t.assertEquals(arr[2], message3);
t.succeed();
}
);
ajaxAppender.setFailCallback(
function(msg) {
t.fail(msg);
ajaxErrorMessage = msg;
}
);
t.logger.addAppender(ajaxAppender);
t.logger.debug(message1);
t.logger.info(message2);
t.logger.warn(message3);
});
s.test("AjaxAppender HttpPostDataLayout single message test", function(t) {
t.async(10000);
// Create and add an Ajax appender
var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");
var testMessage = "TEST +\"1\"";
ajaxAppender.setLayout(new log4javascript.HttpPostDataLayout());
ajaxAppender.setRequestSuccessCallback(
function(xmlHttp) {
// Response comes back as JSON array of messages logged
var jsonResponse = xmlHttp.responseText;
var arr = eval(jsonResponse);
t.assertEquals(arr.length, 1);
t.assertEquals(arr[0], testMessage);
t.succeed();
}
);
ajaxAppender.setFailCallback(
function(msg) {
t.fail(msg);
ajaxErrorMessage = msg;
}
);
t.logger.addAppender(ajaxAppender);
t.logger.debug(testMessage);
});
*/
var testConsoleAppender = function(t, appender) {
var timeoutCallback = function() {
//alert("Failed. Debug messages follow.");
//log4javascript.logLog.displayDebug();
return (windowLoaded ? "Timed out while waiting for messages to appear" :
"Timed out while waiting for window to load") + ". Debug messages: " +
log4javascript.logLog.debugMessages.join("\r\n");
}
t.async(60000, timeoutCallback);
var windowLoaded = false;
var domChecked = false;
// Set a timeout to allow the pop-up to appear
var onLoadHandler = function() {
log4javascript.logLog.debug("onLoadHandler");
windowLoaded = true;
var win = appender.getConsoleWindow();
if (win && win.loaded) {
// Check that the log container element contains the log message. Since
// the console window waits 100 milliseconds before actually rendering the
// message as a DOM element, we need to use a timer
var checkDom = function() {
log4javascript.logLog.debug("checkDom");
domChecked = true;
var logContainer = win.logMainContainer;
if (logContainer.hasChildNodes()) {
if (logContainer.innerHTML.indexOf("TEST MESSAGE") == -1) {
appender.close();
t.fail("Log message not correctly logged (log container innerHTML: " + logContainer.innerHTML + ")");
} else {
t.assert(appender.isVisible());
appender.close();
t.assert(!appender.isVisible());
t.succeed();
}
} else {
appender.close();
t.fail("Console has no log messages");
}
}
window.setTimeout(checkDom, 300);
} else {
appender.close();
t.fail("Console mistakenly raised load event");
}
}
appender.addEventListener("load", onLoadHandler);
t.logger.addAppender(appender);
t.logger.debug("TEST MESSAGE");
};
s.test("InlineAppender test", function(t) {
var inlineAppender = new log4javascript.InlineAppender();
inlineAppender.setInitiallyMinimized(false);
inlineAppender.setNewestMessageAtTop(false);
inlineAppender.setScrollToLatestMessage(true);
inlineAppender.setWidth(600);
inlineAppender.setHeight(200);
testConsoleAppender(t, inlineAppender);
});
s.test("InPageAppender with separate console HTML file test", function(t) {
var inPageAppender = new log4javascript.InPageAppender();
inPageAppender.setInitiallyMinimized(false);
inPageAppender.setNewestMessageAtTop(false);
inPageAppender.setScrollToLatestMessage(true);
inPageAppender.setUseDocumentWrite(false);
inPageAppender.setWidth(600);
inPageAppender.setHeight(200);
testConsoleAppender(t, inPageAppender);
});
s.test("PopUpAppender test", function(t) {
var popUpAppender = new log4javascript.PopUpAppender();
popUpAppender.setFocusPopUp(true);
popUpAppender.setUseOldPopUp(false);
popUpAppender.setNewestMessageAtTop(false);
popUpAppender.setScrollToLatestMessage(true);
popUpAppender.setComplainAboutPopUpBlocking(false);
popUpAppender.setWidth(600);
popUpAppender.setHeight(200);
testConsoleAppender(t, popUpAppender);
});
s.test("PopUpAppender with separate console HTML file test", function(t) {
var popUpAppender = new log4javascript.PopUpAppender();
popUpAppender.setFocusPopUp(true);
popUpAppender.setUseOldPopUp(false);
popUpAppender.setNewestMessageAtTop(false);
popUpAppender.setScrollToLatestMessage(true);
popUpAppender.setComplainAboutPopUpBlocking(false);
popUpAppender.setUseDocumentWrite(false);
popUpAppender.setWidth(600);
popUpAppender.setHeight(200);
testConsoleAppender(t, popUpAppender);
});
});