diff options
| author | Mikio Hara <mikioh.mikioh@gmail.com> | 2015-04-17 14:35:54 +0900 |
|---|---|---|
| committer | Mikio Hara <mikioh.mikioh@gmail.com> | 2015-04-18 03:38:50 +0000 |
| commit | 4540e162b1aefda8157372764ad3d290a414ef1d (patch) | |
| tree | 219593913b2b5d05d57b0119dd33a7102921971b /src/net/error_test.go | |
| parent | 310db63c5bc121e7bfccb494c01a6b91a257e7fc (diff) | |
| download | go-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.go | 74 |
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() +} |
