From d1a82c6824876cad2c64019e4234cdd72300e954 Mon Sep 17 00:00:00 2001
From: Rich Trott <rtrott@gmail.com>
Date: Fri, 26 Feb 2016 09:29:19 -0800
Subject: [PATCH] test: retry on known SmartOS bug

There is a known issue with SmartOS that is generally worked around
in `tools/test.py`. However, a more robust workaround is required for
some tests that open many network connections.

`test-http-regr-gh-2928` is one such test.

Fixes: https://github.com/nodejs/node/issues/5445
Refs: https://github.com/nodejs/node/pull/3941
PR-URL: https://github.com/nodejs/node/pull/5454
Reviewed-By: Fedor Indutny <fedor@indutny.com>
---
 test/sequential/test-http-regr-gh-2928.js | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/test/sequential/test-http-regr-gh-2928.js b/test/sequential/test-http-regr-gh-2928.js
index 975eb84e769d97..b4ae7054d72bb9 100644
--- a/test/sequential/test-http-regr-gh-2928.js
+++ b/test/sequential/test-http-regr-gh-2928.js
@@ -18,13 +18,26 @@ var gotRequests = 0;
 var gotResponses = 0;
 
 function execAndClose() {
-  process.stdout.write('.');
   if (parsers.length === 0)
     return;
+  process.stdout.write('.');
 
   const parser = parsers.pop();
   parser.reinitialize(HTTPParser.RESPONSE);
+
   const socket = net.connect(common.PORT);
+  socket.on('error', (e) => {
+    // If SmartOS and ECONNREFUSED, then retry. See
+    // https://github.com/nodejs/node/issues/2663.
+    if (common.isSunOS && e.code === 'ECONNREFUSED') {
+      parsers.push(parser);
+      socket.destroy();
+      setImmediate(execAndClose);
+      return;
+    }
+    throw e;
+  });
+
   parser.consume(socket._handle._externalStream);
 
   parser.onIncoming = function onIncoming() {