|
|
|
@ -9,91 +9,93 @@ import ( |
|
|
|
|
. "github.com/smartystreets/goconvey/convey" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func TestStateIsUpdatedWhenNeeded(t *testing.T) { |
|
|
|
|
ctx := NewEvalContext(context.TODO(), &Rule{Conditions: []Condition{&conditionStub{firing: true}}}) |
|
|
|
|
|
|
|
|
|
t.Run("ok -> alerting", func(t *testing.T) { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Rule.State = models.AlertStateAlerting |
|
|
|
|
|
|
|
|
|
if !ctx.ShouldUpdateAlertState() { |
|
|
|
|
t.Fatalf("expected should updated to be true") |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("ok -> ok", func(t *testing.T) { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Rule.State = models.AlertStateOK |
|
|
|
|
|
|
|
|
|
if ctx.ShouldUpdateAlertState() { |
|
|
|
|
t.Fatalf("expected should updated to be false") |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestAlertingEvalContext(t *testing.T) { |
|
|
|
|
Convey("Eval context", t, func() { |
|
|
|
|
Convey("Should compute and replace properly new rule state", t, func() { |
|
|
|
|
ctx := NewEvalContext(context.TODO(), &Rule{Conditions: []Condition{&conditionStub{firing: true}}}) |
|
|
|
|
dummieError := fmt.Errorf("dummie error") |
|
|
|
|
|
|
|
|
|
Convey("Should update alert state when needed", func() { |
|
|
|
|
Convey("ok -> alerting", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Firing = true |
|
|
|
|
|
|
|
|
|
Convey("ok -> alerting", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Rule.State = models.AlertStateAlerting |
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateAlerting) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
So(ctx.ShouldUpdateAlertState(), ShouldBeTrue) |
|
|
|
|
}) |
|
|
|
|
Convey("ok -> error(alerting)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Error = dummieError |
|
|
|
|
ctx.Rule.ExecutionErrorState = models.ExecutionErrorSetAlerting |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateAlerting) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("ok -> ok", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Rule.State = models.AlertStateOK |
|
|
|
|
Convey("ok -> error(keep_last)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Error = dummieError |
|
|
|
|
ctx.Rule.ExecutionErrorState = models.ExecutionErrorKeepState |
|
|
|
|
|
|
|
|
|
So(ctx.ShouldUpdateAlertState(), ShouldBeFalse) |
|
|
|
|
}) |
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateOK) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("Should compute and replace properly new rule state", func() { |
|
|
|
|
dummieError := fmt.Errorf("dummie error") |
|
|
|
|
|
|
|
|
|
Convey("ok -> alerting", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Firing = true |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateAlerting) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("ok -> error(alerting)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Error = dummieError |
|
|
|
|
ctx.Rule.ExecutionErrorState = models.ExecutionErrorSetAlerting |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateAlerting) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("ok -> error(keep_last)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Error = dummieError |
|
|
|
|
ctx.Rule.ExecutionErrorState = models.ExecutionErrorKeepState |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateOK) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("pending -> error(keep_last)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStatePending |
|
|
|
|
ctx.Error = dummieError |
|
|
|
|
ctx.Rule.ExecutionErrorState = models.ExecutionErrorKeepState |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStatePending) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("ok -> no_data(alerting)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Rule.NoDataState = models.NoDataSetAlerting |
|
|
|
|
ctx.NoDataFound = true |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateAlerting) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("ok -> no_data(keep_last)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Rule.NoDataState = models.NoDataKeepState |
|
|
|
|
ctx.NoDataFound = true |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateOK) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("pending -> no_data(keep_last)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStatePending |
|
|
|
|
ctx.Rule.NoDataState = models.NoDataKeepState |
|
|
|
|
ctx.NoDataFound = true |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStatePending) |
|
|
|
|
}) |
|
|
|
|
Convey("pending -> error(keep_last)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStatePending |
|
|
|
|
ctx.Error = dummieError |
|
|
|
|
ctx.Rule.ExecutionErrorState = models.ExecutionErrorKeepState |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStatePending) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("ok -> no_data(alerting)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Rule.NoDataState = models.NoDataSetAlerting |
|
|
|
|
ctx.NoDataFound = true |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateAlerting) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("ok -> no_data(keep_last)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStateOK |
|
|
|
|
ctx.Rule.NoDataState = models.NoDataKeepState |
|
|
|
|
ctx.NoDataFound = true |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStateOK) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("pending -> no_data(keep_last)", func() { |
|
|
|
|
ctx.PrevAlertState = models.AlertStatePending |
|
|
|
|
ctx.Rule.NoDataState = models.NoDataKeepState |
|
|
|
|
ctx.NoDataFound = true |
|
|
|
|
|
|
|
|
|
ctx.Rule.State = ctx.GetNewState() |
|
|
|
|
So(ctx.Rule.State, ShouldEqual, models.AlertStatePending) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|