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