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
7package lif
8
9import (
10	"fmt"
11	"testing"
12)
13
14type addrFamily int
15
16func (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
29const hexDigit = "0123456789abcdef"
30
31type llAddr []byte
32
33func (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
48type ipAddr []byte
49
50func (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
67func (a *Inet4Addr) String() string {
68	return fmt.Sprintf("(%s %s %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen)
69}
70
71func (a *Inet6Addr) String() string {
72	return fmt.Sprintf("(%s %s %d %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen, a.ZoneID)
73}
74
75type addrPack struct {
76	af int
77	as []Addr
78}
79
80func 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
94func 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}
124