From 6748b68690991b6c71e5855700030aa8c411bc4d Mon Sep 17 00:00:00 2001 From: Simon Brewster Date: Mon, 18 Sep 2017 21:33:10 +0200 Subject: [PATCH 1/2] test: Http2Stream destroyed handling Refs: https://github.com/nodejs/node/issues/14985 --- ...st-http2-server-destroy-before-priority.js | 44 +++++++++++++++++++ .../test-http2-server-destroy-before-rst.js | 44 +++++++++++++++++++ .../test-http2-server-destroy-before-state.js | 40 +++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 test/parallel/test-http2-server-destroy-before-priority.js create mode 100644 test/parallel/test-http2-server-destroy-before-rst.js create mode 100644 test/parallel/test-http2-server-destroy-before-state.js diff --git a/test/parallel/test-http2-server-destroy-before-priority.js b/test/parallel/test-http2-server-destroy-before-priority.js new file mode 100644 index 00000000000000..1a05a8c47b336d --- /dev/null +++ b/test/parallel/test-http2-server-destroy-before-priority.js @@ -0,0 +1,44 @@ +// Flags: --expose-http2 +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); +const assert = require('assert'); +const http2 = require('http2'); + +const server = http2.createServer(); + +// Test that ERR_HTTP2_INVALID_STREAM is thrown when a stream is destroyed +// before calling stream.priority +server.on('stream', common.mustCall(onStream)); + +function onStream(stream, headers, flags) { + stream.session.destroy(); + assert.throws(() => stream.priority(), + common.expectsError({ + code: 'ERR_HTTP2_INVALID_STREAM', + message: /^The stream has been destroyed$/ + })); +} + +server.listen(0); + +server.on('listening', common.mustCall(() => { + + const client = http2.connect(`http://localhost:${server.address().port}`); + + const req = client.request({ ':path': '/' }); + + req.on('response', common.mustNotCall()); + req.resume(); + req.on('end', common.mustCall(() => { + server.close(); + client.destroy(); + })); + req.end(); + +})); + + + diff --git a/test/parallel/test-http2-server-destroy-before-rst.js b/test/parallel/test-http2-server-destroy-before-rst.js new file mode 100644 index 00000000000000..f1b09954978a40 --- /dev/null +++ b/test/parallel/test-http2-server-destroy-before-rst.js @@ -0,0 +1,44 @@ +// Flags: --expose-http2 +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); +const assert = require('assert'); +const http2 = require('http2'); + +const server = http2.createServer(); + +// Test that ERR_HTTP2_INVALID_STREAM is thrown when a stream is destroyed +// before calling stream.rstStream +server.on('stream', common.mustCall(onStream)); + +function onStream(stream, headers, flags) { + stream.session.destroy(); + assert.throws(() => stream.rstStream(), + common.expectsError({ + code: 'ERR_HTTP2_INVALID_STREAM', + message: /^The stream has been destroyed$/ + })); +} + +server.listen(0); + +server.on('listening', common.mustCall(() => { + + const client = http2.connect(`http://localhost:${server.address().port}`); + + const req = client.request({ ':path': '/' }); + + req.on('response', common.mustNotCall()); + req.resume(); + req.on('end', common.mustCall(() => { + server.close(); + client.destroy(); + })); + req.end(); + +})); + + + diff --git a/test/parallel/test-http2-server-destroy-before-state.js b/test/parallel/test-http2-server-destroy-before-state.js new file mode 100644 index 00000000000000..af8aa4f3e8d55b --- /dev/null +++ b/test/parallel/test-http2-server-destroy-before-state.js @@ -0,0 +1,40 @@ +// Flags: --expose-http2 +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); +const assert = require('assert'); +const h2 = require('http2'); + +const server = h2.createServer(); + +// Test that stream.state getter returns and empty object +// if the stream session has been destroyed +server.on('stream', common.mustCall(onStream)); + +function onStream(stream, headers, flags) { + stream.session.destroy(); + assert.deepEqual({}, stream.state); +} + +server.listen(0); + +server.on('listening', common.mustCall(() => { + + const client = h2.connect(`http://localhost:${server.address().port}`); + + const req = client.request({ ':path': '/' }); + + req.on('response', common.mustNotCall()); + req.resume(); + req.on('end', common.mustCall(() => { + server.close(); + client.destroy(); + })); + req.end(); + +})); + + + From 9b868e189ded9ede78d3105c66c9772b89f9cc39 Mon Sep 17 00:00:00 2001 From: Simon Brewster Date: Tue, 19 Sep 2017 20:55:31 +0200 Subject: [PATCH 2/2] test: lint fixes --- .../test-http2-server-destroy-before-priority.js | 3 --- test/parallel/test-http2-server-destroy-before-rst.js | 3 --- .../test-http2-server-destroy-before-state.js | 11 ++++------- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/test/parallel/test-http2-server-destroy-before-priority.js b/test/parallel/test-http2-server-destroy-before-priority.js index 1a05a8c47b336d..74d7c011ba0be1 100644 --- a/test/parallel/test-http2-server-destroy-before-priority.js +++ b/test/parallel/test-http2-server-destroy-before-priority.js @@ -39,6 +39,3 @@ server.on('listening', common.mustCall(() => { req.end(); })); - - - diff --git a/test/parallel/test-http2-server-destroy-before-rst.js b/test/parallel/test-http2-server-destroy-before-rst.js index f1b09954978a40..f066e76b5f97de 100644 --- a/test/parallel/test-http2-server-destroy-before-rst.js +++ b/test/parallel/test-http2-server-destroy-before-rst.js @@ -39,6 +39,3 @@ server.on('listening', common.mustCall(() => { req.end(); })); - - - diff --git a/test/parallel/test-http2-server-destroy-before-state.js b/test/parallel/test-http2-server-destroy-before-state.js index af8aa4f3e8d55b..f5dce3e30a272d 100644 --- a/test/parallel/test-http2-server-destroy-before-state.js +++ b/test/parallel/test-http2-server-destroy-before-state.js @@ -5,9 +5,9 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); const assert = require('assert'); -const h2 = require('http2'); +const http2 = require('http2'); -const server = h2.createServer(); +const server = http2.createServer(); // Test that stream.state getter returns and empty object // if the stream session has been destroyed @@ -15,14 +15,14 @@ server.on('stream', common.mustCall(onStream)); function onStream(stream, headers, flags) { stream.session.destroy(); - assert.deepEqual({}, stream.state); + assert.deepStrictEqual(Object.create(null), stream.state); } server.listen(0); server.on('listening', common.mustCall(() => { - const client = h2.connect(`http://localhost:${server.address().port}`); + const client = http2.connect(`http://localhost:${server.address().port}`); const req = client.request({ ':path': '/' }); @@ -35,6 +35,3 @@ server.on('listening', common.mustCall(() => { req.end(); })); - - -