linkerd2/pkg/version/version_test.go

112 lines
4.1 KiB
Go

package version_test
import (
"fmt"
"net/http"
"testing"
"github.com/runconduit/conduit/controller/api/public"
healthcheckPb "github.com/runconduit/conduit/controller/gen/common/healthcheck"
pb "github.com/runconduit/conduit/controller/gen/public"
"github.com/runconduit/conduit/pkg/version"
)
func TestVersionCheck(t *testing.T) {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "{\"version\": \"v0.3.0\"}")
})
go http.ListenAndServe("localhost:8080", nil)
t.Run("Passes when versions are latest", func(t *testing.T) {
version.Version = "v0.3.0"
mockPublicApi := createMockPublicApi("v0.3.0")
versionStatusChecker := version.NewVersionStatusChecker("http://localhost:8080/", "", mockPublicApi)
checks := versionStatusChecker.SelfCheck()
expectedName := version.VersionSubsystemName
if checks[0].SubsystemName != expectedName {
t.Fatalf("Expecting check name to be [%s], got [%s]", expectedName, checks[0].SubsystemName)
}
if checks[1].SubsystemName != expectedName {
t.Fatalf("Expecting check name to be [%s], got [%s]", expectedName, checks[0].SubsystemName)
}
expectedStatus := healthcheckPb.CheckStatus_OK
if checks[0].Status != expectedStatus {
t.Fatalf("Expecting cli check status to be [%d], got [%d]", expectedStatus, checks[0].Status)
}
if checks[1].Status != expectedStatus {
t.Fatalf("Expecting control plane check status to be [%d], got [%d]", expectedStatus, checks[1].Status)
}
expectedDescription := version.CliCheckDescription
if checks[0].CheckDescription != expectedDescription {
t.Fatalf("Expecting check description to be [%s], got [%s]", expectedDescription, checks[0].CheckDescription)
}
expectedDescription = version.ControlPlaneCheckDescription
if checks[1].CheckDescription != expectedDescription {
t.Fatalf("Expecting check description to be [%s], got [%s]", expectedDescription, checks[0].CheckDescription)
}
})
t.Run("Fails when cli version is not latest", func(t *testing.T) {
version.Version = "v0.1.1"
mockPublicApi := createMockPublicApi("v0.3.0")
versionStatusChecker := version.NewVersionStatusChecker("http://localhost:8080/", "", mockPublicApi)
checks := versionStatusChecker.SelfCheck()
expectedStatus := healthcheckPb.CheckStatus_FAIL
if checks[0].Status != expectedStatus {
t.Fatalf("Expecting check status to be [%d], got [%d]", expectedStatus, checks[0].Status)
}
expectedMessage := "is running version v0.1.1 but the latest version is v0.3.0"
if checks[0].FriendlyMessageToUser != expectedMessage {
t.Fatalf("Expecting message to be [%s], got [%s]", expectedMessage, checks[0].FriendlyMessageToUser)
}
})
t.Run("Fails when control plane version is not latest", func(t *testing.T) {
version.Version = "v0.3.0"
mockPublicApi := createMockPublicApi("v0.1.1")
versionStatusChecker := version.NewVersionStatusChecker("http://localhost:8080/", "", mockPublicApi)
checks := versionStatusChecker.SelfCheck()
expectedStatus := healthcheckPb.CheckStatus_FAIL
if checks[1].Status != expectedStatus {
t.Fatalf("Expecting check status to be [%d], got [%d]", expectedStatus, checks[1].Status)
}
expectedMessage := "is running version v0.1.1 but the latest version is v0.3.0"
if checks[1].FriendlyMessageToUser != expectedMessage {
t.Fatalf("Expecting message to be [%s], got [%s]", expectedMessage, checks[1].FriendlyMessageToUser)
}
})
t.Run("Supports overriding the expected version", func(t *testing.T) {
version.Version = "customversion"
mockPublicApi := createMockPublicApi("customversion")
versionStatusChecker := version.NewVersionStatusChecker("http://localhost:8080/", "customversion", mockPublicApi)
checks := versionStatusChecker.SelfCheck()
for _, check := range checks {
if check.Status != healthcheckPb.CheckStatus_OK {
t.Errorf("Expecting check for [%s] to be [%s], got [%s]",
check.CheckDescription, healthcheckPb.CheckStatus_OK, check.Status)
}
}
})
}
func createMockPublicApi(version string) *public.MockConduitApiClient {
return &public.MockConduitApiClient{
VersionInfoToReturn: &pb.VersionInfo{
ReleaseVersion: version,
},
}
}