Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 50 additions & 34 deletions examples/chat/server_test.ts
Original file line number Diff line number Diff line change
@@ -1,70 +1,86 @@
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
import { assert, assertEquals } from "../../testing/asserts.ts";
import { TextProtoReader } from "../../textproto/mod.ts";
import { BufReader } from "../../io/buffer.ts";
import { delay } from "../../async/delay.ts";
import { dirname, fromFileUrl, resolve } from "../../path/mod.ts";
import { TextLineStream } from "../../streams/delimiter.ts";

const moduleDir = resolve(dirname(fromFileUrl(import.meta.url)));

async function startServer(): Promise<Deno.Child<Deno.SpawnOptions>> {
const server = Deno.spawnChild(Deno.execPath(), {
args: [
async function startServer(): Promise<
Deno.Process<Deno.RunOptions & { stdout: "piped" }>
> {
const server = Deno.run({
cmd: [
Deno.execPath(),
"run",
"--quiet",
"--allow-net",
"--allow-read",
"server.ts",
],
cwd: moduleDir,
stderr: "null",
stdout: "piped",
});
try {
const r = server.stdout.pipeThrough(new TextDecoderStream()).pipeThrough(
new TextLineStream(),
);
const reader = r.getReader();
const res = await reader.read();
assert(!res.done && res.value.includes("chat server starting"));
await reader.cancel();
assert(server.stdout != null);
const r = new TextProtoReader(new BufReader(server.stdout));
const s = await r.readLine();
assert(s !== null && s.includes("chat server starting"));
} catch {
server.kill("SIGTERM");
server.stdout.close();
server.close();
}

return server;
}

Deno.test({
name: "[examples/chat] GET / should serve html",
sanitizeResources: false, // TODO(@crowlKats): re-enable once https://github.com/denoland/deno/pull/14686 lands
async fn() {
const server = await startServer();
const resp = await fetch("http://127.0.0.1:8080/");
assertEquals(resp.status, 200);
assertEquals(resp.headers.get("content-type"), "text/html");
const html = await resp.text();
assert(html.includes("ws chat example"), "body is ok");
server.kill("SIGTERM");
await server.status;
try {
const resp = await fetch("http://127.0.0.1:8080/");
assertEquals(resp.status, 200);
assertEquals(resp.headers.get("content-type"), "text/html");
const html = await resp.text();
assert(html.includes("ws chat example"), "body is ok");
} finally {
server.close();
server.stdout.close();
}
await delay(10);
},
});

Deno.test({
name: "[examples/chat] GET /ws should upgrade conn to ws",
sanitizeResources: false, // TODO(@crowlKats): re-enable once https://github.com/denoland/deno/pull/14686 lands
async fn() {
const server = await startServer();
const ws = new WebSocket("ws://127.0.0.1:8080/ws");
await new Promise<void>((resolve) => {
ws.onmessage = (message) => {
assertEquals(message.data, "Connected: [1]");
let ws: WebSocket;
try {
ws = new WebSocket("ws://127.0.0.1:8080/ws");
await new Promise<void>((resolve) => {
ws.onmessage = (message) => {
assertEquals(message.data, "[1]: Hello");
ws.close();
assertEquals(message.data, "Connected: [1]");

ws.onmessage = (message) => {
assertEquals(message.data, "[1]: Hello");
ws.close();
};

ws.send("Hello");
};

ws.onclose = () => {
resolve();
};
ws.send("Hello");
};
ws.onclose = () => resolve();
});
server.kill("SIGTERM");
await server.status;
});
} catch (err) {
console.log(err);
} finally {
server.close();
server.stdout.close();
}
},
});