log4js-node/test/tap/multiprocess-shutdown-test.js

128 lines
3.0 KiB
JavaScript

const { test } = require("tap");
const net = require("net");
const childProcess = require("child_process");
const sandbox = require("@log4js-node/sandboxed-module");
const log4js = require("../../lib/log4js");
test("multiprocess appender shutdown (master)", { timeout: 5000 }, t => {
log4js.configure({
appenders: {
stdout: { type: "stdout" },
multi: {
type: "multiprocess",
mode: "master",
loggerPort: 12345,
appender: "stdout"
}
},
categories: { default: { appenders: ["multi"], level: "debug" } }
});
setTimeout(() => {
log4js.shutdown(() => {
setTimeout(() => {
net
.connect({ port: 12345 }, () => {
t.fail("connection should not still work");
t.end();
})
.on("error", err => {
t.ok(err, "we got a connection error");
t.end();
});
}, 1000);
});
}, 1000);
});
test("multiprocess appender shutdown (worker)", t => {
const fakeConnection = {
evts: {},
msgs: [],
on(evt, cb) {
this.evts[evt] = cb;
},
write(data) {
this.msgs.push(data);
},
removeAllListeners() {
this.removeAllListenersCalled = true;
},
end(cb) {
this.endCb = cb;
}
};
const logLib = sandbox.require("../../lib/log4js", {
requires: {
net: {
createConnection() {
return fakeConnection;
}
}
}
});
logLib.configure({
appenders: { worker: { type: "multiprocess", mode: "worker" } },
categories: { default: { appenders: ["worker"], level: "debug" } }
});
logLib
.getLogger()
.info(
"Putting something in the buffer before the connection is established"
);
// nothing been written yet.
t.equal(fakeConnection.msgs.length, 0);
let shutdownFinished = false;
logLib.shutdown(() => {
shutdownFinished = true;
});
// still nothing been written yet.
t.equal(fakeConnection.msgs.length, 0);
fakeConnection.evts.connect();
setTimeout(() => {
t.equal(fakeConnection.msgs.length, 2);
t.ok(fakeConnection.removeAllListenersCalled);
fakeConnection.endCb();
t.ok(shutdownFinished);
t.end();
}, 500);
});
test("multiprocess appender crash (worker)", t => {
const loggerPort = 12346;
const vcr = require("../../lib/appenders/recording");
log4js.configure({
appenders: {
console: { type: "recording" },
multi: {
type: "multiprocess",
mode: "master",
loggerPort,
appender: "console"
}
},
categories: { default: { appenders: ["multi"], level: "debug" } }
});
const worker = childProcess.fork(require.resolve("../multiprocess-worker"), [
"start-multiprocess-worker",
loggerPort
]);
worker.on("message", m => {
if (m === "worker is done") {
setTimeout(() => {
worker.kill();
t.equal(vcr.replay()[0].data[0], "Logging from worker");
log4js.shutdown(() => t.end());
}, 100);
}
});
});