diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-03-17 13:53:57 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-17 18:53:57 +0100 |
commit | 0bc6bf5d33b8198253954d7f04558270de45c925 (patch) | |
tree | 6b2f689c88da34677d25e77f0554b1fc36719410 /cli/tests/unit_node/async_hooks_test.ts | |
parent | e6fe1630f0e6cbc16ccfda5a58cbe8ecdfea2694 (diff) |
chore: add tests for node:async_hooks (#18004)
Closes https://github.com/denoland/deno/issues/17878
---------
Co-authored-by: crowlkats <crowlkats@toaxl.com>
Diffstat (limited to 'cli/tests/unit_node/async_hooks_test.ts')
-rw-r--r-- | cli/tests/unit_node/async_hooks_test.ts | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/cli/tests/unit_node/async_hooks_test.ts b/cli/tests/unit_node/async_hooks_test.ts new file mode 100644 index 000000000..73d6a99bc --- /dev/null +++ b/cli/tests/unit_node/async_hooks_test.ts @@ -0,0 +1,83 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +import { AsyncLocalStorage, AsyncResource } from "node:async_hooks"; +import { + assert, + assertEquals, +} from "../../../test_util/std/testing/asserts.ts"; +import { deferred } from "../../../test_util/std/async/deferred.ts"; + +Deno.test(async function foo() { + const asyncLocalStorage = new AsyncLocalStorage(); + + const out: string[] = []; + function logWithId(msg: string) { + const id = asyncLocalStorage.getStore(); + out.push(`${id !== undefined ? id : "-"}: ${msg}`); + } + + async function exec() { + logWithId("start"); + await new Promise((resolve) => setTimeout(resolve, 100)); + logWithId("finish"); + } + + for (const foo of [1, 2, 3]) { + asyncLocalStorage.run(foo, exec); + } + + await new Promise((resolve) => setTimeout(resolve, 500)); + + assertEquals(out, [ + "1: start", + "2: start", + "3: start", + "1: finish", + "2: finish", + "3: finish", + ]); +}); + +Deno.test(async function bar() { + let differentScopeDone = false; + const als = new AsyncLocalStorage(); + const ac = new AbortController(); + const server = Deno.serve(() => { + const differentScope = als.run(123, () => + AsyncResource.bind(() => { + differentScopeDone = true; + })); + return als.run("Hello World", async () => { + // differentScope is attached to a different async context, so + // it will see a different value for als.getStore() (123) + setTimeout(differentScope, 5); + // Some simulated async delay. + await new Promise((res) => setTimeout(res, 10)); + return new Response(als.getStore() as string); // "Hello World" + }); + }, { + signal: ac.signal, + port: 4000, + }); + + const res = await fetch("http://localhost:4000"); + assertEquals(await res.text(), "Hello World"); + ac.abort(); + await server; + assert(differentScopeDone); +}); + +Deno.test(async function nested() { + const als = new AsyncLocalStorage(); + const promise = deferred(); + const promise1 = deferred(); + + als.run(null, () => { + als.run({ x: 1 }, () => { + promise.resolve(als.getStore()); + }); + promise1.resolve(als.getStore()); + }); + + assertEquals(await promise, { x: 1 }); + assertEquals(await promise1, null); +}); |