github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/golang.org/x/net/lif/address_test.go (about) 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 lastErr error 82 var aps []addrPack 83 for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { 84 as, err := Addrs(af, "") 85 if err != nil { 86 lastErr = err 87 continue 88 } 89 aps = append(aps, addrPack{af: af, as: as}) 90 } 91 return aps, lastErr 92 } 93 94 func TestAddrs(t *testing.T) { 95 aps, err := addrPacks() 96 if len(aps) == 0 && err != nil { 97 t.Fatal(err) 98 } 99 lps, err := linkPacks() 100 if len(lps) == 0 && err != nil { 101 t.Fatal(err) 102 } 103 for _, lp := range lps { 104 n := 0 105 for _, ll := range lp.lls { 106 as, err := Addrs(lp.af, ll.Name) 107 if err != nil { 108 t.Fatal(lp.af, ll.Name, err) 109 } 110 t.Logf("af=%s name=%s %v", addrFamily(lp.af), ll.Name, as) 111 n += len(as) 112 } 113 for _, ap := range aps { 114 if ap.af != lp.af { 115 continue 116 } 117 if n != len(ap.as) { 118 t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(ap.as)) 119 continue 120 } 121 } 122 } 123 }