github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/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 //go:build !js 9 // +build !js 10 11 package net 12 13 import ( 14 "os" 15 "runtime" 16 "testing" 17 "time" 18 ) 19 20 // The full stack test cases for IPConn have been moved to the 21 // following: 22 // golang.org/x/net/ipv4 23 // golang.org/x/net/ipv6 24 // golang.org/x/net/icmp 25 26 func TestTCPListenerSpecificMethods(t *testing.T) { 27 switch runtime.GOOS { 28 case "plan9": 29 t.Skipf("not supported on %s", runtime.GOOS) 30 } 31 32 la, err := ResolveTCPAddr("tcp4", "127.0.0.1:0") 33 if err != nil { 34 t.Fatal(err) 35 } 36 ln, err := ListenTCP("tcp4", la) 37 if err != nil { 38 t.Fatal(err) 39 } 40 defer ln.Close() 41 ln.Addr() 42 ln.SetDeadline(time.Now().Add(30 * time.Nanosecond)) 43 44 if c, err := ln.Accept(); err != nil { 45 if !err.(Error).Timeout() { 46 t.Fatal(err) 47 } 48 } else { 49 c.Close() 50 } 51 if c, err := ln.AcceptTCP(); err != nil { 52 if !err.(Error).Timeout() { 53 t.Fatal(err) 54 } 55 } else { 56 c.Close() 57 } 58 59 if f, err := ln.File(); err != nil { 60 condFatalf(t, "file+net", "%v", err) 61 } else { 62 f.Close() 63 } 64 } 65 66 func TestTCPConnSpecificMethods(t *testing.T) { 67 la, err := ResolveTCPAddr("tcp4", "127.0.0.1:0") 68 if err != nil { 69 t.Fatal(err) 70 } 71 ln, err := ListenTCP("tcp4", la) 72 if err != nil { 73 t.Fatal(err) 74 } 75 ch := make(chan error, 1) 76 handler := func(ls *localServer, ln Listener) { ls.transponder(ls.Listener, ch) } 77 ls, err := (&streamListener{Listener: ln}).newLocalServer() 78 if err != nil { 79 t.Fatal(err) 80 } 81 defer ls.teardown() 82 if err := ls.buildup(handler); err != nil { 83 t.Fatal(err) 84 } 85 86 ra, err := ResolveTCPAddr("tcp4", ls.Listener.Addr().String()) 87 if err != nil { 88 t.Fatal(err) 89 } 90 c, err := DialTCP("tcp4", nil, ra) 91 if err != nil { 92 t.Fatal(err) 93 } 94 defer c.Close() 95 c.SetKeepAlive(false) 96 c.SetKeepAlivePeriod(3 * time.Second) 97 c.SetLinger(0) 98 c.SetNoDelay(false) 99 c.LocalAddr() 100 c.RemoteAddr() 101 c.SetDeadline(time.Now().Add(someTimeout)) 102 c.SetReadDeadline(time.Now().Add(someTimeout)) 103 c.SetWriteDeadline(time.Now().Add(someTimeout)) 104 105 if _, err := c.Write([]byte("TCPCONN TEST")); err != nil { 106 t.Fatal(err) 107 } 108 rb := make([]byte, 128) 109 if _, err := c.Read(rb); err != nil { 110 t.Fatal(err) 111 } 112 113 for err := range ch { 114 t.Error(err) 115 } 116 } 117 118 func TestUDPConnSpecificMethods(t *testing.T) { 119 la, err := ResolveUDPAddr("udp4", "127.0.0.1:0") 120 if err != nil { 121 t.Fatal(err) 122 } 123 c, err := ListenUDP("udp4", la) 124 if err != nil { 125 t.Fatal(err) 126 } 127 defer c.Close() 128 c.LocalAddr() 129 c.RemoteAddr() 130 c.SetDeadline(time.Now().Add(someTimeout)) 131 c.SetReadDeadline(time.Now().Add(someTimeout)) 132 c.SetWriteDeadline(time.Now().Add(someTimeout)) 133 c.SetReadBuffer(2048) 134 c.SetWriteBuffer(2048) 135 136 wb := []byte("UDPCONN TEST") 137 rb := make([]byte, 128) 138 if _, err := c.WriteToUDP(wb, c.LocalAddr().(*UDPAddr)); err != nil { 139 t.Fatal(err) 140 } 141 if _, _, err := c.ReadFromUDP(rb); err != nil { 142 t.Fatal(err) 143 } 144 if _, _, err := c.WriteMsgUDP(wb, nil, c.LocalAddr().(*UDPAddr)); err != nil { 145 condFatalf(t, c.LocalAddr().Network(), "%v", err) 146 } 147 if _, _, _, _, err := c.ReadMsgUDP(rb, nil); err != nil { 148 condFatalf(t, c.LocalAddr().Network(), "%v", err) 149 } 150 151 if f, err := c.File(); err != nil { 152 condFatalf(t, "file+net", "%v", err) 153 } else { 154 f.Close() 155 } 156 157 defer func() { 158 if p := recover(); p != nil { 159 t.Fatalf("panicked: %v", p) 160 } 161 }() 162 163 c.WriteToUDP(wb, nil) 164 c.WriteMsgUDP(wb, nil, nil) 165 } 166 167 func TestIPConnSpecificMethods(t *testing.T) { 168 if os.Getuid() != 0 { 169 t.Skip("must be root") 170 } 171 172 la, err := ResolveIPAddr("ip4", "127.0.0.1") 173 if err != nil { 174 t.Fatal(err) 175 } 176 c, err := ListenIP("ip4:icmp", la) 177 if err != nil { 178 t.Fatal(err) 179 } 180 defer c.Close() 181 c.LocalAddr() 182 c.RemoteAddr() 183 c.SetDeadline(time.Now().Add(someTimeout)) 184 c.SetReadDeadline(time.Now().Add(someTimeout)) 185 c.SetWriteDeadline(time.Now().Add(someTimeout)) 186 c.SetReadBuffer(2048) 187 c.SetWriteBuffer(2048) 188 189 if f, err := c.File(); err != nil { 190 condFatalf(t, "file+net", "%v", err) 191 } else { 192 f.Close() 193 } 194 195 defer func() { 196 if p := recover(); p != nil { 197 t.Fatalf("panicked: %v", p) 198 } 199 }() 200 201 wb := []byte("IPCONN TEST") 202 c.WriteToIP(wb, nil) 203 c.WriteMsgIP(wb, nil, nil) 204 } 205 206 func TestUnixListenerSpecificMethods(t *testing.T) { 207 if !testableNetwork("unix") { 208 t.Skip("unix test") 209 } 210 211 addr := testUnixAddr() 212 la, err := ResolveUnixAddr("unix", addr) 213 if err != nil { 214 t.Fatal(err) 215 } 216 ln, err := ListenUnix("unix", la) 217 if err != nil { 218 t.Fatal(err) 219 } 220 defer ln.Close() 221 defer os.Remove(addr) 222 ln.Addr() 223 ln.SetDeadline(time.Now().Add(30 * time.Nanosecond)) 224 225 if c, err := ln.Accept(); err != nil { 226 if !err.(Error).Timeout() { 227 t.Fatal(err) 228 } 229 } else { 230 c.Close() 231 } 232 if c, err := ln.AcceptUnix(); err != nil { 233 if !err.(Error).Timeout() { 234 t.Fatal(err) 235 } 236 } else { 237 c.Close() 238 } 239 240 if f, err := ln.File(); err != nil { 241 t.Fatal(err) 242 } else { 243 f.Close() 244 } 245 } 246 247 func TestUnixConnSpecificMethods(t *testing.T) { 248 if !testableNetwork("unixgram") { 249 t.Skip("unixgram test") 250 } 251 252 addr1, addr2, addr3 := testUnixAddr(), testUnixAddr(), testUnixAddr() 253 254 a1, err := ResolveUnixAddr("unixgram", addr1) 255 if err != nil { 256 t.Fatal(err) 257 } 258 c1, err := DialUnix("unixgram", a1, nil) 259 if err != nil { 260 t.Fatal(err) 261 } 262 defer c1.Close() 263 defer os.Remove(addr1) 264 c1.LocalAddr() 265 c1.RemoteAddr() 266 c1.SetDeadline(time.Now().Add(someTimeout)) 267 c1.SetReadDeadline(time.Now().Add(someTimeout)) 268 c1.SetWriteDeadline(time.Now().Add(someTimeout)) 269 c1.SetReadBuffer(2048) 270 c1.SetWriteBuffer(2048) 271 272 a2, err := ResolveUnixAddr("unixgram", addr2) 273 if err != nil { 274 t.Fatal(err) 275 } 276 c2, err := DialUnix("unixgram", a2, nil) 277 if err != nil { 278 t.Fatal(err) 279 } 280 defer c2.Close() 281 defer os.Remove(addr2) 282 c2.LocalAddr() 283 c2.RemoteAddr() 284 c2.SetDeadline(time.Now().Add(someTimeout)) 285 c2.SetReadDeadline(time.Now().Add(someTimeout)) 286 c2.SetWriteDeadline(time.Now().Add(someTimeout)) 287 c2.SetReadBuffer(2048) 288 c2.SetWriteBuffer(2048) 289 290 a3, err := ResolveUnixAddr("unixgram", addr3) 291 if err != nil { 292 t.Fatal(err) 293 } 294 c3, err := ListenUnixgram("unixgram", a3) 295 if err != nil { 296 t.Fatal(err) 297 } 298 defer c3.Close() 299 defer os.Remove(addr3) 300 c3.LocalAddr() 301 c3.RemoteAddr() 302 c3.SetDeadline(time.Now().Add(someTimeout)) 303 c3.SetReadDeadline(time.Now().Add(someTimeout)) 304 c3.SetWriteDeadline(time.Now().Add(someTimeout)) 305 c3.SetReadBuffer(2048) 306 c3.SetWriteBuffer(2048) 307 308 wb := []byte("UNIXCONN TEST") 309 rb1 := make([]byte, 128) 310 rb2 := make([]byte, 128) 311 rb3 := make([]byte, 128) 312 if _, _, err := c1.WriteMsgUnix(wb, nil, a2); err != nil { 313 t.Fatal(err) 314 } 315 if _, _, _, _, err := c2.ReadMsgUnix(rb2, nil); err != nil { 316 t.Fatal(err) 317 } 318 if _, err := c2.WriteToUnix(wb, a1); err != nil { 319 t.Fatal(err) 320 } 321 if _, _, err := c1.ReadFromUnix(rb1); err != nil { 322 t.Fatal(err) 323 } 324 if _, err := c3.WriteToUnix(wb, a1); err != nil { 325 t.Fatal(err) 326 } 327 if _, _, err := c1.ReadFromUnix(rb1); err != nil { 328 t.Fatal(err) 329 } 330 if _, err := c2.WriteToUnix(wb, a3); err != nil { 331 t.Fatal(err) 332 } 333 if _, _, err := c3.ReadFromUnix(rb3); err != nil { 334 t.Fatal(err) 335 } 336 337 if f, err := c1.File(); err != nil { 338 t.Fatal(err) 339 } else { 340 f.Close() 341 } 342 343 defer func() { 344 if p := recover(); p != nil { 345 t.Fatalf("panicked: %v", p) 346 } 347 }() 348 349 c1.WriteToUnix(wb, nil) 350 c1.WriteMsgUnix(wb, nil, nil) 351 c3.WriteToUnix(wb, nil) 352 c3.WriteMsgUnix(wb, nil, nil) 353 }