mirror of https://github.com/lukechilds/node.git
Browse Source
adds 2 new tests for streams3 cork behavior, cork then uncork and cork then end PR-URL: https://github.com/nodejs/node/pull/6493 Reviewed-By: James M Snell <jasnell@gmail.com>v4.x
Alex J Burke
9 years ago
committed by
Myles Borins
2 changed files with 177 additions and 0 deletions
@ -0,0 +1,91 @@ |
|||||
|
'use strict'; |
||||
|
require('../common'); |
||||
|
const assert = require('assert'); |
||||
|
const stream = require('stream'); |
||||
|
const Writable = stream.Writable; |
||||
|
|
||||
|
// Test the buffering behaviour of Writable streams.
|
||||
|
//
|
||||
|
// The call to cork() triggers storing chunks which are flushed
|
||||
|
// on calling end() and the stream subsequently ended.
|
||||
|
//
|
||||
|
// node version target: 0.12
|
||||
|
|
||||
|
const expectedChunks = ['please', 'buffer', 'me', 'kindly']; |
||||
|
var inputChunks = expectedChunks.slice(0); |
||||
|
var seenChunks = []; |
||||
|
var seenEnd = false; |
||||
|
|
||||
|
var w = new Writable(); |
||||
|
// lets arrange to store the chunks
|
||||
|
w._write = function(chunk, encoding, cb) { |
||||
|
// stream end event is not seen before the last write
|
||||
|
assert.ok(!seenEnd); |
||||
|
// default encoding given none was specified
|
||||
|
assert.equal(encoding, 'buffer'); |
||||
|
|
||||
|
seenChunks.push(chunk); |
||||
|
cb(); |
||||
|
}; |
||||
|
// lets record the stream end event
|
||||
|
w.on('finish', () => { |
||||
|
seenEnd = true; |
||||
|
}); |
||||
|
|
||||
|
function writeChunks(remainingChunks, callback) { |
||||
|
var writeChunk = remainingChunks.shift(); |
||||
|
var writeState; |
||||
|
|
||||
|
if (writeChunk) { |
||||
|
setImmediate(() => { |
||||
|
writeState = w.write(writeChunk); |
||||
|
// we were not told to stop writing
|
||||
|
assert.ok(writeState); |
||||
|
|
||||
|
writeChunks(remainingChunks, callback); |
||||
|
}); |
||||
|
} else { |
||||
|
callback(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// do an initial write
|
||||
|
w.write('stuff'); |
||||
|
// the write was immediate
|
||||
|
assert.equal(seenChunks.length, 1); |
||||
|
// reset the seen chunks
|
||||
|
seenChunks = []; |
||||
|
|
||||
|
// trigger stream buffering
|
||||
|
w.cork(); |
||||
|
|
||||
|
// write the bufferedChunks
|
||||
|
writeChunks(inputChunks, () => { |
||||
|
// should not have seen anything yet
|
||||
|
assert.equal(seenChunks.length, 0); |
||||
|
|
||||
|
// trigger flush and ending the stream
|
||||
|
w.end(); |
||||
|
|
||||
|
// stream should not ended in current tick
|
||||
|
assert.ok(!seenEnd); |
||||
|
|
||||
|
// buffered bytes should be seen in current tick
|
||||
|
assert.equal(seenChunks.length, 4); |
||||
|
|
||||
|
// did the chunks match
|
||||
|
for (var i = 0, l = expectedChunks.length; i < l; i++) { |
||||
|
var seen = seenChunks[i]; |
||||
|
// there was a chunk
|
||||
|
assert.ok(seen); |
||||
|
|
||||
|
var expected = new Buffer(expectedChunks[i]); |
||||
|
// it was what we expected
|
||||
|
assert.ok(seen.equals(expected)); |
||||
|
} |
||||
|
|
||||
|
setImmediate(() => { |
||||
|
// stream should have ended in next tick
|
||||
|
assert.ok(seenEnd); |
||||
|
}); |
||||
|
}); |
@ -0,0 +1,86 @@ |
|||||
|
'use strict'; |
||||
|
require('../common'); |
||||
|
const assert = require('assert'); |
||||
|
const stream = require('stream'); |
||||
|
const Writable = stream.Writable; |
||||
|
|
||||
|
// Test the buffering behaviour of Writable streams.
|
||||
|
//
|
||||
|
// The call to cork() triggers storing chunks which are flushed
|
||||
|
// on calling uncork() in the same tick.
|
||||
|
//
|
||||
|
// node version target: 0.12
|
||||
|
|
||||
|
const expectedChunks = ['please', 'buffer', 'me', 'kindly']; |
||||
|
var inputChunks = expectedChunks.slice(0); |
||||
|
var seenChunks = []; |
||||
|
var seenEnd = false; |
||||
|
|
||||
|
var w = new Writable(); |
||||
|
// lets arrange to store the chunks
|
||||
|
w._write = function(chunk, encoding, cb) { |
||||
|
// default encoding given none was specified
|
||||
|
assert.equal(encoding, 'buffer'); |
||||
|
|
||||
|
seenChunks.push(chunk); |
||||
|
cb(); |
||||
|
}; |
||||
|
// lets record the stream end event
|
||||
|
w.on('finish', () => { |
||||
|
seenEnd = true; |
||||
|
}); |
||||
|
|
||||
|
function writeChunks(remainingChunks, callback) { |
||||
|
var writeChunk = remainingChunks.shift(); |
||||
|
var writeState; |
||||
|
|
||||
|
if (writeChunk) { |
||||
|
setImmediate(() => { |
||||
|
writeState = w.write(writeChunk); |
||||
|
// we were not told to stop writing
|
||||
|
assert.ok(writeState); |
||||
|
|
||||
|
writeChunks(remainingChunks, callback); |
||||
|
}); |
||||
|
} else { |
||||
|
callback(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// do an initial write
|
||||
|
w.write('stuff'); |
||||
|
// the write was immediate
|
||||
|
assert.equal(seenChunks.length, 1); |
||||
|
// reset the chunks seen so far
|
||||
|
seenChunks = []; |
||||
|
|
||||
|
// trigger stream buffering
|
||||
|
w.cork(); |
||||
|
|
||||
|
// write the bufferedChunks
|
||||
|
writeChunks(inputChunks, () => { |
||||
|
// should not have seen anything yet
|
||||
|
assert.equal(seenChunks.length, 0); |
||||
|
|
||||
|
// trigger writing out the buffer
|
||||
|
w.uncork(); |
||||
|
|
||||
|
// buffered bytes shoud be seen in current tick
|
||||
|
assert.equal(seenChunks.length, 4); |
||||
|
|
||||
|
// did the chunks match
|
||||
|
for (var i = 0, l = expectedChunks.length; i < l; i++) { |
||||
|
var seen = seenChunks[i]; |
||||
|
// there was a chunk
|
||||
|
assert.ok(seen); |
||||
|
|
||||
|
var expected = new Buffer(expectedChunks[i]); |
||||
|
// it was what we expected
|
||||
|
assert.ok(seen.equals(expected)); |
||||
|
} |
||||
|
|
||||
|
setImmediate(() => { |
||||
|
// the stream should not have been ended
|
||||
|
assert.ok(!seenEnd); |
||||
|
}); |
||||
|
}); |
Loading…
Reference in new issue