Skip to content

Commit cfc9a2a

Browse files
ilteooodcrysmags
authored andcommitted
feat: port websocket tests to node test runner (nodejs#2553)
* feat: initial websocket convertion * fix: events tests * fix: handshake * fix: ping pong * feat; receive and send * fix: websocket init * fix: close * fix: borp flag * fix: diagnostic channel * fix: lint * fix: custom headers * fix: fragments
1 parent 6cf7c46 commit cfc9a2a

13 files changed

+576
-579
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
"test:tap": "tap test/*.js test/diagnostics-channel/*.js",
8484
"test:tdd": "tap test/*.js test/diagnostics-channel/*.js -w",
8585
"test:typescript": "tsd && tsc --skipLibCheck test/imports/undici-import.ts",
86-
"test:websocket": "tap test/websocket/*.js",
86+
"test:websocket": "borp --coverage -p \"test/websocket/*.js\"",
8787
"test:wpt": "node test/wpt/start-fetch.mjs && node test/wpt/start-FileAPI.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node test/wpt/start-websockets.mjs",
8888
"coverage": "nyc --reporter=text --reporter=html npm run test",
8989
"coverage:ci": "nyc --reporter=lcov npm run test",

test/websocket/close.js

+93-92
Original file line numberDiff line numberDiff line change
@@ -1,130 +1,131 @@
11
'use strict'
22

3-
const { test } = require('tap')
3+
const { describe, test } = require('node:test')
4+
const assert = require('node:assert')
45
const { WebSocketServer } = require('ws')
56
const { WebSocket } = require('../..')
67

7-
test('Close', (t) => {
8-
t.plan(6)
9-
10-
t.test('Close with code', (t) => {
11-
t.plan(1)
12-
13-
const server = new WebSocketServer({ port: 0 })
14-
15-
server.on('connection', (ws) => {
16-
ws.on('close', (code) => {
17-
t.equal(code, 1000)
8+
describe('Close', () => {
9+
test('Close with code', () => {
10+
return new Promise((resolve) => {
11+
const server = new WebSocketServer({ port: 0 })
12+
13+
server.on('connection', (ws) => {
14+
ws.on('close', (code) => {
15+
assert.equal(code, 1000)
16+
server.close()
17+
resolve()
18+
})
1819
})
19-
})
20-
21-
t.teardown(server.close.bind(server))
2220

23-
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
24-
ws.addEventListener('open', () => ws.close(1000))
21+
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
22+
ws.addEventListener('open', () => ws.close(1000))
23+
})
2524
})
2625

27-
t.test('Close with code and reason', (t) => {
28-
t.plan(2)
29-
30-
const server = new WebSocketServer({ port: 0 })
31-
32-
server.on('connection', (ws) => {
33-
ws.on('close', (code, reason) => {
34-
t.equal(code, 1000)
35-
t.same(reason, Buffer.from('Goodbye'))
26+
test('Close with code and reason', () => {
27+
return new Promise((resolve) => {
28+
const server = new WebSocketServer({ port: 0 })
29+
30+
server.on('connection', (ws) => {
31+
ws.on('close', (code, reason) => {
32+
assert.equal(code, 1000)
33+
assert.deepStrictEqual(reason, Buffer.from('Goodbye'))
34+
server.close()
35+
resolve()
36+
})
3637
})
37-
})
3838

39-
t.teardown(server.close.bind(server))
40-
41-
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
42-
ws.addEventListener('open', () => ws.close(1000, 'Goodbye'))
39+
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
40+
ws.addEventListener('open', () => ws.close(1000, 'Goodbye'))
41+
})
4342
})
4443

45-
t.test('Close with invalid code', (t) => {
46-
t.plan(2)
47-
44+
test('Close with invalid code', () => {
4845
const server = new WebSocketServer({ port: 0 })
4946

50-
t.teardown(server.close.bind(server))
51-
5247
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
53-
ws.addEventListener('open', () => {
54-
t.throws(
55-
() => ws.close(2999),
56-
{
57-
name: 'InvalidAccessError',
58-
constructor: DOMException
59-
}
60-
)
61-
62-
t.throws(
63-
() => ws.close(5000),
64-
{
65-
name: 'InvalidAccessError',
66-
constructor: DOMException
67-
}
68-
)
69-
70-
ws.close()
48+
49+
return new Promise((resolve) => {
50+
ws.addEventListener('open', () => {
51+
assert.throws(
52+
() => ws.close(2999),
53+
{
54+
name: 'InvalidAccessError',
55+
constructor: DOMException
56+
}
57+
)
58+
59+
assert.throws(
60+
() => ws.close(5000),
61+
{
62+
name: 'InvalidAccessError',
63+
constructor: DOMException
64+
}
65+
)
66+
67+
ws.close()
68+
server.close()
69+
resolve()
70+
})
7171
})
7272
})
7373

74-
t.test('Close with invalid reason', (t) => {
75-
t.plan(1)
76-
74+
test('Close with invalid reason', () => {
7775
const server = new WebSocketServer({ port: 0 })
7876

79-
t.teardown(server.close.bind(server))
8077
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
8178

82-
ws.addEventListener('open', () => {
83-
t.throws(
84-
() => ws.close(1000, 'a'.repeat(124)),
85-
{
86-
name: 'SyntaxError',
87-
constructor: DOMException
88-
}
89-
)
90-
91-
ws.close(1000)
79+
return new Promise((resolve) => {
80+
ws.addEventListener('open', () => {
81+
assert.throws(
82+
() => ws.close(1000, 'a'.repeat(124)),
83+
{
84+
name: 'SyntaxError',
85+
constructor: DOMException
86+
}
87+
)
88+
89+
ws.close(1000)
90+
server.close()
91+
resolve()
92+
})
9293
})
9394
})
9495

95-
t.test('Close with no code or reason', (t) => {
96-
t.plan(2)
97-
96+
test('Close with no code or reason', () => {
9897
const server = new WebSocketServer({ port: 0 })
9998

100-
server.on('connection', (ws) => {
101-
ws.on('close', (code, reason) => {
102-
t.equal(code, 1005)
103-
t.same(reason, Buffer.alloc(0))
99+
return new Promise((resolve) => {
100+
server.on('connection', (ws) => {
101+
ws.on('close', (code, reason) => {
102+
assert.equal(code, 1005)
103+
assert.deepStrictEqual(reason, Buffer.alloc(0))
104+
server.close()
105+
resolve()
106+
})
104107
})
105-
})
106108

107-
t.teardown(server.close.bind(server))
108-
109-
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
110-
ws.addEventListener('open', () => ws.close())
109+
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
110+
ws.addEventListener('open', () => ws.close())
111+
})
111112
})
112113

113-
t.test('Close with a 3000 status code', (t) => {
114-
t.plan(2)
115-
114+
test('Close with a 3000 status code', () => {
116115
const server = new WebSocketServer({ port: 0 })
117116

118-
server.on('connection', (ws) => {
119-
ws.on('close', (code, reason) => {
120-
t.equal(code, 3000)
121-
t.same(reason, Buffer.alloc(0))
117+
return new Promise((resolve) => {
118+
server.on('connection', (ws) => {
119+
ws.on('close', (code, reason) => {
120+
assert.equal(code, 3000)
121+
assert.deepStrictEqual(reason, Buffer.alloc(0))
122+
server.close()
123+
resolve()
124+
})
122125
})
123-
})
124-
125-
t.teardown(server.close.bind(server))
126126

127-
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
128-
ws.addEventListener('open', () => ws.close(3000))
127+
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
128+
ws.addEventListener('open', () => ws.close(3000))
129+
})
129130
})
130131
})

test/websocket/constructor.js

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,47 @@
11
'use strict'
22

3-
const { test } = require('tap')
3+
const { test } = require('node:test')
4+
const assert = require('node:assert')
45
const { WebSocket } = require('../..')
56

6-
test('Constructor', (t) => {
7-
t.throws(
7+
test('Constructor', () => {
8+
assert.throws(
89
() => new WebSocket('abc'),
910
{
1011
name: 'SyntaxError',
1112
constructor: DOMException
1213
}
1314
)
1415

15-
t.throws(
16+
assert.throws(
1617
() => new WebSocket('wss://echo.websocket.events/#a'),
1718
{
1819
name: 'SyntaxError',
1920
constructor: DOMException
2021
}
2122
)
2223

23-
t.throws(
24+
assert.throws(
2425
() => new WebSocket('wss://echo.websocket.events', ''),
2526
{
2627
name: 'SyntaxError',
2728
constructor: DOMException
2829
}
2930
)
3031

31-
t.throws(
32+
assert.throws(
3233
() => new WebSocket('wss://echo.websocket.events', ['chat', 'chat']),
3334
{
3435
name: 'SyntaxError',
3536
constructor: DOMException
3637
}
3738
)
3839

39-
t.throws(
40+
assert.throws(
4041
() => new WebSocket('wss://echo.websocket.events', ['<>@,;:\\"/[]?={}\t']),
4142
{
4243
name: 'SyntaxError',
4344
constructor: DOMException
4445
}
4546
)
46-
47-
t.end()
4847
})

test/websocket/custom-headers.js

+15-15
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
'use strict'
22

3-
const { test } = require('tap')
3+
const { test } = require('node:test')
44
const assert = require('assert')
55
const { Agent, WebSocket } = require('../..')
66

77
test('Setting custom headers', (t) => {
8-
t.plan(1)
9-
108
const headers = {
119
'x-khafra-hello': 'hi',
1210
Authorization: 'Bearer base64orsomethingitreallydoesntmatter'
1311
}
1412

15-
class TestAgent extends Agent {
16-
dispatch (options) {
17-
t.match(options.headers, headers)
18-
19-
return false
13+
return new Promise((resolve, reject) => {
14+
class TestAgent extends Agent {
15+
dispatch (options) {
16+
assert.deepStrictEqual(options.headers['x-khafra-hello'], headers['x-khafra-hello'])
17+
assert.deepStrictEqual(options.headers.Authorization, headers.Authorization)
18+
resolve()
19+
return false
20+
}
2021
}
21-
}
2222

23-
const ws = new WebSocket('wss://echo.websocket.events', {
24-
headers,
25-
dispatcher: new TestAgent()
26-
})
23+
const ws = new WebSocket('wss://echo.websocket.events', {
24+
headers,
25+
dispatcher: new TestAgent()
26+
})
2727

28-
// We don't want to make a request, just ensure the headers are set.
29-
ws.onclose = ws.onerror = ws.onmessage = assert.fail
28+
ws.onclose = ws.onerror = ws.onmessage = reject
29+
})
3030
})

0 commit comments

Comments
 (0)