aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikio Hara <mikioh.mikioh@gmail.com>2015-06-26 12:05:27 +0900
committerMikio Hara <mikioh.mikioh@gmail.com>2015-06-26 04:58:29 +0000
commitaf03a19e5e18af95235c84e92e6670fdeb0b220a (patch)
tree47099c1e609adf7f9e9625ea3caaf8daf159105a
parent669b27b881d6d006def7db14d534acdc5aba342b (diff)
downloadnet-af03a19e5e18af95235c84e92e6670fdeb0b220a.tar.gz
netutil, internal/nettest: deflake TestLimitListener
Change-Id: Ic82974bcafa1723c96ece0b6b0b717b00b27774b Reviewed-on: https://go-review.googlesource.com/11533 Reviewed-by: Andrew Gerrand <adg@golang.org>
-rw-r--r--internal/nettest/rlimit.go11
-rw-r--r--internal/nettest/rlimit_plan9.go7
-rw-r--r--internal/nettest/rlimit_unix.go17
-rw-r--r--internal/nettest/rlimit_windows.go7
-rw-r--r--netutil/listen_test.go18
5 files changed, 51 insertions, 9 deletions
diff --git a/internal/nettest/rlimit.go b/internal/nettest/rlimit.go
new file mode 100644
index 0000000..bb34aec
--- /dev/null
+++ b/internal/nettest/rlimit.go
@@ -0,0 +1,11 @@
+// Copyright 2015 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.
+
+package nettest
+
+const defaultMaxOpenFiles = 256
+
+// MaxOpenFiles returns the maximum number of open files for the
+// caller's process.
+func MaxOpenFiles() int { return maxOpenFiles() }
diff --git a/internal/nettest/rlimit_plan9.go b/internal/nettest/rlimit_plan9.go
new file mode 100644
index 0000000..f745f8a
--- /dev/null
+++ b/internal/nettest/rlimit_plan9.go
@@ -0,0 +1,7 @@
+// Copyright 2015 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.
+
+package nettest
+
+func maxOpenFiles() int { return defaultMaxOpenFiles }
diff --git a/internal/nettest/rlimit_unix.go b/internal/nettest/rlimit_unix.go
new file mode 100644
index 0000000..eb4312c
--- /dev/null
+++ b/internal/nettest/rlimit_unix.go
@@ -0,0 +1,17 @@
+// Copyright 2015 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 darwin dragonfly freebsd linux netbsd openbsd solaris
+
+package nettest
+
+import "syscall"
+
+func maxOpenFiles() int {
+ var rlim syscall.Rlimit
+ if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil {
+ return defaultMaxOpenFiles
+ }
+ return int(rlim.Cur)
+}
diff --git a/internal/nettest/rlimit_windows.go b/internal/nettest/rlimit_windows.go
new file mode 100644
index 0000000..de927b5
--- /dev/null
+++ b/internal/nettest/rlimit_windows.go
@@ -0,0 +1,7 @@
+// Copyright 2015 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.
+
+package nettest
+
+func maxOpenFiles() int { return 4 * defaultMaxOpenFiles /* actually it's 16581375 */ }
diff --git a/netutil/listen_test.go b/netutil/listen_test.go
index ac87e0e..7179907 100644
--- a/netutil/listen_test.go
+++ b/netutil/listen_test.go
@@ -20,17 +20,17 @@ import (
"sync/atomic"
"testing"
"time"
+
+ "golang.org/x/net/internal/nettest"
)
func TestLimitListener(t *testing.T) {
- const (
- max = 5
- num = 200
- )
+ const max = 5
+ attempts := (nettest.MaxOpenFiles() - max) / 2
l, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
- t.Fatalf("Listen: %v", err)
+ t.Fatal(err)
}
defer l.Close()
l = LimitListener(l, max)
@@ -47,14 +47,14 @@ func TestLimitListener(t *testing.T) {
var wg sync.WaitGroup
var failed int32
- for i := 0; i < num; i++ {
+ for i := 0; i < attempts; i++ {
wg.Add(1)
go func() {
defer wg.Done()
c := http.Client{Timeout: 3 * time.Second}
r, err := c.Get("http://" + l.Addr().String())
if err != nil {
- t.Logf("Get: %v", err)
+ t.Log(err)
atomic.AddInt32(&failed, 1)
return
}
@@ -66,8 +66,8 @@ func TestLimitListener(t *testing.T) {
// We expect some Gets to fail as the kernel's accept queue is filled,
// but most should succeed.
- if failed >= num/2 {
- t.Errorf("too many Gets failed: %v", failed)
+ if int(failed) >= attempts/2 {
+ t.Errorf("%d requests failed within %d attempts", failed, attempts)
}
}