Skip to content
This repository was archived by the owner on Sep 18, 2020. It is now read-only.

Commit 2134fce

Browse files
committed
digitalocean: Add tests for network unit generation
1 parent 3abd6b2 commit 2134fce

File tree

1 file changed

+367
-0
lines changed

1 file changed

+367
-0
lines changed

network/digitalocean_test.go

Lines changed: 367 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,367 @@
1+
package network
2+
3+
import (
4+
"errors"
5+
"net"
6+
"reflect"
7+
"testing"
8+
9+
"github.com/coreos/coreos-cloudinit/datasource/metadata/digitalocean"
10+
)
11+
12+
func TestParseNameservers(t *testing.T) {
13+
for _, tt := range []struct {
14+
dns digitalocean.DNS
15+
nss []net.IP
16+
err error
17+
}{
18+
{
19+
dns: digitalocean.DNS{},
20+
nss: []net.IP{},
21+
},
22+
{
23+
dns: digitalocean.DNS{[]string{"1.2.3.4"}},
24+
nss: []net.IP{net.ParseIP("1.2.3.4")},
25+
},
26+
{
27+
dns: digitalocean.DNS{[]string{"bad"}},
28+
err: errors.New("could not parse \"bad\" as nameserver IP address"),
29+
},
30+
} {
31+
nss, err := parseNameservers(tt.dns)
32+
if !errorsEqual(tt.err, err) {
33+
t.Fatalf("bad error (%+v): want %q, got %q", tt.dns, tt.err, err)
34+
}
35+
if !reflect.DeepEqual(tt.nss, nss) {
36+
t.Fatalf("bad nameservers (%+v): want %#v, got %#v", tt.dns, tt.nss, nss)
37+
}
38+
}
39+
}
40+
41+
func TestParseInterface(t *testing.T) {
42+
for _, tt := range []struct {
43+
cfg digitalocean.Interface
44+
nss []net.IP
45+
useRoute bool
46+
iface *logicalInterface
47+
err error
48+
}{
49+
{
50+
cfg: digitalocean.Interface{
51+
MAC: "bad",
52+
},
53+
err: errors.New("invalid MAC address: bad"),
54+
},
55+
{
56+
cfg: digitalocean.Interface{
57+
MAC: "01:23:45:67:89:AB",
58+
},
59+
nss: []net.IP{},
60+
iface: &logicalInterface{
61+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
62+
config: configMethodStatic{
63+
addresses: []net.IPNet{},
64+
nameservers: []net.IP{},
65+
routes: []route{},
66+
},
67+
},
68+
},
69+
{
70+
cfg: digitalocean.Interface{
71+
MAC: "01:23:45:67:89:AB",
72+
},
73+
useRoute: true,
74+
nss: []net.IP{net.ParseIP("1.2.3.4")},
75+
iface: &logicalInterface{
76+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
77+
config: configMethodStatic{
78+
addresses: []net.IPNet{},
79+
nameservers: []net.IP{net.ParseIP("1.2.3.4")},
80+
routes: []route{},
81+
},
82+
},
83+
},
84+
{
85+
cfg: digitalocean.Interface{
86+
MAC: "01:23:45:67:89:AB",
87+
IPv4: &digitalocean.Address{
88+
IPAddress: "bad",
89+
Netmask: "255.255.0.0",
90+
},
91+
},
92+
nss: []net.IP{},
93+
err: errors.New("could not parse \"bad\" as IPv4 address"),
94+
},
95+
{
96+
cfg: digitalocean.Interface{
97+
MAC: "01:23:45:67:89:AB",
98+
IPv4: &digitalocean.Address{
99+
IPAddress: "1.2.3.4",
100+
Netmask: "bad",
101+
},
102+
},
103+
nss: []net.IP{},
104+
err: errors.New("could not parse \"bad\" as IPv4 mask"),
105+
},
106+
{
107+
cfg: digitalocean.Interface{
108+
MAC: "01:23:45:67:89:AB",
109+
IPv4: &digitalocean.Address{
110+
IPAddress: "1.2.3.4",
111+
Netmask: "255.255.0.0",
112+
Gateway: "ignoreme",
113+
},
114+
},
115+
nss: []net.IP{},
116+
iface: &logicalInterface{
117+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
118+
config: configMethodStatic{
119+
addresses: []net.IPNet{net.IPNet{net.ParseIP("1.2.3.4"), net.IPMask(net.ParseIP("255.255.0.0"))}},
120+
nameservers: []net.IP{},
121+
routes: []route{},
122+
},
123+
},
124+
},
125+
{
126+
cfg: digitalocean.Interface{
127+
MAC: "01:23:45:67:89:AB",
128+
IPv4: &digitalocean.Address{
129+
IPAddress: "1.2.3.4",
130+
Netmask: "255.255.0.0",
131+
Gateway: "bad",
132+
},
133+
},
134+
useRoute: true,
135+
nss: []net.IP{},
136+
err: errors.New("could not parse \"bad\" as IPv4 gateway"),
137+
},
138+
{
139+
cfg: digitalocean.Interface{
140+
MAC: "01:23:45:67:89:AB",
141+
IPv4: &digitalocean.Address{
142+
IPAddress: "1.2.3.4",
143+
Netmask: "255.255.0.0",
144+
Gateway: "5.6.7.8",
145+
},
146+
},
147+
useRoute: true,
148+
nss: []net.IP{},
149+
iface: &logicalInterface{
150+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
151+
config: configMethodStatic{
152+
addresses: []net.IPNet{net.IPNet{net.ParseIP("1.2.3.4"), net.IPMask(net.ParseIP("255.255.0.0"))}},
153+
nameservers: []net.IP{},
154+
routes: []route{route{net.IPNet{net.IPv4zero, net.IPMask(net.IPv4zero)}, net.ParseIP("5.6.7.8")}},
155+
},
156+
},
157+
},
158+
{
159+
cfg: digitalocean.Interface{
160+
MAC: "01:23:45:67:89:AB",
161+
IPv6: &digitalocean.Address{
162+
IPAddress: "bad",
163+
Cidr: 16,
164+
},
165+
},
166+
nss: []net.IP{},
167+
err: errors.New("could not parse \"bad\" as IPv6 address"),
168+
},
169+
{
170+
cfg: digitalocean.Interface{
171+
MAC: "01:23:45:67:89:AB",
172+
IPv6: &digitalocean.Address{
173+
IPAddress: "fe00::",
174+
Cidr: 16,
175+
Gateway: "ignoreme",
176+
},
177+
},
178+
nss: []net.IP{},
179+
iface: &logicalInterface{
180+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
181+
config: configMethodStatic{
182+
addresses: []net.IPNet{net.IPNet{net.ParseIP("fe00::"), net.IPMask(net.ParseIP("ffff::"))}},
183+
nameservers: []net.IP{},
184+
routes: []route{},
185+
},
186+
},
187+
},
188+
{
189+
cfg: digitalocean.Interface{
190+
MAC: "01:23:45:67:89:AB",
191+
IPv6: &digitalocean.Address{
192+
IPAddress: "fe00::",
193+
Cidr: 16,
194+
Gateway: "bad",
195+
},
196+
},
197+
useRoute: true,
198+
nss: []net.IP{},
199+
err: errors.New("could not parse \"bad\" as IPv6 gateway"),
200+
},
201+
{
202+
cfg: digitalocean.Interface{
203+
MAC: "01:23:45:67:89:AB",
204+
IPv6: &digitalocean.Address{
205+
IPAddress: "fe00::",
206+
Cidr: 16,
207+
Gateway: "fe00:1234::",
208+
},
209+
},
210+
useRoute: true,
211+
nss: []net.IP{},
212+
iface: &logicalInterface{
213+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
214+
config: configMethodStatic{
215+
addresses: []net.IPNet{net.IPNet{net.ParseIP("fe00::"), net.IPMask(net.ParseIP("ffff::"))}},
216+
nameservers: []net.IP{},
217+
routes: []route{route{net.IPNet{net.IPv6zero, net.IPMask(net.IPv6zero)}, net.ParseIP("fe00:1234::")}},
218+
},
219+
},
220+
},
221+
} {
222+
iface, err := parseInterface(tt.cfg, tt.nss, tt.useRoute)
223+
if !errorsEqual(tt.err, err) {
224+
t.Fatalf("bad error (%+v): want %q, got %q", tt.cfg, tt.err, err)
225+
}
226+
if !reflect.DeepEqual(tt.iface, iface) {
227+
t.Fatalf("bad interface (%+v): want %#v, got %#v", tt.cfg, tt.iface, iface)
228+
}
229+
}
230+
}
231+
232+
func TestParseInterfaces(t *testing.T) {
233+
for _, tt := range []struct {
234+
cfg digitalocean.Interfaces
235+
nss []net.IP
236+
ifaces []InterfaceGenerator
237+
err error
238+
}{
239+
{
240+
ifaces: []InterfaceGenerator{},
241+
},
242+
{
243+
cfg: digitalocean.Interfaces{
244+
Public: []digitalocean.Interface{{MAC: "01:23:45:67:89:AB"}},
245+
},
246+
ifaces: []InterfaceGenerator{
247+
&physicalInterface{logicalInterface{
248+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
249+
config: configMethodStatic{
250+
addresses: []net.IPNet{},
251+
nameservers: []net.IP{},
252+
routes: []route{},
253+
},
254+
}},
255+
},
256+
},
257+
{
258+
cfg: digitalocean.Interfaces{
259+
Private: []digitalocean.Interface{{MAC: "01:23:45:67:89:AB"}},
260+
},
261+
ifaces: []InterfaceGenerator{
262+
&physicalInterface{logicalInterface{
263+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
264+
config: configMethodStatic{
265+
addresses: []net.IPNet{},
266+
nameservers: []net.IP{},
267+
routes: []route{},
268+
},
269+
}},
270+
},
271+
},
272+
{
273+
cfg: digitalocean.Interfaces{
274+
Public: []digitalocean.Interface{{MAC: "01:23:45:67:89:AB"}},
275+
},
276+
nss: []net.IP{net.ParseIP("1.2.3.4")},
277+
ifaces: []InterfaceGenerator{
278+
&physicalInterface{logicalInterface{
279+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
280+
config: configMethodStatic{
281+
addresses: []net.IPNet{},
282+
nameservers: []net.IP{net.ParseIP("1.2.3.4")},
283+
routes: []route{},
284+
},
285+
}},
286+
},
287+
},
288+
{
289+
cfg: digitalocean.Interfaces{
290+
Private: []digitalocean.Interface{{MAC: "01:23:45:67:89:AB"}},
291+
},
292+
nss: []net.IP{net.ParseIP("1.2.3.4")},
293+
ifaces: []InterfaceGenerator{
294+
&physicalInterface{logicalInterface{
295+
hwaddr: net.HardwareAddr([]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
296+
config: configMethodStatic{
297+
addresses: []net.IPNet{},
298+
nameservers: []net.IP{},
299+
routes: []route{},
300+
},
301+
}},
302+
},
303+
},
304+
{
305+
cfg: digitalocean.Interfaces{
306+
Public: []digitalocean.Interface{{MAC: "bad"}},
307+
},
308+
err: errors.New("invalid MAC address: bad"),
309+
},
310+
{
311+
cfg: digitalocean.Interfaces{
312+
Private: []digitalocean.Interface{{MAC: "bad"}},
313+
},
314+
err: errors.New("invalid MAC address: bad"),
315+
},
316+
} {
317+
ifaces, err := parseInterfaces(tt.cfg, tt.nss)
318+
if !errorsEqual(tt.err, err) {
319+
t.Fatalf("bad error (%+v): want %q, got %q", tt.cfg, tt.err, err)
320+
}
321+
if !reflect.DeepEqual(tt.ifaces, ifaces) {
322+
t.Fatalf("bad interfaces (%+v): want %#v, got %#v", tt.cfg, tt.ifaces, ifaces)
323+
}
324+
}
325+
}
326+
327+
func TestProcessDigitalOceanNetconf(t *testing.T) {
328+
for _, tt := range []struct {
329+
cfg string
330+
ifaces []InterfaceGenerator
331+
err error
332+
}{
333+
{
334+
cfg: ``,
335+
},
336+
{
337+
cfg: `{"dns":{"nameservers":["bad"]}}`,
338+
err: errors.New("could not parse \"bad\" as nameserver IP address"),
339+
},
340+
{
341+
cfg: `{"interfaces":{"public":[{"ipv4":{"ip_address":"bad"}}]}}`,
342+
err: errors.New("could not parse \"bad\" as IPv4 address"),
343+
},
344+
{
345+
cfg: `{}`,
346+
ifaces: []InterfaceGenerator{},
347+
},
348+
} {
349+
ifaces, err := ProcessDigitalOceanNetconf(tt.cfg)
350+
if !errorsEqual(tt.err, err) {
351+
t.Fatalf("bad error (%q): want %q, got %q", tt.cfg, tt.err, err)
352+
}
353+
if !reflect.DeepEqual(tt.ifaces, ifaces) {
354+
t.Fatalf("bad interfaces (%q): want %#v, got %#v", tt.cfg, tt.ifaces, ifaces)
355+
}
356+
}
357+
}
358+
359+
func errorsEqual(a, b error) bool {
360+
if a == nil && b == nil {
361+
return true
362+
}
363+
if (a != nil && b == nil) || (a == nil && b != nil) {
364+
return false
365+
}
366+
return (a.Error() == b.Error())
367+
}

0 commit comments

Comments
 (0)