1 // Copyright 2009 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.
16 func TestShutdown(t
*testing
.T
) {
17 if runtime
.GOOS
== "plan9" {
18 t
.Skipf("skipping test on %q", runtime
.GOOS
)
20 ln
, err
:= Listen("tcp", "127.0.0.1:0")
22 if ln
, err
= Listen("tcp6", "[::1]:0"); err
!= nil {
23 t
.Fatalf("ListenTCP on :0: %v", err
)
31 t
.Fatalf("Accept: %v", err
)
34 n
, err
:= c
.Read(buf
[:])
35 if n
!= 0 || err
!= io
.EOF
{
36 t
.Fatalf("server Read = %d, %v; want 0, io.EOF", n
, err
)
38 c
.Write([]byte("response"))
42 c
, err
:= Dial("tcp", ln
.Addr().String())
44 t
.Fatalf("Dial: %v", err
)
48 err
= c
.(*TCPConn
).CloseWrite()
50 t
.Fatalf("CloseWrite: %v", err
)
53 n
, err
:= c
.Read(buf
[:])
55 t
.Fatalf("client Read: %d, %v", n
, err
)
57 got
:= string(buf
[:n
])
58 if got
!= "response" {
59 t
.Errorf("read = %q, want \"response\"", got
)
63 func TestShutdownUnix(t
*testing
.T
) {
65 case "windows", "plan9":
66 t
.Skipf("skipping test on %q", runtime
.GOOS
)
68 f
, err
:= ioutil
.TempFile("", "go_net_unixtest")
70 t
.Fatalf("TempFile: %s", err
)
75 ln
, err
:= Listen("unix", tmpname
)
77 t
.Fatalf("ListenUnix on %s: %s", tmpname
, err
)
87 t
.Fatalf("Accept: %v", err
)
90 n
, err
:= c
.Read(buf
[:])
91 if n
!= 0 || err
!= io
.EOF
{
92 t
.Fatalf("server Read = %d, %v; want 0, io.EOF", n
, err
)
94 c
.Write([]byte("response"))
98 c
, err
:= Dial("unix", tmpname
)
100 t
.Fatalf("Dial: %v", err
)
104 err
= c
.(*UnixConn
).CloseWrite()
106 t
.Fatalf("CloseWrite: %v", err
)
109 n
, err
:= c
.Read(buf
[:])
111 t
.Fatalf("client Read: %d, %v", n
, err
)
113 got
:= string(buf
[:n
])
114 if got
!= "response" {
115 t
.Errorf("read = %q, want \"response\"", got
)
119 func TestTCPListenClose(t
*testing
.T
) {
120 ln
, err
:= Listen("tcp", "127.0.0.1:0")
122 t
.Fatalf("Listen failed: %v", err
)
125 done
:= make(chan bool, 1)
127 time
.Sleep(100 * time
.Millisecond
)
131 c
, err
:= ln
.Accept()
134 t
.Error("Accept succeeded")
136 t
.Logf("Accept timeout error: %s (any error is fine)", err
)
142 case <-time
.After(2 * time
.Second
):
143 t
.Fatal("timeout waiting for TCP close")
147 func TestUDPListenClose(t
*testing
.T
) {
148 switch runtime
.GOOS
{
150 t
.Skipf("skipping test on %q", runtime
.GOOS
)
152 ln
, err
:= ListenPacket("udp", "127.0.0.1:0")
154 t
.Fatalf("Listen failed: %v", err
)
157 buf
:= make([]byte, 1000)
158 done
:= make(chan bool, 1)
160 time
.Sleep(100 * time
.Millisecond
)
164 _
, _
, err
= ln
.ReadFrom(buf
)
166 t
.Error("ReadFrom succeeded")
168 t
.Logf("ReadFrom timeout error: %s (any error is fine)", err
)
174 case <-time
.After(2 * time
.Second
):
175 t
.Fatal("timeout waiting for UDP close")
179 func TestTCPClose(t
*testing
.T
) {
180 switch runtime
.GOOS
{
182 t
.Skipf("skipping test on %q", runtime
.GOOS
)
184 l
, err
:= Listen("tcp", "127.0.0.1:0")
190 read
:= func(r io
.Reader
) error
{
192 _
, err
:= r
.Read(m
[:])
197 c
, err
:= Dial("tcp", l
.Addr().String())
204 time
.Sleep(10 * time
.Millisecond
)
217 if err
!= nil && err
!= io
.EOF
{
222 func TestErrorNil(t
*testing
.T
) {
223 c
, err
:= Dial("tcp", "127.0.0.1:65535")
225 t
.Fatal("Dial 127.0.0.1:65535 succeeded")
228 t
.Fatalf("Dial returned non-nil interface %T(%v) with err != nil", c
, c
)
231 // Make Listen fail by relistening on the same address.
232 l
, err
:= Listen("tcp", "127.0.0.1:0")
234 t
.Fatalf("Listen 127.0.0.1:0: %v", err
)
237 l1
, err
:= Listen("tcp", l
.Addr().String())
239 t
.Fatalf("second Listen %v: %v", l
.Addr(), err
)
242 t
.Fatalf("Listen returned non-nil interface %T(%v) with err != nil", l1
, l1
)
245 // Make ListenPacket fail by relistening on the same address.
246 lp
, err
:= ListenPacket("udp", "127.0.0.1:0")
248 t
.Fatalf("Listen 127.0.0.1:0: %v", err
)
251 lp1
, err
:= ListenPacket("udp", lp
.LocalAddr().String())
253 t
.Fatalf("second Listen %v: %v", lp
.LocalAddr(), err
)
256 t
.Fatalf("ListenPacket returned non-nil interface %T(%v) with err != nil", lp1
, lp1
)