github.com/rafaeltorres324/go/src@v0.0.0-20210519164414-9fdf653a9838/net/unixsock_test.go (about) 1 // Copyright 2013 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 // +build !js,!plan9,!windows 6 7 package net 8 9 import ( 10 "bytes" 11 "internal/testenv" 12 "os" 13 "reflect" 14 "runtime" 15 "syscall" 16 "testing" 17 "time" 18 ) 19 20 func TestReadUnixgramWithUnnamedSocket(t *testing.T) { 21 if !testableNetwork("unixgram") { 22 t.Skip("unixgram test") 23 } 24 if runtime.GOOS == "openbsd" { 25 testenv.SkipFlaky(t, 15157) 26 } 27 28 addr := testUnixAddr() 29 la, err := ResolveUnixAddr("unixgram", addr) 30 if err != nil { 31 t.Fatal(err) 32 } 33 c, err := ListenUnixgram("unixgram", la) 34 if err != nil { 35 t.Fatal(err) 36 } 37 defer func() { 38 c.Close() 39 os.Remove(addr) 40 }() 41 42 off := make(chan bool) 43 data := [5]byte{1, 2, 3, 4, 5} 44 go func() { 45 defer func() { off <- true }() 46 s, err := syscall.Socket(syscall.AF_UNIX, syscall.SOCK_DGRAM, 0) 47 if err != nil { 48 t.Error(err) 49 return 50 } 51 defer syscall.Close(s) 52 rsa := &syscall.SockaddrUnix{Name: addr} 53 if err := syscall.Sendto(s, data[:], 0, rsa); err != nil { 54 t.Error(err) 55 return 56 } 57 }() 58 59 <-off 60 b := make([]byte, 64) 61 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) 62 n, from, err := c.ReadFrom(b) 63 if err != nil { 64 t.Fatal(err) 65 } 66 if from != nil { 67 t.Fatalf("unexpected peer address: %v", from) 68 } 69 if !bytes.Equal(b[:n], data[:]) { 70 t.Fatalf("got %v; want %v", b[:n], data[:]) 71 } 72 } 73 74 func TestUnixgramZeroBytePayload(t *testing.T) { 75 if !testableNetwork("unixgram") { 76 t.Skip("unixgram test") 77 } 78 79 c1, err := newLocalPacketListener("unixgram") 80 if err != nil { 81 t.Fatal(err) 82 } 83 defer os.Remove(c1.LocalAddr().String()) 84 defer c1.Close() 85 86 c2, err := Dial("unixgram", c1.LocalAddr().String()) 87 if err != nil { 88 t.Fatal(err) 89 } 90 defer os.Remove(c2.LocalAddr().String()) 91 defer c2.Close() 92 93 for _, genericRead := range []bool{false, true} { 94 n, err := c2.Write(nil) 95 if err != nil { 96 t.Fatal(err) 97 } 98 if n != 0 { 99 t.Errorf("got %d; want 0", n) 100 } 101 c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) 102 var b [1]byte 103 var peer Addr 104 if genericRead { 105 _, err = c1.(Conn).Read(b[:]) 106 } else { 107 _, peer, err = c1.ReadFrom(b[:]) 108 } 109 switch err { 110 case nil: // ReadFrom succeeds 111 if peer != nil { // peer is connected-mode 112 t.Fatalf("unexpected peer address: %v", peer) 113 } 114 default: // Read may timeout, it depends on the platform 115 if !isDeadlineExceeded(err) { 116 t.Fatal(err) 117 } 118 } 119 } 120 } 121 122 func TestUnixgramZeroByteBuffer(t *testing.T) { 123 if !testableNetwork("unixgram") { 124 t.Skip("unixgram test") 125 } 126 // issue 4352: Recvfrom failed with "address family not 127 // supported by protocol family" if zero-length buffer provided 128 129 c1, err := newLocalPacketListener("unixgram") 130 if err != nil { 131 t.Fatal(err) 132 } 133 defer os.Remove(c1.LocalAddr().String()) 134 defer c1.Close() 135 136 c2, err := Dial("unixgram", c1.LocalAddr().String()) 137 if err != nil { 138 t.Fatal(err) 139 } 140 defer os.Remove(c2.LocalAddr().String()) 141 defer c2.Close() 142 143 b := []byte("UNIXGRAM ZERO BYTE BUFFER TEST") 144 for _, genericRead := range []bool{false, true} { 145 n, err := c2.Write(b) 146 if err != nil { 147 t.Fatal(err) 148 } 149 if n != len(b) { 150 t.Errorf("got %d; want %d", n, len(b)) 151 } 152 c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) 153 var peer Addr 154 if genericRead { 155 _, err = c1.(Conn).Read(nil) 156 } else { 157 _, peer, err = c1.ReadFrom(nil) 158 } 159 switch err { 160 case nil: // ReadFrom succeeds 161 if peer != nil { // peer is connected-mode 162 t.Fatalf("unexpected peer address: %v", peer) 163 } 164 default: // Read may timeout, it depends on the platform 165 if !isDeadlineExceeded(err) { 166 t.Fatal(err) 167 } 168 } 169 } 170 } 171 172 func TestUnixgramWrite(t *testing.T) { 173 if !testableNetwork("unixgram") { 174 t.Skip("unixgram test") 175 } 176 177 addr := testUnixAddr() 178 laddr, err := ResolveUnixAddr("unixgram", addr) 179 if err != nil { 180 t.Fatal(err) 181 } 182 c, err := ListenPacket("unixgram", addr) 183 if err != nil { 184 t.Fatal(err) 185 } 186 defer os.Remove(addr) 187 defer c.Close() 188 189 testUnixgramWriteConn(t, laddr) 190 testUnixgramWritePacketConn(t, laddr) 191 } 192 193 func testUnixgramWriteConn(t *testing.T, raddr *UnixAddr) { 194 c, err := Dial("unixgram", raddr.String()) 195 if err != nil { 196 t.Fatal(err) 197 } 198 defer c.Close() 199 200 b := []byte("CONNECTED-MODE SOCKET") 201 if _, err := c.(*UnixConn).WriteToUnix(b, raddr); err == nil { 202 t.Fatal("should fail") 203 } else if err.(*OpError).Err != ErrWriteToConnected { 204 t.Fatalf("should fail as ErrWriteToConnected: %v", err) 205 } 206 if _, err = c.(*UnixConn).WriteTo(b, raddr); err == nil { 207 t.Fatal("should fail") 208 } else if err.(*OpError).Err != ErrWriteToConnected { 209 t.Fatalf("should fail as ErrWriteToConnected: %v", err) 210 } 211 if _, _, err = c.(*UnixConn).WriteMsgUnix(b, nil, raddr); err == nil { 212 t.Fatal("should fail") 213 } else if err.(*OpError).Err != ErrWriteToConnected { 214 t.Fatalf("should fail as ErrWriteToConnected: %v", err) 215 } 216 if _, err := c.Write(b); err != nil { 217 t.Fatal(err) 218 } 219 } 220 221 func testUnixgramWritePacketConn(t *testing.T, raddr *UnixAddr) { 222 addr := testUnixAddr() 223 c, err := ListenPacket("unixgram", addr) 224 if err != nil { 225 t.Fatal(err) 226 } 227 defer os.Remove(addr) 228 defer c.Close() 229 230 b := []byte("UNCONNECTED-MODE SOCKET") 231 if _, err := c.(*UnixConn).WriteToUnix(b, raddr); err != nil { 232 t.Fatal(err) 233 } 234 if _, err := c.WriteTo(b, raddr); err != nil { 235 t.Fatal(err) 236 } 237 if _, _, err := c.(*UnixConn).WriteMsgUnix(b, nil, raddr); err != nil { 238 t.Fatal(err) 239 } 240 if _, err := c.(*UnixConn).Write(b); err == nil { 241 t.Fatal("should fail") 242 } 243 } 244 245 func TestUnixConnLocalAndRemoteNames(t *testing.T) { 246 if !testableNetwork("unix") { 247 t.Skip("unix test") 248 } 249 250 handler := func(ls *localServer, ln Listener) {} 251 for _, laddr := range []string{"", testUnixAddr()} { 252 laddr := laddr 253 taddr := testUnixAddr() 254 ta, err := ResolveUnixAddr("unix", taddr) 255 if err != nil { 256 t.Fatal(err) 257 } 258 ln, err := ListenUnix("unix", ta) 259 if err != nil { 260 t.Fatal(err) 261 } 262 ls, err := (&streamListener{Listener: ln}).newLocalServer() 263 if err != nil { 264 t.Fatal(err) 265 } 266 defer ls.teardown() 267 if err := ls.buildup(handler); err != nil { 268 t.Fatal(err) 269 } 270 271 la, err := ResolveUnixAddr("unix", laddr) 272 if err != nil { 273 t.Fatal(err) 274 } 275 c, err := DialUnix("unix", la, ta) 276 if err != nil { 277 t.Fatal(err) 278 } 279 defer func() { 280 c.Close() 281 if la != nil { 282 defer os.Remove(laddr) 283 } 284 }() 285 if _, err := c.Write([]byte("UNIXCONN LOCAL AND REMOTE NAME TEST")); err != nil { 286 t.Fatal(err) 287 } 288 289 switch runtime.GOOS { 290 case "android", "linux": 291 if laddr == "" { 292 laddr = "@" // autobind feature 293 } 294 } 295 var connAddrs = [3]struct{ got, want Addr }{ 296 {ln.Addr(), ta}, 297 {c.LocalAddr(), &UnixAddr{Name: laddr, Net: "unix"}}, 298 {c.RemoteAddr(), ta}, 299 } 300 for _, ca := range connAddrs { 301 if !reflect.DeepEqual(ca.got, ca.want) { 302 t.Fatalf("got %#v, expected %#v", ca.got, ca.want) 303 } 304 } 305 } 306 } 307 308 func TestUnixgramConnLocalAndRemoteNames(t *testing.T) { 309 if !testableNetwork("unixgram") { 310 t.Skip("unixgram test") 311 } 312 313 for _, laddr := range []string{"", testUnixAddr()} { 314 laddr := laddr 315 taddr := testUnixAddr() 316 ta, err := ResolveUnixAddr("unixgram", taddr) 317 if err != nil { 318 t.Fatal(err) 319 } 320 c1, err := ListenUnixgram("unixgram", ta) 321 if err != nil { 322 t.Fatal(err) 323 } 324 defer func() { 325 c1.Close() 326 os.Remove(taddr) 327 }() 328 329 var la *UnixAddr 330 if laddr != "" { 331 if la, err = ResolveUnixAddr("unixgram", laddr); err != nil { 332 t.Fatal(err) 333 } 334 } 335 c2, err := DialUnix("unixgram", la, ta) 336 if err != nil { 337 t.Fatal(err) 338 } 339 defer func() { 340 c2.Close() 341 if la != nil { 342 defer os.Remove(laddr) 343 } 344 }() 345 346 switch runtime.GOOS { 347 case "android", "linux": 348 if laddr == "" { 349 laddr = "@" // autobind feature 350 } 351 } 352 353 var connAddrs = [4]struct{ got, want Addr }{ 354 {c1.LocalAddr(), ta}, 355 {c1.RemoteAddr(), nil}, 356 {c2.LocalAddr(), &UnixAddr{Name: laddr, Net: "unixgram"}}, 357 {c2.RemoteAddr(), ta}, 358 } 359 for _, ca := range connAddrs { 360 if !reflect.DeepEqual(ca.got, ca.want) { 361 t.Fatalf("got %#v; want %#v", ca.got, ca.want) 362 } 363 } 364 } 365 } 366 367 func TestUnixUnlink(t *testing.T) { 368 if !testableNetwork("unix") { 369 t.Skip("unix test") 370 } 371 name := testUnixAddr() 372 373 listen := func(t *testing.T) *UnixListener { 374 l, err := Listen("unix", name) 375 if err != nil { 376 t.Fatal(err) 377 } 378 return l.(*UnixListener) 379 } 380 checkExists := func(t *testing.T, desc string) { 381 if _, err := os.Stat(name); err != nil { 382 t.Fatalf("unix socket does not exist %s: %v", desc, err) 383 } 384 } 385 checkNotExists := func(t *testing.T, desc string) { 386 if _, err := os.Stat(name); err == nil { 387 t.Fatalf("unix socket does exist %s: %v", desc, err) 388 } 389 } 390 391 // Listener should remove on close. 392 t.Run("Listen", func(t *testing.T) { 393 l := listen(t) 394 checkExists(t, "after Listen") 395 l.Close() 396 checkNotExists(t, "after Listener close") 397 }) 398 399 // FileListener should not. 400 t.Run("FileListener", func(t *testing.T) { 401 l := listen(t) 402 f, _ := l.File() 403 l1, _ := FileListener(f) 404 checkExists(t, "after FileListener") 405 f.Close() 406 checkExists(t, "after File close") 407 l1.Close() 408 checkExists(t, "after FileListener close") 409 l.Close() 410 checkNotExists(t, "after Listener close") 411 }) 412 413 // Only first call to l.Close should remove. 414 t.Run("SecondClose", func(t *testing.T) { 415 l := listen(t) 416 checkExists(t, "after Listen") 417 l.Close() 418 checkNotExists(t, "after Listener close") 419 if err := os.WriteFile(name, []byte("hello world"), 0666); err != nil { 420 t.Fatalf("cannot recreate socket file: %v", err) 421 } 422 checkExists(t, "after writing temp file") 423 l.Close() 424 checkExists(t, "after second Listener close") 425 os.Remove(name) 426 }) 427 428 // SetUnlinkOnClose should do what it says. 429 430 t.Run("Listen/SetUnlinkOnClose(true)", func(t *testing.T) { 431 l := listen(t) 432 checkExists(t, "after Listen") 433 l.SetUnlinkOnClose(true) 434 l.Close() 435 checkNotExists(t, "after Listener close") 436 }) 437 438 t.Run("Listen/SetUnlinkOnClose(false)", func(t *testing.T) { 439 l := listen(t) 440 checkExists(t, "after Listen") 441 l.SetUnlinkOnClose(false) 442 l.Close() 443 checkExists(t, "after Listener close") 444 os.Remove(name) 445 }) 446 447 t.Run("FileListener/SetUnlinkOnClose(true)", func(t *testing.T) { 448 l := listen(t) 449 f, _ := l.File() 450 l1, _ := FileListener(f) 451 checkExists(t, "after FileListener") 452 l1.(*UnixListener).SetUnlinkOnClose(true) 453 f.Close() 454 checkExists(t, "after File close") 455 l1.Close() 456 checkNotExists(t, "after FileListener close") 457 l.Close() 458 }) 459 460 t.Run("FileListener/SetUnlinkOnClose(false)", func(t *testing.T) { 461 l := listen(t) 462 f, _ := l.File() 463 l1, _ := FileListener(f) 464 checkExists(t, "after FileListener") 465 l1.(*UnixListener).SetUnlinkOnClose(false) 466 f.Close() 467 checkExists(t, "after File close") 468 l1.Close() 469 checkExists(t, "after FileListener close") 470 l.Close() 471 }) 472 }