github.com/mh-cbon/go@v0.0.0-20160603070303-9e112a3fe4c0/src/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 !nacl,!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 nerr, ok := err.(Error); !ok || !nerr.Timeout() { 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 nerr, ok := err.(Error); !ok || !nerr.Timeout() { 166 t.Fatal(err) 167 } 168 } 169 } 170 } 171 172 func TestUnixgramAutobind(t *testing.T) { 173 if runtime.GOOS != "linux" { 174 t.Skip("autobind is linux only") 175 } 176 177 laddr := &UnixAddr{Name: "", Net: "unixgram"} 178 c1, err := ListenUnixgram("unixgram", laddr) 179 if err != nil { 180 t.Fatal(err) 181 } 182 defer c1.Close() 183 184 // retrieve the autobind address 185 autoAddr := c1.LocalAddr().(*UnixAddr) 186 if len(autoAddr.Name) <= 1 { 187 t.Fatalf("invalid autobind address: %v", autoAddr) 188 } 189 if autoAddr.Name[0] != '@' { 190 t.Fatalf("invalid autobind address: %v", autoAddr) 191 } 192 193 c2, err := DialUnix("unixgram", nil, autoAddr) 194 if err != nil { 195 t.Fatal(err) 196 } 197 defer c2.Close() 198 199 if !reflect.DeepEqual(c1.LocalAddr(), c2.RemoteAddr()) { 200 t.Fatalf("expected autobind address %v, got %v", c1.LocalAddr(), c2.RemoteAddr()) 201 } 202 } 203 204 func TestUnixAutobindClose(t *testing.T) { 205 if runtime.GOOS != "linux" { 206 t.Skip("autobind is linux only") 207 } 208 209 laddr := &UnixAddr{Name: "", Net: "unix"} 210 ln, err := ListenUnix("unix", laddr) 211 if err != nil { 212 t.Fatal(err) 213 } 214 ln.Close() 215 } 216 217 func TestUnixgramWrite(t *testing.T) { 218 if !testableNetwork("unixgram") { 219 t.Skip("unixgram test") 220 } 221 222 addr := testUnixAddr() 223 laddr, err := ResolveUnixAddr("unixgram", addr) 224 if err != nil { 225 t.Fatal(err) 226 } 227 c, err := ListenPacket("unixgram", addr) 228 if err != nil { 229 t.Fatal(err) 230 } 231 defer os.Remove(addr) 232 defer c.Close() 233 234 testUnixgramWriteConn(t, laddr) 235 testUnixgramWritePacketConn(t, laddr) 236 } 237 238 func testUnixgramWriteConn(t *testing.T, raddr *UnixAddr) { 239 c, err := Dial("unixgram", raddr.String()) 240 if err != nil { 241 t.Fatal(err) 242 } 243 defer c.Close() 244 245 b := []byte("CONNECTED-MODE SOCKET") 246 if _, err := c.(*UnixConn).WriteToUnix(b, raddr); err == nil { 247 t.Fatal("should fail") 248 } else if err.(*OpError).Err != ErrWriteToConnected { 249 t.Fatalf("should fail as ErrWriteToConnected: %v", err) 250 } 251 if _, err = c.(*UnixConn).WriteTo(b, raddr); err == nil { 252 t.Fatal("should fail") 253 } else if err.(*OpError).Err != ErrWriteToConnected { 254 t.Fatalf("should fail as ErrWriteToConnected: %v", err) 255 } 256 if _, _, err = c.(*UnixConn).WriteMsgUnix(b, nil, raddr); err == nil { 257 t.Fatal("should fail") 258 } else if err.(*OpError).Err != ErrWriteToConnected { 259 t.Fatalf("should fail as ErrWriteToConnected: %v", err) 260 } 261 if _, err := c.Write(b); err != nil { 262 t.Fatal(err) 263 } 264 } 265 266 func testUnixgramWritePacketConn(t *testing.T, raddr *UnixAddr) { 267 addr := testUnixAddr() 268 c, err := ListenPacket("unixgram", addr) 269 if err != nil { 270 t.Fatal(err) 271 } 272 defer os.Remove(addr) 273 defer c.Close() 274 275 b := []byte("UNCONNECTED-MODE SOCKET") 276 if _, err := c.(*UnixConn).WriteToUnix(b, raddr); err != nil { 277 t.Fatal(err) 278 } 279 if _, err := c.WriteTo(b, raddr); err != nil { 280 t.Fatal(err) 281 } 282 if _, _, err := c.(*UnixConn).WriteMsgUnix(b, nil, raddr); err != nil { 283 t.Fatal(err) 284 } 285 if _, err := c.(*UnixConn).Write(b); err == nil { 286 t.Fatal("should fail") 287 } 288 } 289 290 func TestUnixConnLocalAndRemoteNames(t *testing.T) { 291 if !testableNetwork("unix") { 292 t.Skip("unix test") 293 } 294 295 handler := func(ls *localServer, ln Listener) {} 296 for _, laddr := range []string{"", testUnixAddr()} { 297 laddr := laddr 298 taddr := testUnixAddr() 299 ta, err := ResolveUnixAddr("unix", taddr) 300 if err != nil { 301 t.Fatal(err) 302 } 303 ln, err := ListenUnix("unix", ta) 304 if err != nil { 305 t.Fatal(err) 306 } 307 ls, err := (&streamListener{Listener: ln}).newLocalServer() 308 if err != nil { 309 t.Fatal(err) 310 } 311 defer ls.teardown() 312 if err := ls.buildup(handler); err != nil { 313 t.Fatal(err) 314 } 315 316 la, err := ResolveUnixAddr("unix", laddr) 317 if err != nil { 318 t.Fatal(err) 319 } 320 c, err := DialUnix("unix", la, ta) 321 if err != nil { 322 t.Fatal(err) 323 } 324 defer func() { 325 c.Close() 326 if la != nil { 327 defer os.Remove(laddr) 328 } 329 }() 330 if _, err := c.Write([]byte("UNIXCONN LOCAL AND REMOTE NAME TEST")); err != nil { 331 t.Fatal(err) 332 } 333 334 switch runtime.GOOS { 335 case "android", "linux": 336 if laddr == "" { 337 laddr = "@" // autobind feature 338 } 339 } 340 var connAddrs = [3]struct{ got, want Addr }{ 341 {ln.Addr(), ta}, 342 {c.LocalAddr(), &UnixAddr{Name: laddr, Net: "unix"}}, 343 {c.RemoteAddr(), ta}, 344 } 345 for _, ca := range connAddrs { 346 if !reflect.DeepEqual(ca.got, ca.want) { 347 t.Fatalf("got %#v, expected %#v", ca.got, ca.want) 348 } 349 } 350 } 351 } 352 353 func TestUnixgramConnLocalAndRemoteNames(t *testing.T) { 354 if !testableNetwork("unixgram") { 355 t.Skip("unixgram test") 356 } 357 358 for _, laddr := range []string{"", testUnixAddr()} { 359 laddr := laddr 360 taddr := testUnixAddr() 361 ta, err := ResolveUnixAddr("unixgram", taddr) 362 if err != nil { 363 t.Fatal(err) 364 } 365 c1, err := ListenUnixgram("unixgram", ta) 366 if err != nil { 367 t.Fatal(err) 368 } 369 defer func() { 370 c1.Close() 371 os.Remove(taddr) 372 }() 373 374 var la *UnixAddr 375 if laddr != "" { 376 if la, err = ResolveUnixAddr("unixgram", laddr); err != nil { 377 t.Fatal(err) 378 } 379 } 380 c2, err := DialUnix("unixgram", la, ta) 381 if err != nil { 382 t.Fatal(err) 383 } 384 defer func() { 385 c2.Close() 386 if la != nil { 387 defer os.Remove(laddr) 388 } 389 }() 390 391 switch runtime.GOOS { 392 case "android", "linux": 393 if laddr == "" { 394 laddr = "@" // autobind feature 395 } 396 } 397 398 var connAddrs = [4]struct{ got, want Addr }{ 399 {c1.LocalAddr(), ta}, 400 {c1.RemoteAddr(), nil}, 401 {c2.LocalAddr(), &UnixAddr{Name: laddr, Net: "unixgram"}}, 402 {c2.RemoteAddr(), ta}, 403 } 404 for _, ca := range connAddrs { 405 if !reflect.DeepEqual(ca.got, ca.want) { 406 t.Fatalf("got %#v; want %#v", ca.got, ca.want) 407 } 408 } 409 } 410 } 411 412 func TestUnixUnlink(t *testing.T) { 413 if !testableNetwork("unix") { 414 t.Skip("unix test") 415 } 416 name := testUnixAddr() 417 l, err := Listen("unix", name) 418 if err != nil { 419 t.Fatal(err) 420 } 421 if _, err := os.Stat(name); err != nil { 422 t.Fatalf("cannot stat unix socket after ListenUnix: %v", err) 423 } 424 f, _ := l.(*UnixListener).File() 425 l1, err := FileListener(f) 426 if err != nil { 427 t.Fatal(err) 428 } 429 if _, err := os.Stat(name); err != nil { 430 t.Fatalf("cannot stat unix socket after FileListener: %v", err) 431 } 432 if err := l1.Close(); err != nil { 433 t.Fatalf("closing file listener: %v", err) 434 } 435 if _, err := os.Stat(name); err != nil { 436 t.Fatalf("cannot stat unix socket after closing FileListener: %v", err) 437 } 438 f.Close() 439 if _, err := os.Stat(name); err != nil { 440 t.Fatalf("cannot stat unix socket after closing FileListener and fd: %v", err) 441 } 442 l.Close() 443 if _, err := os.Stat(name); err == nil { 444 t.Fatal("closing unix listener did not remove unix socket") 445 } 446 }