1 package net
2
3 import (
4 "testing"
5
6 assert "github.com/stretchr/testify/require"
7 )
8
9 const (
10 netstatTruncated = `Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes Coll Drop
11 lo0 16384 <Link#1> 31241 0 3769823 31241 0 3769823 0 0
12 lo0 16384 ::1/128 ::1 31241 - 3769823 31241 - 3769823 - -
13 lo0 16384 127 127.0.0.1 31241 - 3769823 31241 - 3769823 - -
14 lo0 16384 fe80::1%lo0 fe80:1::1 31241 - 3769823 31241 - 3769823 - -
15 gif0* 1280 <Link#2> 0 0 0 0 0 0 0 0
16 stf0* 1280 <Link#3> 0 0 0 0 0 0 0 0
17 utun8 1500 <Link#88> 286 0 27175 0 0 0 0 0
18 utun8 1500 <Link#90> 286 0 29554 0 0 0 0 0
19 utun8 1500 <Link#92> 286 0 29244 0 0 0 0 0
20 utun8 1500 <Link#93> 286 0 28267 0 0 0 0 0
21 utun8 1500 <Link#95> 286 0 28593 0 0 0 0 0`
22 netstatNotTruncated = `Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes Coll Drop
23 lo0 16384 <Link#1> 27190978 0 12824763793 27190978 0 12824763793 0 0
24 lo0 16384 ::1/128 ::1 27190978 - 12824763793 27190978 - 12824763793 - -
25 lo0 16384 127 127.0.0.1 27190978 - 12824763793 27190978 - 12824763793 - -
26 lo0 16384 fe80::1%lo0 fe80:1::1 27190978 - 12824763793 27190978 - 12824763793 - -
27 gif0* 1280 <Link#2> 0 0 0 0 0 0 0 0
28 stf0* 1280 <Link#3> 0 0 0 0 0 0 0 0
29 en0 1500 <Link#4> a8:66:7f:dd:ee:ff 5708989 0 7295722068 3494252 0 379533492 0 230
30 en0 1500 fe80::aa66: fe80:4::aa66:7fff 5708989 - 7295722068 3494252 - 379533492 - -`
31 )
32
33 func TestParseNetstatLineHeader(t *testing.T) {
34 stat, linkIkd, err := parseNetstatLine(`Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes Coll Drop`)
35 assert.Nil(t, linkIkd)
36 assert.Nil(t, stat)
37 assert.Error(t, err)
38 assert.Equal(t, errNetstatHeader, err)
39 }
40
41 func assertLoopbackStat(t *testing.T, err error, stat *IOCountersStat) {
42 assert.NoError(t, err)
43 assert.Equal(t, uint64(869107), stat.PacketsRecv)
44 assert.Equal(t, uint64(0), stat.Errin)
45 assert.Equal(t, uint64(169411755), stat.BytesRecv)
46 assert.Equal(t, uint64(869108), stat.PacketsSent)
47 assert.Equal(t, uint64(1), stat.Errout)
48 assert.Equal(t, uint64(169411756), stat.BytesSent)
49 }
50
51 func TestParseNetstatLineLink(t *testing.T) {
52 stat, linkID, err := parseNetstatLine(
53 `lo0 16384 <Link#1> 869107 0 169411755 869108 1 169411756 0 0`,
54 )
55 assertLoopbackStat(t, err, stat)
56 assert.NotNil(t, linkID)
57 assert.Equal(t, uint(1), *linkID)
58 }
59
60 func TestParseNetstatLineIPv6(t *testing.T) {
61 stat, linkID, err := parseNetstatLine(
62 `lo0 16384 ::1/128 ::1 869107 - 169411755 869108 1 169411756 - -`,
63 )
64 assertLoopbackStat(t, err, stat)
65 assert.Nil(t, linkID)
66 }
67
68 func TestParseNetstatLineIPv4(t *testing.T) {
69 stat, linkID, err := parseNetstatLine(
70 `lo0 16384 127 127.0.0.1 869107 - 169411755 869108 1 169411756 - -`,
71 )
72 assertLoopbackStat(t, err, stat)
73 assert.Nil(t, linkID)
74 }
75
76 func TestParseNetstatOutput(t *testing.T) {
77 nsInterfaces, err := parseNetstatOutput(netstatNotTruncated)
78 assert.NoError(t, err)
79 assert.Len(t, nsInterfaces, 8)
80 for index := range nsInterfaces {
81 assert.NotNil(t, nsInterfaces[index].stat, "Index %d", index)
82 }
83
84 assert.NotNil(t, nsInterfaces[0].linkID)
85 assert.Equal(t, uint(1), *nsInterfaces[0].linkID)
86
87 assert.Nil(t, nsInterfaces[1].linkID)
88 assert.Nil(t, nsInterfaces[2].linkID)
89 assert.Nil(t, nsInterfaces[3].linkID)
90
91 assert.NotNil(t, nsInterfaces[4].linkID)
92 assert.Equal(t, uint(2), *nsInterfaces[4].linkID)
93
94 assert.NotNil(t, nsInterfaces[5].linkID)
95 assert.Equal(t, uint(3), *nsInterfaces[5].linkID)
96
97 assert.NotNil(t, nsInterfaces[6].linkID)
98 assert.Equal(t, uint(4), *nsInterfaces[6].linkID)
99
100 assert.Nil(t, nsInterfaces[7].linkID)
101
102 mapUsage := newMapInterfaceNameUsage(nsInterfaces)
103 assert.False(t, mapUsage.isTruncated())
104 assert.Len(t, mapUsage.notTruncated(), 4)
105 }
106
107 func TestParseNetstatTruncated(t *testing.T) {
108 nsInterfaces, err := parseNetstatOutput(netstatTruncated)
109 assert.NoError(t, err)
110 assert.Len(t, nsInterfaces, 11)
111 for index := range nsInterfaces {
112 assert.NotNil(t, nsInterfaces[index].stat, "Index %d", index)
113 }
114
115 const truncatedIface = "utun8"
116
117 assert.NotNil(t, nsInterfaces[6].linkID)
118 assert.Equal(t, uint(88), *nsInterfaces[6].linkID)
119 assert.Equal(t, truncatedIface, nsInterfaces[6].stat.Name)
120
121 assert.NotNil(t, nsInterfaces[7].linkID)
122 assert.Equal(t, uint(90), *nsInterfaces[7].linkID)
123 assert.Equal(t, truncatedIface, nsInterfaces[7].stat.Name)
124
125 assert.NotNil(t, nsInterfaces[8].linkID)
126 assert.Equal(t, uint(92), *nsInterfaces[8].linkID)
127 assert.Equal(t, truncatedIface, nsInterfaces[8].stat.Name)
128
129 assert.NotNil(t, nsInterfaces[9].linkID)
130 assert.Equal(t, uint(93), *nsInterfaces[9].linkID)
131 assert.Equal(t, truncatedIface, nsInterfaces[9].stat.Name)
132
133 assert.NotNil(t, nsInterfaces[10].linkID)
134 assert.Equal(t, uint(95), *nsInterfaces[10].linkID)
135 assert.Equal(t, truncatedIface, nsInterfaces[10].stat.Name)
136
137 mapUsage := newMapInterfaceNameUsage(nsInterfaces)
138 assert.True(t, mapUsage.isTruncated())
139 assert.Equal(t, 3, len(mapUsage.notTruncated()), "en0, gif0 and stf0")
140 }
141
View as plain text