blob: 003dbb2ecb759212fec1b0e25f9bf2c36d6ebb98 [file] [log] [blame]
Albert Strasheime480b812011-03-25 14:42:25 -04001// Copyright 2011 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package net
6
7import (
8 "os"
9 "reflect"
Mikio Hara195ccd52012-03-06 10:07:08 +090010 "runtime"
Albert Strasheime480b812011-03-25 14:42:25 -040011 "testing"
12)
13
14type listenerFile interface {
15 Listener
Russ Coxeb692922011-11-01 22:05:34 -040016 File() (f *os.File, err error)
Albert Strasheime480b812011-03-25 14:42:25 -040017}
18
19type packetConnFile interface {
20 PacketConn
Russ Coxeb692922011-11-01 22:05:34 -040021 File() (f *os.File, err error)
Albert Strasheime480b812011-03-25 14:42:25 -040022}
23
24type connFile interface {
25 Conn
Russ Coxeb692922011-11-01 22:05:34 -040026 File() (f *os.File, err error)
Albert Strasheime480b812011-03-25 14:42:25 -040027}
28
29func testFileListener(t *testing.T, net, laddr string) {
Albert Strasheime480b812011-03-25 14:42:25 -040030 l, err := Listen(net, laddr)
31 if err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +090032 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -040033 }
34 defer l.Close()
35 lf := l.(listenerFile)
36 f, err := lf.File()
37 if err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +090038 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -040039 }
40 c, err := FileListener(f)
41 if err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +090042 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -040043 }
44 if !reflect.DeepEqual(l.Addr(), c.Addr()) {
Mikio Haraf77e10f2015-05-01 12:38:42 +090045 t.Fatalf("got %#v; want%#v", l.Addr(), c.Addr())
Albert Strasheime480b812011-03-25 14:42:25 -040046 }
47 if err := c.Close(); err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +090048 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -040049 }
50 if err := f.Close(); err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +090051 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -040052 }
53}
54
Mikio Harad4e13832012-03-06 09:43:45 +090055var fileListenerTests = []struct {
56 net string
57 laddr string
Mikio Harad4e13832012-03-06 09:43:45 +090058}{
Mikio Hara7b2b45e2015-03-26 23:26:45 +090059 {net: "tcp", laddr: ":0"},
60 {net: "tcp", laddr: "0.0.0.0:0"},
61 {net: "tcp", laddr: "[::ffff:0.0.0.0]:0"},
62 {net: "tcp", laddr: "[::]:0"},
Mikio Harad4e13832012-03-06 09:43:45 +090063
Mikio Hara7b2b45e2015-03-26 23:26:45 +090064 {net: "tcp", laddr: "127.0.0.1:0"},
65 {net: "tcp", laddr: "[::ffff:127.0.0.1]:0"},
66 {net: "tcp", laddr: "[::1]:0"},
Mikio Harad4e13832012-03-06 09:43:45 +090067
Mikio Hara7b2b45e2015-03-26 23:26:45 +090068 {net: "tcp4", laddr: ":0"},
69 {net: "tcp4", laddr: "0.0.0.0:0"},
70 {net: "tcp4", laddr: "[::ffff:0.0.0.0]:0"},
Mikio Harad4e13832012-03-06 09:43:45 +090071
Mikio Hara7b2b45e2015-03-26 23:26:45 +090072 {net: "tcp4", laddr: "127.0.0.1:0"},
73 {net: "tcp4", laddr: "[::ffff:127.0.0.1]:0"},
Mikio Harad4e13832012-03-06 09:43:45 +090074
Mikio Hara7b2b45e2015-03-26 23:26:45 +090075 {net: "tcp6", laddr: ":0"},
76 {net: "tcp6", laddr: "[::]:0"},
Mikio Harad4e13832012-03-06 09:43:45 +090077
Mikio Hara7b2b45e2015-03-26 23:26:45 +090078 {net: "tcp6", laddr: "[::1]:0"},
Mikio Harad4e13832012-03-06 09:43:45 +090079
Mikio Hara7b2b45e2015-03-26 23:26:45 +090080 {net: "unix", laddr: "@gotest/net"},
81 {net: "unixpacket", laddr: "@gotest/net"},
Mikio Harad4e13832012-03-06 09:43:45 +090082}
83
Albert Strasheime480b812011-03-25 14:42:25 -040084func TestFileListener(t *testing.T) {
Mikio Hara195ccd52012-03-06 10:07:08 +090085 switch runtime.GOOS {
Mikio Hara484cc672014-09-18 19:17:55 +090086 case "nacl", "windows":
Mikio Haraf77e10f2015-05-01 12:38:42 +090087 t.Skipf("not supported on %s", runtime.GOOS)
Mikio Hara195ccd52012-03-06 10:07:08 +090088 }
89
Mikio Harad4e13832012-03-06 09:43:45 +090090 for _, tt := range fileListenerTests {
Mikio Hara7b2b45e2015-03-26 23:26:45 +090091 if !testableListenArgs(tt.net, tt.laddr, "") {
Mikio Haraf77e10f2015-05-01 12:38:42 +090092 t.Logf("skipping %s test", tt.net+" "+tt.laddr)
Mikio Harad4e13832012-03-06 09:43:45 +090093 continue
94 }
95 testFileListener(t, tt.net, tt.laddr)
Albert Strasheime480b812011-03-25 14:42:25 -040096 }
97}
98
Albert Strasheim51057bda32011-10-12 13:36:45 -040099func testFilePacketConn(t *testing.T, pcf packetConnFile, listen bool) {
Albert Strasheime480b812011-03-25 14:42:25 -0400100 f, err := pcf.File()
101 if err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900102 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -0400103 }
104 c, err := FilePacketConn(f)
105 if err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900106 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -0400107 }
108 if !reflect.DeepEqual(pcf.LocalAddr(), c.LocalAddr()) {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900109 t.Fatalf("got %#v; want %#v", pcf.LocalAddr(), c.LocalAddr())
Albert Strasheime480b812011-03-25 14:42:25 -0400110 }
Albert Strasheim51057bda32011-10-12 13:36:45 -0400111 if listen {
112 if _, err := c.WriteTo([]byte{}, c.LocalAddr()); err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900113 t.Fatal(err)
Albert Strasheim51057bda32011-10-12 13:36:45 -0400114 }
115 }
Albert Strasheime480b812011-03-25 14:42:25 -0400116 if err := c.Close(); err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900117 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -0400118 }
119 if err := f.Close(); err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900120 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -0400121 }
122}
123
124func testFilePacketConnListen(t *testing.T, net, laddr string) {
125 l, err := ListenPacket(net, laddr)
126 if err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900127 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -0400128 }
Albert Strasheim51057bda32011-10-12 13:36:45 -0400129 testFilePacketConn(t, l.(packetConnFile), true)
Albert Strasheime480b812011-03-25 14:42:25 -0400130 if err := l.Close(); err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900131 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -0400132 }
133}
134
135func testFilePacketConnDial(t *testing.T, net, raddr string) {
Russ Cox98828f02011-03-28 23:39:39 -0400136 c, err := Dial(net, raddr)
Albert Strasheime480b812011-03-25 14:42:25 -0400137 if err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900138 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -0400139 }
Albert Strasheim51057bda32011-10-12 13:36:45 -0400140 testFilePacketConn(t, c.(packetConnFile), false)
Albert Strasheime480b812011-03-25 14:42:25 -0400141 if err := c.Close(); err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900142 t.Fatal(err)
Albert Strasheime480b812011-03-25 14:42:25 -0400143 }
144}
145
Mikio Harad4e13832012-03-06 09:43:45 +0900146var filePacketConnTests = []struct {
Mikio Hara7b2b45e2015-03-26 23:26:45 +0900147 net string
148 addr string
Mikio Harad4e13832012-03-06 09:43:45 +0900149}{
Mikio Hara7b2b45e2015-03-26 23:26:45 +0900150 {net: "udp", addr: "127.0.0.1:0"},
151 {net: "udp", addr: "[::ffff:127.0.0.1]:0"},
152 {net: "udp", addr: "[::1]:0"},
Mikio Harad4e13832012-03-06 09:43:45 +0900153
Mikio Hara7b2b45e2015-03-26 23:26:45 +0900154 {net: "udp4", addr: "127.0.0.1:0"},
155 {net: "udp4", addr: "[::ffff:127.0.0.1]:0"},
Mikio Harad4e13832012-03-06 09:43:45 +0900156
Mikio Hara7b2b45e2015-03-26 23:26:45 +0900157 {net: "udp6", addr: "[::1]:0"},
Mikio Harad4e13832012-03-06 09:43:45 +0900158
Ainar Garipov7f9f70e2015-06-11 16:49:38 +0300159 // TODO(mikioh,bradfitz): reenable once 10730 is fixed
Brad Fitzpatrickf97f8762015-05-06 19:25:04 -0700160 // {net: "ip4:icmp", addr: "127.0.0.1"},
Mikio Harac88a6712014-01-28 03:18:27 -0800161
Mikio Hara7b2b45e2015-03-26 23:26:45 +0900162 {net: "unixgram", addr: "@gotest3/net"},
Mikio Harad4e13832012-03-06 09:43:45 +0900163}
164
Albert Strasheime480b812011-03-25 14:42:25 -0400165func TestFilePacketConn(t *testing.T) {
Mikio Hara195ccd52012-03-06 10:07:08 +0900166 switch runtime.GOOS {
Mikio Hara1b135172014-02-26 10:20:49 +0900167 case "nacl", "plan9", "windows":
Mikio Haraf77e10f2015-05-01 12:38:42 +0900168 t.Skipf("not supported on %s", runtime.GOOS)
Mikio Hara195ccd52012-03-06 10:07:08 +0900169 }
170
Mikio Harad4e13832012-03-06 09:43:45 +0900171 for _, tt := range filePacketConnTests {
Mikio Hara7b2b45e2015-03-26 23:26:45 +0900172 if !testableListenArgs(tt.net, tt.addr, "") {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900173 t.Logf("skipping %s test", tt.net+" "+tt.addr)
Mikio Harad4e13832012-03-06 09:43:45 +0900174 continue
175 }
Mikio Harac88a6712014-01-28 03:18:27 -0800176 if os.Getuid() != 0 && tt.net == "ip4:icmp" {
177 t.Log("skipping test; must be root")
178 continue
179 }
Mikio Harad4e13832012-03-06 09:43:45 +0900180 testFilePacketConnListen(t, tt.net, tt.addr)
Mikio Hara7b2b45e2015-03-26 23:26:45 +0900181 switch tt.net {
182 case "udp", "udp4", "udp6":
183 host, _, err := SplitHostPort(tt.addr)
184 if err != nil {
185 t.Error(err)
186 continue
Mikio Harad4e13832012-03-06 09:43:45 +0900187 }
Mikio Hara7b2b45e2015-03-26 23:26:45 +0900188 testFilePacketConnDial(t, tt.net, JoinHostPort(host, "12345"))
189 case "ip4:icmp":
190 testFilePacketConnDial(t, tt.net, tt.addr)
Mikio Harad4e13832012-03-06 09:43:45 +0900191 }
Albert Strasheime480b812011-03-25 14:42:25 -0400192 }
193}