unixsock_linux_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Copyright 2017 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. package net
  5. import (
  6. "bytes"
  7. "reflect"
  8. "syscall"
  9. "testing"
  10. "time"
  11. )
  12. func TestUnixgramAutobind(t *testing.T) {
  13. laddr := &UnixAddr{Name: "", Net: "unixgram"}
  14. c1, err := ListenUnixgram("unixgram", laddr)
  15. if err != nil {
  16. t.Fatal(err)
  17. }
  18. defer c1.Close()
  19. // retrieve the autobind address
  20. autoAddr := c1.LocalAddr().(*UnixAddr)
  21. if len(autoAddr.Name) <= 1 {
  22. t.Fatalf("invalid autobind address: %v", autoAddr)
  23. }
  24. if autoAddr.Name[0] != '@' {
  25. t.Fatalf("invalid autobind address: %v", autoAddr)
  26. }
  27. c2, err := DialUnix("unixgram", nil, autoAddr)
  28. if err != nil {
  29. t.Fatal(err)
  30. }
  31. defer c2.Close()
  32. if !reflect.DeepEqual(c1.LocalAddr(), c2.RemoteAddr()) {
  33. t.Fatalf("expected autobind address %v, got %v", c1.LocalAddr(), c2.RemoteAddr())
  34. }
  35. }
  36. func TestUnixAutobindClose(t *testing.T) {
  37. laddr := &UnixAddr{Name: "", Net: "unix"}
  38. ln, err := ListenUnix("unix", laddr)
  39. if err != nil {
  40. t.Fatal(err)
  41. }
  42. ln.Close()
  43. }
  44. func TestUnixgramLinuxAbstractLongName(t *testing.T) {
  45. if !testableNetwork("unixgram") {
  46. t.Skip("abstract unix socket long name test")
  47. }
  48. // Create an abstract socket name whose length is exactly
  49. // the maximum RawSockkaddrUnix Path len
  50. rsu := syscall.RawSockaddrUnix{}
  51. addrBytes := make([]byte, len(rsu.Path))
  52. copy(addrBytes, "@abstract_test")
  53. addr := string(addrBytes)
  54. la, err := ResolveUnixAddr("unixgram", addr)
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. c, err := ListenUnixgram("unixgram", la)
  59. if err != nil {
  60. t.Fatal(err)
  61. }
  62. defer c.Close()
  63. off := make(chan bool)
  64. data := [5]byte{1, 2, 3, 4, 5}
  65. go func() {
  66. defer func() { off <- true }()
  67. s, err := syscall.Socket(syscall.AF_UNIX, syscall.SOCK_DGRAM, 0)
  68. if err != nil {
  69. t.Error(err)
  70. return
  71. }
  72. defer syscall.Close(s)
  73. rsa := &syscall.SockaddrUnix{Name: addr}
  74. if err := syscall.Sendto(s, data[:], 0, rsa); err != nil {
  75. t.Error(err)
  76. return
  77. }
  78. }()
  79. <-off
  80. b := make([]byte, 64)
  81. c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
  82. n, from, err := c.ReadFrom(b)
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. if from != nil {
  87. t.Fatalf("unexpected peer address: %v", from)
  88. }
  89. if !bytes.Equal(b[:n], data[:]) {
  90. t.Fatalf("got %v; want %v", b[:n], data[:])
  91. }
  92. }