1 // Copyright 2020 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 darwin dragonfly freebsd netbsd openbsd
16 func Test_anyToSockaddr(t *testing.T) {
24 name: "AF_UNIX zero length",
25 rsa: sockaddrUnixToAny(RawSockaddrUnix{
31 name: "AF_UNIX unnamed",
32 rsa: sockaddrUnixToAny(RawSockaddrUnix{
33 Len: 2, // family (uint16)
39 name: "AF_UNIX named",
40 rsa: sockaddrUnixToAny(RawSockaddrUnix{
41 Len: uint8(2 + len("gopher")), // family (uint16) + len(gopher)
43 Path: [104]int8{'g', 'o', 'p', 'h', 'e', 'r'},
50 name: "AF_UNIX named",
51 rsa: sockaddrUnixToAny(RawSockaddrUnix{
52 Len: uint8(2 + len("go")),
54 Path: [104]int8{'g', 'o', 'p', 'h', 'e', 'r'},
61 name: "AF_MAX EAFNOSUPPORT",
69 // TODO: expand to support other families.
72 for _, tt := range tests {
73 t.Run(tt.name, func(t *testing.T) {
75 sa, err := anyToSockaddr(fd, tt.rsa)
77 t.Fatalf("unexpected error: %v, want: %v", err, tt.err)
80 if !reflect.DeepEqual(sa, tt.sa) {
81 t.Fatalf("unexpected Sockaddr:\n got: %#v\nwant: %#v", sa, tt.sa)
87 func TestSockaddrUnix_sockaddr(t *testing.T) {
97 raw: &RawSockaddrUnix{
107 raw: &RawSockaddrUnix{
108 Len: uint8(2 + len("gopher") + 1), // family (uint16) + len(gopher) + '\0'
110 Path: [104]int8{'g', 'o', 'p', 'h', 'e', 'r'},
114 name: "named too long",
116 Name: strings.Repeat("A", 104),
122 for _, tt := range tests {
123 t.Run(tt.name, func(t *testing.T) {
124 out, _, err := tt.sa.sockaddr()
126 t.Fatalf("unexpected error: %v, want: %v", err, tt.err)
130 // No pointer to cast, return early.
134 raw := (*RawSockaddrUnix)(out)
135 if !reflect.DeepEqual(raw, tt.raw) {
136 t.Fatalf("unexpected RawSockaddrUnix:\n got: %#v\nwant: %#v", raw, tt.raw)
142 func sockaddrUnixToAny(in RawSockaddrUnix) *RawSockaddrAny {
143 var out RawSockaddrAny
145 // Explicitly copy the contents of in into out to produce the correct
146 // sockaddr structure, without relying on unsafe casting to a type of a
149 (*(*[SizeofSockaddrAny]byte)(unsafe.Pointer(&out)))[:],
150 (*(*[SizeofSockaddrUnix]byte)(unsafe.Pointer(&in)))[:],