Skip to content

Commit

Permalink
Merge pull request #70 from Code-Hex/add/available-version-tests
Browse files Browse the repository at this point in the history
added available version tests
  • Loading branch information
Code-Hex authored Oct 13, 2022
2 parents 6ebd576 + b9afd31 commit abb2ab4
Show file tree
Hide file tree
Showing 8 changed files with 312 additions and 115 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/compile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ jobs:
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go }}
- name: Unit Test
run: go test ./...
- name: Build
run: cd example/linux && make
- name: vet
Expand Down
17 changes: 5 additions & 12 deletions configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,12 @@ type VirtualMachineConfiguration struct {

// NewVirtualMachineConfiguration creates a new configuration.
//
// - bootLoader parameter is used when the virtual machine starts.
// - cpu parameter is The number of CPUs must be a value between
// - bootLoader parameter is used when the virtual machine starts.
// - cpu parameter is The number of CPUs must be a value between
// VZVirtualMachineConfiguration.minimumAllowedCPUCount and VZVirtualMachineConfiguration.maximumAllowedCPUCount.
// - memorySize parameter represents memory size in bytes.
// The memory size must be a multiple of a 1 megabyte (1024 * 1024 bytes) between
// VZVirtualMachineConfiguration.minimumAllowedMemorySize and VZVirtualMachineConfiguration.maximumAllowedMemorySize.
// - memorySize parameter represents memory size in bytes.
// The memory size must be a multiple of a 1 megabyte (1024 * 1024 bytes) between
// VZVirtualMachineConfiguration.minimumAllowedMemorySize and VZVirtualMachineConfiguration.maximumAllowedMemorySize.
//
// This is only supported on macOS 11 and newer, ErrUnsupportedOSVersion will
// be returned on older versions.
Expand Down Expand Up @@ -72,14 +72,7 @@ func NewVirtualMachineConfiguration(bootLoader BootLoader, cpu uint, memorySize
//
// Return true if the configuration is valid.
// If error is not nil, assigned with the validation error if the validation failed.
//
// This is only supported on macOS 11 and newer, ErrUnsupportedOSVersion will
// be returned on older versions.
func (v *VirtualMachineConfiguration) Validate() (bool, error) {
if macosMajorVersionLessThan(11) {
return false, ErrUnsupportedOSVersion
}

nserr := newNSErrorAsNil()
nserrPtr := nserr.Ptr()
ret := C.validateVZVirtualMachineConfiguration(v.Ptr(), &nserrPtr)
Expand Down
37 changes: 37 additions & 0 deletions osversion.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package vz

import (
"strconv"
"strings"
"sync"
"syscall"
)

func macosMajorVersionLessThan(major int) bool {
return macOSMajorVersion() < major
}

var (
majorVersion int
majorVersionOnce interface{ Do(func()) } = &sync.Once{}
)

// This can be replaced in the test code to enable mock.
// It will not be changed in production.
var fetchMajorVersion = func() {
osver, err := syscall.Sysctl("kern.osproductversion")
if err != nil {
panic(err)
}
osverArray := strings.Split(osver, ".")
major, err := strconv.Atoi(osverArray[0])
if err != nil {
panic(err)
}
majorVersion = major
}

func macOSMajorVersion() int {
majorVersionOnce.Do(fetchMajorVersion)
return majorVersion
}
71 changes: 71 additions & 0 deletions osversion_arm64_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package vz

import (
"context"
"errors"
"sync"
"testing"
)

func TestAvailableVersionArm64(t *testing.T) {
majorVersionOnce = &nopDoer{}
defer func() {
majorVersion = 0
majorVersionOnce = &sync.Once{}
}()
t.Run("macOS 12", func(t *testing.T) {
majorVersion = 11
cases := map[string]func() error{
"NewMacOSBootLoader": func() error {
_, err := NewMacOSBootLoader()
return err
},
"NewMacGraphicsDeviceConfiguration": func() error {
_, err := NewMacGraphicsDeviceConfiguration()
return err
},
"NewMacGraphicsDisplayConfiguration": func() error {
_, err := NewMacGraphicsDisplayConfiguration(0, 0, 0)
return err
},
"NewMacPlatformConfiguration": func() error {
_, err := NewMacPlatformConfiguration()
return err
},
"NewMacHardwareModelWithData": func() error {
_, err := NewMacHardwareModelWithData(nil)
return err
},
"NewMacMachineIdentifierWithData": func() error {
_, err := NewMacMachineIdentifierWithData(nil)
return err
},
"NewMacMachineIdentifier": func() error {
_, err := NewMacMachineIdentifier()
return err
},
"NewMacAuxiliaryStorage": func() error {
_, err := NewMacAuxiliaryStorage("")
return err
},
"FetchLatestSupportedMacOSRestoreImage": func() error {
_, err := FetchLatestSupportedMacOSRestoreImage(context.Background(), "")
return err
},
"LoadMacOSRestoreImageFromPath": func() error {
_, err := LoadMacOSRestoreImageFromPath("")
return err
},
"NewMacOSInstaller": func() error {
_, err := NewMacOSInstaller(nil, "")
return err
},
}
for name, fn := range cases {
err := fn()
if !errors.Is(err, ErrUnsupportedOSVersion) {
t.Fatalf("unexpected error %v in %s", err, name)
}
}
})
}
165 changes: 165 additions & 0 deletions osversion_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
package vz

import (
"errors"
"sync"
"testing"
)

type nopDoer struct{}

func (*nopDoer) Do(func()) {}

func TestAvailableVersion(t *testing.T) {
majorVersionOnce = &nopDoer{}
defer func() {
majorVersion = 0
majorVersionOnce = &sync.Once{}
}()

t.Run("macOS 11", func(t *testing.T) {
majorVersion = 10
cases := map[string]func() error{
"NewLinuxBootLoader": func() error {
_, err := NewLinuxBootLoader("")
return err
},
"NewVirtualMachineConfiguration": func() error {
_, err := NewVirtualMachineConfiguration(nil, 0, 0)
return err
},
"NewFileHandleSerialPortAttachment": func() error {
_, err := NewFileHandleSerialPortAttachment(nil, nil)
return err
},
"NewFileSerialPortAttachment": func() error {
_, err := NewFileSerialPortAttachment("", false)
return err
},
"NewVirtioConsoleDeviceSerialPortConfiguration": func() error {
_, err := NewVirtioConsoleDeviceSerialPortConfiguration(nil)
return err
},
"NewVirtioEntropyDeviceConfiguration": func() error {
_, err := NewVirtioEntropyDeviceConfiguration()
return err
},
"NewVirtioTraditionalMemoryBalloonDeviceConfiguration": func() error {
_, err := NewVirtioTraditionalMemoryBalloonDeviceConfiguration()
return err
},
"NewNATNetworkDeviceAttachment": func() error {
_, err := NewNATNetworkDeviceAttachment()
return err
},
"NewBridgedNetworkDeviceAttachment": func() error {
_, err := NewBridgedNetworkDeviceAttachment(nil)
return err
},
"NewFileHandleNetworkDeviceAttachment": func() error {
_, err := NewFileHandleNetworkDeviceAttachment(nil)
return err
},
"NewVirtioNetworkDeviceConfiguration": func() error {
_, err := NewVirtioNetworkDeviceConfiguration(nil)
return err
},
"NewMACAddress": func() error {
_, err := NewMACAddress(nil)
return err
},
"NewRandomLocallyAdministeredMACAddress": func() error {
_, err := NewRandomLocallyAdministeredMACAddress()
return err
},
"NewVirtioSocketDeviceConfiguration": func() error {
_, err := NewVirtioSocketDeviceConfiguration()
return err
},
"NewVirtioSocketListener": func() error {
_, err := NewVirtioSocketListener(nil)
return err
},
"NewDiskImageStorageDeviceAttachment": func() error {
_, err := NewDiskImageStorageDeviceAttachment("", false)
return err
},
"NewVirtioBlockDeviceConfiguration": func() error {
_, err := NewVirtioBlockDeviceConfiguration(nil)
return err
},
"NewVirtualMachine": func() error {
_, err := NewVirtualMachine(nil)
return err
},
}
for name, fn := range cases {
err := fn()
if !errors.Is(err, ErrUnsupportedOSVersion) {
t.Fatalf("unexpected error %v in %s", err, name)
}
}
})

t.Run("macOS 12", func(t *testing.T) {
majorVersion = 11
cases := map[string]func() error{
"NewVirtioSoundDeviceConfiguration": func() error {
_, err := NewVirtioSoundDeviceConfiguration()
return err
},
"NewVirtioSoundDeviceHostInputStreamConfiguration": func() error {
_, err := NewVirtioSoundDeviceHostInputStreamConfiguration()
return err
},
"NewVirtioSoundDeviceHostOutputStreamConfiguration": func() error {
_, err := NewVirtioSoundDeviceHostOutputStreamConfiguration()
return err
},
"NewUSBKeyboardConfiguration": func() error {
_, err := NewUSBKeyboardConfiguration()
return err
},
"NewGenericPlatformConfiguration": func() error {
_, err := NewGenericPlatformConfiguration()
return err
},
"NewUSBScreenCoordinatePointingDeviceConfiguration": func() error {
_, err := NewUSBScreenCoordinatePointingDeviceConfiguration()
return err
},
"NewVirtioFileSystemDeviceConfiguration": func() error {
_, err := NewVirtioFileSystemDeviceConfiguration("")
return err
},
"NewSharedDirectory": func() error {
_, err := NewSharedDirectory("", false)
return err
},
"NewSingleDirectoryShare": func() error {
_, err := NewSingleDirectoryShare(nil)
return err
},
"NewMultipleDirectoryShare": func() error {
_, err := NewMultipleDirectoryShare(nil)
return err
},
"(*VirtualMachine).Stop": func() error {
var err error
(*VirtualMachine)(nil).Stop(func(e error) {
err = e
})
return err
},
"(*VirtualMachine).StartGraphicApplication": func() error {
return (*VirtualMachine)(nil).StartGraphicApplication(0, 0)
},
}
for name, fn := range cases {
err := fn()
if !errors.Is(err, ErrUnsupportedOSVersion) {
t.Fatalf("unexpected error %v in %s", err, name)
}
}
})
}
14 changes: 10 additions & 4 deletions shared_folder.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,10 @@ type SingleDirectoryShare struct {
}

// NewSingleDirectoryShare creates a new single directory share.
func NewSingleDirectoryShare(share *SharedDirectory) *SingleDirectoryShare {
func NewSingleDirectoryShare(share *SharedDirectory) (*SingleDirectoryShare, error) {
if macosMajorVersionLessThan(12) {
return nil, ErrUnsupportedOSVersion
}
config := &SingleDirectoryShare{
pointer: pointer{
ptr: C.newVZSingleDirectoryShare(share.Ptr()),
Expand All @@ -112,7 +115,7 @@ func NewSingleDirectoryShare(share *SharedDirectory) *SingleDirectoryShare {
runtime.SetFinalizer(config, func(self *SingleDirectoryShare) {
self.Release()
})
return config
return config, nil
}

// MultipleDirectoryShare defines the directory share for multiple directories.
Expand All @@ -123,7 +126,10 @@ type MultipleDirectoryShare struct {
}

// NewMultipleDirectoryShare creates a new multiple directories share.
func NewMultipleDirectoryShare(shares map[string]*SharedDirectory) *MultipleDirectoryShare {
func NewMultipleDirectoryShare(shares map[string]*SharedDirectory) (*MultipleDirectoryShare, error) {
if macosMajorVersionLessThan(12) {
return nil, ErrUnsupportedOSVersion
}
directories := make(map[string]NSObject, len(shares))
for k, v := range shares {
directories[k] = v
Expand All @@ -139,5 +145,5 @@ func NewMultipleDirectoryShare(shares map[string]*SharedDirectory) *MultipleDire
runtime.SetFinalizer(config, func(self *SingleDirectoryShare) {
self.Release()
})
return config
return config, nil
}
Loading

0 comments on commit abb2ab4

Please sign in to comment.