kubeprobes/kubeprobes_test.go

183 lines
4.6 KiB
Go
Raw Normal View History

package kubeprobes
import (
"net/http"
"net/http/httptest"
"testing"
)
func getStatusFromEndpoint(t *testing.T, client *http.Client, endpoint string) int {
t.Helper()
resp, err := client.Get(endpoint)
if err != nil {
t.Errorf("error getting status from endpoint: %s", err)
}
return resp.StatusCode
}
func TestValidation(t *testing.T) {
var (
live, _ = NewManualProbe("live")
ready, _ = NewManualProbe("ready")
)
tests := map[string]struct {
opts []Option
expectedError bool
}{
"no modifications and no error": {
opts: []Option{
WithLivenessProbes(live),
WithReadinessProbes(ready),
},
},
"modifications and no error": {
opts: []Option{
WithLivenessProbes(live),
WithReadinessProbes(ready),
WithLivenessPath("/livez"),
WithReadinessPath("/readyz"),
},
},
"missing liveness probes": {
opts: []Option{
WithReadinessProbes(ready),
},
expectedError: true,
},
"missing readiness probes": {
opts: []Option{
WithLivenessProbes(live),
},
expectedError: true,
},
"liveness probe path empty": {
opts: []Option{
WithLivenessProbes(live),
WithReadinessProbes(ready),
WithLivenessPath(""),
},
expectedError: true,
},
"readiness probe path empty": {
opts: []Option{
WithLivenessProbes(live),
WithReadinessProbes(ready),
WithReadinessPath(""),
},
expectedError: true,
},
"liveness probe path does not start with slash": {
opts: []Option{
WithLivenessProbes(live),
WithReadinessProbes(ready),
WithLivenessPath("livez"),
},
expectedError: true,
},
"readiness probe path does not start with slash": {
opts: []Option{
WithLivenessProbes(live),
WithReadinessProbes(ready),
WithReadinessPath("readyz"),
},
expectedError: true,
},
"liveness and readiness probe paths are equal": {
opts: []Option{
WithLivenessProbes(live),
WithReadinessProbes(ready),
WithLivenessPath("/check"),
WithReadinessPath("/check"),
},
expectedError: true,
},
}
for name, tc := range tests {
name, tc := name, tc
t.Run(name, func(t *testing.T) {
_, err := New(tc.opts...)
switch {
case err == nil && tc.expectedError:
t.Error("expected error, but no error was returned")
case err != nil && !tc.expectedError:
t.Errorf("expected no error but got %v", err)
}
})
}
}
func TestHandler(t *testing.T) {
var (
live, _ = NewManualProbe("live")
ready, _ = NewManualProbe("ready")
)
tests := map[string]struct {
livenessProbeTransformation func(*testing.T, ManualProbe)
readinessProbeTransformation func(*testing.T, ManualProbe)
expectedLiveStatus int
expectedReadyStatus int
}{
"not live": {
livenessProbeTransformation: markAsDown,
readinessProbeTransformation: markAsDown,
expectedLiveStatus: http.StatusServiceUnavailable,
expectedReadyStatus: http.StatusServiceUnavailable,
},
"live but not ready": {
livenessProbeTransformation: markAsUp,
readinessProbeTransformation: markAsDown,
expectedLiveStatus: http.StatusOK,
expectedReadyStatus: http.StatusServiceUnavailable,
},
"live and ready": {
livenessProbeTransformation: markAsUp,
readinessProbeTransformation: markAsUp,
expectedLiveStatus: http.StatusOK,
expectedReadyStatus: http.StatusOK,
},
"ready but not live - should never happen": {
livenessProbeTransformation: markAsDown,
readinessProbeTransformation: markAsUp,
expectedLiveStatus: http.StatusServiceUnavailable,
expectedReadyStatus: http.StatusServiceUnavailable,
},
}
kp, err := New(
WithLivenessProbes(live),
WithReadinessProbes(ready),
)
if err != nil {
t.Errorf("expected no error, got %v", err)
}
srv := httptest.NewServer(kp)
defer srv.Close()
client := srv.Client()
for name, test := range tests {
name, test := name, test
t.Run(name, func(t *testing.T) {
test.livenessProbeTransformation(t, live)
test.readinessProbeTransformation(t, ready)
liveStatus := getStatusFromEndpoint(t, client, srv.URL+defaultLivenessPath)
readyStatus := getStatusFromEndpoint(t, client, srv.URL+defaultReadinessPath)
otherStatus := getStatusFromEndpoint(t, client, srv.URL+"/something")
if liveStatus != test.expectedLiveStatus {
t.Errorf("expected live status %d, got %d", test.expectedLiveStatus, liveStatus)
}
if readyStatus != test.expectedReadyStatus {
t.Errorf("expected ready status %d, got %d", test.expectedReadyStatus, readyStatus)
}
if otherStatus != http.StatusNotFound {
t.Errorf("expected 404 status, got %d", otherStatus)
}
})
}
}