diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2013-09-09 10:57:09 +0200 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2013-09-09 11:05:40 +0200 |
commit | 204228b57f06ece34b61d69c5e3b58218bbfed0e (patch) | |
tree | 5e28eb7ca8c4e4b96833c3e29a8a0e4731de664f /test/pummel/test-stream-pipe-multi.js | |
parent | 1c58a07dd491282817e0999e511d88d18dd25b90 (diff) | |
download | android-node-v8-204228b57f06ece34b61d69c5e3b58218bbfed0e.tar.gz android-node-v8-204228b57f06ece34b61d69c5e3b58218bbfed0e.tar.bz2 android-node-v8-204228b57f06ece34b61d69c5e3b58218bbfed0e.zip |
test: move slow tests to test/pummel/
Slowness being somewhat subjective but determined by running the
test suite a few times and picking off everything that consistently
clocks in at 2 seconds or more.
Honorable mention for simple/test-tls-server-large-request, it often
runs for 10 (!) seconds or more.
Diffstat (limited to 'test/pummel/test-stream-pipe-multi.js')
-rw-r--r-- | test/pummel/test-stream-pipe-multi.js | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/test/pummel/test-stream-pipe-multi.js b/test/pummel/test-stream-pipe-multi.js new file mode 100644 index 0000000000..9a8535ffe7 --- /dev/null +++ b/test/pummel/test-stream-pipe-multi.js @@ -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. + +// Test that having a bunch of streams piping in parallel +// doesn't break anything. + +var common = require('../common'); +var assert = require('assert'); +var Stream = require('stream').Stream; +var rr = []; +var ww = []; +var cnt = 100; +var chunks = 1000; +var chunkSize = 250; +var data = new Buffer(chunkSize); +var wclosed = 0; +var rclosed = 0; + +function FakeStream() { + Stream.apply(this); + this.wait = false; + this.writable = true; + this.readable = true; +} + +FakeStream.prototype = Object.create(Stream.prototype); + +FakeStream.prototype.write = function(chunk) { + console.error(this.ID, 'write', this.wait); + if (this.wait) { + process.nextTick(this.emit.bind(this, 'drain')); + } + this.wait = !this.wait; + return this.wait; +}; + +FakeStream.prototype.end = function() { + this.emit('end'); + process.nextTick(this.close.bind(this)); +}; + +// noop - closes happen automatically on end. +FakeStream.prototype.close = function() { + this.emit('close'); +}; + + +// expect all streams to close properly. +process.on('exit', function() { + assert.equal(cnt, wclosed, 'writable streams closed'); + assert.equal(cnt, rclosed, 'readable streams closed'); +}); + +for (var i = 0; i < chunkSize; i++) { + chunkSize[i] = i % 256; +} + +for (var i = 0; i < cnt; i++) { + var r = new FakeStream(); + r.on('close', function() { + console.error(this.ID, 'read close'); + rclosed++; + }); + rr.push(r); + + var w = new FakeStream(); + w.on('close', function() { + console.error(this.ID, 'write close'); + wclosed++; + }); + ww.push(w); + + r.ID = w.ID = i; + r.pipe(w); +} + +// now start passing through data +// simulate a relatively fast async stream. +rr.forEach(function(r) { + var cnt = chunks; + var paused = false; + + r.on('pause', function() { + paused = true; + }); + + r.on('resume', function() { + paused = false; + step(); + }); + + function step() { + r.emit('data', data); + if (--cnt === 0) { + r.end(); + return; + } + if (paused) return; + process.nextTick(step); + } + + process.nextTick(step); +}); |