95 lines
2.2 KiB
Go
95 lines
2.2 KiB
Go
package structs
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/hashicorp/serf/serf"
|
|
)
|
|
|
|
func TestServerHealth_IsHealthy(t *testing.T) {
|
|
cases := []struct {
|
|
health ServerHealth
|
|
lastTerm uint64
|
|
lastIndex uint64
|
|
conf AutopilotConfig
|
|
expected bool
|
|
}{
|
|
// Healthy server, all values within allowed limits
|
|
{
|
|
health: ServerHealth{SerfStatus: serf.StatusAlive, LastTerm: 1, LastIndex: 0},
|
|
lastTerm: 1,
|
|
lastIndex: 10,
|
|
conf: AutopilotConfig{MaxTrailingLogs: 20},
|
|
expected: true,
|
|
},
|
|
// Serf status failed
|
|
{
|
|
health: ServerHealth{SerfStatus: serf.StatusFailed},
|
|
expected: false,
|
|
},
|
|
// Old value for lastTerm
|
|
{
|
|
health: ServerHealth{SerfStatus: serf.StatusAlive, LastTerm: 0},
|
|
lastTerm: 1,
|
|
expected: false,
|
|
},
|
|
// Too far behind on logs
|
|
{
|
|
health: ServerHealth{SerfStatus: serf.StatusAlive, LastIndex: 0},
|
|
lastIndex: 10,
|
|
conf: AutopilotConfig{MaxTrailingLogs: 5},
|
|
expected: false,
|
|
},
|
|
}
|
|
|
|
for index, tc := range cases {
|
|
actual := tc.health.IsHealthy(tc.lastTerm, tc.lastIndex, &tc.conf)
|
|
if actual != tc.expected {
|
|
t.Fatalf("bad value for case %d: %v", index, actual)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestServerHealth_IsStable(t *testing.T) {
|
|
start := time.Now()
|
|
cases := []struct {
|
|
health *ServerHealth
|
|
now time.Time
|
|
conf AutopilotConfig
|
|
expected bool
|
|
}{
|
|
// Healthy server, all values within allowed limits
|
|
{
|
|
health: &ServerHealth{Healthy: true, StableSince: start},
|
|
now: start.Add(15 * time.Second),
|
|
conf: AutopilotConfig{ServerStabilizationTime: 10 * time.Second},
|
|
expected: true,
|
|
},
|
|
// Unhealthy server
|
|
{
|
|
health: &ServerHealth{Healthy: false},
|
|
expected: false,
|
|
},
|
|
// Healthy server, hasn't reached stabilization time
|
|
{
|
|
health: &ServerHealth{Healthy: true, StableSince: start},
|
|
now: start.Add(5 * time.Second),
|
|
conf: AutopilotConfig{ServerStabilizationTime: 10 * time.Second},
|
|
expected: false,
|
|
},
|
|
// Nil struct
|
|
{
|
|
health: nil,
|
|
expected: false,
|
|
},
|
|
}
|
|
|
|
for index, tc := range cases {
|
|
actual := tc.health.IsStable(tc.now, &tc.conf)
|
|
if actual != tc.expected {
|
|
t.Fatalf("bad value for case %d: %v", index, actual)
|
|
}
|
|
}
|
|
}
|