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.
5 // +build !plan9,!windows
19 func TestReadUnixgramWithUnnamedSocket(t
*testing
.T
) {
20 addr
:= testUnixAddr()
21 la
, err
:= ResolveUnixAddr("unixgram", addr
)
23 t
.Fatalf("ResolveUnixAddr failed: %v", err
)
25 c
, err
:= ListenUnixgram("unixgram", la
)
27 t
.Fatalf("ListenUnixgram failed: %v", err
)
34 off
:= make(chan bool)
35 data
:= [5]byte{1, 2, 3, 4, 5}
37 defer func() { off
<- true }()
38 s
, err
:= syscall
.Socket(syscall
.AF_UNIX
, syscall
.SOCK_DGRAM
, 0)
40 t
.Errorf("syscall.Socket failed: %v", err
)
43 defer syscall
.Close(s
)
44 rsa
:= &syscall
.SockaddrUnix
{Name
: addr
}
45 if err
:= syscall
.Sendto(s
, data
[:], 0, rsa
); err
!= nil {
46 t
.Errorf("syscall.Sendto failed: %v", err
)
53 c
.SetReadDeadline(time
.Now().Add(100 * time
.Millisecond
))
54 n
, from
, err
:= c
.ReadFrom(b
)
56 t
.Fatalf("UnixConn.ReadFrom failed: %v", err
)
59 t
.Fatalf("neighbor address is %v", from
)
61 if !bytes
.Equal(b
[:n
], data
[:]) {
62 t
.Fatalf("got %v, want %v", b
[:n
], data
[:])
66 func TestReadUnixgramWithZeroBytesBuffer(t
*testing
.T
) {
67 // issue 4352: Recvfrom failed with "address family not
68 // supported by protocol family" if zero-length buffer provided
70 addr
:= testUnixAddr()
71 la
, err
:= ResolveUnixAddr("unixgram", addr
)
73 t
.Fatalf("ResolveUnixAddr failed: %v", err
)
75 c
, err
:= ListenUnixgram("unixgram", la
)
77 t
.Fatalf("ListenUnixgram failed: %v", err
)
84 off
:= make(chan bool)
86 defer func() { off
<- true }()
87 c
, err
:= DialUnix("unixgram", nil, la
)
89 t
.Errorf("DialUnix failed: %v", err
)
93 if _
, err
:= c
.Write([]byte{1, 2, 3, 4, 5}); err
!= nil {
94 t
.Errorf("UnixConn.Write failed: %v", err
)
100 c
.SetReadDeadline(time
.Now().Add(100 * time
.Millisecond
))
101 _
, from
, err
:= c
.ReadFrom(nil)
103 t
.Fatalf("UnixConn.ReadFrom failed: %v", err
)
106 t
.Fatalf("neighbor address is %v", from
)
110 func TestUnixAutobind(t
*testing
.T
) {
111 if runtime
.GOOS
!= "linux" {
112 t
.Skip("skipping: autobind is linux only")
115 laddr
:= &UnixAddr
{Name
: "", Net
: "unixgram"}
116 c1
, err
:= ListenUnixgram("unixgram", laddr
)
118 t
.Fatalf("ListenUnixgram failed: %v", err
)
122 // retrieve the autobind address
123 autoAddr
:= c1
.LocalAddr().(*UnixAddr
)
124 if len(autoAddr
.Name
) <= 1 {
125 t
.Fatalf("invalid autobind address: %v", autoAddr
)
127 if autoAddr
.Name
[0] != '@' {
128 t
.Fatalf("invalid autobind address: %v", autoAddr
)
131 c2
, err
:= DialUnix("unixgram", nil, autoAddr
)
133 t
.Fatalf("DialUnix failed: %v", err
)
137 if !reflect
.DeepEqual(c1
.LocalAddr(), c2
.RemoteAddr()) {
138 t
.Fatalf("expected autobind address %v, got %v", c1
.LocalAddr(), c2
.RemoteAddr())
142 func TestUnixConnLocalAndRemoteNames(t
*testing
.T
) {
143 for _
, laddr
:= range []string{"", testUnixAddr()} {
144 taddr
:= testUnixAddr()
145 ta
, err
:= ResolveUnixAddr("unix", taddr
)
147 t
.Fatalf("ResolveUnixAddr failed: %v", err
)
149 ln
, err
:= ListenUnix("unix", ta
)
151 t
.Fatalf("ListenUnix failed: %v", err
)
158 done
:= make(chan int)
159 go transponder(t
, ln
, done
)
161 la
, err
:= ResolveUnixAddr("unix", laddr
)
163 t
.Fatalf("ResolveUnixAddr failed: %v", err
)
165 c
, err
:= DialUnix("unix", la
, ta
)
167 t
.Fatalf("DialUnix failed: %v", err
)
172 defer os
.Remove(laddr
)
175 if _
, err
:= c
.Write([]byte("UNIXCONN LOCAL AND REMOTE NAME TEST")); err
!= nil {
176 t
.Fatalf("UnixConn.Write failed: %v", err
)
179 if runtime
.GOOS
== "linux" && laddr
== "" {
180 laddr
= "@" // autobind feature
182 var connAddrs
= [3]struct{ got
, want Addr
}{
184 {c
.LocalAddr(), &UnixAddr
{Name
: laddr
, Net
: "unix"}},
185 {c
.RemoteAddr(), ta
},
187 for _
, ca
:= range connAddrs
{
188 if !reflect
.DeepEqual(ca
.got
, ca
.want
) {
189 t
.Fatalf("got %#v, expected %#v", ca
.got
, ca
.want
)
197 func TestUnixgramConnLocalAndRemoteNames(t
*testing
.T
) {
198 for _
, laddr
:= range []string{"", testUnixAddr()} {
199 taddr
:= testUnixAddr()
200 ta
, err
:= ResolveUnixAddr("unixgram", taddr
)
202 t
.Fatalf("ResolveUnixAddr failed: %v", err
)
204 c1
, err
:= ListenUnixgram("unixgram", ta
)
206 t
.Fatalf("ListenUnixgram failed: %v", err
)
216 if la
, err
= ResolveUnixAddr("unixgram", laddr
); err
!= nil {
217 t
.Fatalf("ResolveUnixAddr failed: %v", err
)
220 c2
, err
:= DialUnix("unixgram", la
, ta
)
222 t
.Fatalf("DialUnix failed: %v", err
)
227 defer os
.Remove(laddr
)
231 if runtime
.GOOS
== "linux" && laddr
== "" {
232 laddr
= "@" // autobind feature
234 var connAddrs
= [4]struct{ got
, want Addr
}{
235 {c1
.LocalAddr(), ta
},
236 {c1
.RemoteAddr(), nil},
237 {c2
.LocalAddr(), &UnixAddr
{Name
: laddr
, Net
: "unixgram"}},
238 {c2
.RemoteAddr(), ta
},
240 for _
, ca
:= range connAddrs
{
241 if !reflect
.DeepEqual(ca
.got
, ca
.want
) {
242 t
.Fatalf("got %#v, expected %#v", ca
.got
, ca
.want
)