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
.Errorf("Accept: %v", err
)
35 n
, err
:= c
.Read(buf
[:])
36 if n
!= 0 || err
!= io
.EOF
{
37 t
.Errorf("server Read = %d, %v; want 0, io.EOF", n
, err
)
40 c
.Write([]byte("response"))
44 c
, err
:= Dial("tcp", ln
.Addr().String())
46 t
.Fatalf("Dial: %v", err
)
50 err
= c
.(*TCPConn
).CloseWrite()
52 t
.Fatalf("CloseWrite: %v", err
)
55 n
, err
:= c
.Read(buf
[:])
57 t
.Fatalf("client Read: %d, %v", n
, err
)
59 got
:= string(buf
[:n
])
60 if got
!= "response" {
61 t
.Errorf("read = %q, want \"response\"", got
)
65 func TestShutdownUnix(t
*testing
.T
) {
67 case "nacl", "plan9", "windows":
68 t
.Skipf("skipping test on %q", runtime
.GOOS
)
70 f
, err
:= ioutil
.TempFile("", "go_net_unixtest")
72 t
.Fatalf("TempFile: %s", err
)
77 ln
, err
:= Listen("unix", tmpname
)
79 t
.Fatalf("ListenUnix on %s: %s", tmpname
, err
)
89 t
.Errorf("Accept: %v", err
)
93 n
, err
:= c
.Read(buf
[:])
94 if n
!= 0 || err
!= io
.EOF
{
95 t
.Errorf("server Read = %d, %v; want 0, io.EOF", n
, err
)
98 c
.Write([]byte("response"))
102 c
, err
:= Dial("unix", tmpname
)
104 t
.Fatalf("Dial: %v", err
)
108 err
= c
.(*UnixConn
).CloseWrite()
110 t
.Fatalf("CloseWrite: %v", err
)
113 n
, err
:= c
.Read(buf
[:])
115 t
.Fatalf("client Read: %d, %v", n
, err
)
117 got
:= string(buf
[:n
])
118 if got
!= "response" {
119 t
.Errorf("read = %q, want \"response\"", got
)
123 func TestTCPListenClose(t
*testing
.T
) {
124 ln
, err
:= Listen("tcp", "127.0.0.1:0")
126 t
.Fatalf("Listen failed: %v", err
)
129 done
:= make(chan bool, 1)
131 time
.Sleep(100 * time
.Millisecond
)
135 c
, err
:= ln
.Accept()
138 t
.Error("Accept succeeded")
140 t
.Logf("Accept timeout error: %s (any error is fine)", err
)
146 case <-time
.After(2 * time
.Second
):
147 t
.Fatal("timeout waiting for TCP close")
151 func TestUDPListenClose(t
*testing
.T
) {
152 switch runtime
.GOOS
{
154 t
.Skipf("skipping test on %q", runtime
.GOOS
)
156 ln
, err
:= ListenPacket("udp", "127.0.0.1:0")
158 t
.Fatalf("Listen failed: %v", err
)
161 buf
:= make([]byte, 1000)
162 done
:= make(chan bool, 1)
164 time
.Sleep(100 * time
.Millisecond
)
168 _
, _
, err
= ln
.ReadFrom(buf
)
170 t
.Error("ReadFrom succeeded")
172 t
.Logf("ReadFrom timeout error: %s (any error is fine)", err
)
178 case <-time
.After(2 * time
.Second
):
179 t
.Fatal("timeout waiting for UDP close")
183 func TestTCPClose(t
*testing
.T
) {
184 switch runtime
.GOOS
{
186 t
.Skipf("skipping test on %q", runtime
.GOOS
)
188 l
, err
:= Listen("tcp", "127.0.0.1:0")
194 read
:= func(r io
.Reader
) error
{
196 _
, err
:= r
.Read(m
[:])
201 c
, err
:= Dial("tcp", l
.Addr().String())
203 t
.Errorf("Dial: %v", err
)
209 time
.Sleep(10 * time
.Millisecond
)
222 if err
!= nil && err
!= io
.EOF
{
227 func TestErrorNil(t
*testing
.T
) {
228 c
, err
:= Dial("tcp", "127.0.0.1:65535")
230 t
.Fatal("Dial 127.0.0.1:65535 succeeded")
233 t
.Fatalf("Dial returned non-nil interface %T(%v) with err != nil", c
, c
)
236 // Make Listen fail by relistening on the same address.
237 l
, err
:= Listen("tcp", "127.0.0.1:0")
239 t
.Fatalf("Listen 127.0.0.1:0: %v", err
)
242 l1
, err
:= Listen("tcp", l
.Addr().String())
244 t
.Fatalf("second Listen %v: %v", l
.Addr(), err
)
247 t
.Fatalf("Listen returned non-nil interface %T(%v) with err != nil", l1
, l1
)
250 // Make ListenPacket fail by relistening on the same address.
251 lp
, err
:= ListenPacket("udp", "127.0.0.1:0")
253 t
.Fatalf("Listen 127.0.0.1:0: %v", err
)
256 lp1
, err
:= ListenPacket("udp", lp
.LocalAddr().String())
258 t
.Fatalf("second Listen %v: %v", lp
.LocalAddr(), err
)
261 t
.Fatalf("ListenPacket returned non-nil interface %T(%v) with err != nil", lp1
, lp1
)