From 6da49ac1fd0d9f94202edb8bb2ad744ef7e23387 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Thu, 30 Jun 2016 14:07:07 -0700 Subject: [PATCH] test: handle SmartOS bug in test-tls-session-cache Sometimes, a SmartOS bug results in ECONNREFUSED when trying to connect to the TLS server that the test starts. Retry in that situation. Fixes: https://github.com/nodejs/node/issues/5111 Refs: https://smartos.org/bugview/OS-2767 PR-URL: https://github.com/nodejs/node/pull/7505 Reviewed-By: Santiago Gimeno --- test/parallel/test-tls-session-cache.js | 68 +++++++++++++++---------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/test/parallel/test-tls-session-cache.js b/test/parallel/test-tls-session-cache.js index 1fd921aeef2b3c..60a85701796d72 100644 --- a/test/parallel/test-tls-session-cache.js +++ b/test/parallel/test-tls-session-cache.js @@ -1,5 +1,5 @@ 'use strict'; -var common = require('../common'); +const common = require('../common'); if (!common.opensslCli) { common.skip('node compiled without OpenSSL CLI.'); @@ -18,17 +18,17 @@ doTest({ tickets: false }, function() { }); function doTest(testOptions, callback) { - var assert = require('assert'); - var tls = require('tls'); - var fs = require('fs'); - var join = require('path').join; - var spawn = require('child_process').spawn; + const assert = require('assert'); + const tls = require('tls'); + const fs = require('fs'); + const join = require('path').join; + const spawn = require('child_process').spawn; - var keyFile = join(common.fixturesDir, 'agent.key'); - var certFile = join(common.fixturesDir, 'agent.crt'); - var key = fs.readFileSync(keyFile); - var cert = fs.readFileSync(certFile); - var options = { + const keyFile = join(common.fixturesDir, 'agent.key'); + const certFile = join(common.fixturesDir, 'agent.crt'); + const key = fs.readFileSync(keyFile); + const cert = fs.readFileSync(certFile); + const options = { key: key, cert: cert, ca: [cert], @@ -38,7 +38,7 @@ function doTest(testOptions, callback) { var resumeCount = 0; var session; - var server = tls.createServer(options, function(cleartext) { + const server = tls.createServer(options, function(cleartext) { cleartext.on('error', function(er) { // We're ok with getting ECONNRESET in this test, but it's // timing-dependent, and thus unreliable. Any other errors @@ -72,7 +72,7 @@ function doTest(testOptions, callback) { }); server.listen(0, function() { - var args = [ + const args = [ 's_client', '-tls1', '-connect', `localhost:${this.address().port}`, @@ -86,21 +86,35 @@ function doTest(testOptions, callback) { if (common.isWindows) args.push('-no_rand_screen'); - var client = spawn(common.opensslCli, args, { - stdio: [ 0, 1, 'pipe' ] - }); - var err = ''; - client.stderr.setEncoding('utf8'); - client.stderr.on('data', function(chunk) { - err += chunk; - }); - client.on('exit', function(code) { - console.error('done'); - assert.equal(code, 0); - server.close(function() { - setTimeout(callback, 100); + function spawnClient() { + const client = spawn(common.opensslCli, args, { + stdio: [ 0, 1, 'pipe' ] }); - }); + var err = ''; + client.stderr.setEncoding('utf8'); + client.stderr.on('data', function(chunk) { + err += chunk; + }); + + client.on('exit', common.mustCall(function(code, signal) { + if (code !== 0) { + // If SmartOS and connection refused, then retry. See + // https://github.com/nodejs/node/issues/2663. + if (common.isSunOS && err.includes('Connection refused')) { + requestCount = 0; + spawnClient(); + return; + } + common.fail(`code: ${code}, signal: ${signal}, output: ${err}`); + } + assert.equal(code, 0); + server.close(common.mustCall(function() { + setTimeout(callback, 100); + })); + })); + } + + spawnClient(); }); process.on('exit', function() {