mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-29 19:43:57 +01:00
200 lines
4.0 KiB
Go
200 lines
4.0 KiB
Go
|
package routemanager
|
||
|
|
||
|
import (
|
||
|
"net/netip"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/netbirdio/netbird/route"
|
||
|
)
|
||
|
|
||
|
func TestGetBestrouteFromStatuses(t *testing.T) {
|
||
|
|
||
|
testCases := []struct {
|
||
|
name string
|
||
|
statuses map[string]routerPeerStatus
|
||
|
expectedRouteID string
|
||
|
currentRoute *route.Route
|
||
|
existingRoutes map[string]*route.Route
|
||
|
}{
|
||
|
{
|
||
|
name: "one route",
|
||
|
statuses: map[string]routerPeerStatus{
|
||
|
"route1": {
|
||
|
connected: true,
|
||
|
relayed: false,
|
||
|
direct: true,
|
||
|
},
|
||
|
},
|
||
|
existingRoutes: map[string]*route.Route{
|
||
|
"route1": {
|
||
|
ID: "route1",
|
||
|
Metric: route.MaxMetric,
|
||
|
Peer: "peer1",
|
||
|
},
|
||
|
},
|
||
|
currentRoute: nil,
|
||
|
expectedRouteID: "route1",
|
||
|
},
|
||
|
{
|
||
|
name: "one connected routes with relayed and direct",
|
||
|
statuses: map[string]routerPeerStatus{
|
||
|
"route1": {
|
||
|
connected: true,
|
||
|
relayed: true,
|
||
|
direct: true,
|
||
|
},
|
||
|
},
|
||
|
existingRoutes: map[string]*route.Route{
|
||
|
"route1": {
|
||
|
ID: "route1",
|
||
|
Metric: route.MaxMetric,
|
||
|
Peer: "peer1",
|
||
|
},
|
||
|
},
|
||
|
currentRoute: nil,
|
||
|
expectedRouteID: "route1",
|
||
|
},
|
||
|
{
|
||
|
name: "one connected routes with relayed and no direct",
|
||
|
statuses: map[string]routerPeerStatus{
|
||
|
"route1": {
|
||
|
connected: true,
|
||
|
relayed: true,
|
||
|
direct: false,
|
||
|
},
|
||
|
},
|
||
|
existingRoutes: map[string]*route.Route{
|
||
|
"route1": {
|
||
|
ID: "route1",
|
||
|
Metric: route.MaxMetric,
|
||
|
Peer: "peer1",
|
||
|
},
|
||
|
},
|
||
|
currentRoute: nil,
|
||
|
expectedRouteID: "route1",
|
||
|
},
|
||
|
{
|
||
|
name: "no connected peers",
|
||
|
statuses: map[string]routerPeerStatus{
|
||
|
"route1": {
|
||
|
connected: false,
|
||
|
relayed: false,
|
||
|
direct: false,
|
||
|
},
|
||
|
},
|
||
|
existingRoutes: map[string]*route.Route{
|
||
|
"route1": {
|
||
|
ID: "route1",
|
||
|
Metric: route.MaxMetric,
|
||
|
Peer: "peer1",
|
||
|
},
|
||
|
},
|
||
|
currentRoute: nil,
|
||
|
expectedRouteID: "",
|
||
|
},
|
||
|
{
|
||
|
name: "multiple connected peers with different metrics",
|
||
|
statuses: map[string]routerPeerStatus{
|
||
|
"route1": {
|
||
|
connected: true,
|
||
|
relayed: false,
|
||
|
direct: true,
|
||
|
},
|
||
|
"route2": {
|
||
|
connected: true,
|
||
|
relayed: false,
|
||
|
direct: true,
|
||
|
},
|
||
|
},
|
||
|
existingRoutes: map[string]*route.Route{
|
||
|
"route1": {
|
||
|
ID: "route1",
|
||
|
Metric: 9000,
|
||
|
Peer: "peer1",
|
||
|
},
|
||
|
"route2": {
|
||
|
ID: "route2",
|
||
|
Metric: route.MaxMetric,
|
||
|
Peer: "peer2",
|
||
|
},
|
||
|
},
|
||
|
currentRoute: nil,
|
||
|
expectedRouteID: "route1",
|
||
|
},
|
||
|
{
|
||
|
name: "multiple connected peers with one relayed",
|
||
|
statuses: map[string]routerPeerStatus{
|
||
|
"route1": {
|
||
|
connected: true,
|
||
|
relayed: false,
|
||
|
direct: true,
|
||
|
},
|
||
|
"route2": {
|
||
|
connected: true,
|
||
|
relayed: true,
|
||
|
direct: true,
|
||
|
},
|
||
|
},
|
||
|
existingRoutes: map[string]*route.Route{
|
||
|
"route1": {
|
||
|
ID: "route1",
|
||
|
Metric: route.MaxMetric,
|
||
|
Peer: "peer1",
|
||
|
},
|
||
|
"route2": {
|
||
|
ID: "route2",
|
||
|
Metric: route.MaxMetric,
|
||
|
Peer: "peer2",
|
||
|
},
|
||
|
},
|
||
|
currentRoute: nil,
|
||
|
expectedRouteID: "route1",
|
||
|
},
|
||
|
{
|
||
|
name: "multiple connected peers with one direct",
|
||
|
statuses: map[string]routerPeerStatus{
|
||
|
"route1": {
|
||
|
connected: true,
|
||
|
relayed: false,
|
||
|
direct: true,
|
||
|
},
|
||
|
"route2": {
|
||
|
connected: true,
|
||
|
relayed: false,
|
||
|
direct: false,
|
||
|
},
|
||
|
},
|
||
|
existingRoutes: map[string]*route.Route{
|
||
|
"route1": {
|
||
|
ID: "route1",
|
||
|
Metric: route.MaxMetric,
|
||
|
Peer: "peer1",
|
||
|
},
|
||
|
"route2": {
|
||
|
ID: "route2",
|
||
|
Metric: route.MaxMetric,
|
||
|
Peer: "peer2",
|
||
|
},
|
||
|
},
|
||
|
currentRoute: nil,
|
||
|
expectedRouteID: "route1",
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, tc := range testCases {
|
||
|
t.Run(tc.name, func(t *testing.T) {
|
||
|
// create new clientNetwork
|
||
|
client := &clientNetwork{
|
||
|
network: netip.MustParsePrefix("192.168.0.0/24"),
|
||
|
routes: tc.existingRoutes,
|
||
|
chosenRoute: tc.currentRoute,
|
||
|
}
|
||
|
|
||
|
chosenRoute := client.getBestRouteFromStatuses(tc.statuses)
|
||
|
if chosenRoute != tc.expectedRouteID {
|
||
|
t.Errorf("expected routeID %s, got %s", tc.expectedRouteID, chosenRoute)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|