From bfcbab4c0c047fb052839d58db78d2db8887cdf6 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Tue, 21 May 2019 16:36:36 -0700 Subject: [PATCH] test: fix test-https-agent-additional-options test-https-agent-additional-options can occasionally fail if a socket closes before the checks near the end of the test. Modify the test to check the freeSockets pool after each request. PR-URL: https://github.com/nodejs/node/pull/27830 Fixes: https://github.com/nodejs/node/issues/24449 Reviewed-By: Sam Roberts Reviewed-By: Luigi Pinca --- .../test-https-agent-additional-options.js | 58 +++++++++---------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/test/parallel/test-https-agent-additional-options.js b/test/parallel/test-https-agent-additional-options.js index 42d913c2ea264a..99fcd0126ab1a0 100644 --- a/test/parallel/test-https-agent-additional-options.js +++ b/test/parallel/test-https-agent-additional-options.js @@ -39,41 +39,35 @@ const updatedValues = new Map([ ['sessionIdContext', 'sessionIdContext'], ]); +let value; function variations(iter, port, cb) { - const { done, value } = iter.next(); - if (done) { - return common.mustCall((res) => { - res.resume(); - https.globalAgent.once('free', common.mustCall(() => { - // Verify that different keep-alived connections are created - // for the base call and each variation - const keys = Object.keys(https.globalAgent.freeSockets); - assert.strictEqual(keys.length, 1 + updatedValues.size); - let i = 1; - for (const [, value] of updatedValues) { - assert.ok( - keys[i].startsWith(value.toString() + ':') || - keys[i].endsWith(':' + value.toString()) || - keys[i].includes(':' + value.toString() + ':') - ); - i++; - } + return common.mustCall((res) => { + res.resume(); + https.globalAgent.once('free', common.mustCall(() => { + // Verify that the most recent connection is in the freeSockets pool. + const keys = Object.keys(https.globalAgent.freeSockets); + if (value) { + assert.ok( + keys.some((val) => val.startsWith(value.toString() + ':') || + val.endsWith(':' + value.toString()) || + val.includes(':' + value.toString() + ':')), + `missing value: ${value.toString()} in ${keys}` + ); + } + const next = iter.next(); + + if (next.done) { https.globalAgent.destroy(); server.close(); - })); - }); - } else { - const [key, val] = value; - return common.mustCall((res) => { - res.resume(); - https.globalAgent.once('free', common.mustCall(() => { - https.get( - Object.assign({}, getBaseOptions(port), { [key]: val }), - variations(iter, port, cb) - ); - })); - }); - } + } else { + // Save `value` for check the next time. + value = next.value.val; + const [key, val] = next.value; + https.get(Object.assign({}, getBaseOptions(port), { [key]: val }), + variations(iter, port, cb)); + } + })); + }); } server.listen(0, common.mustCall(() => {