Просмотр исходного кода

test(alerting): add test for alertjob selection

bergquist 9 лет назад
Родитель
Сommit
b496b6a252
2 измененных файлов с 66 добавлено и 4 удалено
  1. 4 4
      pkg/services/alerting/alerting.go
  2. 62 0
      pkg/services/alerting/alerting_test.go

+ 4 - 4
pkg/services/alerting/alerting.go

@@ -56,25 +56,25 @@ func (s *Scheduler) Dispatch(reader RuleReader) {
 	ticker := time.NewTicker(time.Second * 5)
 
 	s.heartBeat()
-	s.updateJobs(reader)
+	s.updateJobs(reader.Fetch)
 
 	for {
 		select {
 		case <-secondTicker.C:
 			s.queueJobs()
 		case <-reschedule.C:
-			s.updateJobs(reader)
+			s.updateJobs(reader.Fetch)
 		case <-ticker.C:
 			s.heartBeat()
 		}
 	}
 }
 
-func (s *Scheduler) updateJobs(reader RuleReader) {
+func (s *Scheduler) updateJobs(f func() []m.AlertRule) {
 	log.Debug("Scheduler: UpdateJobs()")
 
 	jobs := make([]*AlertJob, 0)
-	rules := reader.Fetch()
+	rules := f()
 
 	for i := s.serverPosition - 1; i < len(rules); i += s.clusterSize {
 		rule := rules[i]

+ 62 - 0
pkg/services/alerting/alerting_test.go

@@ -1 +1,63 @@
 package alerting
+
+import (
+	m "github.com/grafana/grafana/pkg/models"
+	. "github.com/smartystreets/goconvey/convey"
+	"testing"
+)
+
+func TestAlertingScheduler(t *testing.T) {
+	Convey("Testing alert job selection", t, func() {
+		mockFn := func() []m.AlertRule {
+			return []m.AlertRule{
+				{Id: 1, Title: "test 1"},
+				{Id: 2, Title: "test 2"},
+				{Id: 3, Title: "test 3"},
+				{Id: 4, Title: "test 4"},
+				{Id: 5, Title: "test 5"},
+				{Id: 6, Title: "test 6"},
+			}
+		}
+
+		Convey("single server", func() {
+			scheduler := &Scheduler{
+				jobs:           make([]*AlertJob, 0),
+				runQueue:       make(chan *AlertJob, 1000),
+				serverId:       "",
+				serverPosition: 1,
+				clusterSize:    1,
+			}
+
+			scheduler.updateJobs(mockFn)
+			So(len(scheduler.jobs), ShouldEqual, 6)
+		})
+
+		Convey("two servers", func() {
+			scheduler := &Scheduler{
+				jobs:           make([]*AlertJob, 0),
+				runQueue:       make(chan *AlertJob, 1000),
+				serverId:       "",
+				serverPosition: 1,
+				clusterSize:    2,
+			}
+
+			scheduler.updateJobs(mockFn)
+			So(len(scheduler.jobs), ShouldEqual, 3)
+			So(scheduler.jobs[0].id, ShouldEqual, 1)
+		})
+
+		Convey("six servers", func() {
+			scheduler := &Scheduler{
+				jobs:           make([]*AlertJob, 0),
+				runQueue:       make(chan *AlertJob, 1000),
+				serverId:       "",
+				serverPosition: 6,
+				clusterSize:    6,
+			}
+
+			scheduler.updateJobs(mockFn)
+			So(len(scheduler.jobs), ShouldEqual, 1)
+			So(scheduler.jobs[0].id, ShouldEqual, 6)
+		})
+	})
+}