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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
package ztpv4
import (
"testing"
"github.com/insomniacslk/dhcp/dhcpv4"
"github.com/insomniacslk/dhcp/iana"
"github.com/stretchr/testify/require"
)
func TestParseClassIdentifier(t *testing.T) {
tt := []struct {
name string
vc, hostname string
ci []byte // Client Identifier
want *VendorData
fail bool
}{
{name: "empty", fail: true},
{name: "unknownVendor", vc: "VendorX;BFR10K;XX12345", fail: true},
{name: "truncatedVendor", vc: "Arista;1234", fail: true},
{
name: "arista",
vc: "Arista;DCS-7050S-64;01.23;JPE12345678",
want: &VendorData{VendorName: "Arista", Model: "DCS-7050S-64", Serial: "JPE12345678"},
},
{
name: "juniper",
vc: "Juniper-ptx1000-DD123",
want: &VendorData{VendorName: "Juniper", Model: "ptx1000", Serial: "DD123"},
},
{
name: "juniperModelDash",
vc: "Juniper-qfx10002-36q-DN817",
want: &VendorData{VendorName: "Juniper", Model: "qfx10002-36q", Serial: "DN817"},
},
{
name: "juniperHostnameSerial",
vc: "Juniper-qfx10008",
hostname: "DE123",
want: &VendorData{VendorName: "Juniper", Model: "qfx10008", Serial: "DE123"},
},
{name: "juniperNoSerial", vc: "Juniper-qfx10008", fail: true},
{
name: "zpe",
vc: "ZPESystems:NSC:001234567",
want: &VendorData{VendorName: "ZPESystems", Model: "NSC", Serial: "001234567"},
},
{
name: "cisco",
vc: "FPR4100",
ci: []byte("JMX2525X0BW"),
want: &VendorData{VendorName: "Cisco Systems", Model: "FPR4100", Serial: "JMX2525X0BW"},
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
packet, err := dhcpv4.New()
if err != nil {
t.Fatalf("failed to creat dhcpv4 packet object: %v", err)
}
if tc.vc != "" {
packet.UpdateOption(dhcpv4.OptClassIdentifier(tc.vc))
}
if tc.hostname != "" {
packet.UpdateOption(dhcpv4.OptHostName(tc.hostname))
}
if tc.ci != nil {
packet.UpdateOption(dhcpv4.OptClientIdentifier(tc.ci))
}
vd, err := ParseVendorData(packet)
if tc.fail {
require.Error(t, err)
} else {
require.NoError(t, err)
require.Equal(t, tc.want, vd)
}
})
}
}
func TestParseVIVC(t *testing.T) {
tt := []struct {
name string
vivc string
entID iana.EntID
want *VendorData
fail bool
}{
{
name: "cisco",
entID: iana.EntIDCiscoSystems,
vivc: "SN:0;PID:R-IOSXRV9000-CC",
want: &VendorData{VendorName: "Cisco Systems", Model: "R-IOSXRV9000-CC", Serial: "0"},
},
{
name: "ciscoMultipleColonDelimiters",
entID: iana.EntIDCiscoSystems,
vivc: "SN:0:123;PID:R-IOSXRV9000-CC:456",
fail: true,
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
packet, err := dhcpv4.New()
if err != nil {
t.Fatalf("failed to creat dhcpv4 packet object: %v", err)
}
if tc.vivc != "" {
vivc := dhcpv4.VIVCIdentifier{EntID: uint32(tc.entID), Data: []byte(tc.vivc)}
packet.UpdateOption(dhcpv4.OptVIVC(vivc))
}
vd, err := ParseVendorData(packet)
if tc.fail {
require.Error(t, err)
} else {
require.NoError(t, err)
require.Equal(t, tc.want, vd)
}
})
}
}
|