2 var assert = require('assert');
3 var vows = require('vows');
4 var layouts = require('../lib/layouts');
5 var sandbox = require('sandboxed-module');
6 var LoggingEvent = require('../lib/logger').LoggingEvent;
7 var cluster = require('cluster');
9 vows.describe('log4js cluster appender').addBatch({
10 'when in master mode': {
13 var registeredClusterEvents = [];
14 var loggingEvents = [];
15 var onChildProcessForked;
16 var onMasterReceiveChildMessage;
18 // Fake cluster module, so no real cluster listeners be really added
21 on: function(event, callback) {
22 registeredClusterEvents.push(event);
23 onChildProcessForked = callback;
31 on: function(event, callback) {
32 onMasterReceiveChildMessage = callback;
40 var fakeActualAppender = function(loggingEvent) {
41 loggingEvents.push(loggingEvent);
44 // Load appender and fake modules in it
45 var appenderModule = sandbox.require('../lib/appenders/clustered', {
47 'cluster': fakeCluster,
51 var masterAppender = appenderModule.appender({
52 actualAppenders: [fakeActualAppender, fakeActualAppender, fakeActualAppender],
53 appenders: [{}, {category: "test"}, {category: "wovs"}]
56 // Actual test - log message using masterAppender
57 masterAppender(new LoggingEvent('wovs', 'Info', ['masterAppender test']));
59 // Simulate a 'fork' event to register the master's message handler on our fake worker.
60 onChildProcessForked(fakeWorker);
61 // Simulate a cluster message received by the masterAppender.
62 var simulatedLoggingEvent = new LoggingEvent(
66 'message deserialization test',
67 {stack: 'my wrapped stack'}
70 onMasterReceiveChildMessage({
71 type : '::log-message',
72 event : JSON.stringify(simulatedLoggingEvent)
76 registeredClusterEvents: registeredClusterEvents,
77 loggingEvents: loggingEvents,
83 "should register 'fork' event listener on 'cluster'": function(topic) {
84 assert.equal(topic.registeredClusterEvents[0], 'fork');
87 "should log using actual appender": function(topic) {
88 assert.equal(topic.loggingEvents.length, 4);
89 assert.equal(topic.loggingEvents[0].data[0], 'masterAppender test');
90 assert.equal(topic.loggingEvents[1].data[0], 'masterAppender test');
91 assert.equal(topic.loggingEvents[2].data[0], 'message deserialization test');
92 assert.equal(topic.loggingEvents[2].data[1], 'my wrapped stack');
93 assert.equal(topic.loggingEvents[3].data[0], 'message deserialization test');
94 assert.equal(topic.loggingEvents[3].data[1], 'my wrapped stack');
99 'when in worker mode': {
103 var registeredProcessEvents = [];
105 // Fake cluster module, to fake we're inside a worker process
115 send: function(data) {
116 registeredProcessEvents.push(data);
121 // Load appender and fake modules in it
122 var appenderModule = sandbox.require('../lib/appenders/clustered', {
124 'cluster': fakeCluster,
127 'process': fakeProcess,
131 var workerAppender = appenderModule.appender();
133 // Actual test - log message using masterAppender
134 workerAppender(new LoggingEvent('wovs', 'Info', ['workerAppender test']));
135 workerAppender(new LoggingEvent('wovs', 'Info', [new Error('Error test')]));
138 registeredProcessEvents: registeredProcessEvents,
145 "worker appender should call process.send" : function(topic) {
146 assert.equal(topic.registeredProcessEvents[0].type, '::log-message');
148 JSON.parse(topic.registeredProcessEvents[0].event).data[0],
149 "workerAppender test"
153 "worker should serialize an Error correctly" : function(topic) {
154 assert.equal(topic.registeredProcessEvents[1].type, '::log-message');
155 assert(JSON.parse(topic.registeredProcessEvents[1].event).data[0].stack);
156 var actual = JSON.parse(topic.registeredProcessEvents[1].event).data[0].stack;
157 var expectedRegex = /^Error: Error test/;
159 actual.match(expectedRegex),
160 "Expected: \n\n " + actual + "\n\n to match " + expectedRegex