diff --git a/test/async-hooks/test-async-local-storage-thenable.js b/test/async-hooks/test-async-local-storage-thenable.js new file mode 100644 index 00000000000000..1f947fa9345491 --- /dev/null +++ b/test/async-hooks/test-async-local-storage-thenable.js @@ -0,0 +1,53 @@ +'use strict'; + +const common = require('../common'); + +const assert = require('assert'); +const { AsyncLocalStorage } = require('async_hooks'); + +// This test verifies that async local storage works with thenables + +const store = new AsyncLocalStorage(); +const data = Symbol('verifier'); + +const then = common.mustCall((cb) => { + assert.strictEqual(store.getStore(), data); + setImmediate(cb); +}, 4); + +function thenable() { + return { + then + }; +} + +// Await a thenable +store.run(data, async () => { + assert.strictEqual(store.getStore(), data); + await thenable(); + assert.strictEqual(store.getStore(), data); +}); + +// Returning a thenable in an async function +store.run(data, async () => { + try { + assert.strictEqual(store.getStore(), data); + return thenable(); + } finally { + assert.strictEqual(store.getStore(), data); + } +}); + +// Resolving a thenable +store.run(data, () => { + assert.strictEqual(store.getStore(), data); + Promise.resolve(thenable()); + assert.strictEqual(store.getStore(), data); +}); + +// Returning a thenable in a then handler +store.run(data, () => { + assert.strictEqual(store.getStore(), data); + Promise.resolve().then(() => thenable()); + assert.strictEqual(store.getStore(), data); +});