154 lines
3.8 KiB
JavaScript
154 lines
3.8 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
/*
|
||
|
* file-stress.test.js: Tests for stressing File transport: volume, ambient event loop lag.
|
||
|
*
|
||
|
* (C) 2016 Charlie Robbins
|
||
|
* MIT LICENSE
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
const fs = require('fs');
|
||
|
const os = require('os');
|
||
|
const path = require('path');
|
||
|
const assume = require('assume');
|
||
|
const helpers = require('../helpers');
|
||
|
const split = require('split2');
|
||
|
const winston = require('../../lib/winston');
|
||
|
|
||
|
describe('File (stress)', function () {
|
||
|
this.timeout(30 * 1000);
|
||
|
|
||
|
const logPath = path.resolve(__dirname, '../fixtures/logs/file-stress-test.log');
|
||
|
beforeEach(function () {
|
||
|
try {
|
||
|
fs.unlinkSync(logPath);
|
||
|
} catch (ex) {
|
||
|
if (ex && ex.code !== 'ENOENT') { return done(ex); }
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it('should handle a high volume of writes', function (done) {
|
||
|
const logger = winston.createLogger({
|
||
|
transports: [new winston.transports.File({
|
||
|
filename: logPath
|
||
|
})]
|
||
|
});
|
||
|
|
||
|
const counters = {
|
||
|
write: 0,
|
||
|
read: 0
|
||
|
};
|
||
|
|
||
|
const interval = setInterval(function () {
|
||
|
logger.info(++counters.write);
|
||
|
}, 0);
|
||
|
|
||
|
setTimeout(function () {
|
||
|
clearInterval(interval);
|
||
|
|
||
|
helpers.tryRead(logPath)
|
||
|
.on('error', function (err) {
|
||
|
assume(err).false();
|
||
|
logger.close();
|
||
|
done();
|
||
|
})
|
||
|
.pipe(split())
|
||
|
.on('data', function (d) {
|
||
|
const json = JSON.parse(d);
|
||
|
assume(json.level).equal('info');
|
||
|
assume(json.message).equal(++counters.read);
|
||
|
})
|
||
|
.on('end', function () {
|
||
|
assume(counters.write).equal(counters.read);
|
||
|
logger.close();
|
||
|
done();
|
||
|
});
|
||
|
}, 10000);
|
||
|
});
|
||
|
|
||
|
it('should handle a high volume of large writes', function (done) {
|
||
|
const logger = winston.createLogger({
|
||
|
transports: [new winston.transports.File({
|
||
|
filename: logPath
|
||
|
})]
|
||
|
});
|
||
|
|
||
|
const counters = {
|
||
|
write: 0,
|
||
|
read: 0
|
||
|
};
|
||
|
|
||
|
const interval = setInterval(function () {
|
||
|
const msg = {
|
||
|
counter: ++counters.write,
|
||
|
message: 'a'.repeat(16384 - os.EOL.length - 1)
|
||
|
};
|
||
|
logger.info(msg);
|
||
|
}, 0);
|
||
|
|
||
|
setTimeout(function () {
|
||
|
clearInterval(interval);
|
||
|
|
||
|
helpers.tryRead(logPath)
|
||
|
.on('error', function (err) {
|
||
|
assume(err).false();
|
||
|
logger.close();
|
||
|
done();
|
||
|
})
|
||
|
.pipe(split())
|
||
|
.on('data', function (d) {
|
||
|
const json = JSON.parse(d);
|
||
|
assume(json.level).equal('info');
|
||
|
assume(json.message).equal('a'.repeat(16384 - os.EOL.length - 1));
|
||
|
assume(json.counter).equal(++counters.read);
|
||
|
})
|
||
|
.on('end', function () {
|
||
|
assume(counters.write).equal(counters.read);
|
||
|
logger.close();
|
||
|
done();
|
||
|
});
|
||
|
}, 10000);
|
||
|
});
|
||
|
|
||
|
it('should handle a high volume of large writes synchronous', function (done) {
|
||
|
const logger = winston.createLogger({
|
||
|
transports: [new winston.transports.File({
|
||
|
filename: logPath
|
||
|
})]
|
||
|
});
|
||
|
|
||
|
const counters = {
|
||
|
write: 0,
|
||
|
read: 0
|
||
|
};
|
||
|
|
||
|
const msgs = new Array(10).fill().map(() => ({
|
||
|
counter: ++counters.write,
|
||
|
message: 'a'.repeat(16384 - os.EOL.length - 1)
|
||
|
}));
|
||
|
msgs.forEach(msg => logger.info(msg));
|
||
|
|
||
|
setTimeout(function () {
|
||
|
helpers.tryRead(logPath)
|
||
|
.on('error', function (err) {
|
||
|
assume(err).false();
|
||
|
logger.close();
|
||
|
done();
|
||
|
})
|
||
|
.pipe(split())
|
||
|
.on('data', function (d) {
|
||
|
const json = JSON.parse(d);
|
||
|
assume(json.level).equal('info');
|
||
|
assume(json.message).equal('a'.repeat(16384 - os.EOL.length - 1));
|
||
|
assume(json.counter).equal(++counters.read);
|
||
|
})
|
||
|
.on('end', function () {
|
||
|
assume(counters.write).equal(counters.read);
|
||
|
logger.close();
|
||
|
done();
|
||
|
});
|
||
|
}, 10000);
|
||
|
});
|
||
|
});
|