const tap = require("tap"); const fs = require("fs"); const log4js = require("../../lib/log4js"); const removeFiles = async filenames => { if (!Array.isArray(filenames)) filenames = [filenames]; const promises = filenames.map(filename => fs.promises.unlink(filename)); await Promise.allSettled(promises); }; tap.test("Drain event test", batch => { batch.test("Should emit pause event and resume when logging in a file with high frequency", t => { t.teardown(async () => { process.off("log4js:pause", process.listeners("log4js:pause")[process.listeners("log4js:pause").length - 1]); await removeFiles("logs/drain.log"); }); // Generate logger with 5k of highWaterMark config log4js.configure({ appenders: { file: { type: "file", filename: "logs/drain.log", highWaterMark: 5 * 1024 } }, categories: { default: { appenders: ["file"], level: "debug" } } }); let paused = false; let resumed = false; process.on("log4js:pause", value => { if (value) { paused = true; t.ok(value, "log4js:pause, true"); } else { resumed = true; t.ok(!value, "log4js:pause, false"); t.end(); } }); const logger = log4js.getLogger(); while (!paused && !resumed) { if (!paused) { logger.info("This is a test for emitting drain event"); } } }); batch.test("Should emit pause event and resume when logging in a date file with high frequency", (t) => { t.teardown(async () => { process.off("log4js:pause", process.listeners("log4js:pause")[process.listeners("log4js:pause").length - 1]); await removeFiles("logs/date-file-drain.log"); }); // Generate date file logger with 5kb of highWaterMark config log4js.configure({ appenders: { file: { type: "dateFile", filename: "logs/date-file-drain.log", highWaterMark: 5 * 1024 } }, categories: { default: { appenders: ["file"], level: "debug" } } }); let paused = false; let resumed = false; process.on("log4js:pause", value => { if (value) { paused = true; t.ok(value, "log4js:pause, true"); } else { resumed = true; t.ok(!value, "log4js:pause, false"); t.end(); } }); const logger = log4js.getLogger(); while (!paused && !resumed) { if (!paused) logger.info("This is a test for emitting drain event in date file logger"); } }); batch.teardown(async () => { try { const files = fs.readdirSync("logs"); await removeFiles(files.map(filename => `logs/${filename}`)); fs.rmdirSync("logs"); } catch (e) { // doesn't matter } }); batch.end(); });