Skip to content

Commit 84199a1

Browse files
committed
Improve test coverage
Signed-off-by: David Gageot <david@gageot.net>
1 parent f9979c2 commit 84199a1

File tree

7 files changed

+137
-111
lines changed

7 files changed

+137
-111
lines changed

drivers/virtualbox/disk.go

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package virtualbox
22

3-
import (
4-
"bufio"
5-
"strings"
6-
)
7-
83
type VirtualDisk struct {
94
UUID string
105
Path string
@@ -16,34 +11,19 @@ func getVMDiskInfo(name string, vbox VBoxManager) (*VirtualDisk, error) {
1611
return nil, err
1712
}
1813

19-
return parseDiskInfo(out)
20-
}
21-
22-
func parseDiskInfo(out string) (*VirtualDisk, error) {
2314
disk := &VirtualDisk{}
2415

25-
r := strings.NewReader(out)
26-
s := bufio.NewScanner(r)
27-
for s.Scan() {
28-
line := s.Text()
29-
if line == "" {
30-
continue
31-
}
32-
33-
res := reEqualQuoteLine.FindStringSubmatch(line)
34-
if res == nil {
35-
continue
36-
}
37-
38-
key, val := res[1], res[2]
16+
err = parseKeyValues(out, reEqualQuoteLine, func(key, val string) error {
3917
switch key {
4018
case "SATA-1-0":
4119
disk.Path = val
4220
case "SATA-ImageUUID-1-0":
4321
disk.UUID = val
4422
}
45-
}
46-
if err := s.Err(); err != nil {
23+
24+
return nil
25+
})
26+
if err != nil {
4727
return nil, err
4828
}
4929

drivers/virtualbox/disk_test.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,19 @@ import (
77
"github.com/stretchr/testify/assert"
88
)
99

10-
const (
11-
validDiskInfoText = `
10+
const stdOutDiskInfo = `
1211
storagecontrollerbootable0="on"
1312
"SATA-0-0"="/home/ehazlett/.boot2docker/boot2docker.iso"
1413
"SATA-IsEjected"="off"
1514
"SATA-1-0"="/home/ehazlett/vm/test/disk.vmdk"
1615
"SATA-ImageUUID-1-0"="12345-abcdefg"
1716
"SATA-2-0"="none"
18-
nic1="nat"
19-
`
20-
)
17+
nic1="nat"`
2118

2219
func TestVMDiskInfo(t *testing.T) {
2320
vbox := &VBoxManagerMock{
2421
args: "showvminfo default --machinereadable",
25-
stdOut: validDiskInfoText,
22+
stdOut: stdOutDiskInfo,
2623
}
2724

2825
disk, err := getVMDiskInfo("default", vbox)

drivers/virtualbox/network.go

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package virtualbox
22

33
import (
4-
"bufio"
54
"errors"
65
"fmt"
76
"net"
87
"regexp"
98
"strconv"
10-
"strings"
119
)
1210

1311
const (
@@ -79,19 +77,8 @@ func listHostOnlyNetworks(vbox VBoxManager) (map[string]*hostOnlyNetwork, error)
7977
m := map[string]*hostOnlyNetwork{}
8078
n := &hostOnlyNetwork{}
8179

82-
s := bufio.NewScanner(strings.NewReader(out))
83-
for s.Scan() {
84-
line := s.Text()
85-
if line == "" {
86-
continue
87-
}
88-
89-
res := reColonLine.FindStringSubmatch(line)
90-
if res == nil {
91-
continue
92-
}
93-
94-
switch key, val := res[1], res[2]; key {
80+
err = parseKeyValues(out, reColonLine, func(key, val string) error {
81+
switch key {
9582
case "Name":
9683
n.Name = val
9784
case "GUID":
@@ -107,13 +94,13 @@ func listHostOnlyNetworks(vbox VBoxManager) (map[string]*hostOnlyNetwork, error)
10794
case "IPV6NetworkMaskPrefixLength":
10895
l, err := strconv.ParseUint(val, 10, 8)
10996
if err != nil {
110-
return nil, err
97+
return err
11198
}
11299
n.IPv6.Mask = net.CIDRMask(int(l), net.IPv6len*8)
113100
case "HardwareAddress":
114101
mac, err := net.ParseMAC(val)
115102
if err != nil {
116-
return nil, err
103+
return err
117104
}
118105
n.HwAddr = mac
119106
case "MediumType":
@@ -125,11 +112,13 @@ func listHostOnlyNetworks(vbox VBoxManager) (map[string]*hostOnlyNetwork, error)
125112
m[val] = n
126113
n = &hostOnlyNetwork{}
127114
}
128-
}
129115

130-
if err := s.Err(); err != nil {
116+
return nil
117+
})
118+
if err != nil {
131119
return nil, err
132120
}
121+
133122
return m, nil
134123
}
135124

@@ -247,22 +236,15 @@ func getDHCPServers(vbox VBoxManager) (map[string]*dhcpServer, error) {
247236
if err != nil {
248237
return nil, err
249238
}
250-
s := bufio.NewScanner(strings.NewReader(out))
239+
251240
m := map[string]*dhcpServer{}
252241
dhcp := &dhcpServer{}
253-
for s.Scan() {
254-
line := s.Text()
255-
if line == "" {
256-
m[dhcp.NetworkName] = dhcp
257-
dhcp = &dhcpServer{}
258-
continue
259-
}
260-
res := reColonLine.FindStringSubmatch(line)
261-
if res == nil {
262-
continue
263-
}
264-
switch key, val := res[1], res[2]; key {
242+
243+
err = parseKeyValues(out, reColonLine, func(key, val string) error {
244+
switch key {
265245
case "NetworkName":
246+
dhcp = &dhcpServer{}
247+
m[val] = dhcp
266248
dhcp.NetworkName = val
267249
case "IP":
268250
dhcp.IPv4.IP = net.ParseIP(val)
@@ -275,10 +257,13 @@ func getDHCPServers(vbox VBoxManager) (map[string]*dhcpServer, error) {
275257
case "Enabled":
276258
dhcp.Enabled = (val == "Yes")
277259
}
278-
}
279-
if err := s.Err(); err != nil {
260+
261+
return nil
262+
})
263+
if err != nil {
280264
return nil, err
281265
}
266+
282267
return m, nil
283268
}
284269

drivers/virtualbox/network_test.go

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import (
88
"github.com/stretchr/testify/assert"
99
)
1010

11-
const stdOutOneHostOnlyNetwork = `Name: vboxnet0
11+
const (
12+
stdOutOneHostOnlyNetwork = `
13+
Name: vboxnet0
1214
GUID: 786f6276-656e-4074-8000-0a0027000000
1315
DHCP: Disabled
1416
IPAddress: 192.168.99.1
@@ -21,7 +23,8 @@ Status: Up
2123
VBoxNetworkName: HostInterfaceNetworking-vboxnet0
2224
2325
`
24-
const stdOutTwoHostOnlyNetwork = `Name: vboxnet0
26+
stdOutTwoHostOnlyNetwork = `
27+
Name: vboxnet0
2528
GUID: 786f6276-656e-4074-8000-0a0027000000
2629
DHCP: Disabled
2730
IPAddress: 192.168.99.1
@@ -44,8 +47,23 @@ HardwareAddress: 0a:00:27:00:00:01
4447
MediumType: Ethernet
4548
Status: Up
4649
VBoxNetworkName: HostInterfaceNetworking-vboxnet1
47-
4850
`
51+
stdOutListTwoDHCPServers = `
52+
NetworkName: HostInterfaceNetworking-vboxnet0
53+
IP: 192.168.99.6
54+
NetworkMask: 255.255.255.0
55+
lowerIPAddress: 192.168.99.100
56+
upperIPAddress: 192.168.99.254
57+
Enabled: Yes
58+
59+
NetworkName: HostInterfaceNetworking-vboxnet1
60+
IP: 192.168.99.7
61+
NetworkMask: 255.255.255.0
62+
lowerIPAddress: 192.168.99.100
63+
upperIPAddress: 192.168.99.254
64+
Enabled: No
65+
`
66+
)
4967

5068
// Tests that when we have a host only network which matches our expectations,
5169
// it gets returned correctly.
@@ -223,3 +241,33 @@ func TestFailWithDuplicateHostOnlyNetworks(t *testing.T) {
223241
assert.Nil(t, net)
224242
assert.Equal(t, errDuplicateHostOnlyInterfaceNetworks, err)
225243
}
244+
245+
func TestGetDHCPServers(t *testing.T) {
246+
vbox := &VBoxManagerMock{
247+
args: "list dhcpservers",
248+
stdOut: stdOutListTwoDHCPServers,
249+
}
250+
251+
servers, err := getDHCPServers(vbox)
252+
253+
assert.Equal(t, 2, len(servers))
254+
assert.NoError(t, err)
255+
256+
server, present := servers["HostInterfaceNetworking-vboxnet0"]
257+
assert.True(t, present)
258+
assert.Equal(t, "HostInterfaceNetworking-vboxnet0", server.NetworkName)
259+
assert.Equal(t, "192.168.99.6", server.IPv4.IP.String())
260+
assert.Equal(t, "192.168.99.100", server.LowerIP.String())
261+
assert.Equal(t, "192.168.99.254", server.UpperIP.String())
262+
assert.Equal(t, "ffffff00", server.IPv4.Mask.String())
263+
assert.True(t, server.Enabled)
264+
265+
server, present = servers["HostInterfaceNetworking-vboxnet1"]
266+
assert.True(t, present)
267+
assert.Equal(t, "HostInterfaceNetworking-vboxnet1", server.NetworkName)
268+
assert.Equal(t, "192.168.99.7", server.IPv4.IP.String())
269+
assert.Equal(t, "192.168.99.100", server.LowerIP.String())
270+
assert.Equal(t, "192.168.99.254", server.UpperIP.String())
271+
assert.Equal(t, "ffffff00", server.IPv4.Mask.String())
272+
assert.False(t, server.Enabled)
273+
}

drivers/virtualbox/vbm.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package virtualbox
22

33
import (
4+
"bufio"
45
"bytes"
56
"errors"
67
"fmt"
@@ -83,3 +84,27 @@ func checkVBoxManageVersion(version string) error {
8384

8485
return nil
8586
}
87+
88+
func parseKeyValues(stdOut string, regexp *regexp.Regexp, callback func(key, val string) error) error {
89+
r := strings.NewReader(stdOut)
90+
s := bufio.NewScanner(r)
91+
92+
for s.Scan() {
93+
line := s.Text()
94+
if line == "" {
95+
continue
96+
}
97+
98+
res := regexp.FindStringSubmatch(line)
99+
if res == nil {
100+
continue
101+
}
102+
103+
key, val := res[1], res[2]
104+
if err := callback(key, val); err != nil {
105+
return err
106+
}
107+
}
108+
109+
return s.Err()
110+
}

drivers/virtualbox/vm.go

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
package virtualbox
22

3-
import (
4-
"bufio"
5-
"io"
6-
"strconv"
7-
"strings"
8-
)
3+
import "strconv"
94

105
type VM struct {
116
CPUs int
@@ -18,39 +13,29 @@ func getVMInfo(name string, vbox VBoxManager) (*VM, error) {
1813
return nil, err
1914
}
2015

21-
r := strings.NewReader(out)
22-
return parseVMInfo(r)
23-
}
24-
25-
func parseVMInfo(r io.Reader) (*VM, error) {
26-
s := bufio.NewScanner(r)
2716
vm := &VM{}
28-
for s.Scan() {
29-
line := s.Text()
30-
if line == "" {
31-
continue
32-
}
33-
res := reEqualLine.FindStringSubmatch(line)
34-
if res == nil {
35-
continue
36-
}
37-
switch key, val := res[1], res[2]; key {
17+
18+
err = parseKeyValues(out, reEqualLine, func(key, val string) error {
19+
switch key {
3820
case "cpus":
3921
v, err := strconv.Atoi(val)
4022
if err != nil {
41-
return nil, err
23+
return err
4224
}
4325
vm.CPUs = v
4426
case "memory":
4527
v, err := strconv.Atoi(val)
4628
if err != nil {
47-
return nil, err
29+
return err
4830
}
4931
vm.Memory = v
5032
}
51-
}
52-
if err := s.Err(); err != nil {
33+
34+
return nil
35+
})
36+
if err != nil {
5337
return nil, err
5438
}
39+
5540
return vm, nil
5641
}

0 commit comments

Comments
 (0)