diff options
Diffstat (limited to 'libgo/go/net/fd_unix_test.go')
-rw-r--r-- | libgo/go/net/fd_unix_test.go | 66 |
1 files changed, 56 insertions, 10 deletions
diff --git a/libgo/go/net/fd_unix_test.go b/libgo/go/net/fd_unix_test.go index d1eb573d004..fd1385ef934 100644 --- a/libgo/go/net/fd_unix_test.go +++ b/libgo/go/net/fd_unix_test.go @@ -7,33 +7,34 @@ package net import ( + "io" + "syscall" "testing" ) // Issue 3590. netFd.AddFD should return an error // from the underlying pollster rather than panicing. func TestAddFDReturnsError(t *testing.T) { - l, err := Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatal(err) - } - defer l.Close() - + ln := newLocalListener(t).(*TCPListener) + defer ln.Close() + connected := make(chan bool) go func() { for { - c, err := l.Accept() + c, err := ln.Accept() if err != nil { return } + connected <- true defer c.Close() } }() - c, err := Dial("tcp", l.Addr().String()) + c, err := DialTCP("tcp", nil, ln.Addr().(*TCPAddr)) if err != nil { t.Fatal(err) } defer c.Close() + <-connected // replace c's pollServer with a closed version. ps, err := newPollServer() @@ -41,7 +42,7 @@ func TestAddFDReturnsError(t *testing.T) { t.Fatal(err) } ps.poll.Close() - c.(*TCPConn).conn.fd.pollServer = ps + c.conn.fd.pollServer = ps var b [1]byte _, err = c.Read(b[:]) @@ -56,5 +57,50 @@ func TestAddFDReturnsError(t *testing.T) { } } } - t.Error(err) + t.Error("unexpected error:", err) +} + +var chkReadErrTests = []struct { + n int + err error + fd *netFD + expected error +}{ + + {100, nil, &netFD{sotype: syscall.SOCK_STREAM}, nil}, + {100, io.EOF, &netFD{sotype: syscall.SOCK_STREAM}, io.EOF}, + {100, errClosing, &netFD{sotype: syscall.SOCK_STREAM}, errClosing}, + {0, nil, &netFD{sotype: syscall.SOCK_STREAM}, io.EOF}, + {0, io.EOF, &netFD{sotype: syscall.SOCK_STREAM}, io.EOF}, + {0, errClosing, &netFD{sotype: syscall.SOCK_STREAM}, errClosing}, + + {100, nil, &netFD{sotype: syscall.SOCK_DGRAM}, nil}, + {100, io.EOF, &netFD{sotype: syscall.SOCK_DGRAM}, io.EOF}, + {100, errClosing, &netFD{sotype: syscall.SOCK_DGRAM}, errClosing}, + {0, nil, &netFD{sotype: syscall.SOCK_DGRAM}, nil}, + {0, io.EOF, &netFD{sotype: syscall.SOCK_DGRAM}, io.EOF}, + {0, errClosing, &netFD{sotype: syscall.SOCK_DGRAM}, errClosing}, + + {100, nil, &netFD{sotype: syscall.SOCK_SEQPACKET}, nil}, + {100, io.EOF, &netFD{sotype: syscall.SOCK_SEQPACKET}, io.EOF}, + {100, errClosing, &netFD{sotype: syscall.SOCK_SEQPACKET}, errClosing}, + {0, nil, &netFD{sotype: syscall.SOCK_SEQPACKET}, io.EOF}, + {0, io.EOF, &netFD{sotype: syscall.SOCK_SEQPACKET}, io.EOF}, + {0, errClosing, &netFD{sotype: syscall.SOCK_SEQPACKET}, errClosing}, + + {100, nil, &netFD{sotype: syscall.SOCK_RAW}, nil}, + {100, io.EOF, &netFD{sotype: syscall.SOCK_RAW}, io.EOF}, + {100, errClosing, &netFD{sotype: syscall.SOCK_RAW}, errClosing}, + {0, nil, &netFD{sotype: syscall.SOCK_RAW}, nil}, + {0, io.EOF, &netFD{sotype: syscall.SOCK_RAW}, io.EOF}, + {0, errClosing, &netFD{sotype: syscall.SOCK_RAW}, errClosing}, +} + +func TestChkReadErr(t *testing.T) { + for _, tt := range chkReadErrTests { + actual := chkReadErr(tt.n, tt.err, tt.fd) + if actual != tt.expected { + t.Errorf("chkReadError(%v, %v, %v): expected %v, actual %v", tt.n, tt.err, tt.fd.sotype, tt.expected, actual) + } + } } |