2019-10-18 13:48:14 +02:00

83 lines
1.7 KiB
JavaScript

'use strict'
const { expect } = require('chai')
const pair = require('it-pair/duplex')
const pipe = require('it-pipe')
const pLimit = require('p-limit')
const { collect, tap, consume } = require('streaming-iterables')
module.exports = async (Muxer, nStreams, nMsg, limit) => {
const [dialerSocket, listenerSocket] = pair()
const { check, done } = marker((4 * nStreams) + (nStreams * nMsg))
const msg = 'simple msg'
const listener = new Muxer(async stream => {
expect(stream).to.exist // eslint-disable-line
check()
await pipe(
stream,
tap(chunk => check()),
consume
)
check()
pipe([], stream)
})
const dialer = new Muxer()
pipe(listenerSocket, listener, listenerSocket)
pipe(dialerSocket, dialer, dialerSocket)
const spawnStream = async n => {
const stream = dialer.newStream()
expect(stream).to.exist // eslint-disable-line
check()
const res = await pipe(
(function * () {
for (let i = 0; i < nMsg; i++) {
// console.log('n', n, 'msg', i)
yield new Promise(resolve => resolve(msg))
}
})(),
stream,
collect
)
expect(res).to.be.eql([])
check()
}
const limiter = pLimit(limit || Infinity)
await Promise.all(
Array.from(Array(nStreams), (_, i) => limiter(() => spawnStream(i)))
)
return done
}
function marker (n) {
let check
let i = 0
const done = new Promise((resolve, reject) => {
check = err => {
i++
if (err) {
/* eslint-disable-next-line */
console.error('Failed after %s iterations', i)
return reject(err)
}
if (i === n) {
resolve()
}
}
})
return { check, done }
}