summaryrefslogtreecommitdiff
path: root/cli/tests
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2023-06-13 11:16:17 -0600
committerGitHub <noreply@github.com>2023-06-13 17:16:17 +0000
commit72da18dd476e269a8677e698c01b08e683fac4a5 (patch)
treebeb286de172982ac62fcfad8216dda583bb44681 /cli/tests
parentceb03cfb037cf7024a5048b17b508ddda59cfa05 (diff)
fix(ext/websockets): ensure we fully send frames before close (#19484)
Fixes #19483
Diffstat (limited to 'cli/tests')
-rw-r--r--cli/tests/unit/websocket_test.ts54
1 files changed, 52 insertions, 2 deletions
diff --git a/cli/tests/unit/websocket_test.ts b/cli/tests/unit/websocket_test.ts
index 16384da40..ac33f9d69 100644
--- a/cli/tests/unit/websocket_test.ts
+++ b/cli/tests/unit/websocket_test.ts
@@ -100,7 +100,7 @@ Deno.test(
promise.resolve();
};
- await Promise.all([promise, server]);
+ await Promise.all([promise, server.finished]);
ws.close();
},
);
@@ -145,7 +145,57 @@ Deno.test({
ws.onclose = () => {
promise.resolve();
};
- await Promise.all([promise, server]);
+ await Promise.all([promise, server.finished]);
+});
+
+// https://github.com/denoland/deno/issues/19483
+Deno.test({
+ sanitizeOps: false,
+ sanitizeResources: false,
+}, async function websocketCloseFlushes() {
+ const promise = deferred();
+
+ const ac = new AbortController();
+ const listeningPromise = deferred();
+
+ const server = Deno.serve({
+ handler: (req) => {
+ const { response, socket } = Deno.upgradeWebSocket(req);
+ socket.onopen = () => socket.send("Hello");
+ socket.onmessage = () => {
+ socket.send("Bye");
+ socket.close();
+ };
+ socket.onclose = () => ac.abort();
+ socket.onerror = () => fail();
+ return response;
+ },
+ signal: ac.signal,
+ onListen: () => listeningPromise.resolve(),
+ hostname: "localhost",
+ port: 4247,
+ });
+
+ await listeningPromise;
+
+ const ws = new WebSocket("ws://localhost:4247/");
+ assertEquals(ws.url, "ws://localhost:4247/");
+ let seenBye = false;
+ ws.onerror = () => fail();
+ ws.onmessage = ({ data }) => {
+ if (data == "Hello") {
+ ws.send("Hello!");
+ } else {
+ assertEquals(data, "Bye");
+ seenBye = true;
+ }
+ };
+ ws.onclose = () => {
+ promise.resolve();
+ };
+ await Promise.all([promise, server.finished]);
+
+ assert(seenBye);
});
Deno.test(