Home | History | Annotate | Download | only in lif
      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