diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 5a0ddfb..24b6013 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -27,6 +27,7 @@ jobs: fail-fast: false matrix: os: + - macOS-11 - macOS-12 go: - 1.17 diff --git a/error_test.go b/error_test.go deleted file mode 100644 index 95369cf..0000000 --- a/error_test.go +++ /dev/null @@ -1,12 +0,0 @@ -package vz - -import ( - "testing" -) - -func TestNonExistingFileSerialPortAttachment(t *testing.T) { - _, err := NewFileSerialPortAttachment("/non/existing/path", false) - if err == nil { - t.Error("NewFileSerialPortAttachment should have returned an error") - } -} diff --git a/issues_test.go b/issues_test.go new file mode 100644 index 0000000..b36ba18 --- /dev/null +++ b/issues_test.go @@ -0,0 +1,63 @@ +package vz + +import ( + "os" + "testing" +) + +func TestIssue50(t *testing.T) { + f, err := os.CreateTemp("", "vmlinuz") + if err != nil { + t.Fatal(err) + } + defer f.Close() + + bootloader, err := NewLinuxBootLoader(f.Name()) + if err != nil { + t.Fatal(err) + } + config, err := NewVirtualMachineConfiguration(bootloader, 1, 1024*1024*1024) + if err != nil { + t.Fatal(err) + } + ok, err := config.Validate() + if err != nil { + t.Fatal(err) + } + if !ok { + t.Fatal("failed to validate config") + } + m, err := NewVirtualMachine(config) + if err != nil { + t.Fatal(err) + } + + t.Run("check for segmentation faults", func(t *testing.T) { + cases := map[string]func(){ + "start handler": func() { + m.Start(func(err error) { _ = err == nil }) + }, + "pause handler": func() { + m.Pause(func(err error) { _ = err == nil }) + }, + "resume handler": func() { + m.Resume(func(err error) { _ = err == nil }) + }, + "stop handler": func() { + m.Stop(func(err error) { _ = err == nil }) + }, + } + for name, run := range cases { + t.Run(name, func(t *testing.T) { + run() + }) + } + }) +} + +func TestIssue71(t *testing.T) { + _, err := NewFileSerialPortAttachment("/non/existing/path", false) + if err == nil { + t.Error("NewFileSerialPortAttachment should have returned an error") + } +} diff --git a/virtualization.h b/virtualization.h index 04bad6a..d44ce35 100644 --- a/virtualization.h +++ b/virtualization.h @@ -6,7 +6,6 @@ #pragma once -#import "virtualization_raise.h" #import #import diff --git a/virtualization.m b/virtualization.m index 63fc5ef..4eedef3 100644 --- a/virtualization.m +++ b/virtualization.m @@ -5,6 +5,7 @@ // #import "virtualization.h" +#import "virtualization_helper.h" #import "virtualization_view.h" char *copyCString(NSString *nss) @@ -1059,14 +1060,23 @@ bool requestStopVirtualMachine(void *machine, void *queue, void **error) return queue; } +typedef void (^vm_completion_handler_t)(NSError *); + +vm_completion_handler_t makeVMCompletionHandler(void *completionHandler) +{ + return Block_copy(^(NSError *err) { + virtualMachineCompletionHandler(completionHandler, err); + }); +} + void startWithCompletionHandler(void *machine, void *queue, void *completionHandler) { if (@available(macOS 11, *)) { + vm_completion_handler_t handler = makeVMCompletionHandler(completionHandler); dispatch_sync((dispatch_queue_t)queue, ^{ - [(VZVirtualMachine *)machine startWithCompletionHandler:^(NSError *err) { - virtualMachineCompletionHandler(completionHandler, err); - }]; + [(VZVirtualMachine *)machine startWithCompletionHandler:handler]; }); + Block_release(handler); return; } @@ -1076,11 +1086,11 @@ void startWithCompletionHandler(void *machine, void *queue, void *completionHand void pauseWithCompletionHandler(void *machine, void *queue, void *completionHandler) { if (@available(macOS 11, *)) { + vm_completion_handler_t handler = makeVMCompletionHandler(completionHandler); dispatch_sync((dispatch_queue_t)queue, ^{ - [(VZVirtualMachine *)machine pauseWithCompletionHandler:^(NSError *err) { - virtualMachineCompletionHandler(completionHandler, err); - }]; + [(VZVirtualMachine *)machine pauseWithCompletionHandler:handler]; }); + Block_release(handler); return; } @@ -1090,11 +1100,11 @@ void pauseWithCompletionHandler(void *machine, void *queue, void *completionHand void resumeWithCompletionHandler(void *machine, void *queue, void *completionHandler) { if (@available(macOS 11, *)) { + vm_completion_handler_t handler = makeVMCompletionHandler(completionHandler); dispatch_sync((dispatch_queue_t)queue, ^{ - [(VZVirtualMachine *)machine resumeWithCompletionHandler:^(NSError *err) { - virtualMachineCompletionHandler(completionHandler, err); - }]; + [(VZVirtualMachine *)machine resumeWithCompletionHandler:handler]; }); + Block_release(handler); return; } @@ -1104,11 +1114,11 @@ void resumeWithCompletionHandler(void *machine, void *queue, void *completionHan void stopWithCompletionHandler(void *machine, void *queue, void *completionHandler) { if (@available(macOS 12, *)) { + vm_completion_handler_t handler = makeVMCompletionHandler(completionHandler); dispatch_sync((dispatch_queue_t)queue, ^{ - [(VZVirtualMachine *)machine stopWithCompletionHandler:^(NSError *err) { - virtualMachineCompletionHandler(completionHandler, err); - }]; + [(VZVirtualMachine *)machine stopWithCompletionHandler:handler]; }); + Block_release(handler); return; } diff --git a/virtualization_arm64.m b/virtualization_arm64.m index d7860b9..73d5982 100644 --- a/virtualization_arm64.m +++ b/virtualization_arm64.m @@ -1,6 +1,6 @@ #ifdef __arm64__ #import "virtualization_arm64.h" -#import "virtualization_raise.h" +#import "virtualization_helper.h" @implementation ProgressObserver - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; diff --git a/virtualization_debug.m b/virtualization_debug.m index 06fc86b..67fe356 100644 --- a/virtualization_debug.m +++ b/virtualization_debug.m @@ -5,7 +5,7 @@ // #import "virtualization_debug.h" -#import "virtualization_raise.h" +#import "virtualization_helper.h" /*! @abstract Create a VZGDBDebugStubConfiguration with debug port for GDB server. diff --git a/virtualization_raise.h b/virtualization_helper.h similarity index 100% rename from virtualization_raise.h rename to virtualization_helper.h