libgo: update to Go 1.11
[official-gcc.git] / libgo / go / net / file_test.go
blobcd717747af6dc1ac327e26a701cfc3eba7ab2997
1 // 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.
5 // +build !js
7 package net
9 import (
10 "os"
11 "reflect"
12 "runtime"
13 "sync"
14 "testing"
17 // The full stack test cases for IPConn have been moved to the
18 // following:
19 // golang.org/x/net/ipv4
20 // golang.org/x/net/ipv6
21 // golang.org/x/net/icmp
23 var fileConnTests = []struct {
24 network string
26 {"tcp"},
27 {"udp"},
28 {"unix"},
29 {"unixpacket"},
32 func TestFileConn(t *testing.T) {
33 switch runtime.GOOS {
34 case "nacl", "plan9", "windows":
35 t.Skipf("not supported on %s", runtime.GOOS)
38 for _, tt := range fileConnTests {
39 if !testableNetwork(tt.network) {
40 t.Logf("skipping %s test", tt.network)
41 continue
44 var network, address string
45 switch tt.network {
46 case "udp":
47 c, err := newLocalPacketListener(tt.network)
48 if err != nil {
49 t.Fatal(err)
51 defer c.Close()
52 network = c.LocalAddr().Network()
53 address = c.LocalAddr().String()
54 default:
55 handler := func(ls *localServer, ln Listener) {
56 c, err := ln.Accept()
57 if err != nil {
58 return
60 defer c.Close()
61 var b [1]byte
62 c.Read(b[:])
64 ls, err := newLocalServer(tt.network)
65 if err != nil {
66 t.Fatal(err)
68 defer ls.teardown()
69 if err := ls.buildup(handler); err != nil {
70 t.Fatal(err)
72 network = ls.Listener.Addr().Network()
73 address = ls.Listener.Addr().String()
76 c1, err := Dial(network, address)
77 if err != nil {
78 if perr := parseDialError(err); perr != nil {
79 t.Error(perr)
81 t.Fatal(err)
83 addr := c1.LocalAddr()
85 var f *os.File
86 switch c1 := c1.(type) {
87 case *TCPConn:
88 f, err = c1.File()
89 case *UDPConn:
90 f, err = c1.File()
91 case *UnixConn:
92 f, err = c1.File()
94 if err := c1.Close(); err != nil {
95 if perr := parseCloseError(err, false); perr != nil {
96 t.Error(perr)
98 t.Error(err)
100 if err != nil {
101 if perr := parseCommonError(err); perr != nil {
102 t.Error(perr)
104 t.Fatal(err)
107 c2, err := FileConn(f)
108 if err := f.Close(); err != nil {
109 t.Error(err)
111 if err != nil {
112 if perr := parseCommonError(err); perr != nil {
113 t.Error(perr)
115 t.Fatal(err)
117 defer c2.Close()
119 if _, err := c2.Write([]byte("FILECONN TEST")); err != nil {
120 if perr := parseWriteError(err); perr != nil {
121 t.Error(perr)
123 t.Fatal(err)
125 if !reflect.DeepEqual(c2.LocalAddr(), addr) {
126 t.Fatalf("got %#v; want %#v", c2.LocalAddr(), addr)
131 var fileListenerTests = []struct {
132 network string
134 {"tcp"},
135 {"unix"},
136 {"unixpacket"},
139 func TestFileListener(t *testing.T) {
140 switch runtime.GOOS {
141 case "nacl", "plan9", "windows":
142 t.Skipf("not supported on %s", runtime.GOOS)
145 for _, tt := range fileListenerTests {
146 if !testableNetwork(tt.network) {
147 t.Logf("skipping %s test", tt.network)
148 continue
151 ln1, err := newLocalListener(tt.network)
152 if err != nil {
153 t.Fatal(err)
155 switch tt.network {
156 case "unix", "unixpacket":
157 defer os.Remove(ln1.Addr().String())
159 addr := ln1.Addr()
161 var f *os.File
162 switch ln1 := ln1.(type) {
163 case *TCPListener:
164 f, err = ln1.File()
165 case *UnixListener:
166 f, err = ln1.File()
168 switch tt.network {
169 case "unix", "unixpacket":
170 defer ln1.Close() // UnixListener.Close calls syscall.Unlink internally
171 default:
172 if err := ln1.Close(); err != nil {
173 t.Error(err)
176 if err != nil {
177 if perr := parseCommonError(err); perr != nil {
178 t.Error(perr)
180 t.Fatal(err)
183 ln2, err := FileListener(f)
184 if err := f.Close(); err != nil {
185 t.Error(err)
187 if err != nil {
188 if perr := parseCommonError(err); perr != nil {
189 t.Error(perr)
191 t.Fatal(err)
193 defer ln2.Close()
195 var wg sync.WaitGroup
196 wg.Add(1)
197 go func() {
198 defer wg.Done()
199 c, err := Dial(ln2.Addr().Network(), ln2.Addr().String())
200 if err != nil {
201 if perr := parseDialError(err); perr != nil {
202 t.Error(perr)
204 t.Error(err)
205 return
207 c.Close()
209 c, err := ln2.Accept()
210 if err != nil {
211 if perr := parseAcceptError(err); perr != nil {
212 t.Error(perr)
214 t.Fatal(err)
216 c.Close()
217 wg.Wait()
218 if !reflect.DeepEqual(ln2.Addr(), addr) {
219 t.Fatalf("got %#v; want %#v", ln2.Addr(), addr)
224 var filePacketConnTests = []struct {
225 network string
227 {"udp"},
228 {"unixgram"},
231 func TestFilePacketConn(t *testing.T) {
232 switch runtime.GOOS {
233 case "nacl", "plan9", "windows":
234 t.Skipf("not supported on %s", runtime.GOOS)
237 for _, tt := range filePacketConnTests {
238 if !testableNetwork(tt.network) {
239 t.Logf("skipping %s test", tt.network)
240 continue
243 c1, err := newLocalPacketListener(tt.network)
244 if err != nil {
245 t.Fatal(err)
247 switch tt.network {
248 case "unixgram":
249 defer os.Remove(c1.LocalAddr().String())
251 addr := c1.LocalAddr()
253 var f *os.File
254 switch c1 := c1.(type) {
255 case *UDPConn:
256 f, err = c1.File()
257 case *UnixConn:
258 f, err = c1.File()
260 if err := c1.Close(); err != nil {
261 if perr := parseCloseError(err, false); perr != nil {
262 t.Error(perr)
264 t.Error(err)
266 if err != nil {
267 if perr := parseCommonError(err); perr != nil {
268 t.Error(perr)
270 t.Fatal(err)
273 c2, err := FilePacketConn(f)
274 if err := f.Close(); err != nil {
275 t.Error(err)
277 if err != nil {
278 if perr := parseCommonError(err); perr != nil {
279 t.Error(perr)
281 t.Fatal(err)
283 defer c2.Close()
285 if _, err := c2.WriteTo([]byte("FILEPACKETCONN TEST"), addr); err != nil {
286 if perr := parseWriteError(err); perr != nil {
287 t.Error(perr)
289 t.Fatal(err)
291 if !reflect.DeepEqual(c2.LocalAddr(), addr) {
292 t.Fatalf("got %#v; want %#v", c2.LocalAddr(), addr)
297 // Issue 24483.
298 func TestFileCloseRace(t *testing.T) {
299 switch runtime.GOOS {
300 case "nacl", "plan9", "windows":
301 t.Skipf("not supported on %s", runtime.GOOS)
303 if !testableNetwork("tcp") {
304 t.Skip("tcp not supported")
307 handler := func(ls *localServer, ln Listener) {
308 c, err := ln.Accept()
309 if err != nil {
310 return
312 defer c.Close()
313 var b [1]byte
314 c.Read(b[:])
317 ls, err := newLocalServer("tcp")
318 if err != nil {
319 t.Fatal(err)
321 defer ls.teardown()
322 if err := ls.buildup(handler); err != nil {
323 t.Fatal(err)
326 const tries = 100
327 for i := 0; i < tries; i++ {
328 c1, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
329 if err != nil {
330 t.Fatal(err)
332 tc := c1.(*TCPConn)
334 var wg sync.WaitGroup
335 wg.Add(2)
336 go func() {
337 defer wg.Done()
338 f, err := tc.File()
339 if err == nil {
340 f.Close()
343 go func() {
344 defer wg.Done()
345 c1.Close()
347 wg.Wait()