51 lines
2.6 KiB
Go
51 lines
2.6 KiB
Go
package hub
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/shcizo/package-updater/internal/master/model"
|
|
"github.com/shcizo/package-updater/internal/protocol"
|
|
)
|
|
|
|
func TestRoute(t *testing.T) {
|
|
composeSvc := model.Service{Kind: protocol.KindCompose, AgentID: ptr(int64(2))}
|
|
swarmSvc := model.Service{Kind: protocol.KindSwarm, AgentID: ptr(int64(1)), SwarmClusterID: "c1"}
|
|
v2 := protocol.Hello{ProtocolVersion: protocol.Version}
|
|
mgrV2 := protocol.Hello{ProtocolVersion: protocol.Version, SwarmManager: true, SwarmClusterID: "c1"}
|
|
|
|
tests := []struct {
|
|
name string
|
|
svc model.Service
|
|
conns []candidate
|
|
want model.Route
|
|
err error
|
|
}{
|
|
{"compose on own agent", composeSvc, []candidate{{2, 20, v2}}, model.Route{AgentID: 2, ConnID: 20}, nil},
|
|
{"compose, own agent too old", composeSvc, []candidate{{2, 20, protocol.Hello{}}}, model.Route{}, model.ErrAgentTooOld},
|
|
{"compose, own agent missing", composeSvc, nil, model.Route{}, model.ErrAgentOffline},
|
|
{"compose, only another agent online", composeSvc, []candidate{{5, 50, v2}}, model.Route{}, model.ErrAgentOffline},
|
|
{"swarm on reporting agent", swarmSvc, []candidate{{1, 10, mgrV2}, {3, 30, mgrV2}}, model.Route{AgentID: 1, ConnID: 10}, nil},
|
|
{"swarm, reporting agent offline, other manager", swarmSvc, []candidate{{3, 30, mgrV2}}, model.Route{AgentID: 3, ConnID: 30}, nil},
|
|
{"swarm, lowest agent id first", swarmSvc, []candidate{{4, 40, mgrV2}, {3, 30, mgrV2}}, model.Route{AgentID: 3, ConnID: 30}, nil},
|
|
{"swarm, other manager in another cluster", swarmSvc,
|
|
[]candidate{{3, 30, protocol.Hello{ProtocolVersion: 2, SwarmManager: true, SwarmClusterID: "c2"}}}, model.Route{}, model.ErrAgentOffline},
|
|
{"swarm, only a v0 manager of the cluster", swarmSvc,
|
|
[]candidate{{1, 10, protocol.Hello{SwarmManager: true, SwarmClusterID: "c1"}}}, model.Route{}, model.ErrAgentTooOld},
|
|
{"swarm, v0 manager but a v2 manager exists", swarmSvc,
|
|
[]candidate{{1, 10, protocol.Hello{SwarmManager: true, SwarmClusterID: "c1"}}, {3, 30, mgrV2}}, model.Route{AgentID: 3, ConnID: 30}, nil},
|
|
{"swarm, worker of the cluster", swarmSvc,
|
|
[]candidate{{1, 10, protocol.Hello{ProtocolVersion: 2, SwarmClusterID: "c1"}}}, model.Route{}, model.ErrAgentOffline},
|
|
{"swarm, manager with empty cluster id", model.Service{Kind: protocol.KindSwarm},
|
|
[]candidate{{1, 10, protocol.Hello{ProtocolVersion: 2, SwarmManager: true}}}, model.Route{}, model.ErrAgentOffline},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := route(tt.svc, tt.conns)
|
|
assert.ErrorIs(t, err, tt.err)
|
|
assert.Equal(t, tt.want, got)
|
|
})
|
|
}
|
|
}
|