|
|
@@ -0,0 +1,75 @@ |
|
|
var zlib = require("zlib"); |
|
|
var Transform = require("stream").Transform; |
|
|
var BufferList = require("bl"); |
|
|
|
|
|
function createDeflatedBuffer(size, cb) { |
|
|
var inputBuffer = new Buffer(size); |
|
|
for (var i = 0; i < size; i++) { |
|
|
inputBuffer[i] = Math.floor(Math.random() * 0x100); |
|
|
} |
|
|
var deflater = zlib.createDeflateRaw(); |
|
|
deflater.write(inputBuffer); |
|
|
deflater.end(); |
|
|
deflater.pipe(BufferList(cb)); |
|
|
} |
|
|
|
|
|
function countInflateChunks(buffer, callback) { |
|
|
var count = 0; |
|
|
var chunkCounter = new Transform(); |
|
|
chunkCounter._transform = function(chunk, encoding, cb) { |
|
|
count++; |
|
|
cb(null, chunk); |
|
|
}; |
|
|
chunkCounter.on("finish", function() { |
|
|
callback(null, count); |
|
|
}); |
|
|
chunkCounter.on("data", function() {}); |
|
|
var inflater = zlib.createInflateRaw(); |
|
|
inflater.pipe(chunkCounter); |
|
|
inflater.write(buffer); |
|
|
inflater.end(); |
|
|
} |
|
|
|
|
|
var testBuffer; |
|
|
function findTestBuffer() { |
|
|
var size = 0; |
|
|
iterate(); |
|
|
function iterate() { |
|
|
size += 0x1000; |
|
|
createDeflatedBuffer(size, function(err, buffer) { |
|
|
if (err) throw err; |
|
|
countInflateChunks(buffer, function(err, chunkCount) { |
|
|
if (err) throw err; |
|
|
if (chunkCount < 3) { |
|
|
iterate(); |
|
|
} else { |
|
|
console.log("test buffer size: 0x" + size.toString(16)); |
|
|
testBuffer = buffer; |
|
|
console.log("starting memory leak tests"); |
|
|
makeMemoryLeaks(); |
|
|
} |
|
|
}); |
|
|
}); |
|
|
} |
|
|
} |
|
|
|
|
|
var testCount = 0; |
|
|
function makeMemoryLeaks() { |
|
|
testCount++; |
|
|
if (/^\d0000+$/.test(testCount.toString())) console.log("test: " + testCount); |
|
|
var inflater = zlib.createInflateRaw(); |
|
|
var abandoner = new Transform(); |
|
|
abandoner._transform = function(chunk, encoding, cb) { |
|
|
inflater.unpipe(abandoner); |
|
|
abandoner.emit("error", new Error()); |
|
|
}; |
|
|
abandoner.on("error", function() { |
|
|
makeMemoryLeaks(); |
|
|
}); |
|
|
inflater.pipe(abandoner); |
|
|
inflater.write(testBuffer); |
|
|
inflater.end(); |
|
|
} |
|
|
|
|
|
console.log("finding sufficiently large size..."); |
|
|
findTestBuffer(); |