OLD | NEW |
1 // Copyright 2012 The Go Authors. All rights reserved. | 1 // Copyright 2012 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 package net_test | 5 package net_test |
6 | 6 |
7 import ( | 7 import ( |
8 "net" | 8 "net" |
9 "os" | 9 "os" |
10 "runtime" | 10 "runtime" |
11 "testing" | 11 "testing" |
12 "time" | 12 "time" |
13 ) | 13 ) |
14 | 14 |
15 var connTests = []struct { | 15 var connTests = []struct { |
16 net string | 16 net string |
17 addr string | 17 addr string |
18 }{ | 18 }{ |
19 {"tcp", "127.0.0.1:0"}, | 19 {"tcp", "127.0.0.1:0"}, |
20 » {"unix", "/tmp/gotest.net"}, | 20 » {"unix", "/tmp/gotest.net1"}, |
21 » {"unixpacket", "/tmp/gotest.net"}, | 21 » {"unixpacket", "/tmp/gotest.net2"}, |
22 } | 22 } |
23 | 23 |
24 func TestConnAndListener(t *testing.T) { | 24 func TestConnAndListener(t *testing.T) { |
25 for _, tt := range connTests { | 25 for _, tt := range connTests { |
26 switch tt.net { | 26 switch tt.net { |
27 case "unix", "unixpacket": | 27 case "unix", "unixpacket": |
28 switch runtime.GOOS { | 28 switch runtime.GOOS { |
29 case "plan9", "windows": | 29 case "plan9", "windows": |
30 continue | 30 continue |
31 } | 31 } |
32 if tt.net == "unixpacket" && runtime.GOOS != "linux" { | 32 if tt.net == "unixpacket" && runtime.GOOS != "linux" { |
33 continue | 33 continue |
34 } | 34 } |
35 os.Remove(tt.addr) | 35 os.Remove(tt.addr) |
36 } | 36 } |
37 | 37 |
38 ln, err := net.Listen(tt.net, tt.addr) | 38 ln, err := net.Listen(tt.net, tt.addr) |
39 if err != nil { | 39 if err != nil { |
40 t.Errorf("net.Listen failed: %v", err) | 40 t.Errorf("net.Listen failed: %v", err) |
41 return | 41 return |
42 } | 42 } |
43 ln.Addr() | 43 ln.Addr() |
44 » » defer ln.Close() | 44 » » defer func(ln net.Listener, net, addr string) { |
| 45 » » » ln.Close() |
| 46 » » » switch net { |
| 47 » » » case "unix", "unixpacket": |
| 48 » » » » os.Remove(addr) |
| 49 » » » } |
| 50 » » }(ln, tt.net, tt.addr) |
45 | 51 |
46 done := make(chan int) | 52 done := make(chan int) |
47 go transponder(t, ln, done) | 53 go transponder(t, ln, done) |
48 | 54 |
49 c, err := net.Dial(tt.net, ln.Addr().String()) | 55 c, err := net.Dial(tt.net, ln.Addr().String()) |
50 if err != nil { | 56 if err != nil { |
51 t.Errorf("net.Dial failed: %v", err) | 57 t.Errorf("net.Dial failed: %v", err) |
52 return | 58 return |
53 } | 59 } |
54 c.LocalAddr() | 60 c.LocalAddr() |
55 c.RemoteAddr() | 61 c.RemoteAddr() |
56 c.SetDeadline(time.Now().Add(100 * time.Millisecond)) | 62 c.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
57 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) | 63 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) |
58 c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) | 64 c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) |
59 defer c.Close() | 65 defer c.Close() |
60 | 66 |
61 if _, err := c.Write([]byte("CONN TEST")); err != nil { | 67 if _, err := c.Write([]byte("CONN TEST")); err != nil { |
62 t.Errorf("net.Conn.Write failed: %v", err) | 68 t.Errorf("net.Conn.Write failed: %v", err) |
63 return | 69 return |
64 } | 70 } |
65 rb := make([]byte, 128) | 71 rb := make([]byte, 128) |
66 if _, err := c.Read(rb); err != nil { | 72 if _, err := c.Read(rb); err != nil { |
67 t.Errorf("net.Conn.Read failed: %v", err) | 73 t.Errorf("net.Conn.Read failed: %v", err) |
68 } | 74 } |
69 | 75 |
70 <-done | 76 <-done |
71 switch tt.net { | |
72 case "unix", "unixpacket": | |
73 os.Remove(tt.addr) | |
74 } | |
75 } | 77 } |
76 } | 78 } |
77 | 79 |
78 func transponder(t *testing.T, ln net.Listener, done chan<- int) { | 80 func transponder(t *testing.T, ln net.Listener, done chan<- int) { |
79 defer func() { done <- 1 }() | 81 defer func() { done <- 1 }() |
80 | 82 |
81 c, err := ln.Accept() | 83 c, err := ln.Accept() |
82 if err != nil { | 84 if err != nil { |
83 t.Errorf("net.Listener.Accept failed: %v", err) | 85 t.Errorf("net.Listener.Accept failed: %v", err) |
84 return | 86 return |
85 } | 87 } |
86 c.LocalAddr() | 88 c.LocalAddr() |
87 c.RemoteAddr() | 89 c.RemoteAddr() |
88 c.SetDeadline(time.Now().Add(100 * time.Millisecond)) | 90 c.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
89 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) | 91 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) |
90 c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) | 92 c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) |
91 defer c.Close() | 93 defer c.Close() |
92 | 94 |
93 b := make([]byte, 128) | 95 b := make([]byte, 128) |
94 n, err := c.Read(b) | 96 n, err := c.Read(b) |
95 if err != nil { | 97 if err != nil { |
96 t.Errorf("net.Conn.Read failed: %v", err) | 98 t.Errorf("net.Conn.Read failed: %v", err) |
97 return | 99 return |
98 } | 100 } |
99 if _, err := c.Write(b[:n]); err != nil { | 101 if _, err := c.Write(b[:n]); err != nil { |
100 t.Errorf("net.Conn.Write failed: %v", err) | 102 t.Errorf("net.Conn.Write failed: %v", err) |
101 return | 103 return |
102 } | 104 } |
103 } | 105 } |
OLD | NEW |