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 <santiago.gimeno@gmail.com>
This commit is contained in:
Rich Trott 2016-06-30 14:07:07 -07:00
Родитель 7cbbec516d
Коммит fb4c022fbe
1 изменённых файлов: 41 добавлений и 27 удалений

Просмотреть файл

@ -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() {