Skip to content

Commit 914b846

Browse files
authored
feat: add guardrails to the instantiation of a Profiler (#2226)
Authored-by: debaduttakore <[email protected]> Reviewed-by: @wbt @maverick1872 Merged-by: maverick1872 <[email protected]> Ref: 2091
1 parent 23cb80c commit 914b846

File tree

2 files changed

+49
-21
lines changed

2 files changed

+49
-21
lines changed

lib/winston/profiler.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
*/
77

88
'use strict';
9-
109
/**
1110
* TODO: add class description.
1211
* @type {Profiler}
1312
* @private
1413
*/
15-
module.exports = class Profiler {
14+
class Profiler {
1615
/**
1716
* Constructor function for the Profiler instance used by
1817
* `Logger.prototype.startTimer`. When done is called the timer will finish
@@ -21,12 +20,13 @@ module.exports = class Profiler {
2120
* @private
2221
*/
2322
constructor(logger) {
24-
if (!logger) {
25-
throw new Error('Logger is required for profiling.');
23+
const Logger = require('./logger');
24+
if (typeof logger !== 'object' || Array.isArray(logger) || !(logger instanceof Logger)) {
25+
throw new Error('Logger is required for profiling');
26+
} else {
27+
this.logger = logger;
28+
this.start = Date.now();
2629
}
27-
28-
this.logger = logger;
29-
this.start = Date.now();
3030
}
3131

3232
/**
@@ -49,3 +49,5 @@ module.exports = class Profiler {
4949
return this.logger.write(info);
5050
}
5151
};
52+
53+
module.exports = Profiler;

test/unit/winston/profiler.test.js

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,27 @@
77
*/
88

99
const assume = require('assume');
10+
const Logger = require('../../../lib/winston/logger');
1011
const Profiler = require('../../../lib/winston/profiler');
11-
12+
const { PassThrough } = require('stream');
1213
describe('Profiler', function () {
1314
it('new Profiler()', function () {
1415
assume(function () {
15-
var profiler = new Profiler();
16-
}).throws();
16+
new Profiler();
17+
}).throws('Logger is required for profiling');
1718
});
1819

1920
it('.done({ info })', function (done) {
20-
var profiler = new Profiler({
21-
write: function (info) {
22-
assume(info).is.an('object');
23-
assume(info.something).equals('ok');
24-
assume(info.level).equals('info');
25-
assume(info.durationMs).is.a('number');
26-
assume(info.message).equals('testing1');
27-
done();
28-
}
29-
});
30-
21+
const logger = new Logger();
22+
logger.write = function (info) {
23+
assume(info).is.an('object');
24+
assume(info.something).equals('ok');
25+
assume(info.level).equals('info');
26+
assume(info.durationMs).is.a('number');
27+
assume(info.message).equals('testing1');
28+
done();
29+
};
30+
var profiler = new Profiler(logger);
3131
setTimeout(function () {
3232
profiler.done({
3333
something: 'ok',
@@ -36,4 +36,30 @@ describe('Profiler', function () {
3636
});
3737
}, 200);
3838
});
39+
40+
it('non logger object', function(){
41+
assume(function() {
42+
new Profiler(new Error('Unknown error'));
43+
}).throws('Logger is required for profiling');
44+
45+
assume(function () {
46+
new Profiler({a:'b'});
47+
}).throws('Logger is required for profiling');
48+
49+
assume(function(){
50+
new Profiler([1,2,3,4]);
51+
}).throws('Logger is required for profiling');
52+
53+
assume(function () {
54+
new Profiler(new PassThrough());
55+
}).throws('Logger is required for profiling');
56+
57+
assume(function () {
58+
new Profiler(2);
59+
}).throws('Logger is required for profiling');
60+
61+
assume(function () {
62+
new Profiler('1');
63+
}).throws('Logger is required for profiling');
64+
})
3965
});

0 commit comments

Comments
 (0)