mirror of
https://github.com/netbirdio/netbird.git
synced 2024-12-13 10:21:10 +01:00
3e9b46f8d8
Prevent peer updates if the status is not changing from disconnected to connected and vice versa. Fixed route score calculation, added tests and changed the log message fixed installer /usr/local/bin creation
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)
|
|
}
|
|
})
|
|
}
|
|
}
|