diff options
author | Audrius Butkevicius <audrius.butkevicius@gmail.com> | 2018-05-28 02:47:21 +0100 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2018-05-30 22:54:22 +0000 |
commit | 3c4d3bdd3b454ef45ce00559d705fe5dc6f57cad (patch) | |
tree | f6fdc05def6fd6f042bc99fc105c3ffbd2721769 /src/net/dial_test.go | |
parent | cc6e568c818053ddc16b80b0406a87d19de7a120 (diff) | |
download | go-3c4d3bdd3b454ef45ce00559d705fe5dc6f57cad.tar.gz go-3c4d3bdd3b454ef45ce00559d705fe5dc6f57cad.zip |
net: add ListenConfig, Dialer.Control to permit socket opts before listen/dial
Existing implementation does not provide a way to set options such as
SO_REUSEPORT, that has to be set prior the socket being bound.
New exposed API:
pkg net, method (*ListenConfig) Listen(context.Context, string, string) (Listener, error)
pkg net, method (*ListenConfig) ListenPacket(context.Context, string, string) (PacketConn, error)
pkg net, type ListenConfig struct
pkg net, type ListenConfig struct, Control func(string, string, syscall.RawConn) error
pkg net, type Dialer struct, Control func(string, string, syscall.RawConn) error
Fixes #9661
Change-Id: If4d275711f823df72d3ac5cc3858651a6a57cccb
Reviewed-on: https://go-review.googlesource.com/72810
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/net/dial_test.go')
-rw-r--r-- | src/net/dial_test.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/net/dial_test.go b/src/net/dial_test.go index 96d8921ec8..3934ad8648 100644 --- a/src/net/dial_test.go +++ b/src/net/dial_test.go @@ -912,6 +912,57 @@ func TestDialListenerAddr(t *testing.T) { c.Close() } +func TestDialerControl(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9": + t.Skipf("not supported on %s", runtime.GOOS) + } + + t.Run("StreamDial", func(t *testing.T) { + for _, network := range []string{"tcp", "tcp4", "tcp6", "unix", "unixpacket"} { + if !testableNetwork(network) { + continue + } + ln, err := newLocalListener(network) + if err != nil { + t.Error(err) + continue + } + defer ln.Close() + d := Dialer{Control: controlOnConnSetup} + c, err := d.Dial(network, ln.Addr().String()) + if err != nil { + t.Error(err) + continue + } + c.Close() + } + }) + t.Run("PacketDial", func(t *testing.T) { + for _, network := range []string{"udp", "udp4", "udp6", "unixgram"} { + if !testableNetwork(network) { + continue + } + c1, err := newLocalPacketListener(network) + if err != nil { + t.Error(err) + continue + } + if network == "unixgram" { + defer os.Remove(c1.LocalAddr().String()) + } + defer c1.Close() + d := Dialer{Control: controlOnConnSetup} + c2, err := d.Dial(network, c1.LocalAddr().String()) + if err != nil { + t.Error(err) + continue + } + c2.Close() + } + }) +} + // mustHaveExternalNetwork is like testenv.MustHaveExternalNetwork // except that it won't skip testing on non-iOS builders. func mustHaveExternalNetwork(t *testing.T) { |