Revert r215321.
[official-gcc.git] / libgo / go / net / net_test.go
blobbfed4d657fdde064f741076c88f001d948620068
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.
5 package net
7 import (
8 "io"
9 "io/ioutil"
10 "os"
11 "runtime"
12 "testing"
13 "time"
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")
21 if err != nil {
22 if ln, err = Listen("tcp6", "[::1]:0"); err != nil {
23 t.Fatalf("ListenTCP on :0: %v", err)
27 go func() {
28 defer ln.Close()
29 c, err := ln.Accept()
30 if err != nil {
31 t.Errorf("Accept: %v", err)
32 return
34 var buf [10]byte
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)
38 return
40 c.Write([]byte("response"))
41 c.Close()
42 }()
44 c, err := Dial("tcp", ln.Addr().String())
45 if err != nil {
46 t.Fatalf("Dial: %v", err)
48 defer c.Close()
50 err = c.(*TCPConn).CloseWrite()
51 if err != nil {
52 t.Fatalf("CloseWrite: %v", err)
54 var buf [10]byte
55 n, err := c.Read(buf[:])
56 if err != nil {
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) {
66 switch runtime.GOOS {
67 case "nacl", "plan9", "windows":
68 t.Skipf("skipping test on %q", runtime.GOOS)
70 f, err := ioutil.TempFile("", "go_net_unixtest")
71 if err != nil {
72 t.Fatalf("TempFile: %s", err)
74 f.Close()
75 tmpname := f.Name()
76 os.Remove(tmpname)
77 ln, err := Listen("unix", tmpname)
78 if err != nil {
79 t.Fatalf("ListenUnix on %s: %s", tmpname, err)
81 defer func() {
82 ln.Close()
83 os.Remove(tmpname)
84 }()
86 go func() {
87 c, err := ln.Accept()
88 if err != nil {
89 t.Errorf("Accept: %v", err)
90 return
92 var buf [10]byte
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)
96 return
98 c.Write([]byte("response"))
99 c.Close()
102 c, err := Dial("unix", tmpname)
103 if err != nil {
104 t.Fatalf("Dial: %v", err)
106 defer c.Close()
108 err = c.(*UnixConn).CloseWrite()
109 if err != nil {
110 t.Fatalf("CloseWrite: %v", err)
112 var buf [10]byte
113 n, err := c.Read(buf[:])
114 if err != nil {
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")
125 if err != nil {
126 t.Fatalf("Listen failed: %v", err)
129 done := make(chan bool, 1)
130 go func() {
131 time.Sleep(100 * time.Millisecond)
132 ln.Close()
134 go func() {
135 c, err := ln.Accept()
136 if err == nil {
137 c.Close()
138 t.Error("Accept succeeded")
139 } else {
140 t.Logf("Accept timeout error: %s (any error is fine)", err)
142 done <- true
144 select {
145 case <-done:
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 {
153 case "plan9":
154 t.Skipf("skipping test on %q", runtime.GOOS)
156 ln, err := ListenPacket("udp", "127.0.0.1:0")
157 if err != nil {
158 t.Fatalf("Listen failed: %v", err)
161 buf := make([]byte, 1000)
162 done := make(chan bool, 1)
163 go func() {
164 time.Sleep(100 * time.Millisecond)
165 ln.Close()
167 go func() {
168 _, _, err = ln.ReadFrom(buf)
169 if err == nil {
170 t.Error("ReadFrom succeeded")
171 } else {
172 t.Logf("ReadFrom timeout error: %s (any error is fine)", err)
174 done <- true
176 select {
177 case <-done:
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 {
185 case "plan9":
186 t.Skipf("skipping test on %q", runtime.GOOS)
188 l, err := Listen("tcp", "127.0.0.1:0")
189 if err != nil {
190 t.Fatal(err)
192 defer l.Close()
194 read := func(r io.Reader) error {
195 var m [1]byte
196 _, err := r.Read(m[:])
197 return err
200 go func() {
201 c, err := Dial("tcp", l.Addr().String())
202 if err != nil {
203 t.Errorf("Dial: %v", err)
204 return
207 go read(c)
209 time.Sleep(10 * time.Millisecond)
210 c.Close()
213 c, err := l.Accept()
214 if err != nil {
215 t.Fatal(err)
217 defer c.Close()
219 for err == nil {
220 err = read(c)
222 if err != nil && err != io.EOF {
223 t.Fatal(err)
227 func TestErrorNil(t *testing.T) {
228 c, err := Dial("tcp", "127.0.0.1:65535")
229 if err == nil {
230 t.Fatal("Dial 127.0.0.1:65535 succeeded")
232 if c != nil {
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")
238 if err != nil {
239 t.Fatalf("Listen 127.0.0.1:0: %v", err)
241 defer l.Close()
242 l1, err := Listen("tcp", l.Addr().String())
243 if err == nil {
244 t.Fatalf("second Listen %v: %v", l.Addr(), err)
246 if l1 != nil {
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")
252 if err != nil {
253 t.Fatalf("Listen 127.0.0.1:0: %v", err)
255 defer lp.Close()
256 lp1, err := ListenPacket("udp", lp.LocalAddr().String())
257 if err == nil {
258 t.Fatalf("second Listen %v: %v", lp.LocalAddr(), err)
260 if lp1 != nil {
261 t.Fatalf("ListenPacket returned non-nil interface %T(%v) with err != nil", lp1, lp1)