"net"
"os"
"os/exec"
+ "runtime"
"strconv"
"strings"
"sync"
}
}
+var isConnRefused = func(err error) bool { return false }
+
func localPipe(t testing.TB) (net.Conn, net.Conn) {
localListener.mu.Lock()
defer localListener.mu.Unlock()
addr := localListener.addr
+ var err error
Dialing:
// We expect a rare mismatch, but probably not 5 in a row.
for i := 0; i < 5; i++ {
tooSlow := time.NewTimer(1 * time.Second)
defer tooSlow.Stop()
- c1, err := net.Dial(addr.Network(), addr.String())
+ var c1 net.Conn
+ c1, err = net.Dial(addr.Network(), addr.String())
if err != nil {
+ if runtime.GOOS == "dragonfly" && isConnRefused(err) {
+ // golang.org/issue/29583: Dragonfly sometimes returned a spurious
+ // ECONNREFUSED.
+ <-tooSlow.C
+ continue
+ }
t.Fatalf("localPipe: %v", err)
}
if localFlakes == 2 && i == 0 {
}
}
- t.Fatalf("localPipe: failed to connect")
+ t.Fatalf("localPipe: failed to connect: %v", err)
panic("unreachable")
}
--- /dev/null
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
+
+package tls
+
+import (
+ "errors"
+ "syscall"
+)
+
+func init() {
+ isConnRefused = func(err error) bool {
+ return errors.Is(err, syscall.ECONNREFUSED)
+ }
+}