mirror of https://github.com/linkerd/linkerd2.git
126 lines
3.9 KiB
Go
126 lines
3.9 KiB
Go
package healthcheck
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
healthcheckPb "github.com/runconduit/conduit/controller/gen/common/healthcheck"
|
|
)
|
|
|
|
type mockSubsystem struct {
|
|
checksToReturn []*healthcheckPb.CheckResult
|
|
}
|
|
|
|
func (m *mockSubsystem) SelfCheck() []*healthcheckPb.CheckResult {
|
|
return m.checksToReturn
|
|
}
|
|
|
|
func TestSelfChecker(t *testing.T) {
|
|
workingSubsystem1 := &mockSubsystem{
|
|
checksToReturn: []*healthcheckPb.CheckResult{
|
|
{SubsystemName: "w1", CheckDescription: "w1a", Status: healthcheckPb.CheckStatus_OK},
|
|
{SubsystemName: "w1", CheckDescription: "w1b", Status: healthcheckPb.CheckStatus_OK},
|
|
},
|
|
}
|
|
workingSubsystem2 := &mockSubsystem{
|
|
checksToReturn: []*healthcheckPb.CheckResult{
|
|
{SubsystemName: "w2", CheckDescription: "w2a", Status: healthcheckPb.CheckStatus_OK},
|
|
{SubsystemName: "w2", CheckDescription: "w2b", Status: healthcheckPb.CheckStatus_OK},
|
|
},
|
|
}
|
|
|
|
failingSubsystem1 := &mockSubsystem{
|
|
checksToReturn: []*healthcheckPb.CheckResult{
|
|
{SubsystemName: "f1", CheckDescription: "fa", Status: healthcheckPb.CheckStatus_OK},
|
|
{SubsystemName: "f1", CheckDescription: "fb", Status: healthcheckPb.CheckStatus_FAIL},
|
|
},
|
|
}
|
|
|
|
errorSubsystem1 := &mockSubsystem{
|
|
checksToReturn: []*healthcheckPb.CheckResult{
|
|
{SubsystemName: "e1", CheckDescription: "ea", Status: healthcheckPb.CheckStatus_ERROR},
|
|
{SubsystemName: "e1", CheckDescription: "eb", Status: healthcheckPb.CheckStatus_OK},
|
|
},
|
|
}
|
|
|
|
t.Run("Notifies observer of all results", func(t *testing.T) {
|
|
healthChecker := MakeHealthChecker()
|
|
|
|
healthChecker.Add(workingSubsystem1)
|
|
healthChecker.Add(workingSubsystem2)
|
|
healthChecker.Add(failingSubsystem1)
|
|
|
|
observedResults := make([]*healthcheckPb.CheckResult, 0)
|
|
observer := func(r *healthcheckPb.CheckResult) {
|
|
observedResults = append(observedResults, r)
|
|
}
|
|
|
|
expectedResults := make([]*healthcheckPb.CheckResult, 0)
|
|
expectedResults = append(expectedResults, workingSubsystem1.checksToReturn...)
|
|
expectedResults = append(expectedResults, workingSubsystem2.checksToReturn...)
|
|
expectedResults = append(expectedResults, failingSubsystem1.checksToReturn...)
|
|
|
|
healthChecker.PerformCheck(observer)
|
|
|
|
observedLength := len(observedResults)
|
|
expectedLength := len(expectedResults)
|
|
|
|
if expectedLength != observedLength {
|
|
t.Fatalf("Expecting observed check to contain [%d] check, got [%d]", expectedLength, observedLength)
|
|
}
|
|
|
|
observedResultsSet := make(map[healthcheckPb.CheckResult]bool)
|
|
for _, result := range observedResults {
|
|
observedResultsSet[*result] = true
|
|
}
|
|
|
|
for _, expected := range expectedResults {
|
|
if !observedResultsSet[*expected] {
|
|
t.Fatalf("Expected observed results to contain [%v], but was: %v", expected,
|
|
reflect.ValueOf(observedResultsSet).MapKeys())
|
|
}
|
|
}
|
|
})
|
|
|
|
t.Run("Is successful if all checks were successful", func(t *testing.T) {
|
|
healthChecker := MakeHealthChecker()
|
|
|
|
healthChecker.Add(workingSubsystem1)
|
|
healthChecker.Add(workingSubsystem2)
|
|
|
|
checkStatus := healthChecker.PerformCheck(nil)
|
|
|
|
if checkStatus != healthcheckPb.CheckStatus_OK {
|
|
t.Fatalf("Expecting check to be successful, but got [%s]", checkStatus)
|
|
}
|
|
})
|
|
|
|
t.Run("Is failure if even a single test failed and no errors", func(t *testing.T) {
|
|
healthChecker := MakeHealthChecker()
|
|
|
|
healthChecker.Add(workingSubsystem1)
|
|
healthChecker.Add(failingSubsystem1)
|
|
healthChecker.Add(workingSubsystem2)
|
|
|
|
checkStatus := healthChecker.PerformCheck(nil)
|
|
|
|
if checkStatus != healthcheckPb.CheckStatus_FAIL {
|
|
t.Fatalf("Expecting check to be error, but got [%s]", checkStatus)
|
|
}
|
|
})
|
|
|
|
t.Run("Is error if even a single test errored", func(t *testing.T) {
|
|
healthChecker := MakeHealthChecker()
|
|
|
|
healthChecker.Add(workingSubsystem1)
|
|
healthChecker.Add(failingSubsystem1)
|
|
healthChecker.Add(errorSubsystem1)
|
|
|
|
checkStatus := healthChecker.PerformCheck(nil)
|
|
|
|
if checkStatus != healthcheckPb.CheckStatus_ERROR {
|
|
t.Fatalf("Expecting check to be error, but got [%s]", checkStatus)
|
|
}
|
|
})
|
|
}
|