/* eslint-disable no-sync */ const assert = require('assert'); const rimraf = require('rimraf'); const fs = require('fs'); const path = require('path'); const winston = require('../../lib/winston'); const { MESSAGE } = require('triple-beam'); // // Remove all log fixtures // function removeFixtures(done) { rimraf(path.join(__dirname, '..', 'fixtures', 'logs', 'testtailrollingfiles*'), done); } let tailrollTransport = null; describe('winston/transports/file/tailrolling', function () { describe('An instance of the File Transport', function () { before(removeFixtures); after(removeFixtures); it('init logger AFTER cleaning up old files', function () { tailrollTransport = new winston.transports.File({ timestamp: false, json: false, filename: path.join(__dirname, '..', 'fixtures', 'logs', 'testtailrollingfiles.log'), maxsize: 4096, maxFiles: 3, tailable: true }) .on('open', console.log); // eslint-disable-line no-console }); it('and when passed more files than the maxFiles', function (done) { let created = 0; let loggedTotal = 0; function data(ch, kb) { return String.fromCharCode(65 + ch).repeat(kb * 1024 - 1); } function logKbytes(kbytes, txt) { const toLog = {}; toLog[MESSAGE] = data(txt, kbytes); tailrollTransport.log(toLog); } tailrollTransport.on('logged', function (info) { loggedTotal += info[MESSAGE].length + 1; if (loggedTotal >= 14 * 1024) { // just over 3 x 4kb files return done(); } if (loggedTotal % 4096 === 0) { created++; } // eslint-disable-next-line max-nested-callbacks setTimeout(() => logKbytes(1, created), 1); }); logKbytes(1, created); }); it('should be 3 log files, base to maxFiles - 1', function () { for (var num = 0; num < 4; num++) { const file = !num ? 'testtailrollingfiles.log' : 'testtailrollingfiles' + num + '.log'; const fullpath = path.join(__dirname, '..', 'fixtures', 'logs', file); if (num === 3) { return assert.ok(!fs.existsSync(fullpath)); } assert.ok(fs.existsSync(fullpath)); } return false; }); it('should have files in correct order', function () { ['D', 'C', 'B'].forEach(function (letter, i) { const file = !i ? 'testtailrollingfiles.log' : 'testtailrollingfiles' + i + '.log'; let content = fs.readFileSync(path.join(__dirname, '..', 'fixtures', 'logs', file), 'ascii'); content = content.replace(/\s+/g, ''); assert(content.match(new RegExp(letter, 'g'))[0].length, content.length); }); }); }); });