aboutsummaryrefslogtreecommitdiff
path: root/src/net/error_test.go
diff options
context:
space:
mode:
authorMikio Hara <mikioh.mikioh@gmail.com>2015-04-17 14:35:54 +0900
committerMikio Hara <mikioh.mikioh@gmail.com>2015-04-18 03:38:50 +0000
commit4540e162b1aefda8157372764ad3d290a414ef1d (patch)
tree219593913b2b5d05d57b0119dd33a7102921971b /src/net/error_test.go
parent310db63c5bc121e7bfccb494c01a6b91a257e7fc (diff)
downloadgo-4540e162b1aefda8157372764ad3d290a414ef1d.tar.xz
net: fix inconsistent error values on Accept
This change fixes inconsistent error values on Accept{,TCP,Unix}. Updates #4856. Change-Id: Ie3bb534c19a724cacb3ea3f3656e46c810b2123f Reviewed-on: https://go-review.googlesource.com/8996 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/net/error_test.go')
-rw-r--r--src/net/error_test.go74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/net/error_test.go b/src/net/error_test.go
index 9f4a90d8e1..ebb395d8f9 100644
--- a/src/net/error_test.go
+++ b/src/net/error_test.go
@@ -11,6 +11,7 @@ import (
"os"
"runtime"
"testing"
+ "time"
)
func isTimeoutError(err error) bool {
@@ -424,3 +425,76 @@ func TestCloseError(t *testing.T) {
}
}
}
+
+// parseAcceptError parses nestedErr and reports whether it is a valid
+// error value from Accept functions.
+// It returns nil when nestedErr is valid.
+func parseAcceptError(nestedErr error) error {
+ if nestedErr == nil {
+ return nil
+ }
+
+ switch err := nestedErr.(type) {
+ case *OpError:
+ if err := err.isValid(); err != nil {
+ return err
+ }
+ nestedErr = err.Err
+ goto second
+ }
+ return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
+
+second:
+ if isPlatformError(nestedErr) {
+ return nil
+ }
+ switch err := nestedErr.(type) {
+ case *os.SyscallError:
+ nestedErr = err.Err
+ goto third
+ }
+ switch nestedErr {
+ case errClosing, errTimeout:
+ return nil
+ }
+ return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
+
+third:
+ if isPlatformError(nestedErr) {
+ return nil
+ }
+ return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
+}
+
+func TestAcceptError(t *testing.T) {
+ handler := func(ls *localServer, ln Listener) {
+ for {
+ ln.(*TCPListener).SetDeadline(time.Now().Add(5 * time.Millisecond))
+ c, err := ln.Accept()
+ if perr := parseAcceptError(err); perr != nil {
+ t.Error(perr)
+ }
+ if err != nil {
+ if c != nil {
+ t.Errorf("Accept returned non-nil interface %T(%v) with err != nil", c, c)
+ }
+ if !isTimeoutError(err) && !isTemporaryError(err) {
+ return
+ }
+ continue
+ }
+ c.Close()
+ }
+ }
+ ls, err := newLocalServer("tcp")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := ls.buildup(handler); err != nil {
+ ls.teardown()
+ t.Fatal(err)
+ }
+
+ time.Sleep(100 * time.Millisecond)
+ ls.teardown()
+}