mirror of https://github.com/lukechilds/node.git
Browse Source
This adds proper support for the following situation: w.cork(); w.write(...); w.cork(); w.write(...); w.uncork(); w.write(...); w.uncork(); This is relevant when you have a function (as we do in HTTP) that wants to use cork, but in some cases, want to have a cork/uncork *around* that function, without losing the benefits of writev.v0.11.2-release
isaacs
12 years ago
2 changed files with 132 additions and 5 deletions
@ -0,0 +1,121 @@ |
|||
// Copyright Joyent, Inc. and other Node contributors.
|
|||
//
|
|||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
// copy of this software and associated documentation files (the
|
|||
// "Software"), to deal in the Software without restriction, including
|
|||
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
// persons to whom the Software is furnished to do so, subject to the
|
|||
// following conditions:
|
|||
//
|
|||
// The above copyright notice and this permission notice shall be included
|
|||
// in all copies or substantial portions of the Software.
|
|||
//
|
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|||
var common = require('../common'); |
|||
var assert = require('assert'); |
|||
|
|||
var stream = require('stream'); |
|||
|
|||
var queue = []; |
|||
for (var decode = 0; decode < 2; decode++) { |
|||
for (var uncork = 0; uncork < 2; uncork++) { |
|||
for (var multi = 0; multi < 2; multi++) { |
|||
queue.push([!!decode, !!uncork, !!multi]); |
|||
} |
|||
} |
|||
} |
|||
|
|||
run(); |
|||
|
|||
function run() { |
|||
var t = queue.pop(); |
|||
if (t) |
|||
test(t[0], t[1], t[2], run); |
|||
else |
|||
console.log('ok'); |
|||
} |
|||
|
|||
function test(decode, uncork, multi, next) { |
|||
console.log('# decode=%j uncork=%j multi=%j', decode, uncork, multi); |
|||
var counter = 0; |
|||
var expectCount = 0; |
|||
function cnt(msg) { |
|||
expectCount++; |
|||
var expect = expectCount; |
|||
var called = false; |
|||
return function(er) { |
|||
if (er) |
|||
throw er; |
|||
called = true; |
|||
counter++; |
|||
assert.equal(counter, expect); |
|||
}; |
|||
} |
|||
|
|||
var w = new stream.Writable({ decodeStrings: decode }); |
|||
w._write = function(chunk, e, cb) { |
|||
assert(false, 'Should not call _write'); |
|||
}; |
|||
|
|||
var expectChunks = decode ? |
|||
[{ encoding: 'buffer', |
|||
chunk: [104, 101, 108, 108, 111, 44, 32] }, |
|||
{ encoding: 'buffer', chunk: [119, 111, 114, 108, 100] }, |
|||
{ encoding: 'buffer', chunk: [33] }, |
|||
{ encoding: 'buffer', |
|||
chunk: [10, 97, 110, 100, 32, 116, 104, 101, 110, 46, 46, 46] }, |
|||
{ encoding: 'buffer', |
|||
chunk: [250, 206, 190, 167, 222, 173, 190, 239, 222, 202, 251, 173] }] : |
|||
[{ encoding: 'ascii', chunk: 'hello, ' }, |
|||
{ encoding: 'utf8', chunk: 'world' }, |
|||
{ encoding: 'buffer', chunk: [33] }, |
|||
{ encoding: 'binary', chunk: '\nand then...' }, |
|||
{ encoding: 'hex', chunk: 'facebea7deadbeefdecafbad' }]; |
|||
|
|||
var actualChunks; |
|||
w._writev = function(chunks, cb) { |
|||
actualChunks = chunks.map(function(chunk) { |
|||
return { |
|||
encoding: chunk.encoding, |
|||
chunk: Buffer.isBuffer(chunk.chunk) ? |
|||
Array.prototype.slice.call(chunk.chunk) : chunk.chunk |
|||
}; |
|||
}); |
|||
cb(); |
|||
}; |
|||
|
|||
w.cork(); |
|||
w.write('hello, ', 'ascii', cnt('hello')); |
|||
w.write('world', 'utf8', cnt('world')); |
|||
|
|||
if (multi) |
|||
w.cork(); |
|||
|
|||
w.write(new Buffer('!'), 'buffer', cnt('!')); |
|||
w.write('\nand then...', 'binary', cnt('and then')); |
|||
|
|||
if (multi) |
|||
w.uncork(); |
|||
|
|||
w.write('facebea7deadbeefdecafbad', 'hex', cnt('hex')); |
|||
|
|||
if (uncork) |
|||
w.uncork(); |
|||
|
|||
w.end(cnt('end')); |
|||
|
|||
w.on('finish', function() { |
|||
// make sure finish comes after all the write cb
|
|||
cnt('finish')(); |
|||
assert.deepEqual(expectChunks, actualChunks); |
|||
next(); |
|||
}); |
|||
} |
Loading…
Reference in new issue