aboutsummaryrefslogtreecommitdiff
path: root/test/async-hooks/test-httparser-reuse.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/async-hooks/test-httparser-reuse.js')
-rw-r--r--test/async-hooks/test-httparser-reuse.js55
1 files changed, 46 insertions, 9 deletions
diff --git a/test/async-hooks/test-httparser-reuse.js b/test/async-hooks/test-httparser-reuse.js
index b6d82d7d5e..06441562e0 100644
--- a/test/async-hooks/test-httparser-reuse.js
+++ b/test/async-hooks/test-httparser-reuse.js
@@ -1,28 +1,54 @@
'use strict';
const common = require('../common');
-const http = require('http');
const assert = require('assert');
const { createHook } = require('async_hooks');
+const http = require('http');
+
+// Verify that resource emitted for an HTTPParser is not reused.
+// Verify that correct create/destroy events are emitted.
+
const reused = Symbol('reused');
-let reusedHTTPParser = false;
-const asyncHook = createHook({
+const reusedParser = [];
+const incomingMessageParser = [];
+const clientRequestParser = [];
+const dupDestroys = [];
+const destroyed = [];
+
+createHook({
init(asyncId, type, triggerAsyncId, resource) {
+ switch (type) {
+ case 'HTTPINCOMINGMESSAGE':
+ incomingMessageParser.push(asyncId);
+ break;
+ case 'HTTPCLIENTREQUEST':
+ clientRequestParser.push(asyncId);
+ break;
+ }
+
if (resource[reused]) {
- reusedHTTPParser = true;
+ reusedParser.push(
+ `resource reused: ${asyncId}, ${triggerAsyncId}, ${type}`
+ );
}
resource[reused] = true;
+ },
+ destroy(asyncId) {
+ if (destroyed.includes(asyncId)) {
+ dupDestroys.push(asyncId);
+ } else {
+ destroyed.push(asyncId);
+ }
}
-});
-asyncHook.enable();
+}).enable();
-const server = http.createServer(function(req, res) {
+const server = http.createServer((req, res) => {
res.end();
});
const PORT = 3000;
-const url = 'http://127.0.0.1:' + PORT;
+const url = `http://127.0.0.1:${PORT}`;
server.listen(PORT, common.mustCall(() => {
http.get(url, common.mustCall(() => {
@@ -30,10 +56,21 @@ server.listen(PORT, common.mustCall(() => {
server.listen(PORT, common.mustCall(() => {
http.get(url, common.mustCall(() => {
server.close(common.mustCall(() => {
- assert.strictEqual(reusedHTTPParser, false);
+ setTimeout(common.mustCall(verify), 200);
}));
}));
}));
}));
}));
}));
+
+function verify() {
+ assert.strictEqual(reusedParser.length, 0);
+
+ assert.strictEqual(incomingMessageParser.length, 2);
+ assert.strictEqual(clientRequestParser.length, 2);
+
+ assert.strictEqual(dupDestroys.length, 0);
+ incomingMessageParser.forEach((id) => assert.ok(destroyed.includes(id)));
+ clientRequestParser.forEach((id) => assert.ok(destroyed.includes(id)));
+}