summaryrefslogtreecommitdiff
path: root/cli/tests/testdata/run
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2024-02-08 13:09:47 -0700
committerGitHub <noreply@github.com>2024-02-08 13:09:47 -0700
commita417772bd7dc4f8508621ec7b2fb75f9bfeca955 (patch)
treef2f522db2abb07eb5472cf9d81645506b6d91380 /cli/tests/testdata/run
parentd704007e5fdcf1f27030dc5832b884290f1f35de (diff)
chore: Promote some integration tests to js_unit_tests (#22355)
- Move a workers test to js_unit_tests and make it work - (slightly) repair the websocketstream_test and make it a JS unit test. This test was being ignored and rotted quite a bit, but there's some value in running as much of it as we can. - Merge the two websocket test files
Diffstat (limited to 'cli/tests/testdata/run')
-rw-r--r--cli/tests/testdata/run/websocket_test.ts308
-rw-r--r--cli/tests/testdata/run/websocketstream_test.ts335
2 files changed, 0 insertions, 643 deletions
diff --git a/cli/tests/testdata/run/websocket_test.ts b/cli/tests/testdata/run/websocket_test.ts
deleted file mode 100644
index b6c5744af..000000000
--- a/cli/tests/testdata/run/websocket_test.ts
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertThrows,
- fail,
-} from "../../../../test_util/std/assert/mod.ts";
-
-Deno.test("invalid scheme", () => {
- assertThrows(() => new WebSocket("foo://localhost:4242"));
-});
-
-Deno.test("fragment", () => {
- assertThrows(() => new WebSocket("ws://localhost:4242/#"));
- assertThrows(() => new WebSocket("ws://localhost:4242/#foo"));
-});
-
-Deno.test("duplicate protocols", () => {
- assertThrows(() => new WebSocket("ws://localhost:4242", ["foo", "foo"]));
-});
-
-Deno.test("invalid server", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:2121");
- let err = false;
- ws.onerror = () => {
- err = true;
- };
- ws.onclose = () => {
- if (err) {
- resolve();
- } else {
- fail();
- }
- };
- ws.onopen = () => fail();
- await promise;
-});
-
-Deno.test("connect & close", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => {
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("connect & abort", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.close();
- let err = false;
- ws.onerror = () => {
- err = true;
- };
- ws.onclose = () => {
- if (err) {
- resolve();
- } else {
- fail();
- }
- };
- ws.onopen = () => fail();
- await promise;
-});
-
-Deno.test("connect & close custom valid code", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => ws.close(1000);
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("connect & close custom invalid code", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => {
- assertThrows(() => ws.close(1001));
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("connect & close custom valid reason", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => ws.close(1000, "foo");
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("connect & close custom invalid reason", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => {
- assertThrows(() => ws.close(1000, "".padEnd(124, "o")));
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo string", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => ws.send("foo");
- ws.onmessage = (e) => {
- assertEquals(e.data, "foo");
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo string tls", async () => {
- const deferred1 = Promise.withResolvers<void>();
- const deferred2 = Promise.withResolvers<void>();
- const ws = new WebSocket("wss://localhost:4243");
- ws.onerror = () => fail();
- ws.onopen = () => ws.send("foo");
- ws.onmessage = (e) => {
- assertEquals(e.data, "foo");
- ws.close();
- deferred1.resolve();
- };
- ws.onclose = () => {
- deferred2.resolve();
- };
- await deferred1.promise;
- await deferred2.promise;
-});
-
-Deno.test("websocket error", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("wss://localhost:4242");
- ws.onopen = () => fail();
- ws.onerror = (err) => {
- assert(err instanceof ErrorEvent);
- assertEquals(
- err.message,
- "NetworkError: failed to connect to WebSocket: received corrupt message of type InvalidContentType",
- );
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo blob with binaryType blob", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- const blob = new Blob(["foo"]);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(blob);
- ws.onmessage = (e) => {
- e.data.text().then((actual: string) => {
- blob.text().then((expected) => {
- assertEquals(actual, expected);
- });
- });
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo blob with binaryType arraybuffer", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.binaryType = "arraybuffer";
- const blob = new Blob(["foo"]);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(blob);
- ws.onmessage = (e) => {
- blob.arrayBuffer().then((expected) => {
- assertEquals(e.data, expected);
- });
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo uint8array with binaryType blob", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- const uint = new Uint8Array([102, 111, 111]);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(uint);
- ws.onmessage = (e) => {
- e.data.arrayBuffer().then((actual: ArrayBuffer) => {
- assertEquals(actual, uint.buffer);
- });
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo uint8array with binaryType arraybuffer", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.binaryType = "arraybuffer";
- const uint = new Uint8Array([102, 111, 111]);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(uint);
- ws.onmessage = (e) => {
- assertEquals(e.data, uint.buffer);
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo arraybuffer with binaryType blob", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- const buffer = new ArrayBuffer(3);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(buffer);
- ws.onmessage = (e) => {
- e.data.arrayBuffer().then((actual: ArrayBuffer) => {
- assertEquals(actual, buffer);
- });
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo arraybuffer with binaryType arraybuffer", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.binaryType = "arraybuffer";
- const buffer = new ArrayBuffer(3);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(buffer);
- ws.onmessage = (e) => {
- assertEquals(e.data, buffer);
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("Event Handlers order", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- const arr: number[] = [];
- ws.onerror = () => fail();
- ws.addEventListener("message", () => arr.push(1));
- ws.onmessage = () => fail();
- ws.addEventListener("message", () => {
- arr.push(3);
- ws.close();
- assertEquals(arr, [1, 2, 3]);
- });
- ws.onmessage = () => arr.push(2);
- ws.onopen = () => ws.send("Echo");
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("Close without frame", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4244");
- ws.onerror = () => fail();
- ws.onclose = (e) => {
- assertEquals(e.code, 1005);
- resolve();
- };
- await promise;
-});
diff --git a/cli/tests/testdata/run/websocketstream_test.ts b/cli/tests/testdata/run/websocketstream_test.ts
deleted file mode 100644
index b9157c25e..000000000
--- a/cli/tests/testdata/run/websocketstream_test.ts
+++ /dev/null
@@ -1,335 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-import {
- assert,
- assertEquals,
- assertNotEquals,
- assertRejects,
- assertThrows,
- unreachable,
-} from "../../../../test_util/std/assert/mod.ts";
-
-Deno.test("fragment", () => {
- assertThrows(() => new WebSocketStream("ws://localhost:4242/#"));
- assertThrows(() => new WebSocketStream("ws://localhost:4242/#foo"));
-});
-
-Deno.test("duplicate protocols", () => {
- assertThrows(() =>
- new WebSocketStream("ws://localhost:4242", {
- protocols: ["foo", "foo"],
- })
- );
-});
-
-Deno.test("connect & close custom valid code", async () => {
- const ws = new WebSocketStream("ws://localhost:4242");
- await ws.opened;
- ws.close({ code: 1000 });
- await ws.closed;
-});
-
-Deno.test("connect & close custom invalid reason", async () => {
- const ws = new WebSocketStream("ws://localhost:4242");
- await ws.opened;
- assertThrows(() => ws.close({ code: 1000, reason: "".padEnd(124, "o") }));
- ws.close();
- await ws.closed;
-});
-
-Deno.test("echo string", async () => {
- const ws = new WebSocketStream("ws://localhost:4242");
- const { readable, writable } = await ws.opened;
- await writable.getWriter().write("foo");
- const res = await readable.getReader().read();
- assertEquals(res.value, "foo");
- ws.close();
- await ws.closed;
-});
-
-Deno.test("echo string tls", async () => {
- const ws = new WebSocketStream("wss://localhost:4243");
- const { readable, writable } = await ws.opened;
- await writable.getWriter().write("foo");
- const res = await readable.getReader().read();
- assertEquals(res.value, "foo");
- ws.close();
- await ws.closed;
-});
-
-Deno.test("websocket error", async () => {
- const ws = new WebSocketStream("wss://localhost:4242");
- await Promise.all([
- assertRejects(
- () => ws.opened,
- Deno.errors.UnexpectedEof,
- "tls handshake eof",
- ),
- assertRejects(
- () => ws.closed,
- Deno.errors.UnexpectedEof,
- "tls handshake eof",
- ),
- ]);
-});
-
-Deno.test("echo uint8array", async () => {
- const ws = new WebSocketStream("ws://localhost:4242");
- const { readable, writable } = await ws.opened;
- const uint = new Uint8Array([102, 111, 111]);
- await writable.getWriter().write(uint);
- const res = await readable.getReader().read();
- assertEquals(res.value, uint);
- ws.close();
- await ws.closed;
-});
-
-Deno.test("aborting immediately throws an AbortError", async () => {
- const controller = new AbortController();
- const wss = new WebSocketStream("ws://localhost:4242", {
- signal: controller.signal,
- });
- controller.abort();
- await assertRejects(
- () => wss.opened,
- (error: Error) => {
- assert(error instanceof DOMException);
- assertEquals(error.name, "AbortError");
- },
- );
- await assertRejects(
- () => wss.closed,
- (error: Error) => {
- assert(error instanceof DOMException);
- assertEquals(error.name, "AbortError");
- },
- );
-});
-
-Deno.test("aborting immediately with a reason throws that reason", async () => {
- const controller = new AbortController();
- const wss = new WebSocketStream("ws://localhost:4242", {
- signal: controller.signal,
- });
- const abortReason = new Error();
- controller.abort(abortReason);
- await assertRejects(
- () => wss.opened,
- (error: Error) => assertEquals(error, abortReason),
- );
- await assertRejects(
- () => wss.closed,
- (error: Error) => assertEquals(error, abortReason),
- );
-});
-
-Deno.test("aborting immediately with a primitive as reason throws that primitive", async () => {
- const controller = new AbortController();
- const wss = new WebSocketStream("ws://localhost:4242", {
- signal: controller.signal,
- });
- controller.abort("Some string");
- await wss.opened.then(
- () => unreachable(),
- (e) => assertEquals(e, "Some string"),
- );
- await wss.closed.then(
- () => unreachable(),
- (e) => assertEquals(e, "Some string"),
- );
-});
-
-Deno.test("headers", async () => {
- const listener = Deno.listen({ port: 4512 });
- const promise = (async () => {
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const { request, respondWith } = (await httpConn.nextRequest())!;
- assertEquals(request.headers.get("x-some-header"), "foo");
- const { response, socket } = Deno.upgradeWebSocket(request);
- socket.onopen = () => socket.close();
- const p = new Promise<void>((resolve) => {
- socket.onopen = () => socket.close();
- socket.onclose = () => resolve();
- });
- await respondWith(response);
- await p;
- })();
-
- const ws = new WebSocketStream("ws://localhost:4512", {
- headers: [["x-some-header", "foo"]],
- });
- await ws.opened;
- await promise;
- await ws.closed;
- listener.close();
-});
-
-Deno.test("forbidden headers", async () => {
- const forbiddenHeaders = [
- "sec-websocket-accept",
- "sec-websocket-extensions",
- "sec-websocket-key",
- "sec-websocket-protocol",
- "sec-websocket-version",
- "upgrade",
- "connection",
- ];
-
- const listener = Deno.listen({ port: 4512 });
- const promise = (async () => {
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const { request, respondWith } = (await httpConn.nextRequest())!;
- for (const [key] of request.headers) {
- assertNotEquals(key, "foo");
- }
- const { response, socket } = Deno.upgradeWebSocket(request);
- const p = new Promise<void>((resolve) => {
- socket.onopen = () => socket.close();
- socket.onclose = () => resolve();
- });
- await respondWith(response);
- await p;
- })();
-
- const ws = new WebSocketStream("ws://localhost:4512", {
- headers: forbiddenHeaders.map((header) => [header, "foo"]),
- });
- await ws.opened;
- await promise;
- await ws.closed;
- listener.close();
-});
-
-Deno.test("sync close with empty stream", async () => {
- const listener = Deno.listen({ port: 4512 });
- const promise = (async () => {
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const { request, respondWith } = (await httpConn.nextRequest())!;
- const { response, socket } = Deno.upgradeWebSocket(request);
- const p = new Promise<void>((resolve) => {
- socket.onopen = () => {
- socket.send("first message");
- socket.send("second message");
- };
- socket.onclose = () => resolve();
- });
- await respondWith(response);
- await p;
- })();
-
- const ws = new WebSocketStream("ws://localhost:4512");
- const { readable } = await ws.opened;
- const reader = readable.getReader();
- const firstMessage = await reader.read();
- assertEquals(firstMessage.value, "first message");
- const secondMessage = await reader.read();
- assertEquals(secondMessage.value, "second message");
- ws.close({ code: 1000 });
- await ws.closed;
- await promise;
- listener.close();
-});
-
-Deno.test("sync close with unread messages in stream", async () => {
- const listener = Deno.listen({ port: 4512 });
- const promise = (async () => {
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const { request, respondWith } = (await httpConn.nextRequest())!;
- const { response, socket } = Deno.upgradeWebSocket(request);
- const p = new Promise<void>((resolve) => {
- socket.onopen = () => {
- socket.send("first message");
- socket.send("second message");
- socket.send("third message");
- socket.send("fourth message");
- };
- socket.onclose = () => resolve();
- });
- await respondWith(response);
- await p;
- })();
-
- const ws = new WebSocketStream("ws://localhost:4512");
- const { readable } = await ws.opened;
- const reader = readable.getReader();
- const firstMessage = await reader.read();
- assertEquals(firstMessage.value, "first message");
- const secondMessage = await reader.read();
- assertEquals(secondMessage.value, "second message");
- ws.close({ code: 1000 });
- await ws.closed;
- await promise;
- listener.close();
-});
-
-Deno.test("async close with empty stream", async () => {
- const listener = Deno.listen({ port: 4512 });
- const promise = (async () => {
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const { request, respondWith } = (await httpConn.nextRequest())!;
- const { response, socket } = Deno.upgradeWebSocket(request);
- const p = new Promise<void>((resolve) => {
- socket.onopen = () => {
- socket.send("first message");
- socket.send("second message");
- };
- socket.onclose = () => resolve();
- });
- await respondWith(response);
- await p;
- })();
-
- const ws = new WebSocketStream("ws://localhost:4512");
- const { readable } = await ws.opened;
- const reader = readable.getReader();
- const firstMessage = await reader.read();
- assertEquals(firstMessage.value, "first message");
- const secondMessage = await reader.read();
- assertEquals(secondMessage.value, "second message");
- setTimeout(() => {
- ws.close({ code: 1000 });
- }, 0);
- await ws.closed;
- await promise;
- listener.close();
-});
-
-Deno.test("async close with unread messages in stream", async () => {
- const listener = Deno.listen({ port: 4512 });
- const promise = (async () => {
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const { request, respondWith } = (await httpConn.nextRequest())!;
- const { response, socket } = Deno.upgradeWebSocket(request);
- const p = new Promise<void>((resolve) => {
- socket.onopen = () => {
- socket.send("first message");
- socket.send("second message");
- socket.send("third message");
- socket.send("fourth message");
- };
- socket.onclose = () => resolve();
- });
- await respondWith(response);
- await p;
- })();
-
- const ws = new WebSocketStream("ws://localhost:4512");
- const { readable } = await ws.opened;
- const reader = readable.getReader();
- const firstMessage = await reader.read();
- assertEquals(firstMessage.value, "first message");
- const secondMessage = await reader.read();
- assertEquals(secondMessage.value, "second message");
- setTimeout(() => {
- ws.close({ code: 1000 });
- }, 0);
- await ws.closed;
- await promise;
- listener.close();
-});