| 'use strict'; |
| const common = require('../common'); |
| |
| // Regression test for https://github.com/nodejs/node/issues/12718. |
| // Tests that piping a source stream twice to the same destination stream |
| // works, and that a subsequent unpipe() call only removes the pipe *once*. |
| const assert = require('assert'); |
| const { PassThrough, Writable } = require('stream'); |
| |
| { |
| const passThrough = new PassThrough(); |
| const dest = new Writable({ |
| write: common.mustCall((chunk, encoding, cb) => { |
| assert.strictEqual(`${chunk}`, 'foobar'); |
| cb(); |
| }) |
| }); |
| |
| passThrough.pipe(dest); |
| passThrough.pipe(dest); |
| |
| assert.strictEqual(passThrough._events.data.length, 2); |
| assert.strictEqual(passThrough._readableState.pipes.length, 2); |
| assert.strictEqual(passThrough._readableState.pipes[0], dest); |
| assert.strictEqual(passThrough._readableState.pipes[1], dest); |
| |
| passThrough.unpipe(dest); |
| |
| assert.strictEqual(passThrough._events.data.length, 1); |
| assert.strictEqual(passThrough._readableState.pipes.length, 1); |
| assert.deepStrictEqual(passThrough._readableState.pipes, [dest]); |
| |
| passThrough.write('foobar'); |
| passThrough.pipe(dest); |
| } |
| |
| { |
| const passThrough = new PassThrough(); |
| const dest = new Writable({ |
| write: common.mustCall((chunk, encoding, cb) => { |
| assert.strictEqual(`${chunk}`, 'foobar'); |
| cb(); |
| }, 2) |
| }); |
| |
| passThrough.pipe(dest); |
| passThrough.pipe(dest); |
| |
| assert.strictEqual(passThrough._events.data.length, 2); |
| assert.strictEqual(passThrough._readableState.pipes.length, 2); |
| assert.strictEqual(passThrough._readableState.pipes[0], dest); |
| assert.strictEqual(passThrough._readableState.pipes[1], dest); |
| |
| passThrough.write('foobar'); |
| } |
| |
| { |
| const passThrough = new PassThrough(); |
| const dest = new Writable({ |
| write: common.mustNotCall() |
| }); |
| |
| passThrough.pipe(dest); |
| passThrough.pipe(dest); |
| |
| assert.strictEqual(passThrough._events.data.length, 2); |
| assert.strictEqual(passThrough._readableState.pipes.length, 2); |
| assert.strictEqual(passThrough._readableState.pipes[0], dest); |
| assert.strictEqual(passThrough._readableState.pipes[1], dest); |
| |
| passThrough.unpipe(dest); |
| passThrough.unpipe(dest); |
| |
| assert.strictEqual(passThrough._events.data, undefined); |
| assert.strictEqual(passThrough._readableState.pipes.length, 0); |
| |
| passThrough.write('foobar'); |
| } |