From 7a7f10201aed9d7de6d421dfe4ff3c87f9ffa73d Mon Sep 17 00:00:00 2001 From: Kei Kamikawa Date: Sat, 29 Oct 2022 11:41:30 +0900 Subject: [PATCH 1/5] introduced stringer command for enum --- linuxrosettaavailability_string.go | 25 ++++++++++++++++ shared_directory_arm64.go | 2 ++ shared_directory_arm64_test.go | 33 +++++++++++++++++++++ virtualization.go | 2 ++ virtualization_test.go | 46 ++++++++++++++++++++++++++++++ virtualmachinestate_string.go | 30 +++++++++++++++++++ 6 files changed, 138 insertions(+) create mode 100644 linuxrosettaavailability_string.go create mode 100644 shared_directory_arm64_test.go create mode 100644 virtualmachinestate_string.go diff --git a/linuxrosettaavailability_string.go b/linuxrosettaavailability_string.go new file mode 100644 index 0000000..8092b60 --- /dev/null +++ b/linuxrosettaavailability_string.go @@ -0,0 +1,25 @@ +// Code generated by "stringer -type=LinuxRosettaAvailability"; DO NOT EDIT. + +package vz + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[LinuxRosettaAvailabilityNotSupported-0] + _ = x[LinuxRosettaAvailabilityNotInstalled-1] + _ = x[LinuxRosettaAvailabilityInstalled-2] +} + +const _LinuxRosettaAvailability_name = "LinuxRosettaAvailabilityNotSupportedLinuxRosettaAvailabilityNotInstalledLinuxRosettaAvailabilityInstalled" + +var _LinuxRosettaAvailability_index = [...]uint8{0, 36, 72, 105} + +func (i LinuxRosettaAvailability) String() string { + if i < 0 || i >= LinuxRosettaAvailability(len(_LinuxRosettaAvailability_index)-1) { + return "LinuxRosettaAvailability(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _LinuxRosettaAvailability_name[_LinuxRosettaAvailability_index[i]:_LinuxRosettaAvailability_index[i+1]] +} diff --git a/shared_directory_arm64.go b/shared_directory_arm64.go index 36c3c4e..1ec4492 100644 --- a/shared_directory_arm64.go +++ b/shared_directory_arm64.go @@ -16,6 +16,8 @@ import ( ) // LinuxRosettaAvailability represents an availability of Rosetta support for Linux binaries. +// +//go:generate stringer -type=LinuxRosettaAvailability type LinuxRosettaAvailability int const ( diff --git a/shared_directory_arm64_test.go b/shared_directory_arm64_test.go new file mode 100644 index 0000000..e2dc889 --- /dev/null +++ b/shared_directory_arm64_test.go @@ -0,0 +1,33 @@ +package vz_test + +import ( + "testing" + + "github.com/Code-Hex/vz/v2" +) + +func TestLinuxRosettaAvailabilityString(t *testing.T) { + cases := []struct { + availability vz.LinuxRosettaAvailability + want string + }{ + { + availability: vz.LinuxRosettaAvailabilityNotSupported, + want: "LinuxRosettaAvailabilityNotSupported", + }, + { + availability: vz.LinuxRosettaAvailabilityNotInstalled, + want: "LinuxRosettaAvailabilityNotInstalled", + }, + { + availability: vz.LinuxRosettaAvailabilityInstalled, + want: "LinuxRosettaAvailabilityInstalled", + }, + } + for _, tc := range cases { + got := tc.availability.String() + if tc.want != got { + t.Fatalf("want %q but got %q", tc.want, got) + } + } +} diff --git a/virtualization.go b/virtualization.go index 83a0953..b8b5437 100644 --- a/virtualization.go +++ b/virtualization.go @@ -23,6 +23,8 @@ func init() { } // VirtualMachineState represents execution state of the virtual machine. +// +//go:generate stringer -type=VirtualMachineState type VirtualMachineState int const ( diff --git a/virtualization_test.go b/virtualization_test.go index a3a1ce9..a84408c 100644 --- a/virtualization_test.go +++ b/virtualization_test.go @@ -321,3 +321,49 @@ func TestStop(t *testing.T) { waitState(t, timeout, vm, vz.VirtualMachineStateStopping) waitState(t, timeout, vm, vz.VirtualMachineStateStopped) } + +func TestVirtualMachineStateString(t *testing.T) { + cases := []struct { + state vz.VirtualMachineState + want string + }{ + { + state: vz.VirtualMachineStateStopped, + want: "VirtualMachineStateStopped", + }, + { + state: vz.VirtualMachineStateRunning, + want: "VirtualMachineStateRunning", + }, + { + state: vz.VirtualMachineStatePaused, + want: "VirtualMachineStatePaused", + }, + { + state: vz.VirtualMachineStateError, + want: "VirtualMachineStateError", + }, + { + state: vz.VirtualMachineStateStarting, + want: "VirtualMachineStateStarting", + }, + { + state: vz.VirtualMachineStatePausing, + want: "VirtualMachineStatePausing", + }, + { + state: vz.VirtualMachineStateResuming, + want: "VirtualMachineStateResuming", + }, + { + state: vz.VirtualMachineStateStopping, + want: "VirtualMachineStateStopping", + }, + } + for _, tc := range cases { + got := tc.state.String() + if tc.want != got { + t.Fatalf("want %q but got %q", tc.want, got) + } + } +} diff --git a/virtualmachinestate_string.go b/virtualmachinestate_string.go new file mode 100644 index 0000000..87c16d5 --- /dev/null +++ b/virtualmachinestate_string.go @@ -0,0 +1,30 @@ +// Code generated by "stringer -type=VirtualMachineState"; DO NOT EDIT. + +package vz + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[VirtualMachineStateStopped-0] + _ = x[VirtualMachineStateRunning-1] + _ = x[VirtualMachineStatePaused-2] + _ = x[VirtualMachineStateError-3] + _ = x[VirtualMachineStateStarting-4] + _ = x[VirtualMachineStatePausing-5] + _ = x[VirtualMachineStateResuming-6] + _ = x[VirtualMachineStateStopping-7] +} + +const _VirtualMachineState_name = "VirtualMachineStateStoppedVirtualMachineStateRunningVirtualMachineStatePausedVirtualMachineStateErrorVirtualMachineStateStartingVirtualMachineStatePausingVirtualMachineStateResumingVirtualMachineStateStopping" + +var _VirtualMachineState_index = [...]uint8{0, 26, 52, 77, 101, 128, 154, 181, 208} + +func (i VirtualMachineState) String() string { + if i < 0 || i >= VirtualMachineState(len(_VirtualMachineState_index)-1) { + return "VirtualMachineState(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _VirtualMachineState_name[_VirtualMachineState_index[i]:_VirtualMachineState_index[i+1]] +} From 360536b4f32cf4844f191d41206560a0214d68ae Mon Sep 17 00:00:00 2001 From: Kei Kamikawa Date: Sat, 29 Oct 2022 11:42:00 +0900 Subject: [PATCH 2/5] fixed Makefile to remove count flag in testing and install stringer command --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a77a4b7..4bd73a3 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ fmt: .PHONY: test test: - go test -exec "go run $(PWD)/cmd/codesign" -count=1 ./... -timeout 60s -v + go test -exec "go run $(PWD)/cmd/codesign" ./... -timeout 60s -v .PHONY: download_kernel download_kernel: @@ -22,6 +22,10 @@ else @mv testdata/bzImage testdata/Image endif +.PHONY: install/stringer +install/stringer: + @go install golang.org/x/tools/cmd/stringer@latest + .PHONY: clean clean: @rm testdata/{Image,initramfs.cpio.gz,*.tar.gz} \ No newline at end of file From 26e38137427239a796c9d82d8a7a98059461714d Mon Sep 17 00:00:00 2001 From: Kei Kamikawa Date: Sat, 29 Oct 2022 11:49:28 +0900 Subject: [PATCH 3/5] added builtag for arm64 --- shared_directory_arm64_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shared_directory_arm64_test.go b/shared_directory_arm64_test.go index e2dc889..71aefec 100644 --- a/shared_directory_arm64_test.go +++ b/shared_directory_arm64_test.go @@ -1,3 +1,6 @@ +//go:build darwin && arm64 +// +build darwin,arm64 + package vz_test import ( From 74f313a981905c0ee5d303973fbb094b3e265e5f Mon Sep 17 00:00:00 2001 From: Kei Kamikawa Date: Sat, 29 Oct 2022 12:13:52 +0900 Subject: [PATCH 4/5] added build tag lines manually I got messages when executed this command. $ stringer -tags=arm64 -type=LinuxRosettaAvailability shared_directory_arm64.go stringer: -tags option applies only to directories, not when files are specified So this is workaround. --- linuxrosettaavailability_string.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/linuxrosettaavailability_string.go b/linuxrosettaavailability_string.go index 8092b60..bdbb0b1 100644 --- a/linuxrosettaavailability_string.go +++ b/linuxrosettaavailability_string.go @@ -1,3 +1,6 @@ +//go:build darwin && arm64 +// +build darwin,arm64 + // Code generated by "stringer -type=LinuxRosettaAvailability"; DO NOT EDIT. package vz From a152cc227a1e2bd15daed8a18f86a9d562604836 Mon Sep 17 00:00:00 2001 From: Kei Kamikawa Date: Sat, 29 Oct 2022 19:02:19 +0900 Subject: [PATCH 5/5] added addtags command workaround for https://github.com/golang/go/issues/47179 --- cmd/addtags/main.go | 76 +++++++++++++++++++ ...> linuxrosettaavailability_string_arm64.go | 2 +- shared_directory_arm64.go | 2 +- 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 cmd/addtags/main.go rename linuxrosettaavailability_string.go => linuxrosettaavailability_string_arm64.go (88%) diff --git a/cmd/addtags/main.go b/cmd/addtags/main.go new file mode 100644 index 0000000..e15b2fc --- /dev/null +++ b/cmd/addtags/main.go @@ -0,0 +1,76 @@ +package main + +import ( + "bytes" + "flag" + "fmt" + "go/build/constraint" + "go/format" + "os" + "os/exec" +) + +var ( + tags = flag.String("tags", "", "comma-separated list of build tags to apply") + file = flag.String("file", "", "file to modify") +) + +func usage() { + fmt.Fprintf(os.Stderr, ` +usage: addtags -tags -file FILE +`[1:]) + + flag.PrintDefaults() + fmt.Fprintf(os.Stderr, ` +It is intended for use with 'go generate', so it also runs a subcommand, +which presumably creates the file. +Sample usage: +addtags -tags=darwin,arm64 -file linuxrosettaavailability_string.go stringer -type=LinuxRosettaAvailability +`[1:]) + os.Exit(2) +} + +func main() { + flag.Usage = usage + flag.Parse() + args := flag.Args() + if len(args) == 0 { + flag.Usage() + } + plusConstraint := fmt.Sprintf("// +build %s", *tags) + expr, err := constraint.Parse(plusConstraint) + check(err) + goBuildConstraint := fmt.Sprintf("//go:build %s", expr.String()) + + cmd := exec.Command(args[0], args[1:]...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + check(err) + b, err := os.ReadFile(*file) + check(err) + + var buf bytes.Buffer + _, err = fmt.Fprintf(&buf, "%s\n%s\n", goBuildConstraint, plusConstraint) + check(err) + + _, err = buf.Write(b) + check(err) + + src, err := format.Source(buf.Bytes()) + check(err) + + f, err := os.OpenFile(*file, os.O_TRUNC|os.O_WRONLY, 0644) + check(err) + defer f.Close() + + _, err = f.Write(src) + check(err) +} + +func check(err error) { + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/linuxrosettaavailability_string.go b/linuxrosettaavailability_string_arm64.go similarity index 88% rename from linuxrosettaavailability_string.go rename to linuxrosettaavailability_string_arm64.go index bdbb0b1..f64cadb 100644 --- a/linuxrosettaavailability_string.go +++ b/linuxrosettaavailability_string_arm64.go @@ -1,7 +1,7 @@ //go:build darwin && arm64 // +build darwin,arm64 -// Code generated by "stringer -type=LinuxRosettaAvailability"; DO NOT EDIT. +// Code generated by "stringer -type=LinuxRosettaAvailability -output=linuxrosettaavailability_string_arm64.go"; DO NOT EDIT. package vz diff --git a/shared_directory_arm64.go b/shared_directory_arm64.go index 1ec4492..5edab3a 100644 --- a/shared_directory_arm64.go +++ b/shared_directory_arm64.go @@ -17,7 +17,7 @@ import ( // LinuxRosettaAvailability represents an availability of Rosetta support for Linux binaries. // -//go:generate stringer -type=LinuxRosettaAvailability +//go:generate go run ./cmd/addtags -tags=darwin,arm64 -file linuxrosettaavailability_string_arm64.go stringer -type=LinuxRosettaAvailability -output=linuxrosettaavailability_string_arm64.go type LinuxRosettaAvailability int const (