2020-04-15 01:20:00 +02:00
|
|
|
package core
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
2020-10-22 03:56:07 +02:00
|
|
|
"time"
|
2020-04-15 01:20:00 +02:00
|
|
|
)
|
|
|
|
|
2020-10-22 04:21:51 +02:00
|
|
|
func TestService_ValidateAndSetDefaults(t *testing.T) {
|
|
|
|
condition := Condition("[STATUS] == 200")
|
|
|
|
service := Service{
|
|
|
|
Name: "TwiNNatioN",
|
2020-10-23 22:29:20 +02:00
|
|
|
URL: "https://twinnation.org/health",
|
2020-10-22 04:21:51 +02:00
|
|
|
Conditions: []*Condition{&condition},
|
|
|
|
Alerts: []*Alert{{Type: PagerDutyAlert}},
|
|
|
|
}
|
|
|
|
service.ValidateAndSetDefaults()
|
|
|
|
if service.Method != "GET" {
|
|
|
|
t.Error("Service method should've defaulted to GET")
|
|
|
|
}
|
|
|
|
if service.Interval != time.Minute {
|
|
|
|
t.Error("Service interval should've defaulted to 1 minute")
|
|
|
|
}
|
|
|
|
if service.Headers == nil {
|
|
|
|
t.Error("Service headers should've defaulted to an empty map")
|
|
|
|
}
|
|
|
|
if len(service.Alerts) != 1 {
|
|
|
|
t.Error("Service should've had 1 alert")
|
|
|
|
}
|
|
|
|
if service.Alerts[0].Enabled {
|
|
|
|
t.Error("Service alert should've defaulted to disabled")
|
|
|
|
}
|
|
|
|
if service.Alerts[0].SuccessThreshold != 2 {
|
|
|
|
t.Error("Service alert should've defaulted to a success threshold of 2")
|
|
|
|
}
|
|
|
|
if service.Alerts[0].FailureThreshold != 3 {
|
|
|
|
t.Error("Service alert should've defaulted to a failure threshold of 3")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-22 04:56:35 +02:00
|
|
|
func TestService_ValidateAndSetDefaultsWithNoName(t *testing.T) {
|
|
|
|
defer func() { recover() }()
|
|
|
|
condition := Condition("[STATUS] == 200")
|
|
|
|
service := &Service{
|
|
|
|
Name: "",
|
2020-10-23 22:29:20 +02:00
|
|
|
URL: "http://example.com",
|
2020-10-22 04:56:35 +02:00
|
|
|
Conditions: []*Condition{&condition},
|
|
|
|
}
|
|
|
|
service.ValidateAndSetDefaults()
|
|
|
|
t.Fatal("Should've panicked because service didn't have a name, which is a mandatory field")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestService_ValidateAndSetDefaultsWithNoUrl(t *testing.T) {
|
|
|
|
defer func() { recover() }()
|
|
|
|
condition := Condition("[STATUS] == 200")
|
|
|
|
service := &Service{
|
|
|
|
Name: "example",
|
2020-10-23 22:29:20 +02:00
|
|
|
URL: "",
|
2020-10-22 04:56:35 +02:00
|
|
|
Conditions: []*Condition{&condition},
|
|
|
|
}
|
|
|
|
service.ValidateAndSetDefaults()
|
|
|
|
t.Fatal("Should've panicked because service didn't have an url, which is a mandatory field")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestService_ValidateAndSetDefaultsWithNoConditions(t *testing.T) {
|
|
|
|
defer func() { recover() }()
|
|
|
|
service := &Service{
|
|
|
|
Name: "example",
|
2020-10-23 22:29:20 +02:00
|
|
|
URL: "http://example.com",
|
2020-10-22 04:56:35 +02:00
|
|
|
Conditions: nil,
|
|
|
|
}
|
|
|
|
service.ValidateAndSetDefaults()
|
|
|
|
t.Fatal("Should've panicked because service didn't have at least 1 condition")
|
|
|
|
}
|
|
|
|
|
2020-10-22 04:21:51 +02:00
|
|
|
func TestService_GetAlertsTriggered(t *testing.T) {
|
|
|
|
condition := Condition("[STATUS] == 200")
|
|
|
|
service := Service{
|
|
|
|
Name: "TwiNNatioN",
|
2020-10-23 22:29:20 +02:00
|
|
|
URL: "https://twinnation.org/health",
|
2020-10-22 04:21:51 +02:00
|
|
|
Conditions: []*Condition{&condition},
|
|
|
|
Alerts: []*Alert{{Type: PagerDutyAlert, Enabled: true}},
|
|
|
|
}
|
|
|
|
service.ValidateAndSetDefaults()
|
|
|
|
if service.NumberOfFailuresInARow != 0 {
|
|
|
|
t.Error("Service.NumberOfFailuresInARow should start with 0")
|
|
|
|
}
|
|
|
|
if service.NumberOfSuccessesInARow != 0 {
|
|
|
|
t.Error("Service.NumberOfSuccessesInARow should start with 0")
|
|
|
|
}
|
|
|
|
if len(service.GetAlertsTriggered()) > 0 {
|
|
|
|
t.Error("No alerts should've been triggered, because service.NumberOfFailuresInARow is 0, which is below the failure threshold")
|
|
|
|
}
|
|
|
|
service.NumberOfFailuresInARow = service.Alerts[0].FailureThreshold
|
|
|
|
if len(service.GetAlertsTriggered()) != 1 {
|
|
|
|
t.Error("Alert should've been triggered")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-25 01:49:32 +02:00
|
|
|
func TestIntegrationEvaluateHealth(t *testing.T) {
|
2020-04-15 01:20:00 +02:00
|
|
|
condition := Condition("[STATUS] == 200")
|
|
|
|
service := Service{
|
|
|
|
Name: "TwiNNatioN",
|
2020-10-23 22:29:20 +02:00
|
|
|
URL: "https://twinnation.org/health",
|
2020-04-15 01:20:00 +02:00
|
|
|
Conditions: []*Condition{&condition},
|
|
|
|
}
|
2020-09-25 01:49:32 +02:00
|
|
|
result := service.EvaluateHealth()
|
2020-04-15 01:20:00 +02:00
|
|
|
if !result.ConditionResults[0].Success {
|
|
|
|
t.Errorf("Condition '%s' should have been a success", condition)
|
|
|
|
}
|
2020-10-05 01:55:19 +02:00
|
|
|
if !result.Connected {
|
|
|
|
t.Error("Because the connection has been established, result.Connected should've been true")
|
|
|
|
}
|
2020-04-15 01:20:00 +02:00
|
|
|
if !result.Success {
|
|
|
|
t.Error("Because all conditions passed, this should have been a success")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-25 01:49:32 +02:00
|
|
|
func TestIntegrationEvaluateHealthWithFailure(t *testing.T) {
|
2020-04-15 01:20:00 +02:00
|
|
|
condition := Condition("[STATUS] == 500")
|
|
|
|
service := Service{
|
|
|
|
Name: "TwiNNatioN",
|
2020-10-23 22:29:20 +02:00
|
|
|
URL: "https://twinnation.org/health",
|
2020-04-15 01:20:00 +02:00
|
|
|
Conditions: []*Condition{&condition},
|
|
|
|
}
|
2020-09-25 01:49:32 +02:00
|
|
|
result := service.EvaluateHealth()
|
2020-04-15 01:20:00 +02:00
|
|
|
if result.ConditionResults[0].Success {
|
|
|
|
t.Errorf("Condition '%s' should have been a failure", condition)
|
|
|
|
}
|
2020-10-05 01:55:19 +02:00
|
|
|
if !result.Connected {
|
|
|
|
t.Error("Because the connection has been established, result.Connected should've been true")
|
|
|
|
}
|
2020-04-15 01:20:00 +02:00
|
|
|
if result.Success {
|
|
|
|
t.Error("Because one of the conditions failed, success should have been false")
|
|
|
|
}
|
|
|
|
}
|