Comparing version 0.0.2 to 0.1.0
0.1.0 / 09-06-2011 | ||
================== | ||
* added; #ignore method | ||
* added; multiple instance support | ||
0.0.2 / 09-06-2011 | ||
@@ -3,0 +9,0 @@ ================== |
141
index.js
/** | ||
* Gleak - detect global var leaks. | ||
* @api public | ||
*/ | ||
module.exports = exports = function gleak () { | ||
return new Gleak; | ||
} | ||
/** | ||
* Version. | ||
* @api public | ||
*/ | ||
exports.version = '0.1.0'; | ||
/** | ||
* Express middleware. | ||
* @api public | ||
*/ | ||
exports.middleware = function gleakMiddleware (stream, format) { | ||
var g = new Gleak; | ||
if (!format) { | ||
switch (typeof stream) { | ||
case 'string': | ||
format = stream; | ||
stream = process.stderr; | ||
break; | ||
case 'undefined': | ||
format = g.format; | ||
stream = process.stderr; | ||
break; | ||
default: | ||
format = g.format; | ||
} | ||
} | ||
var known = []; | ||
setTimeout(print, 1000); | ||
function print () { | ||
g.detect().forEach(function (leak) { | ||
if (~known.indexOf(leak)) return; | ||
known.push(leak); | ||
stream.write(format.replace(/%s/, leak) + '\n'); | ||
}); | ||
} | ||
return function gleakMiddleware (req, res, next) { | ||
if (res._gleak) return next(); | ||
res._gleak = true; | ||
var send = res.send; | ||
res.send = function () { | ||
res.send = send; | ||
res.send.apply(res, arguments); | ||
print(); | ||
} | ||
next(); | ||
} | ||
} | ||
/** | ||
* Gleak constructor | ||
* @api private | ||
*/ | ||
function Gleak () { | ||
this.whitelist = this.whitelist.slice(); | ||
} | ||
/** | ||
* Whitelisted globals. | ||
@@ -11,3 +82,3 @@ * @api public | ||
exports.whitelist = [ | ||
Gleak.prototype.whitelist = [ | ||
setTimeout | ||
@@ -28,12 +99,5 @@ , setInterval | ||
exports.format = '\x1b[31mGleak!:\x1b[0m %s'; | ||
Gleak.prototype.format = '\x1b[31mGleak!:\x1b[0m %s'; | ||
/** | ||
* Version. | ||
* @api public | ||
*/ | ||
exports.version = '0.0.2'; | ||
/** | ||
* Detects global variable leaks. | ||
@@ -43,4 +107,4 @@ * @api public | ||
exports.detect = function detect () { | ||
var whitelist = exports.whitelist | ||
Gleak.prototype.detect = function detect () { | ||
var whitelist = this.whitelist | ||
, ret = [] | ||
@@ -72,5 +136,6 @@ | ||
exports.print = function print () { | ||
exports.detect().forEach(function (leak) { | ||
console.error(exports.format, leak); | ||
Gleak.prototype.print = function print () { | ||
var format = this.format; | ||
this.detect().forEach(function (leak) { | ||
console.error(format, leak); | ||
}); | ||
@@ -80,48 +145,14 @@ } | ||
/** | ||
* Express middleware. | ||
* Add items to the whitelist disallowing duplicates. | ||
* @api public | ||
*/ | ||
exports.middleware = function gleakMiddleware (stream, format) { | ||
if (!format) { | ||
switch (typeof stream) { | ||
case 'string': | ||
format = stream; | ||
stream = process.stderr; | ||
break; | ||
case 'undefined': | ||
format = exports.format; | ||
stream = process.stderr; | ||
break; | ||
default: | ||
format = exports.format; | ||
} | ||
Gleak.prototype.ignore = function ignore () { | ||
var i = arguments.length; | ||
while (i--) { | ||
if (~this.whitelist.indexOf(arguments[i])) continue; | ||
this.whitelist.push(arguments[i]); | ||
} | ||
var known = []; | ||
setTimeout(print, 1000); | ||
function print () { | ||
exports.detect().forEach(function (leak) { | ||
if (~known.indexOf(leak)) return; | ||
known.push(leak); | ||
stream.write(format.replace(/%s/, leak) + '\n'); | ||
}); | ||
} | ||
return function gleakMiddleware (req, res, next) { | ||
if (res._gleak) return next(); | ||
res._gleak = true; | ||
var send = res.send; | ||
res.send = function () { | ||
res.send = send; | ||
res.send.apply(res, arguments); | ||
print(); | ||
} | ||
next(); | ||
} | ||
return this; | ||
} | ||
@@ -5,3 +5,3 @@ { | ||
"description": "Node global variable leak detector", | ||
"version": "0.0.2", | ||
"version": "0.1.0", | ||
"repository": { | ||
@@ -8,0 +8,0 @@ "type": "git" |
@@ -6,65 +6,105 @@ | ||
exports['version exists'] = function () { | ||
assert.equal('string', typeof gleak.version); | ||
} | ||
exports['middleware exists'] = function () { | ||
assert.equal('function', typeof gleak.middleware); | ||
} | ||
exports['gleak is a function'] = function () { | ||
assert.equal('function', typeof gleak); | ||
} | ||
exports['default format is correct'] = function () { | ||
assert.equal('\x1b[31mGleak!:\x1b[0m %s', gleak.format); | ||
var g = gleak(); | ||
assert.equal('\x1b[31mGleak!:\x1b[0m %s', g.format); | ||
} | ||
exports['whitelist is an array'] = function () { | ||
assert.ok(Array.isArray(gleak.whitelist)); | ||
var g = gleak(); | ||
assert.ok(Array.isArray(g.whitelist)); | ||
} | ||
exports['setTimeout is a default'] = function () { | ||
assert.ok(~gleak.whitelist.indexOf(setTimeout)); | ||
var g = gleak(); | ||
assert.ok(~g.whitelist.indexOf(setTimeout)); | ||
}; | ||
exports['setInterval is a default'] = function () { | ||
assert.ok(~gleak.whitelist.indexOf(setInterval)); | ||
var g = gleak(); | ||
assert.ok(~g.whitelist.indexOf(setInterval)); | ||
}; | ||
exports['clearTimeout is a default'] = function () { | ||
assert.ok(~gleak.whitelist.indexOf(clearTimeout)); | ||
var g = gleak(); | ||
assert.ok(~g.whitelist.indexOf(clearTimeout)); | ||
}; | ||
exports['clearInterval is a default'] = function () { | ||
assert.ok(~gleak.whitelist.indexOf(clearInterval)); | ||
var g = gleak(); | ||
assert.ok(~g.whitelist.indexOf(clearInterval)); | ||
}; | ||
exports['console is a default'] = function () { | ||
assert.ok(~gleak.whitelist.indexOf(console)); | ||
var g = gleak(); | ||
assert.ok(~g.whitelist.indexOf(console)); | ||
}; | ||
exports['Buffer is a default'] = function () { | ||
assert.ok(~gleak.whitelist.indexOf(Buffer)); | ||
var g = gleak(); | ||
assert.ok(~g.whitelist.indexOf(Buffer)); | ||
}; | ||
exports['process is a default'] = function () { | ||
assert.ok(~gleak.whitelist.indexOf(process)); | ||
var g = gleak(); | ||
assert.ok(~g.whitelist.indexOf(process)); | ||
}; | ||
exports['global is a default'] = function () { | ||
assert.ok(~gleak.whitelist.indexOf(global)); | ||
var g = gleak(); | ||
assert.ok(~g.whitelist.indexOf(global)); | ||
}; | ||
exports['whitelist is mutable'] = function () { | ||
var i = gleak.whitelist.push(assert); | ||
assert.ok(~gleak.whitelist.indexOf(assert)); | ||
gleak.whitelist.splice(i-1, 1); | ||
assert.ok(!~gleak.whitelist.indexOf(assert)); | ||
var g = gleak(); | ||
var i = g.whitelist.push(assert); | ||
assert.ok(~g.whitelist.indexOf(assert)); | ||
g.whitelist.splice(i-1, 1); | ||
assert.ok(!~g.whitelist.indexOf(assert)); | ||
} | ||
exports['gleak.detect is a function'] = function () { | ||
assert.ok('function' === typeof gleak.detect); | ||
exports['#detect is a function'] = function () { | ||
var g = gleak(); | ||
assert.ok('function' === typeof g.detect); | ||
} | ||
exports['detect()'] = function () { | ||
var found = gleak.detect(); | ||
var g = gleak(); | ||
var found = g.detect(); | ||
assert.ok(Array.isArray(found)); | ||
assert.ok(0 === found.length); | ||
haha = "lol" | ||
assert.ok(1 === gleak.detect().length); | ||
assert.equal("haha", gleak.detect()[0]); | ||
assert.ok(1 === g.detect().length); | ||
assert.equal("haha", g.detect()[0]); | ||
} | ||
exports['unknown values can be whitelisted by passing strings'] = function () { | ||
var g = gleak(); | ||
ignoreme = 1; | ||
assert.ok(~gleak.detect().indexOf('ignoreme')); | ||
gleak.whitelist.push('ignoreme'); | ||
assert.ok(!~gleak.detect().indexOf('ignoreme')); | ||
assert.ok(~g.detect().indexOf('ignoreme')); | ||
g.whitelist.push('ignoreme'); | ||
assert.ok(!~g.detect().indexOf('ignoreme')); | ||
delete global.ignoreme; | ||
} | ||
exports['print()'] = function () { | ||
exports['#ignore'] = function () { | ||
var g = gleak(); | ||
assert.equal('function', typeof g.ignore); | ||
} | ||
exports['ignore identical whitelisted values'] = function () { | ||
var g = gleak(); | ||
var len = g.whitelist.length; | ||
var an = 'another'; | ||
g.ignore('another', 'another', 'another', an); | ||
assert.equal(len + 1, g.whitelist.length); | ||
} | ||
exports['#print'] = function () { | ||
var g = gleak(); | ||
var write = console.error; | ||
@@ -74,7 +114,7 @@ var times = 0; | ||
console.error = function (format, item) { | ||
assert.equal(gleak.format, format); | ||
assert.equal(g.format, format); | ||
assert.equal("haha", item); | ||
++times; | ||
} | ||
gleak.print(); | ||
g.print(); | ||
console.error = write; | ||
@@ -84,2 +124,19 @@ assert.equal(1, times); | ||
exports['whitelists are seperate from other instances'] = function () { | ||
var g1 = gleak() | ||
, g2 = gleak(); | ||
g1.ignore('the', 'bad'); | ||
assert.ok(~g1.whitelist.indexOf('the')); | ||
assert.ok(!~g2.whitelist.indexOf('the')); | ||
} | ||
exports['formats are seperate from other instances'] = function () { | ||
var g1 = gleak() | ||
, g2 = gleak(); | ||
g1.format = "different %s"; | ||
assert.ok(~g1.format !== g1.format); | ||
} | ||
exports['test middleware'] = function (beforeExit) { | ||
@@ -86,0 +143,0 @@ var called = false; |
11012
292