From f5e46c9bf2f50d66a953fa133161fc829cecff06 Mon Sep 17 00:00:00 2001 From: Matt Mastracci Date: Sat, 10 Feb 2024 13:22:13 -0700 Subject: chore: move cli/tests/ -> tests/ (#22369) This looks like a massive PR, but it's only a move from cli/tests -> tests, and updates of relative paths for files. This is the first step towards aggregate all of the integration test files under tests/, which will lead to a set of integration tests that can run without the CLI binary being built. While we could leave these tests under `cli`, it would require us to keep a more complex directory structure for the various test runners. In addition, we have a lot of complexity to ignore various test files in the `cli` project itself (cargo publish exclusion rules, autotests = false, etc). And finally, the `tests/` folder will eventually house the `test_ffi`, `test_napi` and other testing code, reducing the size of the root repo directory. For easier review, the extremely large and noisy "move" is in the first commit (with no changes -- just a move), while the remainder of the changes to actual files is in the second commit. --- tests/unit_node/async_hooks_test.ts | 79 +++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 tests/unit_node/async_hooks_test.ts (limited to 'tests/unit_node/async_hooks_test.ts') diff --git a/tests/unit_node/async_hooks_test.ts b/tests/unit_node/async_hooks_test.ts new file mode 100644 index 000000000..1d0910d10 --- /dev/null +++ b/tests/unit_node/async_hooks_test.ts @@ -0,0 +1,79 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +import { AsyncLocalStorage, AsyncResource } from "node:async_hooks"; +import { assert, assertEquals } from "@test_util/std/assert/mod.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({ + signal: ac.signal, + port: 4000, + }, () => { + 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" + }); + }); + + const res = await fetch("http://localhost:4000"); + assertEquals(await res.text(), "Hello World"); + ac.abort(); + await server.finished; + assert(differentScopeDone); +}); + +Deno.test(async function nested() { + const als = new AsyncLocalStorage(); + const deferred = Promise.withResolvers(); + const deferred1 = Promise.withResolvers(); + + als.run(null, () => { + als.run({ x: 1 }, () => { + deferred.resolve(als.getStore()); + }); + deferred1.resolve(als.getStore()); + }); + + assertEquals(await deferred.promise, { x: 1 }); + assertEquals(await deferred1.promise, null); +}); -- cgit v1.2.3