docs/drivers/virtualbox/vbm_test.go

143 lines
4.0 KiB
Go

package virtualbox
import (
"testing"
"os/exec"
"errors"
"fmt"
"github.com/stretchr/testify/assert"
)
func TestValidCheckVBoxManageVersion(t *testing.T) {
var tests = []struct {
version string
}{
{"5.1"},
{"5.0.8r103449"},
{"5.0"},
{"4.10"},
{"4.3.1"},
}
for _, test := range tests {
err := checkVBoxManageVersion(test.version)
assert.NoError(t, err)
}
}
func TestInvalidCheckVBoxManageVersion(t *testing.T) {
var tests = []struct {
version string
expectedError string
}{
{"3.9", `We support Virtualbox starting with version 5. Your VirtualBox install is "3.9". Please upgrade at https://www.virtualbox.org`},
{"4.0", `We support Virtualbox starting with version 5. Your VirtualBox install is "4.0". Please upgrade at https://www.virtualbox.org`},
{"4.1.1", `We support Virtualbox starting with version 5. Your VirtualBox install is "4.1.1". Please upgrade at https://www.virtualbox.org`},
{"4.2.36-104064", `We support Virtualbox starting with version 5. Your VirtualBox install is "4.2.36-104064". Please upgrade at https://www.virtualbox.org`},
{"X.Y", `We support Virtualbox starting with version 5. Your VirtualBox install is "X.Y". Please upgrade at https://www.virtualbox.org`},
{"", `We support Virtualbox starting with version 5. Your VirtualBox install is "". Please upgrade at https://www.virtualbox.org`},
}
for _, test := range tests {
err := checkVBoxManageVersion(test.version)
assert.EqualError(t, err, test.expectedError)
}
}
func TestVbmOutErr(t *testing.T) {
var cmdRun *exec.Cmd
vBoxManager := NewVBoxManager()
vBoxManager.runCmd = func(cmd *exec.Cmd) error {
cmdRun = cmd
fmt.Fprint(cmd.Stdout, "Printed to StdOut")
fmt.Fprint(cmd.Stderr, "Printed to StdErr")
return nil
}
stdOut, stdErr, err := vBoxManager.vbmOutErr("arg1", "arg2")
assert.Equal(t, []string{vboxManageCmd, "arg1", "arg2"}, cmdRun.Args)
assert.Equal(t, "Printed to StdOut", stdOut)
assert.Equal(t, "Printed to StdErr", stdErr)
assert.NoError(t, err)
}
func TestVbmOutErrError(t *testing.T) {
vBoxManager := NewVBoxManager()
vBoxManager.runCmd = func(cmd *exec.Cmd) error { return errors.New("BUG") }
_, _, err := vBoxManager.vbmOutErr("arg1", "arg2")
assert.EqualError(t, err, "BUG")
}
func TestVbmOutErrNotFound(t *testing.T) {
vBoxManager := NewVBoxManager()
vBoxManager.runCmd = func(cmd *exec.Cmd) error { return &exec.Error{Err: exec.ErrNotFound} }
_, _, err := vBoxManager.vbmOutErr("arg1", "arg2")
assert.Equal(t, ErrVBMNotFound, err)
}
func TestVbmOutErrFailingWithExitStatus(t *testing.T) {
vBoxManager := NewVBoxManager()
vBoxManager.runCmd = func(cmd *exec.Cmd) error {
fmt.Fprint(cmd.Stderr, "error: Unable to run vbox")
return errors.New("exit status BUG")
}
_, _, err := vBoxManager.vbmOutErr("arg1", "arg2", "arg3")
assert.EqualError(t, err, vboxManageCmd+" arg1 arg2 arg3 failed:\nerror: Unable to run vbox")
}
func TestVbmOutErrRetryOnce(t *testing.T) {
var cmdRun *exec.Cmd
var runCount int
vBoxManager := NewVBoxManager()
vBoxManager.runCmd = func(cmd *exec.Cmd) error {
cmdRun = cmd
runCount++
if runCount == 1 {
fmt.Fprint(cmd.Stderr, "error: The object is not ready")
return errors.New("Fail the first time it's called")
}
fmt.Fprint(cmd.Stdout, "Printed to StdOut")
return nil
}
stdOut, stdErr, err := vBoxManager.vbmOutErr("command", "arg")
assert.Equal(t, 2, runCount)
assert.Equal(t, []string{vboxManageCmd, "command", "arg"}, cmdRun.Args)
assert.Equal(t, "Printed to StdOut", stdOut)
assert.Empty(t, stdErr)
assert.NoError(t, err)
}
func TestVbmOutErrRetryMax(t *testing.T) {
var runCount int
vBoxManager := NewVBoxManager()
vBoxManager.runCmd = func(cmd *exec.Cmd) error {
runCount++
fmt.Fprint(cmd.Stderr, "error: The object is not ready")
return errors.New("Always fail")
}
stdOut, stdErr, err := vBoxManager.vbmOutErr("command", "arg")
assert.Equal(t, 5, runCount)
assert.Empty(t, stdOut)
assert.Equal(t, "error: The object is not ready", stdErr)
assert.Error(t, err)
}