Skip to content

Commit a95117c

Browse files
author
Danny Brain
committed
Add tests for multiprocess file appender
1 parent 097390b commit a95117c

File tree

3 files changed

+176
-2
lines changed

3 files changed

+176
-2
lines changed

lib/appenders/multiprocess.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var LogServer = function createLogServer(config) {
2020
// JSON.parse failed, just log the contents probably a naughty.
2121
actualAppender(createLoggingEvent('ERROR', 'Unable to parse log: ' + logMessage));
2222
}
23-
})
23+
});
2424
});
2525
});
2626
server.listen(config.loggerPort || 5000, config.loggerHost || 'localhost');

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"devDependencies": {
2727
"vows": ">=0.5.2",
2828
"sandboxed-module": ">= 0.1.1",
29-
"hook.io": "0.7.7"
29+
"hook.io": "0.7.7",
30+
"underscore": "1.2.1"
3031
}
3132
}

test/multiprocessAppender.js

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
var vows = require('vows');
2+
var assert = require('assert');
3+
var sandbox = require('sandboxed-module');
4+
var _ = require('underscore');
5+
6+
function fancyResultingMultiprocessAppender(opts) {
7+
var result = { clientOns: {}, serverOns: {}, logged: [], ended: [] };
8+
9+
var fakeSocket = {
10+
on: function (event, fn) {
11+
result.clientOns[event] = fn;
12+
if (event === 'connect') {
13+
fn();
14+
}
15+
},
16+
end: function (data, encoding) {
17+
result.ended.push({ data: data, encoding: encoding });
18+
}
19+
}
20+
21+
var fakeServerSocket = {
22+
on: function (event, fn) {
23+
result.serverOns[event] = fn;
24+
if (event === 'connect') {
25+
fn();
26+
}
27+
}
28+
}
29+
30+
var fakeServer = {
31+
listen: function (port, host) {
32+
result.listenPort = port;
33+
result.listenHost = host;
34+
}
35+
}
36+
37+
var fakeNet = {
38+
createServer: function (fn) {
39+
fn(fakeServerSocket);
40+
return fakeServer;
41+
},
42+
createConnection: function (port, host) {
43+
result.connectPort = port;
44+
result.connectHost = host;
45+
return fakeSocket;
46+
}
47+
}
48+
49+
var fakeLog4Js = {
50+
appenderMakers: {}
51+
};
52+
fakeLog4Js.loadAppender = function (appender) {
53+
fakeLog4Js.appenderMakers[appender] = function (config) {
54+
result.actualLoggerConfig = config;
55+
return function log(logEvent) {
56+
result.logged.push(logEvent);
57+
}
58+
};
59+
};
60+
61+
return { theResult: result,
62+
theModule: sandbox.require('../lib/appenders/multiprocess', {
63+
requires: {
64+
'../log4js': fakeLog4Js,
65+
'net': fakeNet
66+
}
67+
})
68+
};
69+
}
70+
71+
function logMessages(result, logs, raw) {
72+
logs.forEach(function log(item) {
73+
var logItem = { startTime: "Wed, 02 Nov 2011 21:46:39 GMT", level: { levelStr: 'DEBUG' }, data: [ item ] };
74+
result.serverOns.data(JSON.stringify(logItem));
75+
result.serverOns.end();
76+
result.serverOns.connect();
77+
});
78+
if (raw) {
79+
raw.forEach(function log(rawItem) {
80+
result.serverOns.data(rawItem);
81+
result.serverOns.end();
82+
result.serverOns.connect();
83+
});
84+
}
85+
}
86+
87+
88+
vows.describe('log4js multiprocessAppender').addBatch({
89+
'master': {
90+
topic: function() {
91+
var fancy = fancyResultingMultiprocessAppender();
92+
var logger = fancy.theModule.configure({ mode: 'master', 'loggerPort': 5001, 'loggerHost': 'abba', appender: { type: 'file' } });
93+
logMessages(fancy.theResult, [ 'ALRIGHTY THEN', 'OH WOW' ]);
94+
return fancy.theResult;
95+
},
96+
97+
'should write to the actual appender': function (result) {
98+
assert.equal(result.listenPort, 5001);
99+
assert.equal(result.listenHost, 'abba');
100+
assert.equal(result.logged.length, 2);
101+
assert.equal(result.logged[0].data[0], 'ALRIGHTY THEN');
102+
assert.equal(result.logged[1].data[0], 'OH WOW');
103+
},
104+
105+
'data written should be formatted correctly': function (result) {
106+
assert.equal(result.logged[0].level.toString(), 'DEBUG');
107+
assert.equal(result.logged[0].data, 'ALRIGHTY THEN');
108+
assert.isTrue(typeof(result.logged[0].startTime) === 'object');
109+
assert.equal(result.logged[1].level.toString(), 'DEBUG');
110+
assert.equal(result.logged[1].data, 'OH WOW');
111+
assert.isTrue(typeof(result.logged[1].startTime) === 'object');
112+
},
113+
114+
'the actual logger should get the right config': function (result) {
115+
assert.equal(result.actualLoggerConfig.type, 'file');
116+
},
117+
118+
'client should not be called': function (result) {
119+
assert.equal(_.keys(result.clientOns).length, 0);
120+
}
121+
},
122+
'master with bad request': {
123+
topic: function() {
124+
var fancy = fancyResultingMultiprocessAppender();
125+
var logger = fancy.theModule.configure({ mode: 'master', 'loggerPort': 5001, 'loggerHost': 'abba', appender: { type: 'file' } });
126+
logMessages(fancy.theResult, [], [ 'ALRIGHTY THEN', 'OH WOW' ]);
127+
return fancy.theResult;
128+
},
129+
130+
'should write to the actual appender': function (result) {
131+
assert.equal(result.listenPort, 5001);
132+
assert.equal(result.listenHost, 'abba');
133+
assert.equal(result.logged.length, 2);
134+
assert.equal(result.logged[0].data[0], 'Unable to parse log: ALRIGHTY THEN');
135+
assert.equal(result.logged[1].data[0], 'Unable to parse log: OH WOW');
136+
},
137+
138+
'data written should be formatted correctly': function (result) {
139+
assert.equal(result.logged[0].level.toString(), 'ERROR');
140+
assert.equal(result.logged[0].data, 'Unable to parse log: ALRIGHTY THEN');
141+
assert.isTrue(typeof(result.logged[0].startTime) === 'object');
142+
assert.equal(result.logged[1].level.toString(), 'ERROR');
143+
assert.equal(result.logged[1].data, 'Unable to parse log: OH WOW');
144+
assert.isTrue(typeof(result.logged[1].startTime) === 'object');
145+
}
146+
},
147+
'worker': {
148+
'should emit logging events to the master': {
149+
topic: function() {
150+
var fancy = fancyResultingMultiprocessAppender();
151+
var logger = fancy.theModule.configure({ loggerHost: 'baba', loggerPort: 1232, name: 'ohno', mode: 'worker', appender: { type: 'file' } });
152+
logger({ level: { levelStr: 'INFO' }, data: "ALRIGHTY THEN", startTime: '2011-10-27T03:53:16.031Z' });
153+
logger({ level: { levelStr: 'DEBUG' }, data: "OH WOW", startTime: '2011-10-27T04:53:16.031Z'});
154+
return fancy.theResult;
155+
},
156+
157+
'client configuration should be correct': function (result) {
158+
assert.equal(result.connectHost, 'baba');
159+
assert.equal(result.connectPort, 1232);
160+
},
161+
162+
'should not write to the actual appender': function (result) {
163+
assert.equal(result.logged.length, 0);
164+
assert.equal(result.ended.length, 2);
165+
assert.equal(result.ended[0].data, JSON.stringify({ level: { levelStr: 'INFO' }, data: "ALRIGHTY THEN", startTime: '2011-10-27T03:53:16.031Z' }));
166+
assert.equal(result.ended[0].encoding, 'utf8');
167+
assert.equal(result.ended[1].data, JSON.stringify({ level: { levelStr: 'DEBUG' }, data: "OH WOW", startTime: '2011-10-27T04:53:16.031Z'}));
168+
assert.equal(result.ended[1].encoding, 'utf8');
169+
assert.equal(_.keys(result.serverOns).length, 0);
170+
}
171+
}
172+
}
173+
}).exportTo(module);

0 commit comments

Comments
 (0)