LEFT | RIGHT |
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 // This file implements API tests across platforms and will never have a build |
| 6 // tag. |
| 7 |
| 8 package net |
6 | 9 |
7 import ( | 10 import ( |
8 "io/ioutil" | |
9 "net" | |
10 "os" | 11 "os" |
11 "runtime" | 12 "runtime" |
12 "testing" | 13 "testing" |
13 "time" | 14 "time" |
14 ) | 15 ) |
15 | |
16 func testUnixAddr() string { | |
17 f, err := ioutil.TempFile("", "nettest") | |
18 if err != nil { | |
19 panic(err) | |
20 } | |
21 addr := f.Name() | |
22 f.Close() | |
23 os.Remove(addr) | |
24 return addr | |
25 } | |
26 | 16 |
27 var connTests = []struct { | 17 var connTests = []struct { |
28 net string | 18 net string |
29 addr string | 19 addr string |
30 }{ | 20 }{ |
31 {"tcp", "127.0.0.1:0"}, | 21 {"tcp", "127.0.0.1:0"}, |
32 {"unix", testUnixAddr()}, | 22 {"unix", testUnixAddr()}, |
33 {"unixpacket", testUnixAddr()}, | 23 {"unixpacket", testUnixAddr()}, |
34 } | 24 } |
35 | 25 |
36 func TestConnAndListener(t *testing.T) { | 26 func TestConnAndListener(t *testing.T) { |
37 for _, tt := range connTests { | 27 for _, tt := range connTests { |
38 switch tt.net { | 28 switch tt.net { |
39 case "unix", "unixpacket": | 29 case "unix", "unixpacket": |
40 switch runtime.GOOS { | 30 switch runtime.GOOS { |
41 case "plan9", "windows": | 31 case "plan9", "windows": |
42 continue | 32 continue |
43 } | 33 } |
44 if tt.net == "unixpacket" && runtime.GOOS != "linux" { | 34 if tt.net == "unixpacket" && runtime.GOOS != "linux" { |
45 continue | 35 continue |
46 } | 36 } |
47 } | 37 } |
48 | 38 |
49 » » ln, err := net.Listen(tt.net, tt.addr) | 39 » » ln, err := Listen(tt.net, tt.addr) |
50 if err != nil { | 40 if err != nil { |
51 » » » t.Fatalf("net.Listen failed: %v", err) | 41 » » » t.Fatalf("Listen failed: %v", err) |
52 } | 42 } |
53 » » ln.Addr() | 43 » » defer func(ln Listener, net, addr string) { |
54 » » defer func(ln net.Listener, net, addr string) { | |
55 ln.Close() | 44 ln.Close() |
56 switch net { | 45 switch net { |
57 case "unix", "unixpacket": | 46 case "unix", "unixpacket": |
58 os.Remove(addr) | 47 os.Remove(addr) |
59 } | 48 } |
60 }(ln, tt.net, tt.addr) | 49 }(ln, tt.net, tt.addr) |
| 50 ln.Addr() |
61 | 51 |
62 done := make(chan int) | 52 done := make(chan int) |
63 go transponder(t, ln, done) | 53 go transponder(t, ln, done) |
64 | 54 |
65 » » c, err := net.Dial(tt.net, ln.Addr().String()) | 55 » » c, err := Dial(tt.net, ln.Addr().String()) |
66 if err != nil { | 56 if err != nil { |
67 » » » t.Fatalf("net.Dial failed: %v", err) | 57 » » » t.Fatalf("Dial failed: %v", err) |
68 } | 58 } |
| 59 defer c.Close() |
69 c.LocalAddr() | 60 c.LocalAddr() |
70 c.RemoteAddr() | 61 c.RemoteAddr() |
71 c.SetDeadline(time.Now().Add(100 * time.Millisecond)) | 62 c.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
72 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) | 63 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) |
73 c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) | 64 c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) |
74 defer c.Close() | |
75 | 65 |
76 if _, err := c.Write([]byte("CONN TEST")); err != nil { | 66 if _, err := c.Write([]byte("CONN TEST")); err != nil { |
77 » » » t.Fatalf("net.Conn.Write failed: %v", err) | 67 » » » t.Fatalf("Conn.Write failed: %v", err) |
78 } | 68 } |
79 rb := make([]byte, 128) | 69 rb := make([]byte, 128) |
80 if _, err := c.Read(rb); err != nil { | 70 if _, err := c.Read(rb); err != nil { |
81 » » » t.Fatalf("net.Conn.Read failed: %v", err) | 71 » » » t.Fatalf("Conn.Read failed: %v", err) |
82 } | 72 } |
83 | 73 |
84 <-done | 74 <-done |
85 } | 75 } |
86 } | 76 } |
87 | 77 |
88 func transponder(t *testing.T, ln net.Listener, done chan<- int) { | 78 func transponder(t *testing.T, ln Listener, done chan<- int) { |
89 defer func() { done <- 1 }() | 79 defer func() { done <- 1 }() |
90 | 80 |
91 » switch ln.(type) { | 81 » switch ln := ln.(type) { |
92 » case *net.TCPListener: | 82 » case *TCPListener: |
93 » » ln.(*net.TCPListener).SetDeadline(time.Now().Add(100 * time.Mill
isecond)) | 83 » » ln.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
94 » case *net.UnixListener: | 84 » case *UnixListener: |
95 » » ln.(*net.UnixListener).SetDeadline(time.Now().Add(100 * time.Mil
lisecond)) | 85 » » ln.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
96 } | 86 } |
97 c, err := ln.Accept() | 87 c, err := ln.Accept() |
98 if err != nil { | 88 if err != nil { |
99 » » t.Fatalf("net.Listener.Accept failed: %v", err) | 89 » » t.Errorf("Listener.Accept failed: %v", err) |
| 90 » » return |
100 } | 91 } |
| 92 defer c.Close() |
101 c.LocalAddr() | 93 c.LocalAddr() |
102 c.RemoteAddr() | 94 c.RemoteAddr() |
103 c.SetDeadline(time.Now().Add(100 * time.Millisecond)) | 95 c.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
104 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) | 96 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) |
105 c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) | 97 c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) |
106 defer c.Close() | |
107 | 98 |
108 b := make([]byte, 128) | 99 b := make([]byte, 128) |
109 n, err := c.Read(b) | 100 n, err := c.Read(b) |
110 if err != nil { | 101 if err != nil { |
111 » » t.Fatalf("net.Conn.Read failed: %v", err) | 102 » » t.Errorf("Conn.Read failed: %v", err) |
| 103 » » return |
112 } | 104 } |
113 if _, err := c.Write(b[:n]); err != nil { | 105 if _, err := c.Write(b[:n]); err != nil { |
114 » » t.Fatalf("net.Conn.Write failed: %v", err) | 106 » » t.Errorf("Conn.Write failed: %v", err) |
| 107 » » return |
115 } | 108 } |
116 } | 109 } |
LEFT | RIGHT |