safing-portmaster/spn/navigator/sort_test.go

112 lines
2 KiB
Go

package navigator
import (
"sort"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/safing/portmaster/spn/hub"
)
func TestSorting(t *testing.T) {
t.Parallel()
list := []*Pin{
{
Hub: &hub.Hub{
ID: "a",
},
measurements: &hub.Measurements{
Latency: 3,
Capacity: 4,
CalculatedCost: 5,
},
analysis: &AnalysisState{
SuggestedHopDistance: 3,
},
},
{
Hub: &hub.Hub{
ID: "b",
},
measurements: &hub.Measurements{
Latency: 4,
Capacity: 3,
CalculatedCost: 1,
},
analysis: &AnalysisState{
SuggestedHopDistance: 2,
},
},
{
Hub: &hub.Hub{
ID: "c",
},
measurements: &hub.Measurements{
Latency: 5,
Capacity: 2,
CalculatedCost: 2,
},
analysis: &AnalysisState{
SuggestedHopDistance: 4,
},
},
{
Hub: &hub.Hub{
ID: "d",
},
measurements: &hub.Measurements{
Latency: 1,
Capacity: 1,
CalculatedCost: 3,
},
analysis: &AnalysisState{
SuggestedHopDistance: 4,
},
},
{
Hub: &hub.Hub{
ID: "e",
},
measurements: &hub.Measurements{
Latency: 2,
Capacity: 5,
CalculatedCost: 4,
},
analysis: &AnalysisState{
SuggestedHopDistance: 4,
},
},
}
sort.Sort(sortByLowestMeasuredCost(list))
checkSorting(t, list, "b-c-d-e-a")
sort.Sort(sortBySuggestedHopDistanceAndLowestMeasuredCost(list))
checkSorting(t, list, "c-d-e-a-b")
sort.Sort(sortByLowestMeasuredLatency(list))
checkSorting(t, list, "d-e-a-b-c")
sort.Sort(sortByHighestMeasuredCapacity(list))
checkSorting(t, list, "e-a-b-c-d")
sort.Sort(sortByPinID(list))
checkSorting(t, list, "a-b-c-d-e")
}
func checkSorting(t *testing.T, sortedList []*Pin, expectedOrder string) {
t.Helper()
// Build list ID string.
ids := make([]string, 0, len(sortedList))
for _, pin := range sortedList {
ids = append(ids, pin.Hub.ID)
}
sortedIDs := strings.Join(ids, "-")
// Check for matching order.
assert.Equal(t, expectedOrder, sortedIDs, "should match")
}