From a41cc020fd6e40b358103425edfa50e6a10fc973 Mon Sep 17 00:00:00 2001 From: Anatoli Papirovski Date: Thu, 2 Nov 2017 12:46:31 -0400 Subject: [PATCH] test: fix flaky test-http2-server-rst-stream.js PR-URL: https://github.com/nodejs/node/pull/16690 Fixes: https://github.com/nodejs/node/issues/16688 Reviewed-By: James M Snell Reviewed-By: Matteo Collina --- test/parallel/test-http2-server-rst-stream.js | 93 +++++++------------ 1 file changed, 35 insertions(+), 58 deletions(-) diff --git a/test/parallel/test-http2-server-rst-stream.js b/test/parallel/test-http2-server-rst-stream.js index b92217dc994e6e..dd38efb42f9d47 100644 --- a/test/parallel/test-http2-server-rst-stream.js +++ b/test/parallel/test-http2-server-rst-stream.js @@ -5,11 +5,9 @@ if (!common.hasCrypto) common.skip('missing crypto'); const assert = require('assert'); const http2 = require('http2'); +const Countdown = require('../common/countdown'); const { - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_METHOD_POST, NGHTTP2_CANCEL, NGHTTP2_NO_ERROR, NGHTTP2_PROTOCOL_ERROR, @@ -17,63 +15,42 @@ const { NGHTTP2_INTERNAL_ERROR } = http2.constants; -const errCheck = common.expectsError({ code: 'ERR_HTTP2_STREAM_ERROR' }, 6); +const tests = [ + ['rstStream', NGHTTP2_NO_ERROR, false], + ['rstWithNoError', NGHTTP2_NO_ERROR, false], + ['rstWithProtocolError', NGHTTP2_PROTOCOL_ERROR, true], + ['rstWithCancel', NGHTTP2_CANCEL, false], + ['rstWithRefuse', NGHTTP2_REFUSED_STREAM, true], + ['rstWithInternalError', NGHTTP2_INTERNAL_ERROR, true] +]; + +const server = http2.createServer(); +server.on('stream', (stream, headers) => { + const method = headers['rstmethod']; + stream[method](); +}); + +server.listen(0, common.mustCall(() => { + const client = http2.connect(`http://localhost:${server.address().port}`); + + const countdown = new Countdown(tests.length, common.mustCall(() => { + client.destroy(); + server.close(); + })); -function checkRstCode(rstMethod, expectRstCode) { - const server = http2.createServer(); - server.on('stream', (stream, headers, flags) => { - stream.respond({ - 'content-type': 'text/html', - ':status': 200 + tests.forEach((test) => { + const req = client.request({ + ':method': 'POST', + rstmethod: test[0] }); - stream.write('test'); - if (rstMethod === 'rstStream') - stream[rstMethod](expectRstCode); - else - stream[rstMethod](); - - if (expectRstCode !== NGHTTP2_NO_ERROR && - expectRstCode !== NGHTTP2_CANCEL) { - stream.on('error', common.mustCall(errCheck)); - } else { - stream.on('error', common.mustNotCall()); - } - }); - - server.listen(0, common.mustCall(() => { - const port = server.address().port; - const client = http2.connect(`http://localhost:${port}`); - - const headers = { - [HTTP2_HEADER_PATH]: '/', - [HTTP2_HEADER_METHOD]: HTTP2_METHOD_POST - }; - const req = client.request(headers); - - req.setEncoding('utf8'); - req.on('streamClosed', common.mustCall((actualRstCode) => { - assert.strictEqual( - expectRstCode, actualRstCode, `${rstMethod} is not match rstCode`); - server.close(); - client.destroy(); + req.on('streamClosed', common.mustCall((code) => { + assert.strictEqual(code, test[1]); + countdown.dec(); })); - req.on('data', common.mustCall()); req.on('aborted', common.mustCall()); - req.on('end', common.mustCall()); - - if (expectRstCode !== NGHTTP2_NO_ERROR && - expectRstCode !== NGHTTP2_CANCEL) { - req.on('error', common.mustCall(errCheck)); - } else { + if (test[2]) + req.on('error', common.mustCall()); + else req.on('error', common.mustNotCall()); - } - - })); -} - -checkRstCode('rstStream', NGHTTP2_NO_ERROR); -checkRstCode('rstWithNoError', NGHTTP2_NO_ERROR); -checkRstCode('rstWithProtocolError', NGHTTP2_PROTOCOL_ERROR); -checkRstCode('rstWithCancel', NGHTTP2_CANCEL); -checkRstCode('rstWithRefuse', NGHTTP2_REFUSED_STREAM); -checkRstCode('rstWithInternalError', NGHTTP2_INTERNAL_ERROR); + }); +}));