From 6567af773078f0e3bc5fee01ec42fad4468eaf20 Mon Sep 17 00:00:00 2001 From: qzydustin <44362429+qzydustin@users.noreply.github.com> Date: Sun, 23 Jul 2023 07:48:30 -0700 Subject: [PATCH] Fix IP Address Order Bug --- hscontrol/types/machine.go | 17 +++++++++++++++++ hscontrol/types/machine_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/hscontrol/types/machine.go b/hscontrol/types/machine.go index 9fedae73..332345f7 100644 --- a/hscontrol/types/machine.go +++ b/hscontrol/types/machine.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net/netip" + "sort" "strings" "time" @@ -73,7 +74,23 @@ type ( type MachineAddresses []netip.Addr +func (ma MachineAddresses) Sort() { + sort.Slice(ma, func(index1, index2 int) bool { + if ma[index1].Is4() && ma[index2].Is6() { + + return true + } + if ma[index1].Is6() && ma[index2].Is4() { + + return false + } + + return ma[index1].Compare(ma[index2]) < 0 + }) +} + func (ma MachineAddresses) StringSlice() []string { + ma.Sort() strSlice := make([]string, 0, len(ma)) for _, addr := range ma { strSlice = append(strSlice, addr.String()) diff --git a/hscontrol/types/machine_test.go b/hscontrol/types/machine_test.go index 50fc428c..f57f8a33 100644 --- a/hscontrol/types/machine_test.go +++ b/hscontrol/types/machine_test.go @@ -113,3 +113,29 @@ func Test_MachineCanAccess(t *testing.T) { }) } } + +func TestMachineAddressesOrder(t *testing.T) { + machineAddresses := MachineAddresses{ + netip.MustParseAddr("2001:db8::2"), + netip.MustParseAddr("100.64.0.2"), + netip.MustParseAddr("2001:db8::1"), + netip.MustParseAddr("100.64.0.1"), + } + + strSlice := machineAddresses.StringSlice() + expected := []string{ + "100.64.0.1", + "100.64.0.2", + "2001:db8::1", + "2001:db8::2", + } + + if len(strSlice) != len(expected) { + t.Fatalf("unexpected slice length: got %v, want %v", len(strSlice), len(expected)) + } + for i, addr := range strSlice { + if addr != expected[i] { + t.Errorf("unexpected address at index %v: got %v, want %v", i, addr, expected[i]) + } + } +}