1 // Copyright 2016 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 // +build solaris 6 7 package lif 8 9 import ( 10 "fmt" 11 "testing" 12 ) 13 14 type addrFamily int 15 16 func (af addrFamily) String() string { 17 switch af { 18 case sysAF_UNSPEC: 19 return "unspec" 20 case sysAF_INET: 21 return "inet4" 22 case sysAF_INET6: 23 return "inet6" 24 default: 25 return fmt.Sprintf("%d", af) 26 } 27 } 28 29 const hexDigit = "0123456789abcdef" 30 31 type llAddr []byte 32 33 func (a llAddr) String() string { 34 if len(a) == 0 { 35 return "" 36 } 37 buf := make([]byte, 0, len(a)*3-1) 38 for i, b := range a { 39 if i > 0 { 40 buf = append(buf, ':') 41 } 42 buf = append(buf, hexDigit[b>>4]) 43 buf = append(buf, hexDigit[b&0xF]) 44 } 45 return string(buf) 46 } 47 48 type ipAddr []byte 49 50 func (a ipAddr) String() string { 51 if len(a) == 0 { 52 return "<nil>" 53 } 54 if len(a) == 4 { 55 return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3]) 56 } 57 if len(a) == 16 { 58 return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]) 59 } 60 s := make([]byte, len(a)*2) 61 for i, tn := range a { 62 s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf] 63 } 64 return string(s) 65 } 66 67 func (a *Inet4Addr) String() string { 68 return fmt.Sprintf("(%s %s %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen) 69 } 70 71 func (a *Inet6Addr) String() string { 72 return fmt.Sprintf("(%s %s %d %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen, a.ZoneID) 73 } 74 75 type addrPack struct { 76 af int 77 as []Addr 78 } 79 80 func addrPacks() ([]addrPack, error) { 81 var aps []addrPack 82 for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { 83 as, err := Addrs(af, "") 84 if err != nil { 85 return nil, err 86 } 87 aps = append(aps, addrPack{af: af, as: as}) 88 } 89 return aps, nil 90 } 91 92 func TestAddrs(t *testing.T) { 93 aps, err := addrPacks() 94 if len(aps) == 0 && err != nil { 95 t.Fatal(err) 96 } 97 lps, err := linkPacks() 98 if len(lps) == 0 && err != nil { 99 t.Fatal(err) 100 } 101 for _, lp := range lps { 102 n := 0 103 for _, ll := range lp.lls { 104 as, err := Addrs(lp.af, ll.Name) 105 if err != nil { 106 t.Fatal(lp.af, ll.Name, err) 107 } 108 t.Logf("af=%s name=%s %v", addrFamily(lp.af), ll.Name, as) 109 n += len(as) 110 } 111 for _, ap := range aps { 112 if ap.af != lp.af { 113 continue 114 } 115 if n != len(ap.as) { 116 t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(ap.as)) 117 continue 118 } 119 } 120 } 121 } 122