diff --git a/test/common/README.md b/test/common/README.md index 9ea825694f5ad2..4e7e955487bd3f 100644 --- a/test/common/README.md +++ b/test/common/README.md @@ -5,6 +5,7 @@ This directory contains modules used to test the Node.js implementation. ## Table of Contents * [Common module API](#common-module-api) +* [Duplex pair helper](#duplex-pair-helper) * [WPT module](#wpt-module) ## Common Module API @@ -318,6 +319,14 @@ Decrements the `Countdown` counter. Specifies the remaining number of times `Countdown.prototype.dec()` must be called before the callback is invoked. +## Duplex pair helper + +The `common/duplexpair` module exports a single function `makeDuplexPair`, +which returns an object `{ clientSide, serverSide }` where each side is a +`Duplex` stream connected to the other side. + +There is no difference between client or server side beyond their names. + ## Fixtures Module The `common/fixtures` module provides convenience methods for working with diff --git a/test/common/duplexpair.js b/test/common/duplexpair.js new file mode 100644 index 00000000000000..ea5bd86a041b24 --- /dev/null +++ b/test/common/duplexpair.js @@ -0,0 +1,45 @@ +/* eslint-disable required-modules */ +'use strict'; +const { Duplex } = require('stream'); +const assert = require('assert'); + +const kCallback = Symbol('Callback'); +const kOtherSide = Symbol('Other'); + +class DuplexSocket extends Duplex { + constructor() { + super(); + this[kCallback] = null; + this[kOtherSide] = null; + } + + _read() { + const callback = this[kCallback]; + if (callback) { + this[kCallback] = null; + callback(); + } + } + + _write(chunk, encoding, callback) { + assert.notStrictEqual(this[kOtherSide], null); + assert.strictEqual(this[kOtherSide][kCallback], null); + this[kOtherSide][kCallback] = callback; + this[kOtherSide].push(chunk); + } + + _final(callback) { + this[kOtherSide].on('end', callback); + this[kOtherSide].push(null); + } +} + +function makeDuplexPair() { + const clientSide = new DuplexSocket(); + const serverSide = new DuplexSocket(); + clientSide[kOtherSide] = serverSide; + serverSide[kOtherSide] = clientSide; + return { clientSide, serverSide }; +} + +module.exports = makeDuplexPair;