libgo: update to go1.9
[official-gcc.git] / libgo / go / net / file_test.go
blobabf8b3a6995f9d92797d180ce072e104495a95ee
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 package net
7 import (
8 "os"
9 "reflect"
10 "runtime"
11 "sync"
12 "testing"
15 // 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
21 var fileConnTests = []struct {
22 network string
24 {"tcp"},
25 {"udp"},
26 {"unix"},
27 {"unixpacket"},
30 func TestFileConn(t *testing.T) {
31 switch runtime.GOOS {
32 case "nacl", "plan9", "windows":
33 t.Skipf("not supported on %s", runtime.GOOS)
36 for _, tt := range fileConnTests {
37 if !testableNetwork(tt.network) {
38 t.Logf("skipping %s test", tt.network)
39 continue
42 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)
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
58 defer c.Close()
59 var b [1]byte
60 c.Read(b[:])
62 ls, err := newLocalServer(tt.network)
63 if err != nil {
64 t.Fatal(err)
66 defer ls.teardown()
67 if err := ls.buildup(handler); err != nil {
68 t.Fatal(err)
70 network = ls.Listener.Addr().Network()
71 address = ls.Listener.Addr().String()
74 c1, err := Dial(network, address)
75 if err != nil {
76 if perr := parseDialError(err); perr != nil {
77 t.Error(perr)
79 t.Fatal(err)
81 addr := c1.LocalAddr()
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()
92 if err := c1.Close(); err != nil {
93 if perr := parseCloseError(err, false); perr != nil {
94 t.Error(perr)
96 t.Error(err)
98 if err != nil {
99 if perr := parseCommonError(err); perr != nil {
100 t.Error(perr)
102 t.Fatal(err)
105 c2, err := FileConn(f)
106 if err := f.Close(); err != nil {
107 t.Error(err)
109 if err != nil {
110 if perr := parseCommonError(err); perr != nil {
111 t.Error(perr)
113 t.Fatal(err)
115 defer c2.Close()
117 if _, err := c2.Write([]byte("FILECONN TEST")); err != nil {
118 if perr := parseWriteError(err); perr != nil {
119 t.Error(perr)
121 t.Fatal(err)
123 if !reflect.DeepEqual(c2.LocalAddr(), addr) {
124 t.Fatalf("got %#v; want %#v", c2.LocalAddr(), addr)
129 var fileListenerTests = []struct {
130 network string
132 {"tcp"},
133 {"unix"},
134 {"unixpacket"},
137 func TestFileListener(t *testing.T) {
138 switch runtime.GOOS {
139 case "nacl", "plan9", "windows":
140 t.Skipf("not supported on %s", runtime.GOOS)
143 for _, tt := range fileListenerTests {
144 if !testableNetwork(tt.network) {
145 t.Logf("skipping %s test", tt.network)
146 continue
149 ln1, err := newLocalListener(tt.network)
150 if err != nil {
151 t.Fatal(err)
153 switch tt.network {
154 case "unix", "unixpacket":
155 defer os.Remove(ln1.Addr().String())
157 addr := ln1.Addr()
159 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()
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)
174 if err != nil {
175 if perr := parseCommonError(err); perr != nil {
176 t.Error(perr)
178 t.Fatal(err)
181 ln2, err := FileListener(f)
182 if err := f.Close(); err != nil {
183 t.Error(err)
185 if err != nil {
186 if perr := parseCommonError(err); perr != nil {
187 t.Error(perr)
189 t.Fatal(err)
191 defer ln2.Close()
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)
202 t.Error(err)
203 return
205 c.Close()
207 c, err := ln2.Accept()
208 if err != nil {
209 if perr := parseAcceptError(err); perr != nil {
210 t.Error(perr)
212 t.Fatal(err)
214 c.Close()
215 wg.Wait()
216 if !reflect.DeepEqual(ln2.Addr(), addr) {
217 t.Fatalf("got %#v; want %#v", ln2.Addr(), addr)
222 var filePacketConnTests = []struct {
223 network string
225 {"udp"},
226 {"unixgram"},
229 func TestFilePacketConn(t *testing.T) {
230 switch runtime.GOOS {
231 case "nacl", "plan9", "windows":
232 t.Skipf("not supported on %s", runtime.GOOS)
235 for _, tt := range filePacketConnTests {
236 if !testableNetwork(tt.network) {
237 t.Logf("skipping %s test", tt.network)
238 continue
241 c1, err := newLocalPacketListener(tt.network)
242 if err != nil {
243 t.Fatal(err)
245 switch tt.network {
246 case "unixgram":
247 defer os.Remove(c1.LocalAddr().String())
249 addr := c1.LocalAddr()
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()
258 if err := c1.Close(); err != nil {
259 if perr := parseCloseError(err, false); perr != nil {
260 t.Error(perr)
262 t.Error(err)
264 if err != nil {
265 if perr := parseCommonError(err); perr != nil {
266 t.Error(perr)
268 t.Fatal(err)
271 c2, err := FilePacketConn(f)
272 if err := f.Close(); err != nil {
273 t.Error(err)
275 if err != nil {
276 if perr := parseCommonError(err); perr != nil {
277 t.Error(perr)
279 t.Fatal(err)
281 defer c2.Close()
283 if _, err := c2.WriteTo([]byte("FILEPACKETCONN TEST"), addr); err != nil {
284 if perr := parseWriteError(err); perr != nil {
285 t.Error(perr)
287 t.Fatal(err)
289 if !reflect.DeepEqual(c2.LocalAddr(), addr) {
290 t.Fatalf("got %#v; want %#v", c2.LocalAddr(), addr)