forked from hashicorp/go-sockaddr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ifattr_test.go
112 lines (103 loc) · 2.69 KB
/
ifattr_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package sockaddr_test
import (
"testing"
sockaddr "github.com/hashicorp/go-sockaddr"
)
func TestIfAttr_net(t *testing.T) {
ifAddrs, err := sockaddr.GetAllInterfaces()
if err != nil {
t.Fatalf("Unable to proceed: %v", err)
}
for _, ifAddr := range ifAddrs {
testSockAddrAttr(t, ifAddr)
}
}
func TestIfAttr_unix(t *testing.T) {
newUnixSock := func(path string) sockaddr.UnixSock {
sa, err := sockaddr.NewUnixSock(path)
if err != nil {
t.Fatalf("unable to create new unix socket: %v", err)
}
return sa
}
unixSockets := []sockaddr.SockAddr{
newUnixSock("/tmp/test"),
}
for _, sa := range unixSockets {
testSockAddrAttr(t, sa)
}
}
func testSockAddrAttr(t *testing.T, sai interface{}) {
attrNamesPerType := []struct {
name sockaddr.AttrName
ipv4Pass bool
ipv6Pass bool
unixPass bool
}{
// Universal
{"type", true, true, true},
{"string", true, true, true},
// IP
{"name", true, true, false},
{"size", true, true, false},
{"flags", true, true, false},
{"host", true, true, false},
{"address", true, true, false},
{"port", true, true, false},
{"netmask", true, true, false},
{"network", true, true, false},
{"mask_bits", true, true, false},
{"binary", true, true, false},
{"hex", true, true, false},
{"first_usable", true, true, false},
{"last_usable", true, true, false},
{"octets", true, true, false},
// IPv4
{"broadcast", true, false, false},
{"uint32", true, false, false},
// IPv6
{"uint128", false, true, false},
// Unix
{"path", false, false, true},
}
for _, attrTest := range attrNamesPerType {
switch v := sai.(type) {
case sockaddr.IfAddr:
saType := v.Type()
_, err := v.Attr(attrTest.name)
switch saType {
case sockaddr.TypeIPv4:
if err == nil && attrTest.ipv4Pass || err != nil && !attrTest.ipv4Pass {
// pass
}
// fallthrough
case sockaddr.TypeIPv6:
if err == nil && attrTest.ipv6Pass || err != nil && !attrTest.ipv6Pass {
// pass
}
// fallthrough
case sockaddr.TypeUnix:
if err == nil && attrTest.unixPass || err != nil && !attrTest.unixPass {
// pass
}
// fallthrough
default:
t.Errorf("Unable to fetch attr name %q: %v", attrTest.name, err)
}
case sockaddr.SockAddr:
val, err := sockaddr.Attr(v, attrTest.name)
_ = err
pass := len(val) > 0
switch {
case v.Type() == sockaddr.TypeIPv4 && attrTest.ipv4Pass == pass,
v.Type() == sockaddr.TypeIPv6 && attrTest.ipv6Pass == pass,
v.Type() == sockaddr.TypeUnix && attrTest.unixPass == pass:
// pass
default:
t.Errorf("Unable to fetch attr name %q from %v / %v + %+q", attrTest.name, v, v.Type(), val)
}
default:
t.Fatalf("unsupported type %T %v", sai, sai)
}
}
}