blob: abf8b3a6995f9d92797d180ce072e104495a95ee [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"
Mikio Hara6a1c2a52015-12-07 17:45:19 +090011 "sync"
Albert Strasheime480b812011-03-25 14:42:25 -040012 "testing"
13)
14
Mikio Hara6a1c2a52015-12-07 17:45:19 +090015// The full stack test cases for IPConn have been moved to the
16// following:
17// golang.org/x/net/ipv4
18// golang.org/x/net/ipv6
19// golang.org/x/net/icmp
20
21var fileConnTests = []struct {
22 network string
23}{
24 {"tcp"},
25 {"udp"},
26 {"unix"},
27 {"unixpacket"},
Albert Strasheime480b812011-03-25 14:42:25 -040028}
29
Mikio Hara6a1c2a52015-12-07 17:45:19 +090030func TestFileConn(t *testing.T) {
31 switch runtime.GOOS {
32 case "nacl", "plan9", "windows":
33 t.Skipf("not supported on %s", runtime.GOOS)
34 }
Albert Strasheime480b812011-03-25 14:42:25 -040035
Mikio Hara6a1c2a52015-12-07 17:45:19 +090036 for _, tt := range fileConnTests {
37 if !testableNetwork(tt.network) {
38 t.Logf("skipping %s test", tt.network)
39 continue
40 }
Albert Strasheime480b812011-03-25 14:42:25 -040041
Mikio Hara6a1c2a52015-12-07 17:45:19 +090042 var network, address string
43 switch tt.network {
44 case "udp":
45 c, err := newLocalPacketListener(tt.network)
46 if err != nil {
47 t.Fatal(err)
48 }
49 defer c.Close()
50 network = c.LocalAddr().Network()
51 address = c.LocalAddr().String()
52 default:
53 handler := func(ls *localServer, ln Listener) {
54 c, err := ln.Accept()
55 if err != nil {
56 return
57 }
58 defer c.Close()
59 var b [1]byte
60 c.Read(b[:])
61 }
62 ls, err := newLocalServer(tt.network)
63 if err != nil {
64 t.Fatal(err)
65 }
66 defer ls.teardown()
67 if err := ls.buildup(handler); err != nil {
68 t.Fatal(err)
69 }
70 network = ls.Listener.Addr().Network()
71 address = ls.Listener.Addr().String()
72 }
73
74 c1, err := Dial(network, address)
75 if err != nil {
76 if perr := parseDialError(err); perr != nil {
77 t.Error(perr)
78 }
79 t.Fatal(err)
80 }
81 addr := c1.LocalAddr()
82
83 var f *os.File
84 switch c1 := c1.(type) {
85 case *TCPConn:
86 f, err = c1.File()
87 case *UDPConn:
88 f, err = c1.File()
89 case *UnixConn:
90 f, err = c1.File()
91 }
92 if err := c1.Close(); err != nil {
Ian Lance Taylorfb4b4342017-04-07 15:53:19 -070093 if perr := parseCloseError(err, false); perr != nil {
Mikio Hara6a1c2a52015-12-07 17:45:19 +090094 t.Error(perr)
95 }
96 t.Error(err)
97 }
98 if err != nil {
99 if perr := parseCommonError(err); perr != nil {
100 t.Error(perr)
101 }
102 t.Fatal(err)
103 }
104
105 c2, err := FileConn(f)
106 if err := f.Close(); err != nil {
107 t.Error(err)
108 }
109 if err != nil {
110 if perr := parseCommonError(err); perr != nil {
111 t.Error(perr)
112 }
113 t.Fatal(err)
114 }
115 defer c2.Close()
116
117 if _, err := c2.Write([]byte("FILECONN TEST")); err != nil {
118 if perr := parseWriteError(err); perr != nil {
119 t.Error(perr)
120 }
121 t.Fatal(err)
122 }
123 if !reflect.DeepEqual(c2.LocalAddr(), addr) {
124 t.Fatalf("got %#v; want %#v", c2.LocalAddr(), addr)
125 }
Albert Strasheime480b812011-03-25 14:42:25 -0400126 }
127}
128
Mikio Harad4e13832012-03-06 09:43:45 +0900129var fileListenerTests = []struct {
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900130 network string
Mikio Harad4e13832012-03-06 09:43:45 +0900131}{
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900132 {"tcp"},
133 {"unix"},
134 {"unixpacket"},
Mikio Harad4e13832012-03-06 09:43:45 +0900135}
136
Albert Strasheime480b812011-03-25 14:42:25 -0400137func TestFileListener(t *testing.T) {
Mikio Hara195ccd52012-03-06 10:07:08 +0900138 switch runtime.GOOS {
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900139 case "nacl", "plan9", "windows":
Mikio Haraf77e10f2015-05-01 12:38:42 +0900140 t.Skipf("not supported on %s", runtime.GOOS)
Mikio Hara195ccd52012-03-06 10:07:08 +0900141 }
142
Mikio Harad4e13832012-03-06 09:43:45 +0900143 for _, tt := range fileListenerTests {
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900144 if !testableNetwork(tt.network) {
145 t.Logf("skipping %s test", tt.network)
Mikio Harad4e13832012-03-06 09:43:45 +0900146 continue
147 }
Albert Strasheime480b812011-03-25 14:42:25 -0400148
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900149 ln1, err := newLocalListener(tt.network)
150 if err != nil {
Mikio Haraf77e10f2015-05-01 12:38:42 +0900151 t.Fatal(err)
Albert Strasheim51057bda32011-10-12 13:36:45 -0400152 }
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900153 switch tt.network {
154 case "unix", "unixpacket":
155 defer os.Remove(ln1.Addr().String())
156 }
157 addr := ln1.Addr()
Albert Strasheime480b812011-03-25 14:42:25 -0400158
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900159 var f *os.File
160 switch ln1 := ln1.(type) {
161 case *TCPListener:
162 f, err = ln1.File()
163 case *UnixListener:
164 f, err = ln1.File()
165 }
166 switch tt.network {
167 case "unix", "unixpacket":
168 defer ln1.Close() // UnixListener.Close calls syscall.Unlink internally
169 default:
170 if err := ln1.Close(); err != nil {
171 t.Error(err)
172 }
173 }
174 if err != nil {
175 if perr := parseCommonError(err); perr != nil {
176 t.Error(perr)
177 }
178 t.Fatal(err)
179 }
Albert Strasheime480b812011-03-25 14:42:25 -0400180
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900181 ln2, err := FileListener(f)
182 if err := f.Close(); err != nil {
183 t.Error(err)
184 }
185 if err != nil {
186 if perr := parseCommonError(err); perr != nil {
187 t.Error(perr)
188 }
189 t.Fatal(err)
190 }
191 defer ln2.Close()
192
193 var wg sync.WaitGroup
194 wg.Add(1)
195 go func() {
196 defer wg.Done()
197 c, err := Dial(ln2.Addr().Network(), ln2.Addr().String())
198 if err != nil {
199 if perr := parseDialError(err); perr != nil {
200 t.Error(perr)
201 }
202 t.Error(err)
203 return
204 }
205 c.Close()
206 }()
207 c, err := ln2.Accept()
208 if err != nil {
209 if perr := parseAcceptError(err); perr != nil {
210 t.Error(perr)
211 }
212 t.Fatal(err)
213 }
214 c.Close()
215 wg.Wait()
216 if !reflect.DeepEqual(ln2.Addr(), addr) {
217 t.Fatalf("got %#v; want %#v", ln2.Addr(), addr)
218 }
Albert Strasheime480b812011-03-25 14:42:25 -0400219 }
220}
221
Mikio Harad4e13832012-03-06 09:43:45 +0900222var filePacketConnTests = []struct {
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900223 network string
Mikio Harad4e13832012-03-06 09:43:45 +0900224}{
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900225 {"udp"},
226 {"unixgram"},
Mikio Harad4e13832012-03-06 09:43:45 +0900227}
228
Albert Strasheime480b812011-03-25 14:42:25 -0400229func TestFilePacketConn(t *testing.T) {
Mikio Hara195ccd52012-03-06 10:07:08 +0900230 switch runtime.GOOS {
Mikio Hara1b135172014-02-26 10:20:49 +0900231 case "nacl", "plan9", "windows":
Mikio Haraf77e10f2015-05-01 12:38:42 +0900232 t.Skipf("not supported on %s", runtime.GOOS)
Mikio Hara195ccd52012-03-06 10:07:08 +0900233 }
234
Mikio Harad4e13832012-03-06 09:43:45 +0900235 for _, tt := range filePacketConnTests {
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900236 if !testableNetwork(tt.network) {
237 t.Logf("skipping %s test", tt.network)
Mikio Harad4e13832012-03-06 09:43:45 +0900238 continue
239 }
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900240
241 c1, err := newLocalPacketListener(tt.network)
242 if err != nil {
243 t.Fatal(err)
Mikio Harac88a6712014-01-28 03:18:27 -0800244 }
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900245 switch tt.network {
246 case "unixgram":
247 defer os.Remove(c1.LocalAddr().String())
248 }
249 addr := c1.LocalAddr()
250
251 var f *os.File
252 switch c1 := c1.(type) {
253 case *UDPConn:
254 f, err = c1.File()
255 case *UnixConn:
256 f, err = c1.File()
257 }
258 if err := c1.Close(); err != nil {
Ian Lance Taylorfb4b4342017-04-07 15:53:19 -0700259 if perr := parseCloseError(err, false); perr != nil {
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900260 t.Error(perr)
Mikio Harad4e13832012-03-06 09:43:45 +0900261 }
Mikio Hara6a1c2a52015-12-07 17:45:19 +0900262 t.Error(err)
263 }
264 if err != nil {
265 if perr := parseCommonError(err); perr != nil {
266 t.Error(perr)
267 }
268 t.Fatal(err)
269 }
270
271 c2, err := FilePacketConn(f)
272 if err := f.Close(); err != nil {
273 t.Error(err)
274 }
275 if err != nil {
276 if perr := parseCommonError(err); perr != nil {
277 t.Error(perr)
278 }
279 t.Fatal(err)
280 }
281 defer c2.Close()
282
283 if _, err := c2.WriteTo([]byte("FILEPACKETCONN TEST"), addr); err != nil {
284 if perr := parseWriteError(err); perr != nil {
285 t.Error(perr)
286 }
287 t.Fatal(err)
288 }
289 if !reflect.DeepEqual(c2.LocalAddr(), addr) {
290 t.Fatalf("got %#v; want %#v", c2.LocalAddr(), addr)
Mikio Harad4e13832012-03-06 09:43:45 +0900291 }
Albert Strasheime480b812011-03-25 14:42:25 -0400292 }
293}