diff options
Diffstat (limited to 'std/ws/test.ts')
-rw-r--r-- | std/ws/test.ts | 68 |
1 files changed, 63 insertions, 5 deletions
diff --git a/std/ws/test.ts b/std/ws/test.ts index a8dbc903c..5a0ff9929 100644 --- a/std/ws/test.ts +++ b/std/ws/test.ts @@ -13,13 +13,14 @@ import { readFrame, unmask, writeFrame, - createWebSocket + createWebSocket, + SocketClosedError } from "./mod.ts"; import { encode, decode } from "../strings/mod.ts"; -type Writer = Deno.Writer; -type Reader = Deno.Reader; -type Conn = Deno.Conn; -const { Buffer } = Deno; +import Writer = Deno.Writer; +import Reader = Deno.Reader; +import Conn = Deno.Conn; +import Buffer = Deno.Buffer; test(async function wsReadUnmaskedTextFrame(): Promise<void> { // unmasked single text frame with payload "Hello" @@ -326,3 +327,60 @@ test("WebSocket.send(), WebSocket.ping() should be exclusive", async (): Promise assertEquals(third.opcode, OpCode.BinaryFrame); assertEquals(bytes.equal(third.payload, new Uint8Array([3])), true); }); + +test("WebSocket should throw SocketClosedError when peer closed connection without close frame", async () => { + const buf = new Buffer(); + const eofReader: Deno.Reader = { + async read(_: Uint8Array): Promise<number | Deno.EOF> { + return Deno.EOF; + } + }; + const conn = dummyConn(eofReader, buf); + const sock = createWebSocket({ conn }); + sock.closeForce(); + await assertThrowsAsync(() => sock.send("hello"), SocketClosedError); + await assertThrowsAsync(() => sock.ping(), SocketClosedError); + await assertThrowsAsync(() => sock.close(0), SocketClosedError); +}); + +test("WebSocket shouldn't throw UnexpectedEOFError on recive()", async () => { + const buf = new Buffer(); + const eofReader: Deno.Reader = { + async read(_: Uint8Array): Promise<number | Deno.EOF> { + return Deno.EOF; + } + }; + const conn = dummyConn(eofReader, buf); + const sock = createWebSocket({ conn }); + const it = sock.receive(); + const { value, done } = await it.next(); + assertEquals(value, undefined); + assertEquals(done, true); +}); + +test("WebSocket should reject sending promise when connection reset forcely", async () => { + const buf = new Buffer(); + let timer: number | undefined; + const lazyWriter: Deno.Writer = { + async write(_: Uint8Array): Promise<number> { + return new Promise(resolve => { + timer = setTimeout(() => resolve(0), 1000); + }); + } + }; + const conn = dummyConn(buf, lazyWriter); + const sock = createWebSocket({ conn }); + const onError = (e: unknown): unknown => e; + const p = Promise.all([ + sock.send("hello").catch(onError), + sock.send(new Uint8Array([1, 2])).catch(onError), + sock.ping().catch(onError) + ]); + sock.closeForce(); + assertEquals(sock.isClosed, true); + const [a, b, c] = await p; + assert(a instanceof SocketClosedError); + assert(b instanceof SocketClosedError); + assert(c instanceof SocketClosedError); + clearTimeout(timer); +}); |