summaryrefslogtreecommitdiff
path: root/std/ws/test.ts
diff options
context:
space:
mode:
authorAndrey Trebler <treblera@gmail.com>2020-04-30 09:09:48 +0200
committerGitHub <noreply@github.com>2020-04-30 03:09:48 -0400
commit8ec36681dd4abac346551a54cdd6870ed8e864f5 (patch)
tree3cad9f96252a0a8896d2e675f2038efbb89eb3ed /std/ws/test.ts
parent12c6055855af37d00be953080370909d0d7ea9b1 (diff)
feat: Make WebSocket Reader/Writer (#5001) (#5002)
Diffstat (limited to 'std/ws/test.ts')
-rw-r--r--std/ws/test.ts120
1 files changed, 120 insertions, 0 deletions
diff --git a/std/ws/test.ts b/std/ws/test.ts
index 796bf3bb8..c59202e89 100644
--- a/std/ws/test.ts
+++ b/std/ws/test.ts
@@ -403,3 +403,123 @@ test({
await delay(10);
},
});
+
+test("[ws] WebSocket should implement Writer", async () => {
+ const buf = new Buffer();
+
+ const conn = dummyConn(buf, buf);
+ const sock = createWebSocket({ conn });
+
+ const [write0, write1, write2] = await Promise.all([
+ sock.write(new Uint8Array([1, 2, 3])),
+ sock.write(new Uint8Array([])),
+ sock.write(new Uint8Array([0])),
+ ]);
+
+ assertEquals(write0, 3);
+ assertEquals(write1, 0);
+ assertEquals(write2, 1);
+});
+
+test("[ws] WebSocket should implement Reader", async () => {
+ const hello = new Uint8Array([0x81, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f]);
+
+ const bufHello = new Buffer(hello);
+
+ const conn = dummyConn(bufHello, new Buffer());
+ const sock = createWebSocket({ conn });
+
+ const p = new Uint8Array(100);
+ const read = await sock.read(p);
+ const readLast = await sock.read(p);
+
+ const helloLength = "Hello".length;
+
+ assertEquals(read, helloLength);
+ assertEquals(decode(new Buffer(p.subarray(0, helloLength)).bytes()), "Hello");
+ assertEquals(readLast, null);
+});
+
+test("[ws] WebSocket Reader should ignore non-message frames", async () => {
+ const pong = new Uint8Array([
+ 0x8a,
+ 0x85,
+ 0x37,
+ 0xfa,
+ 0x21,
+ 0x3d,
+ 0x7f,
+ 0x9f,
+ 0x4d,
+ 0x51,
+ 0x58,
+ ]);
+ const pingHello = new Uint8Array([0x89, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f]);
+ const hello = new Uint8Array([0x81, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f]);
+ const close = new Uint8Array([0x88]);
+
+ const dataPayloadLength = 0x100;
+ const dataArr = [0x82, 0x7e, 0x01, 0x00];
+ for (let i = 0; i < dataPayloadLength; i++) {
+ dataArr.push(i);
+ }
+ const data = new Uint8Array(dataArr);
+
+ enum Frames {
+ ping,
+ text,
+ pong,
+ data,
+ close,
+ end,
+ }
+
+ let frame = Frames.ping;
+
+ const reader: Reader = {
+ read(p: Uint8Array): Promise<number | null> {
+ if (frame === Frames.ping) {
+ frame = Frames.text;
+ p.set(pingHello);
+ return Promise.resolve(pingHello.byteLength);
+ }
+
+ if (frame === Frames.text) {
+ frame = Frames.pong;
+ p.set(hello);
+ return Promise.resolve(hello.byteLength);
+ }
+
+ if (frame === Frames.pong) {
+ frame = Frames.data;
+ p.set(pong);
+ return Promise.resolve(pong.byteLength);
+ }
+
+ if (frame === Frames.data) {
+ frame = Frames.close;
+ p.set(data);
+ return Promise.resolve(data.byteLength);
+ }
+
+ if (frame === Frames.close) {
+ frame = Frames.end;
+ p.set(close);
+ return Promise.resolve(close.byteLength);
+ }
+
+ return Promise.resolve(null);
+ },
+ };
+
+ const conn = dummyConn(reader, new Buffer());
+ const sock = createWebSocket({ conn });
+
+ const p = await Deno.readAll(sock);
+
+ const helloLength = "Hello".length;
+
+ assertEquals(p.byteLength, helloLength + dataPayloadLength);
+ assertEquals(decode(new Buffer(p.subarray(0, helloLength)).bytes()), "Hello");
+ assertEquals(p.subarray(helloLength), data.subarray(4));
+});