mirror of https://github.com/docker/docs.git
143 lines
4.0 KiB
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)
|
|
}
|