diff options
author | Thorsten Lorenz <thlorenz@gmx.de> | 2016-11-22 13:13:44 -0300 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-05-10 22:22:33 +0200 |
commit | e3e56f1d71fd496c8a25d6b4b50e51d4a682d184 (patch) | |
tree | 764b9470be5afecee9027acccbbf84e6e590bac9 /test/async-hooks/test-pipewrap.js | |
parent | 4a7233c1788334c171d2280026333242df7d37af (diff) | |
download | android-node-v8-e3e56f1d71fd496c8a25d6b4b50e51d4a682d184.tar.gz android-node-v8-e3e56f1d71fd496c8a25d6b4b50e51d4a682d184.tar.bz2 android-node-v8-e3e56f1d71fd496c8a25d6b4b50e51d4a682d184.zip |
test: adding tests for initHooks API
Async wrap providers tested:
- crypto.randomBytes
- crypto.pbkdf2
- fs event wrap
- fsreqwrap access
- fsreqwrap readFile
- getaddrinforeq wrap
- getnameinforeq wrap
- pipe connect wrap
- query wrap
- pipewrap
- processwrap
- shutdown wrap
- tcpwrap
- udpwrap
- send wrap
- detailed signal wrap
- statwatcher
- timerwrap via setTimeout
- timerwrap via setInterval
- for Immediate
- http parser request
- http parser response
- connection via ssl server
- tls wrap
- write wrap
- ttywrap via readstream
- ttywrap via wriream
- zctx via zlib binding deflate
Embedder API:
- async-event tests
- one test looks at the happy paths
- another ensures that in cases of events emitted in an order that
doesn't make sense, the order is enforced by async hooks throwing a
meaningful error
- embedder enforcement tests are split up since async hook stack
corruption now the process
- therefore we launch a child and check for error output of the offending code
Additional tests:
- tests that show that we can enable/disable hooks inside their lifetime
events
- tests that verify the graph of resources triggering the creation of
other resources
Test Helpers:
- init-hooks:
- returns one collector instance
- when created an async hook is created and the lifetime events are
registered to call the appropriate collector functions
- the collector also exposes `enable` and `disable` functions which call
through to the async hook
- hook checks:
- checks invocations of life time hooks against the actual invocations
that were collected
- in some cases like `destroy` a min/max range of invocations can be
supplied since in these cases the exact number is non-deterministic
- verify graph:
- verifies the triggerIds of specific async resources are as expected,
i.e. the creation of resources was triggered by the resource we expect
- includes a printGraph function to generate easily readable test
input for verify graph
- both functions prune TickObjects to create less brittle and easier
to understand tests
PR-URL: https://github.com/nodejs/node/pull/12892
Ref: https://github.com/nodejs/node/pull/11883
Ref: https://github.com/nodejs/node/pull/8531
Reviewed-By: Andreas Madsen <amwebdk@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Sam Roberts <vieuxtech@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Refael Ackermann <refack@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Diffstat (limited to 'test/async-hooks/test-pipewrap.js')
-rw-r--r-- | test/async-hooks/test-pipewrap.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/test/async-hooks/test-pipewrap.js b/test/async-hooks/test-pipewrap.js new file mode 100644 index 0000000000..a34bca5795 --- /dev/null +++ b/test/async-hooks/test-pipewrap.js @@ -0,0 +1,89 @@ +// NOTE: this also covers process wrap as one is created along with the pipes +// when we launch the sleep process +'use strict'; +// Flags: --expose-gc + +const common = require('../common'); +const assert = require('assert'); +const tick = require('./tick'); +const initHooks = require('./init-hooks'); +const { checkInvocations } = require('./hook-checks'); +const spawn = require('child_process').spawn; + +const hooks = initHooks(); + +hooks.enable(); +const nodeVersionSpawn = spawn(process.execPath, [ '--version' ]); + +nodeVersionSpawn + .on('exit', common.mustCall(onsleepExit)) + .on('close', common.mustCall(onsleepClose)); + +// a process wrap and 3 pipe wraps for std{in,out,err} are initialized +// synchronously +const processes = hooks.activitiesOfTypes('PROCESSWRAP'); +const pipes = hooks.activitiesOfTypes('PIPEWRAP'); +assert.strictEqual(processes.length, 1, + '1 processwrap created when process created'); +assert.strictEqual(pipes.length, 3, + '3 pipe wraps created when process created'); + +const processwrap = processes[0]; +const pipe1 = pipes[0]; +const pipe2 = pipes[1]; +const pipe3 = pipes[2]; + +assert.strictEqual(processwrap.type, 'PROCESSWRAP', 'process wrap type'); +assert.strictEqual(processwrap.triggerId, 1, 'processwrap triggerId is 1'); +checkInvocations(processwrap, { init: 1 }, + 'processwrap when sleep.spawn was called'); + +[ pipe1, pipe2, pipe3 ].forEach((x) => { + assert(x.type, 'PIPEWRAP', 'pipe wrap type'); + assert.strictEqual(x.triggerId, 1, 'pipe wrap triggerId is 1'); + checkInvocations(x, { init: 1 }, 'pipe wrap when sleep.spawn was called'); +}); + +function onsleepExit(code) { + checkInvocations(processwrap, { init: 1, before: 1 }, + 'processwrap while in onsleepExit callback'); +} + +function onsleepClose() { + tick(1, () => + checkInvocations( + processwrap, + { init: 1, before: 1, after: 1 }, + 'processwrap while in onsleepClose callback') + ); +} + +process.on('exit', onexit); + +function onexit() { + hooks.disable(); + hooks.sanityCheck('PROCESSWRAP'); + hooks.sanityCheck('PIPEWRAP'); + + checkInvocations( + processwrap, + { init: 1, before: 1, after: 1 }, + 'processwrap while in onsleepClose callback'); + + [ pipe1, pipe2, pipe3 ].forEach((x) => { + assert(x.type, 'PIPEWRAP', 'pipe wrap type'); + assert.strictEqual(x.triggerId, 1, 'pipe wrap triggerId is 1'); + }); + + const ioEvents = Math.min(pipe2.before.length, pipe2.after.length); + // 2 events without any IO and at least one more for the node version data. + // Usually it is just one event, but it can be more. + assert.ok(ioEvents >= 3, 'at least 3 stdout io events.'); + + checkInvocations(pipe1, { init: 1, before: 2, after: 2 }, + 'pipe wrap when sleep.spawn was called'); + checkInvocations(pipe2, { init: 1, before: ioEvents, after: ioEvents }, + 'pipe wrap when sleep.spawn was called'); + checkInvocations(pipe3, { init: 1, before: 2, after: 2 }, + 'pipe wrap when sleep.spawn was called'); +} |