github.com/hongwozai/go-src-1.4.3@v0.0.0-20191127132709-dc3fce3dbccb/src/net/protoconn_test.go (about) 1 // Copyright 2012 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. 4 5 // This file implements API tests across platforms and will never have a build 6 // tag. 7 8 package net 9 10 import ( 11 "io/ioutil" 12 "os" 13 "runtime" 14 "testing" 15 "time" 16 ) 17 18 // testUnixAddr uses ioutil.TempFile to get a name that is unique. It 19 // also uses /tmp directory in case it is prohibited to create UNIX 20 // sockets in TMPDIR. 21 func testUnixAddr() string { 22 f, err := ioutil.TempFile("", "nettest") 23 if err != nil { 24 panic(err) 25 } 26 addr := f.Name() 27 f.Close() 28 os.Remove(addr) 29 return addr 30 } 31 32 var condFatalf = func() func(*testing.T, string, ...interface{}) { 33 // A few APIs are not implemented yet on both Plan 9 and Windows. 34 switch runtime.GOOS { 35 case "plan9", "windows": 36 return (*testing.T).Logf 37 } 38 return (*testing.T).Fatalf 39 }() 40 41 func TestTCPListenerSpecificMethods(t *testing.T) { 42 switch runtime.GOOS { 43 case "plan9": 44 t.Skipf("skipping test on %q", runtime.GOOS) 45 } 46 47 la, err := ResolveTCPAddr("tcp4", "127.0.0.1:0") 48 if err != nil { 49 t.Fatalf("ResolveTCPAddr failed: %v", err) 50 } 51 ln, err := ListenTCP("tcp4", la) 52 if err != nil { 53 t.Fatalf("ListenTCP failed: %v", err) 54 } 55 defer ln.Close() 56 ln.Addr() 57 ln.SetDeadline(time.Now().Add(30 * time.Nanosecond)) 58 59 if c, err := ln.Accept(); err != nil { 60 if !err.(Error).Timeout() { 61 t.Fatalf("TCPListener.Accept failed: %v", err) 62 } 63 } else { 64 c.Close() 65 } 66 if c, err := ln.AcceptTCP(); err != nil { 67 if !err.(Error).Timeout() { 68 t.Fatalf("TCPListener.AcceptTCP failed: %v", err) 69 } 70 } else { 71 c.Close() 72 } 73 74 if f, err := ln.File(); err != nil { 75 condFatalf(t, "TCPListener.File failed: %v", err) 76 } else { 77 f.Close() 78 } 79 } 80 81 func TestTCPConnSpecificMethods(t *testing.T) { 82 la, err := ResolveTCPAddr("tcp4", "127.0.0.1:0") 83 if err != nil { 84 t.Fatalf("ResolveTCPAddr failed: %v", err) 85 } 86 ln, err := ListenTCP("tcp4", la) 87 if err != nil { 88 t.Fatalf("ListenTCP failed: %v", err) 89 } 90 defer ln.Close() 91 ln.Addr() 92 93 done := make(chan int) 94 go transponder(t, ln, done) 95 96 ra, err := ResolveTCPAddr("tcp4", ln.Addr().String()) 97 if err != nil { 98 t.Fatalf("ResolveTCPAddr failed: %v", err) 99 } 100 c, err := DialTCP("tcp4", nil, ra) 101 if err != nil { 102 t.Fatalf("DialTCP failed: %v", err) 103 } 104 defer c.Close() 105 c.SetKeepAlive(false) 106 c.SetKeepAlivePeriod(3 * time.Second) 107 c.SetLinger(0) 108 c.SetNoDelay(false) 109 c.LocalAddr() 110 c.RemoteAddr() 111 c.SetDeadline(time.Now().Add(someTimeout)) 112 c.SetReadDeadline(time.Now().Add(someTimeout)) 113 c.SetWriteDeadline(time.Now().Add(someTimeout)) 114 115 if _, err := c.Write([]byte("TCPCONN TEST")); err != nil { 116 t.Fatalf("TCPConn.Write failed: %v", err) 117 } 118 rb := make([]byte, 128) 119 if _, err := c.Read(rb); err != nil { 120 t.Fatalf("TCPConn.Read failed: %v", err) 121 } 122 123 <-done 124 } 125 126 func TestUDPConnSpecificMethods(t *testing.T) { 127 la, err := ResolveUDPAddr("udp4", "127.0.0.1:0") 128 if err != nil { 129 t.Fatalf("ResolveUDPAddr failed: %v", err) 130 } 131 c, err := ListenUDP("udp4", la) 132 if err != nil { 133 t.Fatalf("ListenUDP failed: %v", err) 134 } 135 defer c.Close() 136 c.LocalAddr() 137 c.RemoteAddr() 138 c.SetDeadline(time.Now().Add(someTimeout)) 139 c.SetReadDeadline(time.Now().Add(someTimeout)) 140 c.SetWriteDeadline(time.Now().Add(someTimeout)) 141 c.SetReadBuffer(2048) 142 c.SetWriteBuffer(2048) 143 144 wb := []byte("UDPCONN TEST") 145 rb := make([]byte, 128) 146 if _, err := c.WriteToUDP(wb, c.LocalAddr().(*UDPAddr)); err != nil { 147 t.Fatalf("UDPConn.WriteToUDP failed: %v", err) 148 } 149 if _, _, err := c.ReadFromUDP(rb); err != nil { 150 t.Fatalf("UDPConn.ReadFromUDP failed: %v", err) 151 } 152 if _, _, err := c.WriteMsgUDP(wb, nil, c.LocalAddr().(*UDPAddr)); err != nil { 153 condFatalf(t, "UDPConn.WriteMsgUDP failed: %v", err) 154 } 155 if _, _, _, _, err := c.ReadMsgUDP(rb, nil); err != nil { 156 condFatalf(t, "UDPConn.ReadMsgUDP failed: %v", err) 157 } 158 159 if f, err := c.File(); err != nil { 160 condFatalf(t, "UDPConn.File failed: %v", err) 161 } else { 162 f.Close() 163 } 164 165 defer func() { 166 if p := recover(); p != nil { 167 t.Fatalf("UDPConn.WriteToUDP or WriteMsgUDP panicked: %v", p) 168 } 169 }() 170 171 c.WriteToUDP(wb, nil) 172 c.WriteMsgUDP(wb, nil, nil) 173 } 174 175 func TestIPConnSpecificMethods(t *testing.T) { 176 if skip, skipmsg := skipRawSocketTest(t); skip { 177 t.Skip(skipmsg) 178 } 179 180 la, err := ResolveIPAddr("ip4", "127.0.0.1") 181 if err != nil { 182 t.Fatalf("ResolveIPAddr failed: %v", err) 183 } 184 c, err := ListenIP("ip4:icmp", la) 185 if err != nil { 186 t.Fatalf("ListenIP failed: %v", err) 187 } 188 defer c.Close() 189 c.LocalAddr() 190 c.RemoteAddr() 191 c.SetDeadline(time.Now().Add(someTimeout)) 192 c.SetReadDeadline(time.Now().Add(someTimeout)) 193 c.SetWriteDeadline(time.Now().Add(someTimeout)) 194 c.SetReadBuffer(2048) 195 c.SetWriteBuffer(2048) 196 197 wb, err := (&icmpMessage{ 198 Type: icmpv4EchoRequest, Code: 0, 199 Body: &icmpEcho{ 200 ID: os.Getpid() & 0xffff, Seq: 1, 201 Data: []byte("IPCONN TEST "), 202 }, 203 }).Marshal() 204 if err != nil { 205 t.Fatalf("icmpMessage.Marshal failed: %v", err) 206 } 207 rb := make([]byte, 20+len(wb)) 208 if _, err := c.WriteToIP(wb, c.LocalAddr().(*IPAddr)); err != nil { 209 t.Fatalf("IPConn.WriteToIP failed: %v", err) 210 } 211 if _, _, err := c.ReadFromIP(rb); err != nil { 212 t.Fatalf("IPConn.ReadFromIP failed: %v", err) 213 } 214 if _, _, err := c.WriteMsgIP(wb, nil, c.LocalAddr().(*IPAddr)); err != nil { 215 condFatalf(t, "IPConn.WriteMsgIP failed: %v", err) 216 } 217 if _, _, _, _, err := c.ReadMsgIP(rb, nil); err != nil { 218 condFatalf(t, "IPConn.ReadMsgIP failed: %v", err) 219 } 220 221 if f, err := c.File(); err != nil { 222 condFatalf(t, "IPConn.File failed: %v", err) 223 } else { 224 f.Close() 225 } 226 227 defer func() { 228 if p := recover(); p != nil { 229 t.Fatalf("IPConn.WriteToIP or WriteMsgIP panicked: %v", p) 230 } 231 }() 232 233 c.WriteToIP(wb, nil) 234 c.WriteMsgIP(wb, nil, nil) 235 } 236 237 func TestUnixListenerSpecificMethods(t *testing.T) { 238 switch runtime.GOOS { 239 case "nacl", "plan9", "windows": 240 t.Skipf("skipping test on %q", runtime.GOOS) 241 } 242 243 addr := testUnixAddr() 244 la, err := ResolveUnixAddr("unix", addr) 245 if err != nil { 246 t.Fatalf("ResolveUnixAddr failed: %v", err) 247 } 248 ln, err := ListenUnix("unix", la) 249 if err != nil { 250 t.Fatalf("ListenUnix failed: %v", err) 251 } 252 defer ln.Close() 253 defer os.Remove(addr) 254 ln.Addr() 255 ln.SetDeadline(time.Now().Add(30 * time.Nanosecond)) 256 257 if c, err := ln.Accept(); err != nil { 258 if !err.(Error).Timeout() { 259 t.Fatalf("UnixListener.Accept failed: %v", err) 260 } 261 } else { 262 c.Close() 263 } 264 if c, err := ln.AcceptUnix(); err != nil { 265 if !err.(Error).Timeout() { 266 t.Fatalf("UnixListener.AcceptUnix failed: %v", err) 267 } 268 } else { 269 c.Close() 270 } 271 272 if f, err := ln.File(); err != nil { 273 t.Fatalf("UnixListener.File failed: %v", err) 274 } else { 275 f.Close() 276 } 277 } 278 279 func TestUnixConnSpecificMethods(t *testing.T) { 280 switch runtime.GOOS { 281 case "nacl", "plan9", "windows": 282 t.Skipf("skipping test on %q", runtime.GOOS) 283 } 284 285 addr1, addr2, addr3 := testUnixAddr(), testUnixAddr(), testUnixAddr() 286 287 a1, err := ResolveUnixAddr("unixgram", addr1) 288 if err != nil { 289 t.Fatalf("ResolveUnixAddr failed: %v", err) 290 } 291 c1, err := DialUnix("unixgram", a1, nil) 292 if err != nil { 293 t.Fatalf("DialUnix failed: %v", err) 294 } 295 defer c1.Close() 296 defer os.Remove(addr1) 297 c1.LocalAddr() 298 c1.RemoteAddr() 299 c1.SetDeadline(time.Now().Add(someTimeout)) 300 c1.SetReadDeadline(time.Now().Add(someTimeout)) 301 c1.SetWriteDeadline(time.Now().Add(someTimeout)) 302 c1.SetReadBuffer(2048) 303 c1.SetWriteBuffer(2048) 304 305 a2, err := ResolveUnixAddr("unixgram", addr2) 306 if err != nil { 307 t.Fatalf("ResolveUnixAddr failed: %v", err) 308 } 309 c2, err := DialUnix("unixgram", a2, nil) 310 if err != nil { 311 t.Fatalf("DialUnix failed: %v", err) 312 } 313 defer c2.Close() 314 defer os.Remove(addr2) 315 c2.LocalAddr() 316 c2.RemoteAddr() 317 c2.SetDeadline(time.Now().Add(someTimeout)) 318 c2.SetReadDeadline(time.Now().Add(someTimeout)) 319 c2.SetWriteDeadline(time.Now().Add(someTimeout)) 320 c2.SetReadBuffer(2048) 321 c2.SetWriteBuffer(2048) 322 323 a3, err := ResolveUnixAddr("unixgram", addr3) 324 if err != nil { 325 t.Fatalf("ResolveUnixAddr failed: %v", err) 326 } 327 c3, err := ListenUnixgram("unixgram", a3) 328 if err != nil { 329 t.Fatalf("ListenUnixgram failed: %v", err) 330 } 331 defer c3.Close() 332 defer os.Remove(addr3) 333 c3.LocalAddr() 334 c3.RemoteAddr() 335 c3.SetDeadline(time.Now().Add(someTimeout)) 336 c3.SetReadDeadline(time.Now().Add(someTimeout)) 337 c3.SetWriteDeadline(time.Now().Add(someTimeout)) 338 c3.SetReadBuffer(2048) 339 c3.SetWriteBuffer(2048) 340 341 wb := []byte("UNIXCONN TEST") 342 rb1 := make([]byte, 128) 343 rb2 := make([]byte, 128) 344 rb3 := make([]byte, 128) 345 if _, _, err := c1.WriteMsgUnix(wb, nil, a2); err != nil { 346 t.Fatalf("UnixConn.WriteMsgUnix failed: %v", err) 347 } 348 if _, _, _, _, err := c2.ReadMsgUnix(rb2, nil); err != nil { 349 t.Fatalf("UnixConn.ReadMsgUnix failed: %v", err) 350 } 351 if _, err := c2.WriteToUnix(wb, a1); err != nil { 352 t.Fatalf("UnixConn.WriteToUnix failed: %v", err) 353 } 354 if _, _, err := c1.ReadFromUnix(rb1); err != nil { 355 t.Fatalf("UnixConn.ReadFromUnix failed: %v", err) 356 } 357 if _, err := c3.WriteToUnix(wb, a1); err != nil { 358 t.Fatalf("UnixConn.WriteToUnix failed: %v", err) 359 } 360 if _, _, err := c1.ReadFromUnix(rb1); err != nil { 361 t.Fatalf("UnixConn.ReadFromUnix failed: %v", err) 362 } 363 if _, err := c2.WriteToUnix(wb, a3); err != nil { 364 t.Fatalf("UnixConn.WriteToUnix failed: %v", err) 365 } 366 if _, _, err := c3.ReadFromUnix(rb3); err != nil { 367 t.Fatalf("UnixConn.ReadFromUnix failed: %v", err) 368 } 369 370 if f, err := c1.File(); err != nil { 371 t.Fatalf("UnixConn.File failed: %v", err) 372 } else { 373 f.Close() 374 } 375 376 defer func() { 377 if p := recover(); p != nil { 378 t.Fatalf("UnixConn.WriteToUnix or WriteMsgUnix panicked: %v", p) 379 } 380 }() 381 382 c1.WriteToUnix(wb, nil) 383 c1.WriteMsgUnix(wb, nil, nil) 384 c3.WriteToUnix(wb, nil) 385 c3.WriteMsgUnix(wb, nil, nil) 386 }