Merge branch 'master' of ssh://git.planet-lab.org/git/plstackapi
[plstackapi.git] / planetstack / core / static / log4javascript-1.4.6 / js / tests / log4javascript_uncompressed.js
1 /**\r
2  * Copyright 2013 Tim Down.\r
3  *\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
7  *\r
8  *      http://www.apache.org/licenses/LICENSE-2.0\r
9  *\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
15  */\r
16 \r
17 function array_contains(arr, val) {\r
18         for (var i = 0; i < arr.length; i++) {\r
19                 if (arr[i] == val) {\r
20                         return true;\r
21                 }\r
22         }\r
23         return false;\r
24 }\r
25 \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
29         if (!namePrefix) {\r
30                 namePrefix = "";\r
31         }\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
36                 }\r
37         }\r
38         if (obj1 && obj1.prototype && !array_contains(obj1PropertyNames, "prototype")) {\r
39                 //obj1PropertyNames.push("prototype");\r
40         }\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
45                         try {\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
53                                         }\r
54                                 }\r
55                         } catch(ex) {\r
56                                 throw new Error("Exception while checking property name " + propertyFullyQualifiedName + " in " + obj2_name + ": " + ex.message);\r
57                         }\r
58                 }\r
59         }\r
60         return true;\r
61 };\r
62 \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
71         };\r
72         var twoLevelObject = {\r
73                 "name": "Two-level object",\r
74                 "data": oneLevelObject\r
75         };\r
76         var threeLevelObject = {\r
77                 "name": "Three-level object",\r
78                 "data": twoLevelObject\r
79         };\r
80         var anArray = [\r
81                 3,\r
82                 "stuff",\r
83                 true,\r
84                 false,\r
85                 0,\r
86                 null,\r
87                 localUndefined,\r
88                 3.14,\r
89                 function(p) { return "I'm a function"; },\r
90                 [1, "things"]\r
91         ];\r
92         var arrayOfTestItems = [emptyObject, emptyString, emptyString, localUndefined, oneLevelObject,\r
93                         twoLevelObject, threeLevelObject, anArray];\r
94 \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
106         }\r
107 };\r
108 \r
109 xn.test.enableTestDebug = true;\r
110 xn.test.enable_log4javascript = false;\r
111 \r
112 xn.test.suite("log4javascript tests", function(s) {\r
113         log4javascript.logLog.setQuietMode(true);\r
114         var ArrayAppender = function(layout) {\r
115                 if (layout) {\r
116                         this.setLayout(layout);\r
117                 }\r
118                 this.logMessages = [];\r
119         };\r
120 \r
121         ArrayAppender.prototype = new log4javascript.Appender();\r
122 \r
123         ArrayAppender.prototype.layout = new log4javascript.NullLayout();\r
124 \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
129                 }\r
130                 this.logMessages.push(formattedMessage);\r
131         };\r
132 \r
133         ArrayAppender.prototype.toString = function() {\r
134                 return "[ArrayAppender]";\r
135         };\r
136 \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
142     };\r
143 \r
144     s.tearDown = function(t) {\r
145         t.logger.removeAppender(t.appender);\r
146                 log4javascript.resetConfiguration();\r
147         };\r
148 \r
149     s.test("Stub script interface test", function(t) {\r
150         try {\r
151             compareObjectInterface(log4javascript, "log4javascript", log4javascript_stub, "log4javascript_stub");\r
152         } catch (ex) {\r
153             t.fail(ex);\r
154         }\r
155     });\r
156 \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
162         });\r
163 \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
169     });\r
170 \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
176     });\r
177 \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
183     });\r
184 \r
185         s.test("array_remove with empty array test", function(t) {\r
186                 var array_remove = log4javascript.evalInScope("array_remove");\r
187                 var a = [];\r
188                 array_remove(a, "Darius");\r
189                 t.assertEquals(a.join(","), "");\r
190         });\r
191 \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
197     });\r
198 \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
205     });\r
206 \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
212         });\r
213 \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
219         });\r
220 \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
227         });\r
228 \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
234         });\r
235 \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
240         });\r
241 \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
247 \r
248                 parentLogger.addAppender(parentLoggerAppender);\r
249                 childLogger.addAppender(childLoggerAppender);\r
250 \r
251                 parentLogger.info("Parent logger test message");\r
252                 childLogger.info("Child logger test message");\r
253 \r
254                 t.assertEquals(parentLoggerAppender.logMessages.length, 2);\r
255                 t.assertEquals(childLoggerAppender.logMessages.length, 1);\r
256         });\r
257 \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
263 \r
264                 parentLogger.addAppender(parentLoggerAppender);\r
265                 childLogger.addAppender(childLoggerAppender);\r
266 \r
267                 childLogger.setAdditivity(false);\r
268 \r
269                 parentLogger.info("Parent logger test message");\r
270                 childLogger.info("Child logger test message");\r
271 \r
272                 t.assertEquals(parentLoggerAppender.logMessages.length, 1);\r
273                 t.assertEquals(childLoggerAppender.logMessages.length, 1);\r
274         });\r
275 \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
281 \r
282                 parentLogger.addAppender(parentLoggerAppender);\r
283                 childLogger.addAppender(childLoggerAppender);\r
284 \r
285                 childLogger.setAdditivity(false);\r
286 \r
287                 parentLogger.info("Parent logger test message");\r
288                 childLogger.info("Child logger test message");\r
289 \r
290                 childLogger.setAdditivity(true);\r
291 \r
292                 childLogger.info("Child logger test message 2");\r
293 \r
294                 t.assertEquals(parentLoggerAppender.logMessages.length, 2);\r
295                 t.assertEquals(childLoggerAppender.logMessages.length, 2);\r
296         });\r
297 \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
302     });\r
303 \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
307     });\r
308 \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
314     });\r
315 \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
321         });\r
322 \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
328         });\r
329         s.test("SimpleLayout format test", function(t) {\r
330                 var layout = new log4javascript.SimpleLayout();\r
331                 testLayoutWithVariables(layout, t);\r
332         });\r
333 \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
338     });\r
339         s.test("NullLayout format test", function(t) {\r
340                 var layout = new log4javascript.NullLayout();\r
341                 testLayoutWithVariables(layout, t);\r
342         });\r
343 \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
348     });\r
349         s.test("XmlLayout format test", function(t) {\r
350                 var layout = new log4javascript.XmlLayout();\r
351                 testLayoutWithVariables(layout, t);\r
352         });\r
353 \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
358     });\r
359 \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
364     });\r
365 \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
371                 \r
372                 t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);\r
373                 t.layout = new log4javascript.XmlLayout();\r
374         }\r
375 \r
376         s.test("XmlLayout seconds/milliseconds test 1", function(t) {\r
377                 setUpXmlLayoutMillisecondsTest(t);\r
378 \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
382         });\r
383         \r
384         s.test("XmlLayout seconds/milliseconds test 2", function(t) {\r
385                 setUpXmlLayoutMillisecondsTest(t);\r
386 \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
393         });\r
394 \r
395         s.test("XmlLayout seconds/milliseconds test 3", function(t) {\r
396                 setUpXmlLayoutMillisecondsTest(t);\r
397 \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
403         });\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
408         });\r
409 \r
410         s.test("JsonLayout format test", function(t) {\r
411                 var layout = new log4javascript.JsonLayout();\r
412                 testLayoutWithVariables(layout, t);\r
413         });\r
414 \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
419     });\r
420 \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
426     });\r
427 \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
432     });\r
433 \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
438     });\r
439 \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
444     });\r
445 \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
450     });\r
451 \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
456     });\r
457 \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
463                 \r
464                 t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);\r
465                 t.layout = new log4javascript.JsonLayout();\r
466         };\r
467 \r
468         s.test("JsonLayout seconds/milliseconds test 1", function(t) {\r
469                 setUpJsonLayoutMillisecondsTest(t);\r
470 \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
474         });\r
475         \r
476         s.test("JsonLayout seconds/milliseconds test 2", function(t) {\r
477                 setUpJsonLayoutMillisecondsTest(t);\r
478 \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
485         });\r
486 \r
487         s.test("JsonLayout seconds/milliseconds test 3", function(t) {\r
488                 setUpJsonLayoutMillisecondsTest(t);\r
489 \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
495         });\r
496         s.test("HttpPostDataLayout format test", function(t) {\r
497                 var layout = new log4javascript.HttpPostDataLayout();\r
498                 testLayoutWithVariables(layout, t);\r
499         });\r
500 \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&timestamp=\d+&level=DEBUG&url=.*&message=TEST$/, t.appender.logMessages[0]);\r
505     });\r
506 \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&timestamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/, t.appender.logMessages[0]);\r
511     });\r
512 \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&timestamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/, t.appender.logMessages[0]);\r
517     });\r
518 \r
519         (function() {\r
520                 var formatObjectExpansion = log4javascript.evalInScope("formatObjectExpansion");\r
521                 var newLine = log4javascript.evalInScope("newLine");\r
522                 var arr = [\r
523                         null,\r
524                         undefined,\r
525                         1.2,\r
526                         "A string",\r
527                         [1, "test"],\r
528                         {\r
529                                 a: {\r
530                                         b: 1\r
531                                 }\r
532                         }\r
533                 ];\r
534 \r
535                 s.test("Basic formatObjectExpansion array test (depth: 1)", function(t) {\r
536                         t.assertEquals(formatObjectExpansion(arr, 1),\r
537                                 "[" + newLine +\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
544                                 "]"\r
545                         );\r
546                 });\r
547 \r
548                 s.test("Basic formatObjectExpansion array test (depth: 2)", function(t) {\r
549                         t.assertEquals(formatObjectExpansion(arr, 2),\r
550                                 "[" + newLine +\r
551                                 "  null," + newLine +\r
552                                 "  undefined," + newLine +\r
553                                 "  1.2," + newLine +\r
554                                 "  A string," + newLine +\r
555                                 "  [" + newLine +\r
556                                 "    1," + newLine +\r
557                                 "    test" + newLine +\r
558                                 "  ]," + newLine +\r
559                                 "  {" + newLine +\r
560                                 "    a: [object Object]" + newLine +\r
561                                 "  }" + newLine +\r
562                                 "]"\r
563                         );\r
564                 });\r
565 \r
566                 s.test("formatObjectExpansion simple object test", function(t) {\r
567                         var obj = {\r
568                                 STRING: "A string"\r
569                         };\r
570                         t.assertEquals(formatObjectExpansion(obj, 1), \r
571                                 "{" + newLine +\r
572                                 "  STRING: A string" + newLine +\r
573                                 "}"\r
574                         );\r
575                 });\r
576 \r
577                 s.test("formatObjectExpansion simple circular object test", function(t) {\r
578                         var obj = {};\r
579                         obj.a = obj;\r
580                         \r
581                         t.assertEquals(formatObjectExpansion(obj, 2), \r
582                                 "{" + newLine +\r
583                                 "  a: [object Object] [already expanded]" + newLine +\r
584                                 "}"\r
585                         );\r
586                 });\r
587         })();    /* ---------------------------------------------------------- */\r
588 \r
589     var getSampleDate = function() {\r
590         var date = new Date();\r
591         date.setFullYear(2006);\r
592         date.setMonth(7);\r
593         date.setDate(30);\r
594         date.setHours(15);\r
595         date.setMinutes(38);\r
596         date.setSeconds(45);\r
597         return date;\r
598     };\r
599 \r
600     /* ---------------------------------------------------------- */\r
601 \r
602     s.test("String.replace test", function(t) {\r
603         t.assertEquals("Hello world".replace(/o/g, "Z"), "HellZ wZrld");\r
604     });\r
605 \r
606         s.test("PatternLayout format test", function(t) {\r
607                 var layout = new log4javascript.PatternLayout();\r
608                 testLayoutWithVariables(layout, t);\r
609         });\r
610 \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
616     });\r
617 \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
623     });\r
624 \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
630     });\r
631 \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
635         var testObj = {\r
636             strikers: {\r
637                 quick: "Marlon"\r
638             }\r
639         };\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
642     });\r
643         // Tests for exceptions when logging\r
644         s.test("Logging/grouping test", function(t) {\r
645                 var browserConsoleAppender = new log4javascript.BrowserConsoleAppender();\r
646                 t.logger.addAppender(browserConsoleAppender);\r
647 \r
648                 // Test each level\r
649                 t.logger.trace("TEST TRACE");\r
650                 t.logger.debug("TEST DEBUG");\r
651                 t.logger.info("TEST INFO");\r
652                 t.logger.warn("TEST WARN");\r
653                 t.logger.error("TEST ERROR");\r
654                 t.logger.fatal("TEST FATAL");\r
655                 \r
656                 // Test with exception\r
657                 t.logger.fatal("TEST FATAL", new Error("Fake error"));\r
658                 \r
659                 // Test multiple messages\r
660                 t.logger.info("TEST INFO", "Second message", ["a", "b", "c"]);\r
661                 \r
662                 // Test groups\r
663                 t.logger.group("TEST GROUP");\r
664                 t.logger.info("TEST INFO");\r
665                 t.logger.groupEnd("TEST GROUP");\r
666                 t.logger.info("TEST INFO");\r
667                 \r
668                 t.logger.removeAppender(browserConsoleAppender);\r
669         });\r
670 \r
671 /*\r
672         s.test("AjaxAppender JsonLayout single message test", function(t) {\r
673                 t.async(10000);\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.setRequestSuccessCallback(\r
678                         function(xmlHttp) {\r
679                                 // Response comes back as JSON array of messages logged\r
680                                 var jsonResponse = xmlHttp.responseText;\r
681                                 var arr = eval(jsonResponse);\r
682                                 t.assertEquals(arr.length, 1);\r
683                                 t.assertEquals(arr[0], "TEST");\r
684                                 t.succeed();\r
685                         }\r
686                 );\r
687                 ajaxAppender.setFailCallback(\r
688                         function(msg) {\r
689                                 t.fail(msg);\r
690                                 ajaxErrorMessage = msg;\r
691                         }\r
692                 );\r
693                 t.logger.addAppender(ajaxAppender);\r
694                 t.logger.debug("TEST");\r
695         });\r
696 \r
697         s.test("AjaxAppender JsonLayout batched messages test", function(t) {\r
698                 t.async(10000);\r
699                 var message1 = "TEST 1";\r
700                 var message2 = "String with \"lots of 'quotes'\" + plusses in";\r
701                 var message3 = "A non-threatening string";\r
702                 // Create and add an Ajax appender\r
703                 var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");\r
704                 ajaxAppender.setLayout(new log4javascript.JsonLayout());\r
705                 ajaxAppender.setBatchSize(3);\r
706                 ajaxAppender.setRequestSuccessCallback(\r
707                         function(xmlHttp) {\r
708                                 // Response comes back as JSON array of messages logged\r
709                                 var jsonResponse = xmlHttp.responseText;\r
710                                 var arr = eval(jsonResponse);\r
711                                 t.assertEquals(arr.length, 3);\r
712                                 t.assertEquals(arr[0], message1);\r
713                                 t.assertEquals(arr[1], message2);\r
714                                 t.assertEquals(arr[2], message3);\r
715                                 t.succeed();\r
716                         }\r
717                 );\r
718                 ajaxAppender.setFailCallback(\r
719                         function(msg) {\r
720                                 t.fail(msg);\r
721                                 ajaxErrorMessage = msg;\r
722                         }\r
723                 );\r
724                 t.logger.addAppender(ajaxAppender);\r
725                 t.logger.debug(message1);\r
726                 t.logger.info(message2);\r
727                 t.logger.warn(message3);\r
728         });\r
729 \r
730         s.test("AjaxAppender HttpPostDataLayout single message test", function(t) {\r
731                 t.async(10000);\r
732                 // Create and add an Ajax appender\r
733                 var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");\r
734                 var testMessage = "TEST +\"1\"";\r
735                 ajaxAppender.setLayout(new log4javascript.HttpPostDataLayout());\r
736                 ajaxAppender.setRequestSuccessCallback(\r
737                         function(xmlHttp) {\r
738                                 // Response comes back as JSON array of messages logged\r
739                                 var jsonResponse = xmlHttp.responseText;\r
740                                 var arr = eval(jsonResponse);\r
741                                 t.assertEquals(arr.length, 1);\r
742                                 t.assertEquals(arr[0], testMessage);\r
743                                 t.succeed();\r
744                         }\r
745                 );\r
746                 ajaxAppender.setFailCallback(\r
747                         function(msg) {\r
748                                 t.fail(msg);\r
749                                 ajaxErrorMessage = msg;\r
750                         }\r
751                 );\r
752                 t.logger.addAppender(ajaxAppender);\r
753                 t.logger.debug(testMessage);\r
754         });\r
755 */\r
756         var testConsoleAppender = function(t, appender) {\r
757                 var timeoutCallback = function() {\r
758                         //alert("Failed. Debug messages follow.");\r
759                         //log4javascript.logLog.displayDebug();\r
760                         return (windowLoaded ? "Timed out while waiting for messages to appear" :\r
761                                    "Timed out while waiting for window to load") + ". Debug messages: " +\r
762                                    log4javascript.logLog.debugMessages.join("\r\n");\r
763                 }\r
764 \r
765                 t.async(60000, timeoutCallback);\r
766 \r
767                 var windowLoaded = false;\r
768                 var domChecked = false;\r
769 \r
770                 // Set a timeout to allow the pop-up to appear\r
771                 var onLoadHandler = function() {\r
772                         log4javascript.logLog.debug("onLoadHandler");\r
773                         windowLoaded = true;\r
774                         var win = appender.getConsoleWindow();\r
775 \r
776                         if (win && win.loaded) {\r
777                                 // Check that the log container element contains the log message. Since\r
778                                 // the console window waits 100 milliseconds before actually rendering the\r
779                                 // message as a DOM element, we need to use a timer\r
780                                 var checkDom = function() {\r
781                                         log4javascript.logLog.debug("checkDom");\r
782                                         domChecked = true;\r
783                                         var logContainer = win.logMainContainer;\r
784                                         if (logContainer.hasChildNodes()) {\r
785                                                 if (logContainer.innerHTML.indexOf("TEST MESSAGE") == -1) {\r
786                                                         appender.close();\r
787                                                         t.fail("Log message not correctly logged (log container innerHTML: " + logContainer.innerHTML + ")");\r
788                                                 } else {\r
789                                                         t.assert(appender.isVisible());\r
790                                                         appender.close();\r
791                                                         t.assert(!appender.isVisible());\r
792                                                         t.succeed();\r
793                                                 }\r
794                                         } else {\r
795                                                 appender.close();\r
796                                                 t.fail("Console has no log messages");\r
797                                         }\r
798                                 }\r
799                                 window.setTimeout(checkDom, 300);\r
800                         } else {\r
801                                 appender.close();\r
802                                 t.fail("Console mistakenly raised load event");\r
803                         }\r
804                 }\r
805 \r
806                 appender.addEventListener("load", onLoadHandler);\r
807                 t.logger.addAppender(appender);\r
808                 t.logger.debug("TEST MESSAGE");\r
809         };\r
810 \r
811         s.test("InlineAppender test", function(t) {\r
812                 var inlineAppender = new log4javascript.InlineAppender();\r
813                 inlineAppender.setInitiallyMinimized(false);\r
814                 inlineAppender.setNewestMessageAtTop(false);\r
815                 inlineAppender.setScrollToLatestMessage(true);\r
816                 inlineAppender.setWidth(600);\r
817                 inlineAppender.setHeight(200);\r
818 \r
819                 testConsoleAppender(t, inlineAppender);\r
820         });\r
821 \r
822         s.test("InPageAppender with separate console HTML file test", function(t) {\r
823                 var inPageAppender = new log4javascript.InPageAppender();\r
824                 inPageAppender.setInitiallyMinimized(false);\r
825                 inPageAppender.setNewestMessageAtTop(false);\r
826                 inPageAppender.setScrollToLatestMessage(true);\r
827                 inPageAppender.setUseDocumentWrite(false);\r
828                 inPageAppender.setWidth(600);\r
829                 inPageAppender.setHeight(200);\r
830 \r
831                 testConsoleAppender(t, inPageAppender);\r
832         });\r
833 \r
834         s.test("PopUpAppender test", function(t) {\r
835                 var popUpAppender = new log4javascript.PopUpAppender();\r
836                 popUpAppender.setFocusPopUp(true);\r
837                 popUpAppender.setUseOldPopUp(false);\r
838                 popUpAppender.setNewestMessageAtTop(false);\r
839                 popUpAppender.setScrollToLatestMessage(true);\r
840                 popUpAppender.setComplainAboutPopUpBlocking(false);\r
841                 popUpAppender.setWidth(600);\r
842                 popUpAppender.setHeight(200);\r
843 \r
844                 testConsoleAppender(t, popUpAppender);\r
845                 \r
846                 \r
847         });\r
848 \r
849         s.test("PopUpAppender with separate console HTML file test", function(t) {\r
850                 var popUpAppender = new log4javascript.PopUpAppender();\r
851                 popUpAppender.setFocusPopUp(true);\r
852                 popUpAppender.setUseOldPopUp(false);\r
853                 popUpAppender.setNewestMessageAtTop(false);\r
854                 popUpAppender.setScrollToLatestMessage(true);\r
855                 popUpAppender.setComplainAboutPopUpBlocking(false);\r
856                 popUpAppender.setUseDocumentWrite(false);\r
857                 popUpAppender.setWidth(600);\r
858                 popUpAppender.setHeight(200);\r
859 \r
860                 testConsoleAppender(t, popUpAppender);\r
861         });\r
862 });