You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
654 lines
18 KiB
JavaScript
654 lines
18 KiB
JavaScript
/**
|
|
* This file will be removed.
|
|
*/
|
|
'use strict';
|
|
|
|
require('should');
|
|
|
|
const fs = require('fs')
|
|
, zlib = require('zlib')
|
|
, proxyquire = require('proxyquire').noPreserveCache()
|
|
, util = require('util')
|
|
, async = require('async')
|
|
, streams = require('stream');
|
|
|
|
let fakeNow = new Date(2012, 8, 12, 10, 37, 11);
|
|
const mockNow = () => fakeNow;
|
|
const RollingFileWriteStream = proxyquire('../lib/RollingFileWriteStream', {
|
|
'./now': mockNow
|
|
});
|
|
const DateRollingFileStream = proxyquire('../lib/DateRollingFileStream', {
|
|
'./RollingFileWriteStream': RollingFileWriteStream
|
|
});
|
|
|
|
function remove(filename, cb) {
|
|
fs.unlink(filename, function () {
|
|
cb();
|
|
});
|
|
}
|
|
|
|
describe('DateRollingFileStream', function () {
|
|
describe('arguments', function () {
|
|
var stream;
|
|
|
|
before(function (done) {
|
|
stream = new DateRollingFileStream(
|
|
__dirname + '/test-date-rolling-file-stream-1',
|
|
'yyyy-MM-dd.hh'
|
|
);
|
|
done();
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(__dirname + '/test-date-rolling-file-stream-1', done);
|
|
});
|
|
|
|
it('should take a filename and a pattern and return a WritableStream', function (done) {
|
|
stream.filename.should.eql(__dirname + '/test-date-rolling-file-stream-1');
|
|
stream.options.pattern.should.eql('yyyy-MM-dd.hh');
|
|
stream.should.be.instanceOf(streams.Writable);
|
|
done();
|
|
});
|
|
|
|
it('with default settings for the underlying stream', function (done) {
|
|
stream.currentFileStream.mode.should.eql(420);
|
|
stream.currentFileStream.flags.should.eql('a');
|
|
done();
|
|
});
|
|
});
|
|
|
|
describe('default arguments', function () {
|
|
var stream;
|
|
|
|
before(function (done) {
|
|
stream = new DateRollingFileStream(__dirname + '/test-date-rolling-file-stream-2');
|
|
done();
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(__dirname + '/test-date-rolling-file-stream-2', done);
|
|
});
|
|
|
|
it('should have pattern of .yyyy-MM-dd', function (done) {
|
|
stream.options.pattern.should.eql('yyyy-MM-dd');
|
|
done();
|
|
});
|
|
});
|
|
|
|
describe('with stream arguments', function () {
|
|
var stream;
|
|
|
|
before(function (done) {
|
|
stream = new DateRollingFileStream(
|
|
__dirname + '/test-date-rolling-file-stream-3',
|
|
'yyyy-MM-dd',
|
|
{mode: parseInt('0666', 8)}
|
|
);
|
|
done();
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(__dirname + '/test-date-rolling-file-stream-3', done);
|
|
});
|
|
|
|
it('should pass them to the underlying stream', function (done) {
|
|
stream.theStream.mode.should.eql(parseInt('0666', 8));
|
|
done();
|
|
});
|
|
});
|
|
|
|
describe('with stream arguments but no pattern', function () {
|
|
var stream;
|
|
|
|
before(function (done) {
|
|
stream = new DateRollingFileStream(
|
|
__dirname + '/test-date-rolling-file-stream-4',
|
|
{mode: parseInt('0666', 8)}
|
|
);
|
|
done();
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(__dirname + '/test-date-rolling-file-stream-4', done);
|
|
});
|
|
|
|
it('should pass them to the underlying stream', function (done) {
|
|
stream.theStream.mode.should.eql(parseInt('0666', 8));
|
|
done();
|
|
});
|
|
|
|
it('should use default pattern', function (done) {
|
|
stream.options.pattern.should.eql('yyyy-MM-dd');
|
|
done();
|
|
});
|
|
});
|
|
|
|
describe('with a pattern of .yyyy-MM-dd', function () {
|
|
var stream;
|
|
|
|
before(function (done) {
|
|
stream = new DateRollingFileStream(
|
|
__dirname + '/test-date-rolling-file-stream-5', '.yyyy-MM-dd',
|
|
null
|
|
);
|
|
stream.write('First message\n', 'utf8', done);
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(__dirname + '/test-date-rolling-file-stream-5', done);
|
|
});
|
|
|
|
it('should create a file with the base name', function (done) {
|
|
fs.readFile(__dirname + '/test-date-rolling-file-stream-5', 'utf8', function (err, contents) {
|
|
contents.should.eql('First message\n');
|
|
done(err);
|
|
});
|
|
});
|
|
|
|
describe('when the day changes', function () {
|
|
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 13, 0, 10, 12);
|
|
stream.write('Second message\n', 'utf8', done);
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(__dirname + '/test-date-rolling-file-stream-5.2012-09-12', done);
|
|
});
|
|
|
|
describe('the number of files', function () {
|
|
var files = [];
|
|
|
|
before(function (done) {
|
|
fs.readdir(__dirname, function (err, list) {
|
|
files = list;
|
|
done(err);
|
|
});
|
|
});
|
|
|
|
it('should be two', function (done) {
|
|
files.filter(
|
|
function (file) {
|
|
return file.indexOf('test-date-rolling-file-stream-5') > -1;
|
|
}
|
|
).should.have.length(2);
|
|
done();
|
|
});
|
|
});
|
|
|
|
describe('the file without a date', function () {
|
|
it('should contain the second message', function (done) {
|
|
fs.readFile(
|
|
__dirname + '/test-date-rolling-file-stream-5', 'utf8',
|
|
function (err, contents) {
|
|
contents.should.eql('Second message\n');
|
|
done(err);
|
|
}
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('the file with the date', function () {
|
|
it('should contain the first message', function (done) {
|
|
fs.readFile(
|
|
__dirname + '/test-date-rolling-file-stream-5.2012-09-12', 'utf8',
|
|
function (err, contents) {
|
|
contents.should.eql('First message\n');
|
|
done(err);
|
|
}
|
|
);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('with alwaysIncludePattern', function () {
|
|
var stream;
|
|
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 12, 11, 10, 12);
|
|
remove(
|
|
__dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-11.log',
|
|
function () {
|
|
stream = new DateRollingFileStream(
|
|
__dirname + '/test-date-rolling-file-stream-pattern',
|
|
'.yyyy-MM-dd-hh.log',
|
|
{alwaysIncludePattern: true}
|
|
);
|
|
setTimeout(function () {
|
|
stream.write('First message\n', 'utf8', done);
|
|
}, 50);
|
|
}
|
|
);
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(__dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-11.log', done);
|
|
});
|
|
|
|
it('should create a file with the pattern set', function (done) {
|
|
fs.readFile(
|
|
__dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-11.log', 'utf8',
|
|
function (err, contents) {
|
|
contents.should.eql('First message\n');
|
|
done(err);
|
|
}
|
|
);
|
|
});
|
|
|
|
describe('when the day changes', function () {
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 12, 12, 10, 12);
|
|
stream.write('Second message\n', 'utf8', done);
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(__dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-12.log', done);
|
|
});
|
|
|
|
describe('the number of files', function () {
|
|
it('should be two', function (done) {
|
|
fs.readdir(__dirname, function (err, files) {
|
|
files.filter(
|
|
function (file) {
|
|
return file.indexOf('test-date-rolling-file-stream-pattern') > -1;
|
|
}
|
|
).should.have.length(2);
|
|
done(err);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('the file with the later date', function () {
|
|
it('should contain the second message', function (done) {
|
|
fs.readFile(
|
|
__dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-12.log', 'utf8',
|
|
function (err, contents) {
|
|
contents.should.eql('Second message\n');
|
|
done(err);
|
|
}
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('the file with the date', function () {
|
|
it('should contain the first message', function (done) {
|
|
fs.readFile(
|
|
__dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-11.log', 'utf8',
|
|
function (err, contents) {
|
|
contents.should.eql('First message\n');
|
|
done(err);
|
|
}
|
|
);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('with a pattern that evaluates to digits', function() {
|
|
let stream;
|
|
before(done => {
|
|
fakeNow = new Date(2012, 8, 12, 0, 10, 12);
|
|
stream = new DateRollingFileStream(
|
|
__dirname + '/digits.log',
|
|
'.yyyyMMdd'
|
|
);
|
|
stream.write('First message\n', 'utf8', done);
|
|
});
|
|
|
|
describe('when the day changes', function () {
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 13, 0, 10, 12);
|
|
stream.write('Second message\n', 'utf8', done);
|
|
});
|
|
|
|
it('should be two files (it should not get confused by indexes)', function (done) {
|
|
fs.readdir(__dirname, function (err, files) {
|
|
var logFiles = files.filter(
|
|
function (file) {
|
|
return file.indexOf('digits.log') > -1;
|
|
}
|
|
);
|
|
logFiles.should.have.length(2);
|
|
|
|
fs.readFile(__dirname + '/digits.log.20120912', 'utf8',
|
|
(err, contents) => {
|
|
contents.should.eql('First message\n');
|
|
fs.readFile(__dirname + '/digits.log', 'utf8', (e, c) => {
|
|
c.should.eql('Second message\n');
|
|
done(err || e);
|
|
});
|
|
}
|
|
);
|
|
});
|
|
});
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(
|
|
__dirname + '/digits.log',
|
|
function () {
|
|
remove(__dirname + '/digits.log.20120912', done);
|
|
}
|
|
);
|
|
});
|
|
|
|
});
|
|
|
|
describe('with compress option', function () {
|
|
var stream;
|
|
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 12, 0, 10, 12);
|
|
stream = new DateRollingFileStream(
|
|
__dirname + '/compressed.log',
|
|
'.yyyy-MM-dd',
|
|
{compress: true}
|
|
);
|
|
stream.write('First message\n', 'utf8', done);
|
|
});
|
|
|
|
describe('when the day changes', function () {
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 13, 0, 10, 12);
|
|
stream.write('Second message\n', 'utf8', done);
|
|
});
|
|
|
|
it('should be two files, one compressed', function (done) {
|
|
fs.readdir(__dirname, function (err, files) {
|
|
var logFiles = files.filter(
|
|
function (file) {
|
|
return file.indexOf('compressed.log') > -1;
|
|
}
|
|
);
|
|
logFiles.should.have.length(2);
|
|
|
|
zlib.gunzip(
|
|
fs.readFileSync(__dirname + '/compressed.log.2012-09-12.gz'),
|
|
function (err, contents) {
|
|
contents.toString('utf8').should.eql('First message\n');
|
|
fs.readFileSync(__dirname + '/compressed.log', 'utf8').should.eql('Second message\n');
|
|
done(err);
|
|
}
|
|
);
|
|
});
|
|
});
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(
|
|
__dirname + '/compressed.log',
|
|
function () {
|
|
remove(__dirname + '/compressed.log.2012-09-12.gz', done);
|
|
}
|
|
);
|
|
});
|
|
|
|
});
|
|
|
|
describe('with keepFileExt option', function () {
|
|
var stream;
|
|
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 12, 0, 10, 12);
|
|
stream = new DateRollingFileStream(
|
|
__dirname + '/keepFileExt.log',
|
|
'.yyyy-MM-dd',
|
|
{keepFileExt: true}
|
|
);
|
|
stream.write('First message\n', 'utf8', done);
|
|
});
|
|
|
|
describe('when the day changes', function () {
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 13, 0, 10, 12);
|
|
stream.write('Second message\n', 'utf8', done);
|
|
});
|
|
|
|
it('should be two files', function (done) {
|
|
fs.readdir(__dirname, function (err, files) {
|
|
var logFiles = files.filter(
|
|
function (file) {
|
|
return file.indexOf('keepFileExt') > -1;
|
|
}
|
|
);
|
|
logFiles.should.have.length(2);
|
|
fs.readFileSync(__dirname + '/keepFileExt.2012-09-12.log', 'utf8')
|
|
.should.eql('First message\n');
|
|
fs.readFileSync(__dirname + '/keepFileExt.log', 'utf8')
|
|
.should.eql('Second message\n');
|
|
done(err);
|
|
});
|
|
});
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(
|
|
__dirname + '/keepFileExt.log',
|
|
function () {
|
|
remove(__dirname + '/keepFileExt.2012-09-12.log', done);
|
|
}
|
|
);
|
|
});
|
|
|
|
});
|
|
|
|
describe('with compress option and keepFileExt option', function () {
|
|
var stream;
|
|
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 12, 0, 10, 12);
|
|
stream = new DateRollingFileStream(
|
|
__dirname + '/compressedAndKeepExt.log',
|
|
'.yyyy-MM-dd',
|
|
{compress: true, keepFileExt: true}
|
|
);
|
|
stream.write('First message\n', 'utf8', done);
|
|
});
|
|
|
|
describe('when the day changes', function () {
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 13, 0, 10, 12);
|
|
stream.write('Second message\n', 'utf8', done);
|
|
});
|
|
|
|
it('should be two files, one compressed', function (done) {
|
|
fs.readdir(__dirname, function (err, files) {
|
|
var logFiles = files.filter(
|
|
function (file) {
|
|
return file.indexOf('compressedAndKeepExt') > -1;
|
|
}
|
|
);
|
|
logFiles.should.have.length(2);
|
|
|
|
zlib.gunzip(
|
|
fs.readFileSync(__dirname + '/compressedAndKeepExt.2012-09-12.log.gz'),
|
|
function (err, contents) {
|
|
contents.toString('utf8').should.eql('First message\n');
|
|
fs.readFileSync(__dirname + '/compressedAndKeepExt.log', 'utf8')
|
|
.should.eql('Second message\n');
|
|
done(err);
|
|
}
|
|
);
|
|
});
|
|
});
|
|
});
|
|
|
|
after(function (done) {
|
|
remove(
|
|
__dirname + '/compressedAndKeepExt.log',
|
|
function () {
|
|
remove(__dirname + '/compressedAndKeepExt.2012-09-12.log.gz', done);
|
|
}
|
|
);
|
|
});
|
|
|
|
});
|
|
|
|
describe('with daysToKeep option', function () {
|
|
var stream;
|
|
var daysToKeep = 4;
|
|
var numOriginalLogs = 10;
|
|
|
|
before(function (done) {
|
|
var day = 0;
|
|
var streams = [];
|
|
async.whilst(
|
|
function () {
|
|
return day < numOriginalLogs;
|
|
},
|
|
function (nextCallback) {
|
|
fakeNow = new Date(2012, 8, 20 - day, 0, 10, 12);
|
|
var currentStream = new DateRollingFileStream(
|
|
__dirname + '/daysToKeep.log',
|
|
'.yyyy-MM-dd',
|
|
{
|
|
alwaysIncludePattern: true,
|
|
daysToKeep: daysToKeep
|
|
}
|
|
);
|
|
async.waterfall([
|
|
function (callback) {
|
|
currentStream.write(util.format('Message on day %d\n', day), 'utf8', callback);
|
|
},
|
|
function (callback) {
|
|
fs.utimes(currentStream.filename, fakeNow, fakeNow, callback);
|
|
}
|
|
],
|
|
function (err) {
|
|
day++;
|
|
streams.push(currentStream);
|
|
nextCallback(err);
|
|
});
|
|
},
|
|
function (err) {
|
|
stream = streams[0];
|
|
done(err);
|
|
});
|
|
});
|
|
|
|
describe('when the day changes', function () {
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 21, 0, 10, 12);
|
|
stream.write('Second message\n', 'utf8', done);
|
|
});
|
|
|
|
it('should be daysToKeep + 1 files left from numOriginalLogs', function (done) {
|
|
fs.readdir(__dirname, function (err, files) {
|
|
var logFiles = files.filter(
|
|
function (file) {
|
|
return file.indexOf('daysToKeep.log') > -1;
|
|
}
|
|
);
|
|
logFiles.should.have.length(daysToKeep + 1);
|
|
done(err);
|
|
});
|
|
});
|
|
});
|
|
|
|
after(function (done) {
|
|
fs.readdir(__dirname, function (err, files) {
|
|
var logFiles = files.filter(
|
|
function (file) {
|
|
return file.indexOf('daysToKeep.log') > -1;
|
|
}
|
|
);
|
|
async.each(logFiles, (logFile, nextCallback) => {
|
|
remove(__dirname + '/' + logFile, nextCallback);
|
|
}, done);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('with daysToKeep and compress options', function () {
|
|
var stream;
|
|
var daysToKeep = 4;
|
|
var numOriginalLogs = 10;
|
|
|
|
before(function (done) {
|
|
var day = 0;
|
|
var streams = [];
|
|
async.whilst(
|
|
function () {
|
|
return day < numOriginalLogs;
|
|
},
|
|
function (nextCallback) {
|
|
fakeNow = new Date(2012, 8, 20 - day, 0, 10, 12);
|
|
var currentStream = new DateRollingFileStream(
|
|
__dirname + '/compressedDaysToKeep.log',
|
|
'.yyyy-MM-dd',
|
|
{
|
|
alwaysIncludePattern: true,
|
|
compress: true,
|
|
daysToKeep: daysToKeep
|
|
}
|
|
);
|
|
async.waterfall([
|
|
function (callback) {
|
|
currentStream.write(util.format('Message on day %d\n', day), 'utf8', callback);
|
|
},
|
|
function (callback) {
|
|
var filename = currentStream.filename;
|
|
var gzip = zlib.createGzip();
|
|
var inp = fs.createReadStream(filename);
|
|
var out = fs.createWriteStream(filename+'.gz');
|
|
inp.pipe(gzip).pipe(out);
|
|
|
|
out.on('finish', function () {
|
|
fs.unlink(filename, callback);
|
|
});
|
|
},
|
|
function (callback) {
|
|
fs.utimes(currentStream.filename + '.gz', fakeNow, fakeNow, callback);
|
|
}
|
|
],
|
|
function (err) {
|
|
day++;
|
|
streams.push(currentStream);
|
|
nextCallback(err);
|
|
});
|
|
},
|
|
() => {
|
|
stream = streams[0];
|
|
done();
|
|
}
|
|
);
|
|
});
|
|
|
|
describe('when the day changes', function () {
|
|
before(function (done) {
|
|
fakeNow = new Date(2012, 8, 21, 0, 10, 12);
|
|
stream.write('New file message\n', 'utf8', done);
|
|
});
|
|
|
|
it('should be 4 files left from original 3', function (done) {
|
|
fs.readdir(__dirname, function (err, files) {
|
|
var logFiles = files.filter(
|
|
function (file) {
|
|
return file.indexOf('compressedDaysToKeep.log') > -1;
|
|
}
|
|
);
|
|
logFiles.should.have.length(daysToKeep + 1);
|
|
done(err);
|
|
});
|
|
});
|
|
});
|
|
|
|
after(function (done) {
|
|
fs.readdir(__dirname, function (err, files) {
|
|
var logFiles = files.filter(
|
|
function (file) {
|
|
return file.indexOf('compressedDaysToKeep.log') > -1;
|
|
}
|
|
);
|
|
async.each(logFiles, function (logFile, nextCallback) {
|
|
remove(__dirname + '/' + logFile, nextCallback);
|
|
},
|
|
function (err) {
|
|
done(err);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|