Skip to content

Commit da0eebc

Browse files
authored
test: deflake stream compat coverage (#5209)
1 parent ba63a91 commit da0eebc

1 file changed

Lines changed: 86 additions & 57 deletions

File tree

test/stream-compat.js

Lines changed: 86 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,119 @@
11
'use strict'
22

33
const { tspl } = require('@matteo.collina/tspl')
4-
const { test, after } = require('node:test')
4+
const { test } = require('node:test')
55
const { Client } = require('..')
66
const { createServer } = require('node:http')
7+
const { once } = require('node:events')
78
const { Readable } = require('node:stream')
89
const EE = require('node:events')
910

11+
function closeServer (server) {
12+
return new Promise(resolve => {
13+
server.closeAllConnections?.()
14+
server.close(resolve)
15+
})
16+
}
17+
1018
test('stream body without destroy', async (t) => {
19+
const ctx = t
1120
t = tspl(t, { plan: 2 })
1221

1322
const server = createServer({ joinDuplicateHeaders: true }, (req, res) => {
1423
res.end()
1524
})
16-
after(() => server.close())
17-
server.listen(0, () => {
18-
const client = new Client(`http://localhost:${server.address().port}`)
19-
after(() => client.destroy())
20-
21-
const signal = new EE()
22-
const body = new Readable({ read () {} })
23-
body.destroy = undefined
24-
body.on('error', (err) => {
25-
t.ok(err)
26-
})
27-
client.request({
28-
path: '/',
29-
method: 'PUT',
30-
signal,
31-
body
32-
}, (err, data) => {
33-
t.ok(err)
34-
})
35-
signal.emit('abort')
25+
26+
server.listen(0)
27+
await once(server, 'listening')
28+
29+
const client = new Client(`http://localhost:${server.address().port}`)
30+
ctx.after(async () => {
31+
await client.destroy()
32+
await closeServer(server)
33+
})
34+
35+
const signal = new EE()
36+
const body = new Readable({ read () {} })
37+
body.destroy = undefined
38+
body.on('error', (err) => {
39+
t.ok(err)
3640
})
3741

42+
client.request({
43+
path: '/',
44+
method: 'PUT',
45+
signal,
46+
body
47+
}, (err) => {
48+
t.ok(err)
49+
})
50+
signal.emit('abort')
51+
3852
await t.completed
3953
})
4054

4155
test('IncomingMessage', async (t) => {
56+
const ctx = t
4257
t = tspl(t, { plan: 2 })
4358

4459
const server = createServer({ joinDuplicateHeaders: true }, (req, res) => {
4560
res.end()
4661
})
47-
after(() => server.close())
62+
server.listen(0)
63+
await once(server, 'listening')
4864

49-
server.listen(0, () => {
50-
const proxyClient = new Client(`http://localhost:${server.address().port}`)
51-
after(() => proxyClient.destroy())
65+
const proxyClient = new Client(`http://localhost:${server.address().port}`)
66+
proxyClient.on('disconnect', () => {
67+
if (!proxyClient.closed && !proxyClient.destroyed) {
68+
t.fail('unexpected disconnect')
69+
}
70+
})
5271

53-
proxyClient.on('disconnect', () => {
54-
if (!proxyClient.closed && !proxyClient.destroyed) {
55-
t.fail('unexpected disconnect')
72+
const proxy = createServer({ joinDuplicateHeaders: true }, (req, res) => {
73+
proxyClient.request({
74+
path: '/',
75+
method: 'PUT',
76+
body: req
77+
}, (err, data) => {
78+
t.ifError(err)
79+
if (err) {
80+
res.destroy(err)
81+
return
5682
}
57-
})
5883

59-
const proxy = createServer({ joinDuplicateHeaders: true }, (req, res) => {
60-
proxyClient.request({
61-
path: '/',
62-
method: 'PUT',
63-
body: req
64-
}, (err, data) => {
65-
t.ifError(err)
66-
data.body.pipe(res)
67-
})
84+
data.body.pipe(res)
6885
})
69-
after(() => proxy.close())
70-
71-
proxy.listen(0, () => {
72-
const client = new Client(`http://localhost:${proxy.address().port}`)
73-
after(() => client.destroy())
74-
75-
client.on('disconnect', () => {
76-
if (!client.closed && !client.destroyed) {
77-
t.fail('unexpected disconnect')
78-
}
79-
})
80-
81-
client.request({
82-
path: '/',
83-
method: 'PUT',
84-
body: 'hello world'
85-
}, (err, data) => {
86-
t.ifError(err)
87-
})
86+
})
87+
proxy.listen(0)
88+
await once(proxy, 'listening')
89+
90+
const client = new Client(`http://localhost:${proxy.address().port}`)
91+
client.on('disconnect', () => {
92+
if (!client.closed && !client.destroyed) {
93+
t.fail('unexpected disconnect')
94+
}
95+
})
96+
97+
ctx.after(async () => {
98+
await client.destroy()
99+
await proxyClient.destroy()
100+
await closeServer(proxy)
101+
await closeServer(server)
102+
})
103+
104+
await new Promise((resolve, reject) => {
105+
client.request({
106+
path: '/',
107+
method: 'PUT',
108+
body: 'hello world'
109+
}, (err, data) => {
110+
t.ifError(err)
111+
if (err) {
112+
reject(err)
113+
return
114+
}
115+
116+
data.body.dump().then(resolve, reject)
88117
})
89118
})
90119

0 commit comments

Comments
 (0)