github.com/nibnait/go-learn@v0.0.0-20220227013611-dfa47ea6d2da/src/pkg/mod/golang.org/x/sys@v0.0.0-20210630005230-0f9fa26af87c/unix/syscall_internal_darwin_test.go (about) 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. 4 5 package unix 6 7 import ( 8 "reflect" 9 "testing" 10 "unsafe" 11 ) 12 13 func Test_anyToSockaddr_darwin(t *testing.T) { 14 tests := []struct { 15 name string 16 rsa *RawSockaddrAny 17 sa Sockaddr 18 err error 19 }{ 20 { 21 name: "AF_SYSTEM emtpy", 22 rsa: sockaddrCtlToAny(RawSockaddrCtl{}), 23 err: EAFNOSUPPORT, 24 }, 25 { 26 name: "AF_SYSTEM no sysaddr", 27 rsa: sockaddrCtlToAny(RawSockaddrCtl{ 28 Sc_family: AF_SYSTEM, 29 }), 30 err: EAFNOSUPPORT, 31 }, 32 { 33 name: "AF_SYSTEM/AF_SYS_CONTROL empty ", 34 rsa: sockaddrCtlToAny(RawSockaddrCtl{ 35 Sc_family: AF_SYSTEM, 36 Ss_sysaddr: AF_SYS_CONTROL, 37 }), 38 sa: &SockaddrCtl{}, 39 }, 40 { 41 name: "AF_SYSTEM ID and unit", 42 rsa: sockaddrCtlToAny(RawSockaddrCtl{ 43 Sc_family: AF_SYSTEM, 44 Ss_sysaddr: AF_SYS_CONTROL, 45 Sc_id: 0x42, 46 Sc_unit: 0xC71, 47 }), 48 sa: &SockaddrCtl{ 49 ID: 0x42, 50 Unit: 0xC71, 51 }, 52 }, 53 } 54 55 for _, tt := range tests { 56 t.Run(tt.name, func(t *testing.T) { 57 fd := int(0) 58 sa, err := anyToSockaddr(fd, tt.rsa) 59 if err != tt.err { 60 t.Fatalf("unexpected error: %v, want: %v", err, tt.err) 61 } 62 63 if !reflect.DeepEqual(sa, tt.sa) { 64 t.Fatalf("unexpected Sockaddr:\n got: %#v\nwant: %#v", sa, tt.sa) 65 } 66 }) 67 } 68 } 69 70 func TestSockaddrCtl_sockaddr(t *testing.T) { 71 tests := []struct { 72 name string 73 sa *SockaddrCtl 74 raw *RawSockaddrCtl 75 err error 76 }{ 77 { 78 name: "empty", 79 sa: &SockaddrCtl{}, 80 raw: &RawSockaddrCtl{ 81 Sc_len: SizeofSockaddrCtl, 82 Sc_family: AF_SYSTEM, 83 Ss_sysaddr: AF_SYS_CONTROL, 84 }, 85 }, 86 { 87 name: "with ID and unit", 88 sa: &SockaddrCtl{ 89 ID: 0x42, 90 Unit: 0xff, 91 }, 92 raw: &RawSockaddrCtl{ 93 Sc_len: SizeofSockaddrCtl, 94 Sc_family: AF_SYSTEM, 95 Ss_sysaddr: AF_SYS_CONTROL, 96 Sc_id: 0x42, 97 Sc_unit: 0xff, 98 }, 99 }, 100 } 101 102 for _, tt := range tests { 103 t.Run(tt.name, func(t *testing.T) { 104 out, l, err := tt.sa.sockaddr() 105 if err != tt.err { 106 t.Fatalf("unexpected error: %v, want: %v", err, tt.err) 107 } 108 109 // Must be 0 on error or a fixed size otherwise. 110 if (tt.err != nil && l != 0) || (tt.raw != nil && l != SizeofSockaddrCtl) { 111 t.Fatalf("unexpected Socklen: %d", l) 112 } 113 114 if out != nil { 115 raw := (*RawSockaddrCtl)(out) 116 if !reflect.DeepEqual(raw, tt.raw) { 117 t.Fatalf("unexpected RawSockaddrCtl:\n got: %#v\nwant: %#v", raw, tt.raw) 118 } 119 } 120 }) 121 } 122 } 123 124 func sockaddrCtlToAny(in RawSockaddrCtl) *RawSockaddrAny { 125 var out RawSockaddrAny 126 copy( 127 (*(*[SizeofSockaddrAny]byte)(unsafe.Pointer(&out)))[:], 128 (*(*[SizeofSockaddrCtl]byte)(unsafe.Pointer(&in)))[:], 129 ) 130 return &out 131 }