diff options
Diffstat (limited to 'std')
-rw-r--r-- | std/encoding/binary_test.ts | 2 | ||||
-rw-r--r-- | std/examples/chat/server_test.ts | 67 | ||||
-rw-r--r-- | std/examples/test.ts | 4 | ||||
-rw-r--r-- | std/examples/tests/cat_test.ts | 2 | ||||
-rw-r--r-- | std/examples/tests/catj_test.ts | 11 | ||||
-rw-r--r-- | std/examples/tests/colors_test.ts | 2 | ||||
-rw-r--r-- | std/examples/tests/curl_test.ts | 66 | ||||
-rw-r--r-- | std/examples/tests/echo_server_test.ts | 1 | ||||
-rw-r--r-- | std/examples/tests/welcome_test.ts | 2 | ||||
-rw-r--r-- | std/examples/tests/xeval_test.ts | 29 | ||||
-rw-r--r-- | std/fs/empty_dir_test.ts | 13 | ||||
-rw-r--r-- | std/fs/ensure_symlink_test.ts | 4 | ||||
-rw-r--r-- | std/fs/exists_test.ts | 6 | ||||
-rw-r--r-- | std/fs/expand_glob_test.ts | 1 | ||||
-rw-r--r-- | std/fs/walk_test.ts | 5 | ||||
-rw-r--r-- | std/http/file_server_test.ts | 7 | ||||
-rw-r--r-- | std/http/racing_server_test.ts | 1 | ||||
-rw-r--r-- | std/http/server_test.ts | 146 | ||||
-rw-r--r-- | std/io/util_test.ts | 20 | ||||
-rw-r--r-- | std/mime/multipart_test.ts | 3 | ||||
-rw-r--r-- | std/node/_fs/_fs_dir_test.ts | 18 | ||||
-rw-r--r-- | std/signal/test.ts | 67 | ||||
-rw-r--r-- | std/testing/bench_test.ts | 100 | ||||
-rw-r--r-- | std/ws/test.ts | 109 |
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 = "[44m[3m[31m[1mHello world![22m[39m[23m[49m"; 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); + } }); |