2 * Copyright 2013 Tim Down.
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
17 function array_contains(arr, val) {
\r
18 for (var i = 0; i < arr.length; i++) {
\r
19 if (arr[i] == val) {
\r
26 // Recursively checks that obj2's interface contains all of obj1's
\r
27 // interface (functions and objects only)
\r
28 function compareObjectInterface(obj1, obj1_name, obj2, obj2_name, namePrefix) {
\r
32 var obj1PropertyNames = new Array();
\r
33 for (var i in obj1) {
\r
34 if (i != "prototype" && i != "arguments") {
\r
35 obj1PropertyNames.push(i);
\r
38 if (obj1 && obj1.prototype && !array_contains(obj1PropertyNames, "prototype")) {
\r
39 //obj1PropertyNames.push("prototype");
\r
41 for (var j = 0; j < obj1PropertyNames.length; j++) {
\r
42 var propertyName = obj1PropertyNames[j];
\r
43 if ((typeof obj1[propertyName] == "function" || typeof obj1[propertyName] == "object") && !(obj1[propertyName] instanceof Array)) {
\r
44 var propertyFullyQualifiedName = (namePrefix == "") ? propertyName : namePrefix + "." + propertyName;
\r
46 if (typeof obj2[propertyName] == "undefined") {
\r
47 throw new Error(obj2_name + " does not contain " + propertyFullyQualifiedName + " in " + obj1_name);
\r
48 } else if (typeof obj2[propertyName] != typeof obj1[propertyName]){
\r
49 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);
\r
50 } else if (obj1[propertyName] != Function.prototype.apply) {
\r
51 if (!compareObjectInterface(obj1[propertyName], obj1_name, obj2[propertyName], obj2_name, propertyFullyQualifiedName)) {
\r
52 throw new Error("Interfaces don't match");
\r
56 throw new Error("Exception while checking property name " + propertyFullyQualifiedName + " in " + obj2_name + ": " + ex.message);
\r
63 // Simply tests a layout for exceptions when formatting
\r
64 var testLayoutWithVariables = function(layout, t) {
\r
65 var emptyObject = {};
\r
66 var emptyArray = [];
\r
67 var emptyString = "";
\r
68 var localUndefined = emptyArray[0];
\r
69 var oneLevelObject = {
\r
70 "name": "One-level object"
\r
72 var twoLevelObject = {
\r
73 "name": "Two-level object",
\r
74 "data": oneLevelObject
\r
76 var threeLevelObject = {
\r
77 "name": "Three-level object",
\r
78 "data": twoLevelObject
\r
89 function(p) { return "I'm a function"; },
\r
92 var arrayOfTestItems = [emptyObject, emptyString, emptyString, localUndefined, oneLevelObject,
\r
93 twoLevelObject, threeLevelObject, anArray];
\r
95 t.log("Testing layout " + layout)
\r
96 for (var i = 0; i < arrayOfTestItems.length; i++) {
\r
97 var ex = new Error("Test error");
\r
98 var loggingEvent = new log4javascript.LoggingEvent(t.logger, new Date(), log4javascript.Level.INFO,
\r
99 [arrayOfTestItems[i]], null);
\r
100 t.log("Formatting", arrayOfTestItems[i], result);
\r
101 var result = layout.format(loggingEvent);
\r
102 // Now try with an exception
\r
103 loggingEvent.exception = ex;
\r
104 t.log("Formatting with exception", arrayOfTestItems[i], result);
\r
105 result = layout.format(loggingEvent);
\r
109 xn.test.enableTestDebug = true;
\r
110 xn.test.enable_log4javascript = false;
\r
112 xn.test.suite("log4javascript tests", function(s) {
\r
113 log4javascript.logLog.setQuietMode(true);
\r
114 var ArrayAppender = function(layout) {
\r
116 this.setLayout(layout);
\r
118 this.logMessages = [];
\r
121 ArrayAppender.prototype = new log4javascript.Appender();
\r
123 ArrayAppender.prototype.layout = new log4javascript.NullLayout();
\r
125 ArrayAppender.prototype.append = function(loggingEvent) {
\r
126 var formattedMessage = this.getLayout().format(loggingEvent);
\r
127 if (this.getLayout().ignoresThrowable()) {
\r
128 formattedMessage += loggingEvent.getThrowableStrRep();
\r
130 this.logMessages.push(formattedMessage);
\r
133 ArrayAppender.prototype.toString = function() {
\r
134 return "[ArrayAppender]";
\r
137 s.setUp = function(t) {
\r
138 t.logger = log4javascript.getLogger("test");
\r
139 t.logger.removeAllAppenders();
\r
140 t.appender = new ArrayAppender();
\r
141 t.logger.addAppender(t.appender);
\r
144 s.tearDown = function(t) {
\r
145 t.logger.removeAppender(t.appender);
\r
146 log4javascript.resetConfiguration();
\r
149 s.test("Stub script interface test", function(t) {
\r
151 compareObjectInterface(log4javascript, "log4javascript", log4javascript_stub, "log4javascript_stub");
\r
157 s.test("Disable log4javascript test", function(t) {
\r
158 log4javascript.setEnabled(false);
\r
159 t.logger.debug("TEST");
\r
160 t.assertEquals(t.appender.logMessages.length, 0);
\r
161 log4javascript.setEnabled(true);
\r
164 s.test("Array.splice test 1", function(t) {
\r
165 var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
\r
166 var deletedItems = a.splice(1, 2);
\r
167 t.assertEquals(a.join(","), "Marlon,Lloyd");
\r
168 t.assertEquals(deletedItems.join(","), "Ashley,Darius");
\r
171 s.test("Array.splice test 2", function(t) {
\r
172 var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
\r
173 var deletedItems = a.splice(1, 1, "Malky", "Jay");
\r
174 t.assertEquals(a.join(","), "Marlon,Malky,Jay,Darius,Lloyd");
\r
175 t.assertEquals(deletedItems.join(","), "Ashley");
\r
178 s.test("array_remove test", function(t) {
\r
179 var array_remove = log4javascript.evalInScope("array_remove");
\r
180 var a = ["Marlon", "Ashley", "Darius"];
\r
181 array_remove(a, "Darius");
\r
182 t.assertEquals(a.join(","), "Marlon,Ashley");
\r
185 s.test("array_remove with empty array test", function(t) {
\r
186 var array_remove = log4javascript.evalInScope("array_remove");
\r
188 array_remove(a, "Darius");
\r
189 t.assertEquals(a.join(","), "");
\r
192 s.test("Logger logging test", function(t) {
\r
193 // Should log since the default level for loggers is DEBUG and
\r
194 // the default threshold for appenders is ALL
\r
195 t.logger.debug("TEST");
\r
196 t.assertEquals(t.appender.logMessages.length, 1);
\r
199 s.test("Logger levels test", function(t) {
\r
200 var originalLevel = t.logger.getEffectiveLevel();
\r
201 t.logger.setLevel(log4javascript.Level.INFO);
\r
202 t.logger.debug("TEST");
\r
203 t.logger.setLevel(originalLevel);
\r
204 t.assertEquals(t.appender.logMessages.length, 0);
\r
207 s.test("Logger getEffectiveLevel inheritance test 1", function(t) {
\r
208 var parentLogger = log4javascript.getLogger("test1");
\r
209 var childLogger = log4javascript.getLogger("test1.test2");
\r
210 parentLogger.setLevel(log4javascript.Level.ERROR);
\r
211 t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.ERROR);
\r
214 s.test("Logger getEffectiveLevel inheritance test 2", function(t) {
\r
215 var grandParentLogger = log4javascript.getLogger("test1");
\r
216 var childLogger = log4javascript.getLogger("test1.test2.test3");
\r
217 grandParentLogger.setLevel(log4javascript.Level.ERROR);
\r
218 t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.ERROR);
\r
221 s.test("Logger getEffectiveLevel inheritance test 3", function(t) {
\r
222 var parentLogger = log4javascript.getLogger("test1");
\r
223 var childLogger = log4javascript.getLogger("test1.test2");
\r
224 parentLogger.setLevel(log4javascript.Level.ERROR);
\r
225 childLogger.setLevel(log4javascript.Level.INFO);
\r
226 t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.INFO);
\r
229 s.test("Logger getEffectiveLevel root inheritance test", function(t) {
\r
230 var rootLogger = log4javascript.getRootLogger();
\r
231 var childLogger = log4javascript.getLogger("test1.test2.test3");
\r
232 rootLogger.setLevel(log4javascript.Level.WARN);
\r
233 t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.WARN);
\r
236 s.test("Logger null level test", function(t) {
\r
237 t.logger.setLevel(null);
\r
238 // Should default to root logger level, which is DEBUG
\r
239 t.assertEquals(t.logger.getEffectiveLevel(), log4javascript.Level.DEBUG);
\r
242 s.test("Logger appender additivity test 1", function(t) {
\r
243 var parentLogger = log4javascript.getLogger("test1");
\r
244 var childLogger = log4javascript.getLogger("test1.test2");
\r
245 var parentLoggerAppender = new ArrayAppender();
\r
246 var childLoggerAppender = new ArrayAppender();
\r
248 parentLogger.addAppender(parentLoggerAppender);
\r
249 childLogger.addAppender(childLoggerAppender);
\r
251 parentLogger.info("Parent logger test message");
\r
252 childLogger.info("Child logger test message");
\r
254 t.assertEquals(parentLoggerAppender.logMessages.length, 2);
\r
255 t.assertEquals(childLoggerAppender.logMessages.length, 1);
\r
258 s.test("Logger appender additivity test 2", function(t) {
\r
259 var parentLogger = log4javascript.getLogger("test1");
\r
260 var childLogger = log4javascript.getLogger("test1.test2");
\r
261 var parentLoggerAppender = new ArrayAppender();
\r
262 var childLoggerAppender = new ArrayAppender();
\r
264 parentLogger.addAppender(parentLoggerAppender);
\r
265 childLogger.addAppender(childLoggerAppender);
\r
267 childLogger.setAdditivity(false);
\r
269 parentLogger.info("Parent logger test message");
\r
270 childLogger.info("Child logger test message");
\r
272 t.assertEquals(parentLoggerAppender.logMessages.length, 1);
\r
273 t.assertEquals(childLoggerAppender.logMessages.length, 1);
\r
276 s.test("Logger appender additivity test 3", function(t) {
\r
277 var parentLogger = log4javascript.getLogger("test1");
\r
278 var childLogger = log4javascript.getLogger("test1.test2");
\r
279 var parentLoggerAppender = new ArrayAppender();
\r
280 var childLoggerAppender = new ArrayAppender();
\r
282 parentLogger.addAppender(parentLoggerAppender);
\r
283 childLogger.addAppender(childLoggerAppender);
\r
285 childLogger.setAdditivity(false);
\r
287 parentLogger.info("Parent logger test message");
\r
288 childLogger.info("Child logger test message");
\r
290 childLogger.setAdditivity(true);
\r
292 childLogger.info("Child logger test message 2");
\r
294 t.assertEquals(parentLoggerAppender.logMessages.length, 2);
\r
295 t.assertEquals(childLoggerAppender.logMessages.length, 2);
\r
298 s.test("Appender threshold test", function(t) {
\r
299 t.appender.setThreshold(log4javascript.Level.INFO);
\r
300 t.logger.debug("TEST");
\r
301 t.assertEquals(t.appender.logMessages.length, 0);
\r
304 s.test("Basic appender / layout test", function(t) {
\r
305 t.logger.debug("TEST");
\r
306 t.assertEquals(t.appender.logMessages[0], "TEST");
\r
309 s.test("Appender uniqueness within logger test", function(t) {
\r
310 // Add the same appender to the logger for a second time
\r
311 t.logger.addAppender(t.appender);
\r
312 t.logger.debug("TEST");
\r
313 t.assertEquals(t.appender.logMessages.length, 1);
\r
316 s.test("Logger remove appender test", function(t) {
\r
317 t.logger.debug("TEST");
\r
318 t.logger.removeAppender(t.appender);
\r
319 t.logger.debug("TEST AGAIN");
\r
320 t.assertEquals(t.appender.logMessages.length, 1);
\r
323 s.test("", function(t) {
\r
324 t.logger.debug("TEST");
\r
325 t.logger.removeAppender(t.appender);
\r
326 t.logger.debug("TEST AGAIN");
\r
327 t.assertEquals(t.appender.logMessages.length, 1);
\r
329 s.test("SimpleLayout format test", function(t) {
\r
330 var layout = new log4javascript.SimpleLayout();
\r
331 testLayoutWithVariables(layout, t);
\r
334 s.test("SimpleLayout test", function(t) {
\r
335 t.appender.setLayout(new log4javascript.SimpleLayout());
\r
336 t.logger.debug("TEST");
\r
337 t.assertEquals(t.appender.logMessages[0], "DEBUG - TEST");
\r
339 s.test("NullLayout format test", function(t) {
\r
340 var layout = new log4javascript.NullLayout();
\r
341 testLayoutWithVariables(layout, t);
\r
344 s.test("NullLayout test", function(t) {
\r
345 t.appender.setLayout(new log4javascript.NullLayout());
\r
346 t.logger.debug("TEST");
\r
347 t.assertEquals(t.appender.logMessages[0], "TEST");
\r
349 s.test("XmlLayout format test", function(t) {
\r
350 var layout = new log4javascript.XmlLayout();
\r
351 testLayoutWithVariables(layout, t);
\r
354 s.test("XmlLayout test", function(t) {
\r
355 t.appender.setLayout(new log4javascript.XmlLayout());
\r
356 t.logger.debug("TEST");
\r
357 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]);
\r
360 s.test("XmlLayout with exception test", function(t) {
\r
361 t.appender.setLayout(new log4javascript.XmlLayout());
\r
362 t.logger.debug("TEST", new Error("Test error"));
\r
363 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]);
\r
366 var setUpXmlLayoutMillisecondsTest = function(t) {
\r
367 t.date = new Date();
\r
368 t.timeInMilliseconds = t.date.getTime();
\r
369 t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);
\r
370 t.milliseconds = t.date.getMilliseconds();
\r
372 t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);
\r
373 t.layout = new log4javascript.XmlLayout();
\r
376 s.test("XmlLayout seconds/milliseconds test 1", function(t) {
\r
377 setUpXmlLayoutMillisecondsTest(t);
\r
379 // Test default (i.e. timestamps in milliseconds) first
\r
380 var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInMilliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');
\r
381 t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
\r
384 s.test("XmlLayout seconds/milliseconds test 2", function(t) {
\r
385 setUpXmlLayoutMillisecondsTest(t);
\r
387 // Change the global setting
\r
388 log4javascript.setTimeStampsInMilliseconds(false);
\r
389 var formatted = t.layout.format(t.loggingEvent);
\r
390 log4javascript.setTimeStampsInMilliseconds(true);
\r
391 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*$');
\r
392 t.assertRegexMatches(regex, formatted);
\r
395 s.test("XmlLayout seconds/milliseconds test 3", function(t) {
\r
396 setUpXmlLayoutMillisecondsTest(t);
\r
398 // Change the layout setting
\r
399 t.layout.setTimeStampsInMilliseconds(false);
\r
400 var formatted = t.layout.format(t.loggingEvent);
\r
401 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*$');
\r
402 t.assertRegexMatches(regex, formatted);
\r
404 s.test("escapeNewLines test", function(t) {
\r
405 var escapeNewLines = log4javascript.evalInScope("escapeNewLines");
\r
406 var str = "1\r2\n3\n4\r\n5\r6\r\n7";
\r
407 t.assertEquals(escapeNewLines(str), "1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");
\r
410 s.test("JsonLayout format test", function(t) {
\r
411 var layout = new log4javascript.JsonLayout();
\r
412 testLayoutWithVariables(layout, t);
\r
415 s.test("JsonLayout test", function(t) {
\r
416 t.appender.setLayout(new log4javascript.JsonLayout());
\r
417 t.logger.debug("TEST");
\r
418 t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/, t.appender.logMessages[0]);
\r
421 s.test("JsonLayout JSON validity test", function(t) {
\r
422 t.appender.setLayout(new log4javascript.JsonLayout());
\r
423 t.logger.debug("TEST");
\r
424 eval("var o = " + t.appender.logMessages[0]);
\r
425 t.assertEquals(o.message, "TEST");
\r
428 s.test("JsonLayout with number type message test", function(t) {
\r
429 t.appender.setLayout(new log4javascript.JsonLayout());
\r
430 t.logger.debug(15);
\r
431 t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/, t.appender.logMessages[0]);
\r
434 s.test("JsonLayout with object type message test", function(t) {
\r
435 t.appender.setLayout(new log4javascript.JsonLayout());
\r
436 t.logger.debug({});
\r
437 t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/, t.appender.logMessages[0]);
\r
440 s.test("JsonLayout with boolean type message test", function(t) {
\r
441 t.appender.setLayout(new log4javascript.JsonLayout());
\r
442 t.logger.debug(false);
\r
443 t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/, t.appender.logMessages[0]);
\r
446 s.test("JsonLayout with quote test", function(t) {
\r
447 t.appender.setLayout(new log4javascript.JsonLayout());
\r
448 t.logger.debug("TE\"S\"T");
\r
449 t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/, t.appender.logMessages[0]);
\r
452 s.test("JsonLayout with exception test", function(t) {
\r
453 t.appender.setLayout(new log4javascript.JsonLayout());
\r
454 t.logger.debug("TEST", new Error("Test error"));
\r
455 t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/, t.appender.logMessages[0]);
\r
458 var setUpJsonLayoutMillisecondsTest = function(t) {
\r
459 t.date = new Date();
\r
460 t.timeInMilliseconds = t.date.getTime();
\r
461 t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);
\r
462 t.milliseconds = t.date.getMilliseconds();
\r
464 t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);
\r
465 t.layout = new log4javascript.JsonLayout();
\r
468 s.test("JsonLayout seconds/milliseconds test 1", function(t) {
\r
469 setUpJsonLayoutMillisecondsTest(t);
\r
471 // Test default (i.e. timestamps in milliseconds) first
\r
472 var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInMilliseconds + ',"level":"DEBUG","url":".*","message":"TEST"}$');
\r
473 t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
\r
476 s.test("JsonLayout seconds/milliseconds test 2", function(t) {
\r
477 setUpJsonLayoutMillisecondsTest(t);
\r
479 // Change the global setting
\r
480 log4javascript.setTimeStampsInMilliseconds(false);
\r
481 var formatted = t.layout.format(t.loggingEvent);
\r
482 log4javascript.setTimeStampsInMilliseconds(true);
\r
483 var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
\r
484 t.assertRegexMatches(regex, formatted);
\r
487 s.test("JsonLayout seconds/milliseconds test 3", function(t) {
\r
488 setUpJsonLayoutMillisecondsTest(t);
\r
490 // Change the layout setting
\r
491 t.layout.setTimeStampsInMilliseconds(false);
\r
492 var formatted = t.layout.format(t.loggingEvent);
\r
493 var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
\r
494 t.assertRegexMatches(regex, formatted);
\r
496 s.test("HttpPostDataLayout format test", function(t) {
\r
497 var layout = new log4javascript.HttpPostDataLayout();
\r
498 testLayoutWithVariables(layout, t);
\r
501 s.test("HttpPostDataLayout test", function(t) {
\r
502 t.appender.setLayout(new log4javascript.HttpPostDataLayout());
\r
503 t.logger.debug("TEST");
\r
504 t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST$/, t.appender.logMessages[0]);
\r
507 s.test("HttpPostDataLayout URL encoding test", function(t) {
\r
508 t.appender.setLayout(new log4javascript.HttpPostDataLayout());
\r
509 t.logger.debug("TEST +\"1\"");
\r
510 t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/, t.appender.logMessages[0]);
\r
513 s.test("HttpPostDataLayout with exception test", function(t) {
\r
514 t.appender.setLayout(new log4javascript.HttpPostDataLayout());
\r
515 t.logger.debug("TEST", new Error("Test error"));
\r
516 t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/, t.appender.logMessages[0]);
\r
520 var formatObjectExpansion = log4javascript.evalInScope("formatObjectExpansion");
\r
521 var newLine = log4javascript.evalInScope("newLine");
\r
535 s.test("Basic formatObjectExpansion array test (depth: 1)", function(t) {
\r
536 t.assertEquals(formatObjectExpansion(arr, 1),
\r
538 " null," + newLine +
\r
539 " undefined," + newLine +
\r
540 " 1.2," + newLine +
\r
541 " A string," + newLine +
\r
542 " 1,test," + newLine +
\r
543 " [object Object]" + newLine +
\r
548 s.test("Basic formatObjectExpansion array test (depth: 2)", function(t) {
\r
549 t.assertEquals(formatObjectExpansion(arr, 2),
\r
551 " null," + newLine +
\r
552 " undefined," + newLine +
\r
553 " 1.2," + newLine +
\r
554 " A string," + newLine +
\r
557 " test" + newLine +
\r
560 " a: [object Object]" + newLine +
\r
566 s.test("formatObjectExpansion simple object test", function(t) {
\r
570 t.assertEquals(formatObjectExpansion(obj, 1),
\r
572 " STRING: A string" + newLine +
\r
577 s.test("formatObjectExpansion simple circular object test", function(t) {
\r
581 t.assertEquals(formatObjectExpansion(obj, 2),
\r
583 " a: [object Object] [already expanded]" + newLine +
\r
587 })(); /* ---------------------------------------------------------- */
\r
589 var getSampleDate = function() {
\r
590 var date = new Date();
\r
591 date.setFullYear(2006);
\r
595 date.setMinutes(38);
\r
596 date.setSeconds(45);
\r
600 /* ---------------------------------------------------------- */
\r
602 s.test("String.replace test", function(t) {
\r
603 t.assertEquals("Hello world".replace(/o/g, "Z"), "HellZ wZrld");
\r
606 s.test("PatternLayout format test", function(t) {
\r
607 var layout = new log4javascript.PatternLayout();
\r
608 testLayoutWithVariables(layout, t);
\r
611 s.test("PatternLayout dates test", function(t) {
\r
612 var layout = new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");
\r
613 t.appender.setLayout(layout);
\r
614 t.logger.debug("TEST");
\r
615 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]);
\r
618 s.test("PatternLayout modifiers test", function(t) {
\r
619 var layout = new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");
\r
620 t.appender.setLayout(layout);
\r
621 t.logger.debug("TEST");
\r
622 t.assertEquals(t.appender.logMessages[0], "TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");
\r
625 s.test("PatternLayout conversion characters test", function(t) {
\r
626 var layout = new log4javascript.PatternLayout("%c %n %p %r literal %%");
\r
627 t.appender.setLayout(layout);
\r
628 t.logger.debug("TEST");
\r
629 t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/, t.appender.logMessages[0]);
\r
632 s.test("PatternLayout message test", function(t) {
\r
633 var layout = new log4javascript.PatternLayout("%m{1} %m{2}");
\r
634 t.appender.setLayout(layout);
\r
640 t.logger.debug(testObj);
\r
641 t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}", t.appender.logMessages[0]);
\r
644 s.test("AjaxAppender JsonLayout single message test", function(t) {
\r
646 // Create and add an Ajax appender
\r
647 var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");
\r
648 ajaxAppender.setLayout(new log4javascript.JsonLayout());
\r
649 ajaxAppender.setRequestSuccessCallback(
\r
650 function(xmlHttp) {
\r
651 // Response comes back as JSON array of messages logged
\r
652 var jsonResponse = xmlHttp.responseText;
\r
653 var arr = eval(jsonResponse);
\r
654 t.assertEquals(arr.length, 1);
\r
655 t.assertEquals(arr[0], "TEST");
\r
659 ajaxAppender.setFailCallback(
\r
662 ajaxErrorMessage = msg;
\r
665 t.logger.addAppender(ajaxAppender);
\r
666 t.logger.debug("TEST");
\r
669 s.test("AjaxAppender JsonLayout batched messages test", function(t) {
\r
671 var message1 = "TEST 1";
\r
672 var message2 = "String with \"lots of 'quotes'\" + plusses in";
\r
673 var message3 = "A non-threatening string";
\r
674 // Create and add an Ajax appender
\r
675 var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");
\r
676 ajaxAppender.setLayout(new log4javascript.JsonLayout());
\r
677 ajaxAppender.setBatchSize(3);
\r
678 ajaxAppender.setRequestSuccessCallback(
\r
679 function(xmlHttp) {
\r
680 // Response comes back as JSON array of messages logged
\r
681 var jsonResponse = xmlHttp.responseText;
\r
682 var arr = eval(jsonResponse);
\r
683 t.assertEquals(arr.length, 3);
\r
684 t.assertEquals(arr[0], message1);
\r
685 t.assertEquals(arr[1], message2);
\r
686 t.assertEquals(arr[2], message3);
\r
690 ajaxAppender.setFailCallback(
\r
693 ajaxErrorMessage = msg;
\r
696 t.logger.addAppender(ajaxAppender);
\r
697 t.logger.debug(message1);
\r
698 t.logger.info(message2);
\r
699 t.logger.warn(message3);
\r
702 s.test("AjaxAppender HttpPostDataLayout single message test", function(t) {
\r
704 // Create and add an Ajax appender
\r
705 var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");
\r
706 var testMessage = "TEST +\"1\"";
\r
707 ajaxAppender.setLayout(new log4javascript.HttpPostDataLayout());
\r
708 ajaxAppender.setRequestSuccessCallback(
\r
709 function(xmlHttp) {
\r
710 // Response comes back as JSON array of messages logged
\r
711 var jsonResponse = xmlHttp.responseText;
\r
712 var arr = eval(jsonResponse);
\r
713 t.assertEquals(arr.length, 1);
\r
714 t.assertEquals(arr[0], testMessage);
\r
718 ajaxAppender.setFailCallback(
\r
721 ajaxErrorMessage = msg;
\r
724 t.logger.addAppender(ajaxAppender);
\r
725 t.logger.debug(testMessage);
\r