summaryrefslogtreecommitdiff
path: root/test/async-hooks/test-improper-unwind.js
diff options
context:
space:
mode:
authorMatteo Collina <hello@matteocollina.com>2019-03-08 16:42:21 +0100
committerMatteo Collina <hello@matteocollina.com>2019-03-18 11:36:48 +0100
commit9d064439e5716df250363ed6f88198c86eb63521 (patch)
treed9f9da150a71bdbe9038abc1dfe87fc57b0332d0 /test/async-hooks/test-improper-unwind.js
parentabafd38c8d4e1a280f97ea452688cda54424d185 (diff)
downloadandroid-node-v8-9d064439e5716df250363ed6f88198c86eb63521.tar.gz
android-node-v8-9d064439e5716df250363ed6f88198c86eb63521.tar.bz2
android-node-v8-9d064439e5716df250363ed6f88198c86eb63521.zip
async_hooks: remove deprecated emitBefore and emitAfter
AsyncResource.emitBefore and AsyncResource.emitAfter have been deprecated in https://github.com/nodejs/node/pull/18632. This PR removes it all. This commit also updates some embedder tests to use internal APIs. The conditions are still possible for Node.js core developers but not for end users. PR-URL: https://github.com/nodejs/node/pull/26530 Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com> Reviewed-By: Benedikt Meurer <benedikt.meurer@gmail.com> Reviewed-By: Yang Guo <yangguo@chromium.org> Reviewed-By: Andreas Madsen <amwebdk@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'test/async-hooks/test-improper-unwind.js')
-rw-r--r--test/async-hooks/test-improper-unwind.js67
1 files changed, 67 insertions, 0 deletions
diff --git a/test/async-hooks/test-improper-unwind.js b/test/async-hooks/test-improper-unwind.js
new file mode 100644
index 0000000000..a62512db97
--- /dev/null
+++ b/test/async-hooks/test-improper-unwind.js
@@ -0,0 +1,67 @@
+// Flags: --expose-internals
+'use strict';
+
+const common = require('../common');
+const assert = require('assert');
+const internal_async_hooks = require('internal/async_hooks');
+const { spawn } = require('child_process');
+const corruptedMsg = /async hook stack has become corrupted/;
+const heartbeatMsg = /heartbeat: still alive/;
+
+const {
+ newAsyncId, getDefaultTriggerAsyncId,
+ emitInit, emitBefore, emitAfter
+} = internal_async_hooks;
+
+const initHooks = require('./init-hooks');
+
+if (process.argv[2] === 'child') {
+ const hooks = initHooks();
+ hooks.enable();
+
+ // In both the below two cases 'before' of event2 is nested inside 'before'
+ // of event1.
+ // Therefore the 'after' of event2 needs to occur before the
+ // 'after' of event 1.
+ // The first test of the two below follows that rule,
+ // the second one doesn't.
+
+ const eventOneId = newAsyncId();
+ const eventTwoId = newAsyncId();
+ const triggerId = getDefaultTriggerAsyncId();
+ emitInit(eventOneId, 'event1', triggerId, {});
+ emitInit(eventTwoId, 'event2', triggerId, {});
+
+ // Proper unwind
+ emitBefore(eventOneId, triggerId);
+ emitBefore(eventTwoId, triggerId);
+ emitAfter(eventTwoId);
+ emitAfter(eventOneId);
+
+ // Improper unwind
+ emitBefore(eventOneId, triggerId);
+ emitBefore(eventTwoId, triggerId);
+
+ console.log('heartbeat: still alive');
+ emitAfter(eventOneId);
+} else {
+ const args = ['--expose-internals']
+ .concat(process.argv.slice(1))
+ .concat('child');
+ let errData = Buffer.from('');
+ let outData = Buffer.from('');
+
+ const child = spawn(process.execPath, args);
+ child.stderr.on('data', (d) => { errData = Buffer.concat([ errData, d ]); });
+ child.stdout.on('data', (d) => { outData = Buffer.concat([ outData, d ]); });
+
+ child.on('close', common.mustCall((code) => {
+ assert.strictEqual(code, 1);
+ assert.ok(heartbeatMsg.test(outData.toString()),
+ 'did not crash until we reached offending line of code ' +
+ `(found ${outData})`);
+ assert.ok(corruptedMsg.test(errData.toString()),
+ 'printed error contains corrupted message ' +
+ `(found ${errData})`);
+ }));
+}