* gcc.dg/guality/guality.exp: Skip on AIX.
[official-gcc.git] / libgo / go / net / unix_test.go
blob5e63e9d9decacc2ac9971c03f2ee16814bde0a09
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
7 package net
9 import (
10 "bytes"
11 "os"
12 "reflect"
13 "runtime"
14 "syscall"
15 "testing"
16 "time"
19 func TestReadUnixgramWithUnnamedSocket(t *testing.T) {
20 addr := testUnixAddr()
21 la, err := ResolveUnixAddr("unixgram", addr)
22 if err != nil {
23 t.Fatalf("ResolveUnixAddr failed: %v", err)
25 c, err := ListenUnixgram("unixgram", la)
26 if err != nil {
27 t.Fatalf("ListenUnixgram failed: %v", err)
29 defer func() {
30 c.Close()
31 os.Remove(addr)
32 }()
34 off := make(chan bool)
35 data := [5]byte{1, 2, 3, 4, 5}
36 go func() {
37 defer func() { off <- true }()
38 s, err := syscall.Socket(syscall.AF_UNIX, syscall.SOCK_DGRAM, 0)
39 if err != nil {
40 t.Errorf("syscall.Socket failed: %v", err)
41 return
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)
47 return
49 }()
51 <-off
52 b := make([]byte, 64)
53 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
54 n, from, err := c.ReadFrom(b)
55 if err != nil {
56 t.Fatalf("UnixConn.ReadFrom failed: %v", err)
58 if from != nil {
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)
72 if err != nil {
73 t.Fatalf("ResolveUnixAddr failed: %v", err)
75 c, err := ListenUnixgram("unixgram", la)
76 if err != nil {
77 t.Fatalf("ListenUnixgram failed: %v", err)
79 defer func() {
80 c.Close()
81 os.Remove(addr)
82 }()
84 off := make(chan bool)
85 go func() {
86 defer func() { off <- true }()
87 c, err := DialUnix("unixgram", nil, la)
88 if err != nil {
89 t.Errorf("DialUnix failed: %v", err)
90 return
92 defer c.Close()
93 if _, err := c.Write([]byte{1, 2, 3, 4, 5}); err != nil {
94 t.Errorf("UnixConn.Write failed: %v", err)
95 return
97 }()
99 <-off
100 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
101 _, from, err := c.ReadFrom(nil)
102 if err != nil {
103 t.Fatalf("UnixConn.ReadFrom failed: %v", err)
105 if from != nil {
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)
117 if err != nil {
118 t.Fatalf("ListenUnixgram failed: %v", err)
120 defer c1.Close()
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)
132 if err != nil {
133 t.Fatalf("DialUnix failed: %v", err)
135 defer c2.Close()
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)
146 if err != nil {
147 t.Fatalf("ResolveUnixAddr failed: %v", err)
149 ln, err := ListenUnix("unix", ta)
150 if err != nil {
151 t.Fatalf("ListenUnix failed: %v", err)
153 defer func() {
154 ln.Close()
155 os.Remove(taddr)
158 done := make(chan int)
159 go transponder(t, ln, done)
161 la, err := ResolveUnixAddr("unix", laddr)
162 if err != nil {
163 t.Fatalf("ResolveUnixAddr failed: %v", err)
165 c, err := DialUnix("unix", la, ta)
166 if err != nil {
167 t.Fatalf("DialUnix failed: %v", err)
169 defer func() {
170 c.Close()
171 if la != nil {
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 }{
183 {ln.Addr(), ta},
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)
193 <-done
197 func TestUnixgramConnLocalAndRemoteNames(t *testing.T) {
198 for _, laddr := range []string{"", testUnixAddr()} {
199 taddr := testUnixAddr()
200 ta, err := ResolveUnixAddr("unixgram", taddr)
201 if err != nil {
202 t.Fatalf("ResolveUnixAddr failed: %v", err)
204 c1, err := ListenUnixgram("unixgram", ta)
205 if err != nil {
206 t.Fatalf("ListenUnixgram failed: %v", err)
208 defer func() {
209 c1.Close()
210 os.Remove(taddr)
213 var la *UnixAddr
214 if laddr != "" {
215 var err error
216 if la, err = ResolveUnixAddr("unixgram", laddr); err != nil {
217 t.Fatalf("ResolveUnixAddr failed: %v", err)
220 c2, err := DialUnix("unixgram", la, ta)
221 if err != nil {
222 t.Fatalf("DialUnix failed: %v", err)
224 defer func() {
225 c2.Close()
226 if la != nil {
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)