2012-10-16 16:41:00 -06:00
|
|
|
// Copyright 2012 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 freebsd linux netbsd openbsd
|
|
|
|
|
|
|
|
package net
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2012-10-30 14:38:01 -06:00
|
|
|
// Issue 3590. netFd.AddFD should return an error
|
2012-10-16 16:41:00 -06:00
|
|
|
// from the underlying pollster rather than panicing.
|
|
|
|
func TestAddFDReturnsError(t *testing.T) {
|
2012-11-27 16:08:59 -07:00
|
|
|
ln := newLocalListener(t).(*TCPListener)
|
|
|
|
defer ln.Close()
|
|
|
|
connected := make(chan bool)
|
2012-10-16 16:41:00 -06:00
|
|
|
go func() {
|
|
|
|
for {
|
2012-11-27 16:08:59 -07:00
|
|
|
c, err := ln.Accept()
|
2012-10-16 16:41:00 -06:00
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
2012-11-27 16:08:59 -07:00
|
|
|
connected <- true
|
2012-10-16 16:41:00 -06:00
|
|
|
defer c.Close()
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
2012-11-27 16:08:59 -07:00
|
|
|
c, err := DialTCP("tcp", nil, ln.Addr().(*TCPAddr))
|
2012-10-16 16:41:00 -06:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
defer c.Close()
|
2012-11-27 16:08:59 -07:00
|
|
|
<-connected
|
2012-10-16 16:41:00 -06:00
|
|
|
|
|
|
|
// replace c's pollServer with a closed version.
|
|
|
|
ps, err := newPollServer()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
ps.poll.Close()
|
2012-11-27 16:08:59 -07:00
|
|
|
c.conn.fd.pollServer = ps
|
2012-10-16 16:41:00 -06:00
|
|
|
|
|
|
|
var b [1]byte
|
|
|
|
_, err = c.Read(b[:])
|
|
|
|
if err, ok := err.(*OpError); ok {
|
|
|
|
if err.Op == "addfd" {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if err, ok := err.Err.(*OpError); ok {
|
|
|
|
// the err is sometimes wrapped by another OpError
|
|
|
|
if err.Op == "addfd" {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-11-27 16:08:59 -07:00
|
|
|
t.Error("unexpected error:", err)
|
2012-10-16 16:41:00 -06:00
|
|
|
}
|