From 1f5d05a581414e2c23848a96cf708110a32c9024 Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Sun, 7 Jun 2020 01:12:57 +0200 Subject: [PATCH] test: AsyncLocalStorage works with thenables This adds a test to verify that AsyncLocalStorage works with thenables. --- .../test-async-local-storage-thenable.js | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 test/async-hooks/test-async-local-storage-thenable.js 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); +});