summaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
Diffstat (limited to 'std')
-rw-r--r--std/encoding/binary_test.ts2
-rw-r--r--std/examples/chat/server_test.ts67
-rw-r--r--std/examples/test.ts4
-rw-r--r--std/examples/tests/cat_test.ts2
-rw-r--r--std/examples/tests/catj_test.ts11
-rw-r--r--std/examples/tests/colors_test.ts2
-rw-r--r--std/examples/tests/curl_test.ts66
-rw-r--r--std/examples/tests/echo_server_test.ts1
-rw-r--r--std/examples/tests/welcome_test.ts2
-rw-r--r--std/examples/tests/xeval_test.ts29
-rw-r--r--std/fs/empty_dir_test.ts13
-rw-r--r--std/fs/ensure_symlink_test.ts4
-rw-r--r--std/fs/exists_test.ts6
-rw-r--r--std/fs/expand_glob_test.ts1
-rw-r--r--std/fs/walk_test.ts5
-rw-r--r--std/http/file_server_test.ts7
-rw-r--r--std/http/racing_server_test.ts1
-rw-r--r--std/http/server_test.ts146
-rw-r--r--std/io/util_test.ts20
-rw-r--r--std/mime/multipart_test.ts3
-rw-r--r--std/node/_fs/_fs_dir_test.ts18
-rw-r--r--std/signal/test.ts67
-rw-r--r--std/testing/bench_test.ts100
-rw-r--r--std/ws/test.ts109
24 files changed, 374 insertions, 312 deletions
diff --git a/std/encoding/binary_test.ts b/std/encoding/binary_test.ts
index a9f116ebc..936fcbb63 100644
--- a/std/encoding/binary_test.ts
+++ b/std/encoding/binary_test.ts
@@ -160,5 +160,3 @@ Deno.test(async function testWriteVarnumLittleEndian(): Promise<void> {
await buff.read(data);
assertEquals(data, new Uint8Array([0x01, 0x02, 0x03, 0x04]));
});
-
-Deno.runTests();
diff --git a/std/examples/chat/server_test.ts b/std/examples/chat/server_test.ts
index c63453a19..8004055a4 100644
--- a/std/examples/chat/server_test.ts
+++ b/std/examples/chat/server_test.ts
@@ -3,10 +3,12 @@ import { assert, assertEquals } from "../../testing/asserts.ts";
import { TextProtoReader } from "../../textproto/mod.ts";
import { BufReader } from "../../io/bufio.ts";
import { connectWebSocket, WebSocket } from "../../ws/mod.ts";
+import { delay } from "../../util/async.ts";
-let server: Deno.Process | undefined;
-async function startServer(): Promise<void> {
- server = Deno.run({
+const { test, build } = Deno;
+
+async function startServer(): Promise<Deno.Process> {
+ const server = Deno.run({
args: [Deno.execPath(), "--allow-net", "--allow-read", "server.ts"],
cwd: "examples/chat",
stdout: "piped"
@@ -17,54 +19,51 @@ async function startServer(): Promise<void> {
const s = await r.readLine();
assert(s !== Deno.EOF && s.includes("chat server starting"));
} catch {
+ server.stdout!.close();
server.close();
}
-}
-const { test, build } = Deno;
+ return server;
+}
// TODO: https://github.com/denoland/deno/issues/4108
const skip = build.os == "win";
test({
skip,
- name: "beforeAll",
- async fn() {
- await startServer();
- }
-});
-
-test({
- skip,
name: "GET / should serve html",
async fn() {
- 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.body.text();
- assert(html.includes("ws chat example"), "body is ok");
+ const server = await startServer();
+ 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.body.text();
+ assert(html.includes("ws chat example"), "body is ok");
+ } finally {
+ server.close();
+ server.stdout!.close();
+ }
+ await delay(10);
}
});
-let ws: WebSocket | undefined;
-
test({
skip,
name: "GET /ws should upgrade conn to ws",
async fn() {
- ws = await connectWebSocket("http://127.0.0.1:8080/ws");
- const it = ws.receive();
- assertEquals((await it.next()).value, "Connected: [1]");
- ws.send("Hello");
- assertEquals((await it.next()).value, "[1]: Hello");
- }
-});
-
-test({
- skip,
- name: "afterAll",
- fn() {
- server?.close();
- ws?.conn.close();
+ const server = await startServer();
+ let ws: WebSocket | undefined;
+ try {
+ ws = await connectWebSocket("http://127.0.0.1:8080/ws");
+ const it = ws.receive();
+ assertEquals((await it.next()).value, "Connected: [1]");
+ ws.send("Hello");
+ assertEquals((await it.next()).value, "[1]: Hello");
+ } finally {
+ server.close();
+ server.stdout!.close();
+ ws!.conn.close();
+ }
}
});
diff --git a/std/examples/test.ts b/std/examples/test.ts
index 641a2ef74..1c817dfd1 100644
--- a/std/examples/test.ts
+++ b/std/examples/test.ts
@@ -21,8 +21,10 @@ Deno.test(async function catSmoke(): Promise<void> {
"examples/cat.ts",
"README.md"
],
- stdout: "piped"
+ stdout: "null",
+ stderr: "null"
});
const s = await p.status();
assertEquals(s.code, 0);
+ p.close();
});
diff --git a/std/examples/tests/cat_test.ts b/std/examples/tests/cat_test.ts
index 93e884f61..34b60bc5d 100644
--- a/std/examples/tests/cat_test.ts
+++ b/std/examples/tests/cat_test.ts
@@ -16,7 +16,7 @@ Deno.test("[examples/cat] print multiple files", async () => {
});
try {
- const output = await Deno.readAll(process.stdout!);
+ const output = await process.output();
const actual = decoder.decode(output).trim();
assertStrictEq(actual, "Hello\nWorld");
} finally {
diff --git a/std/examples/tests/catj_test.ts b/std/examples/tests/catj_test.ts
index 9267f532b..2d667dacc 100644
--- a/std/examples/tests/catj_test.ts
+++ b/std/examples/tests/catj_test.ts
@@ -5,7 +5,7 @@ Deno.test("[examples/catj] print an array", async () => {
const decoder = new TextDecoder();
const process = catj("testdata/catj/array.json");
try {
- const output = await Deno.readAll(process.stdout!);
+ const output = await process.output();
const actual = decoder.decode(output).trim();
const expected = [
'.[0] = "string"',
@@ -17,6 +17,7 @@ Deno.test("[examples/catj] print an array", async () => {
assertStrictEq(actual, expected);
} finally {
+ process.stdin!.close();
process.close();
}
});
@@ -25,7 +26,7 @@ Deno.test("[examples/catj] print an object", async () => {
const decoder = new TextDecoder();
const process = catj("testdata/catj/object.json");
try {
- const output = await Deno.readAll(process.stdout!);
+ const output = await process.output();
const actual = decoder.decode(output).trim();
const expected = [
'.string = "foobar"',
@@ -35,6 +36,7 @@ Deno.test("[examples/catj] print an object", async () => {
assertStrictEq(actual, expected);
} finally {
+ process.stdin!.close();
process.close();
}
});
@@ -46,12 +48,13 @@ Deno.test("[examples/catj] print multiple files", async () => {
"testdata/catj/simple-array.json"
);
try {
- const output = await Deno.readAll(process.stdout!);
+ const output = await process.output();
const actual = decoder.decode(output).trim();
const expected = ['.message = "hello"', ".[0] = 1", ".[1] = 2"].join("\n");
assertStrictEq(actual, expected);
} finally {
+ process.stdin!.close();
process.close();
}
});
@@ -63,7 +66,7 @@ Deno.test("[examples/catj] read from stdin", async () => {
try {
await process.stdin!.write(new TextEncoder().encode(input));
process.stdin!.close();
- const output = await Deno.readAll(process.stdout!);
+ const output = await process.output();
const actual = decoder.decode(output).trim();
assertStrictEq(actual, '.foo = "bar"');
diff --git a/std/examples/tests/colors_test.ts b/std/examples/tests/colors_test.ts
index dcb485f6c..e01e4d558 100644
--- a/std/examples/tests/colors_test.ts
+++ b/std/examples/tests/colors_test.ts
@@ -9,7 +9,7 @@ Deno.test("[examples/colors] print a colored text", async () => {
stdout: "piped"
});
try {
- const output = await Deno.readAll(process.stdout!);
+ const output = await process.output();
const actual = decoder.decode(output).trim();
const expected = "Hello world!";
assertStrictEq(actual, expected);
diff --git a/std/examples/tests/curl_test.ts b/std/examples/tests/curl_test.ts
index 71a0fe67f..593e5b8f7 100644
--- a/std/examples/tests/curl_test.ts
+++ b/std/examples/tests/curl_test.ts
@@ -1,41 +1,41 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
-import { Server, serve } from "../../http/server.ts";
+import { serve } from "../../http/server.ts";
import { assertStrictEq } from "../../testing/asserts.ts";
-let server: Server | undefined;
+Deno.test({
+ name: "[examples/curl] send a request to a specified url",
+ // FIXME(bartlomieju): this test is leaking both resources and ops,
+ // and causes interference with other tests
+ skip: true,
+ fn: async () => {
+ const server = serve({ port: 8081 });
+ (async (): Promise<void> => {
+ for await (const req of server) {
+ req.respond({ body: "Hello world" });
+ }
+ })();
-async function startTestServer(): Promise<void> {
- server = await serve({ port: 8080 });
- (async (): Promise<void> => {
- for await (const req of server) {
- req.respond({ body: "Hello world" });
- }
- })();
-}
-
-Deno.test("[examples/curl] beforeAll", async () => {
- await startTestServer();
-});
-
-Deno.test("[examples/curl] send a request to a specified url", async () => {
- const decoder = new TextDecoder();
- const process = Deno.run({
- args: [Deno.execPath(), "--allow-net", "curl.ts", "http://localhost:8080"],
- cwd: "examples",
- stdout: "piped"
- });
+ const decoder = new TextDecoder();
+ const process = Deno.run({
+ args: [
+ Deno.execPath(),
+ "--allow-net",
+ "curl.ts",
+ "http://localhost:8081"
+ ],
+ cwd: "examples",
+ stdout: "piped"
+ });
- try {
- const output = await Deno.readAll(process.stdout!);
- const actual = decoder.decode(output).trim();
- const expected = "Hello world";
+ try {
+ const output = await process.output();
+ const actual = decoder.decode(output).trim();
+ const expected = "Hello world";
- assertStrictEq(actual, expected);
- } finally {
- process.close();
+ assertStrictEq(actual, expected);
+ } finally {
+ process.close();
+ server.close();
+ }
}
});
-
-Deno.test("[examples/curl] afterAll", () => {
- server?.close();
-});
diff --git a/std/examples/tests/echo_server_test.ts b/std/examples/tests/echo_server_test.ts
index 49a1feb31..20fd7479c 100644
--- a/std/examples/tests/echo_server_test.ts
+++ b/std/examples/tests/echo_server_test.ts
@@ -38,6 +38,7 @@ Deno.test("[examples/echo_server]", async () => {
assertStrictEq(actualResponse, expectedResponse);
} finally {
conn?.close();
+ process.stdout!.close();
process.close();
}
});
diff --git a/std/examples/tests/welcome_test.ts b/std/examples/tests/welcome_test.ts
index 76209cfad..304a57868 100644
--- a/std/examples/tests/welcome_test.ts
+++ b/std/examples/tests/welcome_test.ts
@@ -9,7 +9,7 @@ Deno.test("[examples/welcome] print a welcome message", async () => {
stdout: "piped"
});
try {
- const output = await Deno.readAll(process.stdout!);
+ const output = await process.output();
const actual = decoder.decode(output).trim();
const expected = "Welcome to Deno 🦕";
assertStrictEq(actual, expected);
diff --git a/std/examples/tests/xeval_test.ts b/std/examples/tests/xeval_test.ts
index 128b6e3da..db11c215c 100644
--- a/std/examples/tests/xeval_test.ts
+++ b/std/examples/tests/xeval_test.ts
@@ -25,18 +25,22 @@ Deno.test(async function xevalDelimiter(): Promise<void> {
const xevalPath = "examples/xeval.ts";
-Deno.test(async function xevalCliReplvar(): Promise<void> {
- const p = run({
- args: [execPath(), xevalPath, "--replvar=abc", "console.log(abc)"],
- stdin: "piped",
- stdout: "piped",
- stderr: "null"
- });
- assert(p.stdin != null);
- await p.stdin.write(encode("hello"));
- await p.stdin.close();
- assertEquals(await p.status(), { code: 0, success: true });
- assertEquals(decode(await p.output()).trimEnd(), "hello");
+Deno.test({
+ name: "xevalCliReplvar",
+ fn: async function(): Promise<void> {
+ const p = run({
+ args: [execPath(), xevalPath, "--replvar=abc", "console.log(abc)"],
+ stdin: "piped",
+ stdout: "piped",
+ stderr: "null"
+ });
+ assert(p.stdin != null);
+ await p.stdin.write(encode("hello"));
+ p.stdin.close();
+ assertEquals(await p.status(), { code: 0, success: true });
+ assertEquals(decode(await p.output()).trimEnd(), "hello");
+ p.close();
+ }
});
Deno.test(async function xevalCliSyntaxError(): Promise<void> {
@@ -49,4 +53,5 @@ Deno.test(async function xevalCliSyntaxError(): Promise<void> {
assertEquals(await p.status(), { code: 1, success: false });
assertEquals(decode(await p.output()), "");
assertStrContains(decode(await p.stderrOutput()), "Uncaught SyntaxError");
+ p.close();
});
diff --git a/std/fs/empty_dir_test.ts b/std/fs/empty_dir_test.ts
index 8f9ca72c3..553d63001 100644
--- a/std/fs/empty_dir_test.ts
+++ b/std/fs/empty_dir_test.ts
@@ -23,7 +23,7 @@ Deno.test(async function emptyDirIfItNotExist(): Promise<void> {
assertEquals(stat.isDirectory(), true);
} finally {
// remove the test dir
- Deno.remove(testDir, { recursive: true });
+ await Deno.remove(testDir, { recursive: true });
}
});
@@ -39,7 +39,7 @@ Deno.test(function emptyDirSyncIfItNotExist(): void {
assertEquals(stat.isDirectory(), true);
} finally {
// remove the test dir
- Deno.remove(testDir, { recursive: true });
+ Deno.removeSync(testDir, { recursive: true });
}
});
@@ -218,16 +218,15 @@ for (const s of scenes) {
);
args.push("testfolder");
- const { stdout } = Deno.run({
+ const p = Deno.run({
stdout: "piped",
cwd: testdataDir,
args: args
});
- assert(stdout);
-
- const output = await Deno.readAll(stdout);
-
+ assert(p.stdout);
+ const output = await p.output();
+ p.close();
assertStrContains(new TextDecoder().decode(output), s.output);
} catch (err) {
await Deno.remove(testfolder, { recursive: true });
diff --git a/std/fs/ensure_symlink_test.ts b/std/fs/ensure_symlink_test.ts
index 8017bcebf..2357650ab 100644
--- a/std/fs/ensure_symlink_test.ts
+++ b/std/fs/ensure_symlink_test.ts
@@ -15,13 +15,13 @@ Deno.test(async function ensureSymlinkIfItNotExist(): Promise<void> {
const testDir = path.join(testdataDir, "link_file_1");
const testFile = path.join(testDir, "test.txt");
- assertThrowsAsync(
+ await assertThrowsAsync(
async (): Promise<void> => {
await ensureSymlink(testFile, path.join(testDir, "test1.txt"));
}
);
- assertThrowsAsync(
+ await assertThrowsAsync(
async (): Promise<void> => {
await Deno.stat(testFile).then((): void => {
throw new Error("test file should exists.");
diff --git a/std/fs/exists_test.ts b/std/fs/exists_test.ts
index 0a1293d96..4202f2734 100644
--- a/std/fs/exists_test.ts
+++ b/std/fs/exists_test.ts
@@ -121,14 +121,14 @@ for (const s of scenes) {
args.push(path.join(testdataDir, s.async ? "exists.ts" : "exists_sync.ts"));
args.push(s.file);
- const { stdout } = Deno.run({
+ const p = Deno.run({
stdout: "piped",
cwd: testdataDir,
args: args
});
- const output = await Deno.readAll(stdout!);
-
+ const output = await p.output();
+ p.close();
assertStrContains(new TextDecoder().decode(output), s.output);
});
// done
diff --git a/std/fs/expand_glob_test.ts b/std/fs/expand_glob_test.ts
index 58da2c1bf..6bdb77266 100644
--- a/std/fs/expand_glob_test.ts
+++ b/std/fs/expand_glob_test.ts
@@ -131,4 +131,5 @@ Deno.test(async function expandGlobPermError(): Promise<void> {
decode(await p.stderrOutput()),
"Uncaught PermissionDenied"
);
+ p.close();
});
diff --git a/std/fs/walk_test.ts b/std/fs/walk_test.ts
index 91cfd57c8..07f846b49 100644
--- a/std/fs/walk_test.ts
+++ b/std/fs/walk_test.ts
@@ -20,7 +20,7 @@ export async function testWalk(
await t();
} finally {
chdir(origCwd);
- remove(d, { recursive: true });
+ await remove(d, { recursive: true });
}
}
Deno.test({ skip, name: `[walk] ${name}`, fn });
@@ -46,7 +46,8 @@ export async function walkArray(
}
export async function touch(path: string): Promise<void> {
- await open(path, "w");
+ const f = await open(path, "w");
+ f.close();
}
function assertReady(expectedLength: number): void {
diff --git a/std/http/file_server_test.ts b/std/http/file_server_test.ts
index 22b318821..1fbe3ba97 100644
--- a/std/http/file_server_test.ts
+++ b/std/http/file_server_test.ts
@@ -78,6 +78,7 @@ test(async function serveFallback(): Promise<void> {
assert(res.headers.has("access-control-allow-origin"));
assert(res.headers.has("access-control-allow-headers"));
assertEquals(res.status, 404);
+ res.body.close();
} finally {
killFileServer();
}
@@ -90,11 +91,12 @@ test(async function serveWithUnorthodoxFilename(): Promise<void> {
assert(res.headers.has("access-control-allow-origin"));
assert(res.headers.has("access-control-allow-headers"));
assertEquals(res.status, 200);
-
+ res.body.close();
res = await fetch("http://localhost:4500/http/testdata/test%20file.txt");
assert(res.headers.has("access-control-allow-origin"));
assert(res.headers.has("access-control-allow-headers"));
assertEquals(res.status, 200);
+ res.body.close();
} finally {
killFileServer();
}
@@ -114,7 +116,8 @@ test(async function servePermissionDenied(): Promise<void> {
assert(s !== Deno.EOF && s.includes("server listening"));
try {
- await fetch("http://localhost:4500/");
+ const res = await fetch("http://localhost:4500/");
+ res.body.close();
assertStrContains(
(await errReader.readLine()) as string,
"run again with the --allow-read flag"
diff --git a/std/http/racing_server_test.ts b/std/http/racing_server_test.ts
index 0f228419d..d82acebab 100644
--- a/std/http/racing_server_test.ts
+++ b/std/http/racing_server_test.ts
@@ -73,4 +73,5 @@ test(async function serverPipelineRace(): Promise<void> {
assertEquals(s, outLines[i]);
}
killServer();
+ conn.close();
});
diff --git a/std/http/server_test.ts b/std/http/server_test.ts
index 571c7332f..79d4417db 100644
--- a/std/http/server_test.ts
+++ b/std/http/server_test.ts
@@ -343,88 +343,101 @@ test(async function requestBodyReaderWithTransferEncoding(): Promise<void> {
}
});
-test("destroyed connection", async (): Promise<void> => {
- // Runs a simple server as another process
- const p = Deno.run({
- args: [Deno.execPath(), "--allow-net", "http/testdata/simple_server.ts"],
- stdout: "piped"
- });
-
- try {
- const r = new TextProtoReader(new BufReader(p.stdout!));
- const s = await r.readLine();
- assert(s !== Deno.EOF && s.includes("server listening"));
+test({
+ name: "destroyed connection",
+ // FIXME(bartlomieju): hangs on windows, cause can't do `Deno.kill`
+ skip: true,
+ fn: async (): Promise<void> => {
+ // Runs a simple server as another process
+ const p = Deno.run({
+ args: [Deno.execPath(), "--allow-net", "http/testdata/simple_server.ts"],
+ stdout: "piped"
+ });
let serverIsRunning = true;
- p.status()
+ const statusPromise = p
+ .status()
.then((): void => {
serverIsRunning = false;
})
.catch((_): void => {}); // Ignores the error when closing the process.
- await delay(100);
-
- // Reqeusts to the server and immediately closes the connection
- const conn = await Deno.connect({ port: 4502 });
- await conn.write(new TextEncoder().encode("GET / HTTP/1.0\n\n"));
- conn.close();
-
- // Waits for the server to handle the above (broken) request
- await delay(100);
-
- assert(serverIsRunning);
- } finally {
- // Stops the sever.
- p.close();
+ try {
+ const r = new TextProtoReader(new BufReader(p.stdout!));
+ const s = await r.readLine();
+ assert(s !== Deno.EOF && s.includes("server listening"));
+ await delay(100);
+ // Reqeusts to the server and immediately closes the connection
+ const conn = await Deno.connect({ port: 4502 });
+ await conn.write(new TextEncoder().encode("GET / HTTP/1.0\n\n"));
+ conn.close();
+ // Waits for the server to handle the above (broken) request
+ await delay(100);
+ assert(serverIsRunning);
+ } finally {
+ // Stops the sever and allows `p.status()` promise to resolve
+ Deno.kill(p.pid, Deno.Signal.SIGKILL);
+ await statusPromise;
+ p.stdout!.close();
+ p.close();
+ }
}
});
-test("serveTLS", async (): Promise<void> => {
- // Runs a simple server as another process
- const p = Deno.run({
- args: [
- Deno.execPath(),
- "--allow-net",
- "--allow-read",
- "http/testdata/simple_https_server.ts"
- ],
- stdout: "piped"
- });
-
- try {
- const r = new TextProtoReader(new BufReader(p.stdout!));
- const s = await r.readLine();
- assert(
- s !== Deno.EOF && s.includes("server listening"),
- "server must be started"
- );
+test({
+ name: "serveTLS",
+ // FIXME(bartlomieju): hangs on windows, cause can't do `Deno.kill`
+ skip: true,
+ fn: async (): Promise<void> => {
+ // Runs a simple server as another process
+ const p = Deno.run({
+ args: [
+ Deno.execPath(),
+ "--allow-net",
+ "--allow-read",
+ "http/testdata/simple_https_server.ts"
+ ],
+ stdout: "piped"
+ });
let serverIsRunning = true;
- p.status()
+ const statusPromise = p
+ .status()
.then((): void => {
serverIsRunning = false;
})
.catch((_): void => {}); // Ignores the error when closing the process.
- // Requests to the server and immediately closes the connection
- const conn = await Deno.connectTLS({
- hostname: "localhost",
- port: 4503,
- certFile: "http/testdata/tls/RootCA.pem"
- });
- await Deno.writeAll(
- conn,
- new TextEncoder().encode("GET / HTTP/1.0\r\n\r\n")
- );
- const res = new Uint8Array(100);
- const nread = assertNotEOF(await conn.read(res));
- conn.close();
- const resStr = new TextDecoder().decode(res.subarray(0, nread));
- assert(resStr.includes("Hello HTTPS"));
- assert(serverIsRunning);
- } finally {
- // Stops the sever.
- p.close();
+ try {
+ const r = new TextProtoReader(new BufReader(p.stdout!));
+ const s = await r.readLine();
+ assert(
+ s !== Deno.EOF && s.includes("server listening"),
+ "server must be started"
+ );
+ // Requests to the server and immediately closes the connection
+ const conn = await Deno.connectTLS({
+ hostname: "localhost",
+ port: 4503,
+ certFile: "http/testdata/tls/RootCA.pem"
+ });
+ await Deno.writeAll(
+ conn,
+ new TextEncoder().encode("GET / HTTP/1.0\r\n\r\n")
+ );
+ const res = new Uint8Array(100);
+ const nread = assertNotEOF(await conn.read(res));
+ conn.close();
+ const resStr = new TextDecoder().decode(res.subarray(0, nread));
+ assert(resStr.includes("Hello HTTPS"));
+ assert(serverIsRunning);
+ } finally {
+ // Stops the sever and allows `p.status()` promise to resolve
+ Deno.kill(p.pid, Deno.Signal.SIGKILL);
+ await statusPromise;
+ p.stdout!.close();
+ p.close();
+ }
}
});
@@ -480,6 +493,9 @@ test({
}
}
server.close();
+ // Let event loop do another turn so server
+ // finishes all pending ops.
+ await delay(0);
const resources = Deno.resources();
assert(reqCount === 1);
// Server should be gone
diff --git a/std/io/util_test.ts b/std/io/util_test.ts
index 575709e39..2fcad9305 100644
--- a/std/io/util_test.ts
+++ b/std/io/util_test.ts
@@ -38,12 +38,16 @@ test("[io/tuil] copyBytes", function(): void {
assertEquals(dst, Uint8Array.of(3, 4, 0, 0));
});
-test("[io/util] tempfile", async function(): Promise<void> {
- const f = await tempFile(".", {
- prefix: "prefix-",
- postfix: "-postfix"
- });
- const base = path.basename(f.filepath);
- assert(!!base.match(/^prefix-.+?-postfix$/));
- await remove(f.filepath);
+test({
+ name: "[io/util] tempfile",
+ fn: async function(): Promise<void> {
+ const f = await tempFile(".", {
+ prefix: "prefix-",
+ postfix: "-postfix"
+ });
+ const base = path.basename(f.filepath);
+ assert(!!base.match(/^prefix-.+?-postfix$/));
+ f.file.close();
+ await remove(f.filepath);
+ }
});
diff --git a/std/mime/multipart_test.ts b/std/mime/multipart_test.ts
index 95425368c..7c383d447 100644
--- a/std/mime/multipart_test.ts
+++ b/std/mime/multipart_test.ts
@@ -98,6 +98,7 @@ test(async function multipartMultipartWriter(): Promise<void> {
const f = await open(path.resolve("./mime/testdata/sample.txt"), "r");
await mw.writeFile("file", "sample.txt", f);
await mw.close();
+ f.close();
});
test(function multipartMultipartWriter2(): void {
@@ -185,6 +186,7 @@ test(async function multipartMultipartReader(): Promise<void> {
const file = form["file"] as FormFile;
assertEquals(isFormFile(file), true);
assert(file.content !== void 0);
+ o.close();
});
test(async function multipartMultipartReader2(): Promise<void> {
@@ -211,5 +213,6 @@ test(async function multipartMultipartReader2(): Promise<void> {
if (file.tempfile) {
await remove(file.tempfile);
}
+ o.close();
}
});
diff --git a/std/node/_fs/_fs_dir_test.ts b/std/node/_fs/_fs_dir_test.ts
index aefa85854..3b8c5b341 100644
--- a/std/node/_fs/_fs_dir_test.ts
+++ b/std/node/_fs/_fs_dir_test.ts
@@ -71,8 +71,10 @@ test({
name: "Async read returns one file at a time",
async fn() {
const testDir: string = Deno.makeTempDirSync();
- Deno.createSync(testDir + "/foo.txt");
- Deno.createSync(testDir + "/bar.txt");
+ const f1 = Deno.createSync(testDir + "/foo.txt");
+ f1.close();
+ const f2 = Deno.createSync(testDir + "/bar.txt");
+ f2.close();
try {
let secondCallback = false;
@@ -108,8 +110,10 @@ test({
name: "Sync read returns one file at a time",
fn() {
const testDir: string = Deno.makeTempDirSync();
- Deno.createSync(testDir + "/foo.txt");
- Deno.createSync(testDir + "/bar.txt");
+ const f1 = Deno.createSync(testDir + "/foo.txt");
+ f1.close();
+ const f2 = Deno.createSync(testDir + "/bar.txt");
+ f2.close();
try {
const dir: Dir = new Dir(testDir);
@@ -135,8 +139,10 @@ test({
name: "Async iteration over existing directory",
async fn() {
const testDir: string = Deno.makeTempDirSync();
- Deno.createSync(testDir + "/foo.txt");
- Deno.createSync(testDir + "/bar.txt");
+ const f1 = Deno.createSync(testDir + "/foo.txt");
+ f1.close();
+ const f2 = Deno.createSync(testDir + "/bar.txt");
+ f2.close();
try {
const dir: Dir = new Dir(testDir);
diff --git a/std/signal/test.ts b/std/signal/test.ts
index dfe5bf4cf..d59484e12 100644
--- a/std/signal/test.ts
+++ b/std/signal/test.ts
@@ -15,40 +15,47 @@ if (Deno.build.os !== "win") {
);
});
- test("signal() iterates for multiple signals", async (): Promise<void> => {
- // This prevents the program from exiting.
- const t = setInterval(() => {}, 1000);
+ test({
+ name: "signal() iterates for multiple signals",
+ fn: async (): Promise<void> => {
+ // This prevents the program from exiting.
+ const t = setInterval(() => {}, 1000);
- let c = 0;
- const sig = signal(
- Deno.Signal.SIGUSR1,
- Deno.Signal.SIGUSR2,
- Deno.Signal.SIGINT
- );
+ let c = 0;
+ const sig = signal(
+ Deno.Signal.SIGUSR1,
+ Deno.Signal.SIGUSR2,
+ Deno.Signal.SIGINT
+ );
- setTimeout(async () => {
- await delay(20);
- Deno.kill(Deno.pid, Deno.Signal.SIGINT);
- await delay(20);
- Deno.kill(Deno.pid, Deno.Signal.SIGUSR2);
- await delay(20);
- Deno.kill(Deno.pid, Deno.Signal.SIGUSR1);
- await delay(20);
- Deno.kill(Deno.pid, Deno.Signal.SIGUSR2);
- await delay(20);
- Deno.kill(Deno.pid, Deno.Signal.SIGUSR1);
- await delay(20);
- Deno.kill(Deno.pid, Deno.Signal.SIGINT);
- await delay(20);
- sig.dispose();
- });
+ setTimeout(async () => {
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGINT);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR2);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR1);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR2);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR1);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGINT);
+ await delay(20);
+ sig.dispose();
+ });
- for await (const _ of sig) {
- c += 1;
- }
+ for await (const _ of sig) {
+ c += 1;
+ }
- assertEquals(c, 6);
+ assertEquals(c, 6);
- clearTimeout(t);
+ clearTimeout(t);
+ // Clear timeout clears interval, but interval promise is not
+ // yet resolved, delay to next turn of event loop otherwise,
+ // we'll be leaking resources.
+ await delay(10);
+ }
});
}
diff --git a/std/testing/bench_test.ts b/std/testing/bench_test.ts
index b384b21f7..904ee2a8c 100644
--- a/std/testing/bench_test.ts
+++ b/std/testing/bench_test.ts
@@ -3,56 +3,60 @@ import { bench, runBenchmarks } from "./bench.ts";
import "./bench_example.ts";
-test(async function benching(): Promise<void> {
- bench(function forIncrementX1e9(b): void {
- b.start();
- for (let i = 0; i < 1e9; i++);
- b.stop();
- });
-
- bench(function forDecrementX1e9(b): void {
- b.start();
- for (let i = 1e9; i > 0; i--);
- b.stop();
- });
-
- bench(async function forAwaitFetchDenolandX10(b): Promise<void> {
- b.start();
- for (let i = 0; i < 10; i++) {
- const r = await fetch("https://deno.land/");
- await r.text();
- }
- b.stop();
- });
-
- bench(async function promiseAllFetchDenolandX10(b): Promise<void> {
- const urls = new Array(10).fill("https://deno.land/");
- b.start();
- await Promise.all(
- urls.map(
- async (denoland: string): Promise<void> => {
- const r = await fetch(denoland);
- await r.text();
- }
- )
- );
- b.stop();
- });
-
- bench({
- name: "runs100ForIncrementX1e6",
- runs: 100,
- func(b): void {
+test({
+ name: "benching",
+
+ fn: async function(): Promise<void> {
+ bench(function forIncrementX1e9(b): void {
+ b.start();
+ for (let i = 0; i < 1e9; i++);
+ b.stop();
+ });
+
+ bench(function forDecrementX1e9(b): void {
+ b.start();
+ for (let i = 1e9; i > 0; i--);
+ b.stop();
+ });
+
+ bench(async function forAwaitFetchDenolandX10(b): Promise<void> {
b.start();
- for (let i = 0; i < 1e6; i++);
+ for (let i = 0; i < 10; i++) {
+ const r = await fetch("https://deno.land/");
+ await r.text();
+ }
b.stop();
- }
- });
+ });
- bench(function throwing(b): void {
- b.start();
- // Throws bc the timer's stop method is never called
- });
+ bench(async function promiseAllFetchDenolandX10(b): Promise<void> {
+ const urls = new Array(10).fill("https://deno.land/");
+ b.start();
+ await Promise.all(
+ urls.map(
+ async (denoland: string): Promise<void> => {
+ const r = await fetch(denoland);
+ await r.text();
+ }
+ )
+ );
+ b.stop();
+ });
+
+ bench({
+ name: "runs100ForIncrementX1e6",
+ runs: 100,
+ func(b): void {
+ b.start();
+ for (let i = 0; i < 1e6; i++);
+ b.stop();
+ }
+ });
+
+ bench(function throwing(b): void {
+ b.start();
+ // Throws bc the timer's stop method is never called
+ });
- await runBenchmarks({ skip: /throw/ });
+ await runBenchmarks({ skip: /throw/ });
+ }
});
diff --git a/std/ws/test.ts b/std/ws/test.ts
index e0050bcf4..820fe1423 100644
--- a/std/ws/test.ts
+++ b/std/ws/test.ts
@@ -21,6 +21,7 @@ import Writer = Deno.Writer;
import Reader = Deno.Reader;
import Conn = Deno.Conn;
import Buffer = Deno.Buffer;
+import { delay } from "../util/async.ts";
test("[ws] read unmasked text frame", async () => {
// unmasked single text frame with payload "Hello"
@@ -296,31 +297,32 @@ function delayedWriter(ms: number, dest: Writer): Writer {
}
};
}
-test("[ws] WebSocket.send(), WebSocket.ping() should be exclusive", async (): Promise<
- void
-> => {
- const buf = new Buffer();
- const conn = dummyConn(new Buffer(), delayedWriter(1, buf));
- const sock = createWebSocket({ conn });
- // Ensure send call
- await Promise.all([
- sock.send("first"),
- sock.send("second"),
- sock.ping(),
- sock.send(new Uint8Array([3]))
- ]);
- const bufr = new BufReader(buf);
- const first = await readFrame(bufr);
- const second = await readFrame(bufr);
- const ping = await readFrame(bufr);
- const third = await readFrame(bufr);
- assertEquals(first.opcode, OpCode.TextFrame);
- assertEquals(decode(first.payload), "first");
- assertEquals(first.opcode, OpCode.TextFrame);
- assertEquals(decode(second.payload), "second");
- assertEquals(ping.opcode, OpCode.Ping);
- assertEquals(third.opcode, OpCode.BinaryFrame);
- assertEquals(bytes.equal(third.payload, new Uint8Array([3])), true);
+test({
+ name: "[ws] WebSocket.send(), WebSocket.ping() should be exclusive",
+ fn: async (): Promise<void> => {
+ const buf = new Buffer();
+ const conn = dummyConn(new Buffer(), delayedWriter(1, buf));
+ const sock = createWebSocket({ conn });
+ // Ensure send call
+ await Promise.all([
+ sock.send("first"),
+ sock.send("second"),
+ sock.ping(),
+ sock.send(new Uint8Array([3]))
+ ]);
+ const bufr = new BufReader(buf);
+ const first = await readFrame(bufr);
+ const second = await readFrame(bufr);
+ const ping = await readFrame(bufr);
+ const third = await readFrame(bufr);
+ assertEquals(first.opcode, OpCode.TextFrame);
+ assertEquals(decode(first.payload), "first");
+ assertEquals(first.opcode, OpCode.TextFrame);
+ assertEquals(decode(second.payload), "second");
+ assertEquals(ping.opcode, OpCode.Ping);
+ assertEquals(third.opcode, OpCode.BinaryFrame);
+ assertEquals(bytes.equal(third.payload, new Uint8Array([3])), true);
+ }
});
test("[ws] createSecKeyHasCorrectLength", () => {
@@ -363,29 +365,36 @@ test("[ws] WebSocket shouldn't throw `Deno.errors.UnexpectedEof` on recive()", a
assertEquals(done, true);
});
-test("[ws] 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 Deno.errors.ConnectionReset);
- assert(b instanceof Deno.errors.ConnectionReset);
- assert(c instanceof Deno.errors.ConnectionReset);
- clearTimeout(timer);
+test({
+ name:
+ "[ws] WebSocket should reject sending promise when connection reset forcely",
+ fn: 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 Deno.errors.ConnectionReset);
+ assert(b instanceof Deno.errors.ConnectionReset);
+ assert(c instanceof Deno.errors.ConnectionReset);
+ clearTimeout(timer);
+ // Wait for another event loop turn for `timeout` op promise
+ // to resolve, otherwise we'll get "op leak".
+ await delay(10);
+ }
});