From f54889ae000f2d01039ceaaa158dbba99a5b933f Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 22 Oct 2017 17:05:05 +0200 Subject: [PATCH] test: add `makeDuplexPair()` helper Add a utility for adding simple, streams-API based duplex pairs. PR-URL: https://github.com/nodejs/node/pull/16269 Reviewed-By: Anatoli Papirovski Reviewed-By: James M Snell --- test/common/README.md | 9 ++++++++ test/common/duplexpair.js | 45 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 test/common/duplexpair.js diff --git a/test/common/README.md b/test/common/README.md index 93106ad076e2e1..46eb001df86cf6 100644 --- a/test/common/README.md +++ b/test/common/README.md @@ -8,6 +8,7 @@ This directory contains modules used to test the Node.js implementation. * [Common module API](#common-module-api) * [Countdown module](#countdown-module) * [DNS module](#dns-module) +* [Duplex pair helper](#duplex-pair-helper) * [Fixtures module](#fixtures-module) * [WPT module](#wpt-module) @@ -458,6 +459,14 @@ Reads a Domain String and returns a Buffer containing the domain. Takes in a parsed Object and writes its fields to a DNS packet as a Buffer object. +## 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;