Skip to content

Commit 755fc4c

Browse files
authored
websocket: more coverage (nodejs#1833)
1 parent d35b5cc commit 755fc4c

File tree

6 files changed

+182
-4
lines changed

6 files changed

+182
-4
lines changed

lib/websocket/events.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ class MessageEvent extends Event {
1111
#eventInit
1212

1313
constructor (type, eventInitDict = {}) {
14+
webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' })
15+
1416
type = webidl.converters.DOMString(type)
1517
eventInitDict = webidl.converters.MessageEventInit(eventInitDict)
1618

@@ -80,6 +82,8 @@ class CloseEvent extends Event {
8082
#eventInit
8183

8284
constructor (type, eventInitDict = {}) {
85+
webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' })
86+
8387
type = webidl.converters.DOMString(type)
8488
eventInitDict = webidl.converters.CloseEventInit(eventInitDict)
8589

@@ -117,9 +121,7 @@ class ErrorEvent extends Event {
117121
super(type, eventInitDict)
118122

119123
type = webidl.converters.DOMString(type)
120-
if (eventInitDict !== undefined) {
121-
eventInitDict = webidl.converters.ErrorEventInit(eventInitDict)
122-
}
124+
eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})
123125

124126
this.#eventInit = eventInitDict
125127
}

test/websocket/close.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const { WebSocketServer } = require('ws')
55
const { WebSocket } = require('../..')
66

77
test('Close', (t) => {
8-
t.plan(5)
8+
t.plan(6)
99

1010
t.test('Close with code', (t) => {
1111
t.plan(1)
@@ -109,4 +109,22 @@ test('Close', (t) => {
109109
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
110110
ws.addEventListener('open', () => ws.close())
111111
})
112+
113+
t.test('Close with a 3000 status code', (t) => {
114+
t.plan(2)
115+
116+
const server = new WebSocketServer({ port: 0 })
117+
118+
server.on('connection', (ws) => {
119+
ws.on('close', (code, reason) => {
120+
t.equal(code, 3000)
121+
t.same(reason, Buffer.alloc(0))
122+
})
123+
})
124+
125+
t.teardown(server.close.bind(server))
126+
127+
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
128+
ws.addEventListener('open', () => ws.close(3000))
129+
})
112130
})

test/websocket/constructor.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,13 @@ test('Constructor', (t) => {
4444
}
4545
)
4646

47+
t.throws(
48+
() => new WebSocket('wss://echo.websocket.events', ['<>@,;:\\"/[]?={}\t']),
49+
{
50+
name: 'SyntaxError',
51+
constructor: DOMException
52+
}
53+
)
54+
4755
t.end()
4856
})

test/websocket/events.js

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
'use strict'
2+
3+
const { test } = require('tap')
4+
const { WebSocketServer } = require('ws')
5+
const { MessageEvent, CloseEvent, ErrorEvent } = require('../../lib/websocket/events')
6+
const { WebSocket } = require('../..')
7+
8+
test('MessageEvent', (t) => {
9+
t.throws(() => new MessageEvent(), TypeError, 'no arguments')
10+
t.throws(() => new MessageEvent('').initMessageEvent(), TypeError)
11+
12+
const noInitEvent = new MessageEvent('message')
13+
14+
t.equal(noInitEvent.origin, '')
15+
t.equal(noInitEvent.data, null)
16+
t.equal(noInitEvent.lastEventId, '')
17+
t.equal(noInitEvent.source, null)
18+
t.ok(Array.isArray(noInitEvent.ports))
19+
t.ok(Object.isFrozen(noInitEvent.ports))
20+
t.type(new MessageEvent('').initMessageEvent('message'), MessageEvent)
21+
22+
t.end()
23+
})
24+
25+
test('CloseEvent', (t) => {
26+
t.throws(() => new CloseEvent(), TypeError)
27+
28+
const noInitEvent = new CloseEvent('close')
29+
30+
t.equal(noInitEvent.wasClean, false)
31+
t.equal(noInitEvent.code, 0)
32+
t.equal(noInitEvent.reason, '')
33+
34+
t.end()
35+
})
36+
37+
test('ErrorEvent', (t) => {
38+
t.throws(() => new ErrorEvent(), TypeError)
39+
40+
const noInitEvent = new ErrorEvent('error')
41+
42+
t.equal(noInitEvent.message, '')
43+
t.equal(noInitEvent.filename, '')
44+
t.equal(noInitEvent.lineno, 0)
45+
t.equal(noInitEvent.colno, 0)
46+
t.equal(noInitEvent.error, undefined)
47+
48+
t.end()
49+
})
50+
51+
test('Event handlers', (t) => {
52+
t.plan(4)
53+
54+
const server = new WebSocketServer({ port: 0 })
55+
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
56+
57+
function listen () {}
58+
59+
t.teardown(server.close.bind(server))
60+
t.teardown(() => ws.close())
61+
62+
t.test('onopen', (t) => {
63+
t.plan(3)
64+
65+
t.equal(ws.onopen, null)
66+
ws.onopen = 3
67+
t.equal(ws.onopen, null)
68+
ws.onopen = listen
69+
t.equal(ws.onopen, listen)
70+
})
71+
72+
t.test('onerror', (t) => {
73+
t.plan(3)
74+
75+
t.equal(ws.onerror, null)
76+
ws.onerror = 3
77+
t.equal(ws.onerror, null)
78+
ws.onerror = listen
79+
t.equal(ws.onerror, listen)
80+
})
81+
82+
t.test('onclose', (t) => {
83+
t.plan(3)
84+
85+
t.equal(ws.onclose, null)
86+
ws.onclose = 3
87+
t.equal(ws.onclose, null)
88+
ws.onclose = listen
89+
t.equal(ws.onclose, listen)
90+
})
91+
92+
t.test('onmessage', (t) => {
93+
t.plan(3)
94+
95+
t.equal(ws.onmessage, null)
96+
ws.onmessage = 3
97+
t.equal(ws.onmessage, null)
98+
ws.onmessage = listen
99+
t.equal(ws.onmessage, listen)
100+
})
101+
})

test/websocket/receive.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,33 @@ test('Receiving a frame with a payload length > 2^31-1 bytes', (t) => {
2828
t.type(event.error, Error) // error event is emitted
2929
})
3030
})
31+
32+
test('Receiving an ArrayBuffer', (t) => {
33+
t.plan(3)
34+
35+
const server = new WebSocketServer({ port: 0 })
36+
37+
server.on('connection', (ws) => {
38+
ws.on('message', (data, isBinary) => {
39+
ws.send(data, { binary: true })
40+
41+
ws.close(1000)
42+
})
43+
})
44+
45+
t.teardown(server.close.bind(server))
46+
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
47+
48+
ws.addEventListener('open', () => {
49+
ws.binaryType = 'what'
50+
t.equal(ws.binaryType, 'blob')
51+
52+
ws.binaryType = 'arraybuffer' // <--
53+
ws.send('Hello')
54+
})
55+
56+
ws.addEventListener('message', ({ data }) => {
57+
t.type(data, ArrayBuffer)
58+
t.same(Buffer.from(data), Buffer.from('Hello'))
59+
})
60+
})

test/websocket/send.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,25 @@ test('Sending data after close', (t) => {
5858
ws.addEventListener('error', t.fail)
5959
})
6060

61+
test('Sending data before connected', (t) => {
62+
t.plan(2)
63+
64+
const server = new WebSocketServer({ port: 0 })
65+
66+
t.teardown(server.close.bind(server))
67+
const ws = new WebSocket(`ws://localhost:${server.address().port}`)
68+
69+
t.throws(
70+
() => ws.send('Not sent'),
71+
{
72+
name: 'InvalidStateError',
73+
constructor: DOMException
74+
}
75+
)
76+
77+
t.equal(ws.readyState, WebSocket.CONNECTING)
78+
})
79+
6180
test('Sending data to a server', (t) => {
6281
t.plan(3)
6382

0 commit comments

Comments
 (0)