summaryrefslogtreecommitdiff
path: root/std/ws/test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'std/ws/test.ts')
-rw-r--r--std/ws/test.ts68
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);
+});