moira
/
datatypes_test.go
366 строк · 9.6 Кб
1package moira
2
3import (
4"testing"
5
6. "github.com/smartystreets/goconvey/convey"
7)
8
9func TestIsScheduleAllows(t *testing.T) {
10allDaysExcludedSchedule := ScheduleData{
11StartOffset: 0,
12EndOffset: 1439,
13Days: []ScheduleDataDay{
14{
15Name: "Mon",
16Enabled: false,
17},
18{
19Name: "Tue",
20Enabled: false,
21},
22{
23Name: "Wed",
24Enabled: false,
25},
26{
27Name: "Thu",
28Enabled: false,
29},
30{
31Name: "Fri",
32Enabled: false,
33},
34{
35Name: "Sat",
36Enabled: false,
37},
38{
39Name: "Sun",
40Enabled: false,
41},
42},
43}
44
45// 367980 - 01/05/1970 6:13am (UTC) Mon
46// 454380 - 01/06/1970 6:13am (UTC) Tue
47
48Convey("No schedule", t, func() {
49var noSchedule *ScheduleData
50So(noSchedule.IsScheduleAllows(367980), ShouldBeTrue)
51})
52
53Convey("Full schedule", t, func() {
54schedule := getDefaultSchedule()
55So(schedule.IsScheduleAllows(367980), ShouldBeTrue)
56})
57
58Convey("Exclude monday", t, func() {
59schedule := getDefaultSchedule()
60schedule.Days[0].Enabled = false
61So(schedule.IsScheduleAllows(367980), ShouldBeFalse)
62So(schedule.IsScheduleAllows(367980+86400), ShouldBeTrue)
63So(schedule.IsScheduleAllows(367980+86400*2), ShouldBeTrue)
64})
65
66Convey("Exclude all days", t, func() {
67schedule := allDaysExcludedSchedule
68So(schedule.IsScheduleAllows(367980), ShouldBeFalse)
69So(schedule.IsScheduleAllows(367980+86400), ShouldBeFalse)
70So(schedule.IsScheduleAllows(367980+86400*5), ShouldBeFalse)
71})
72
73Convey("Include only morning", t, func() {
74schedule := getDefaultSchedule()
75schedule.StartOffset = 60
76schedule.EndOffset = 540
77So(schedule.IsScheduleAllows(86400+129*60), ShouldBeTrue) // 2/01/1970 2:09
78So(schedule.IsScheduleAllows(86400+239*60), ShouldBeTrue) // 1/01/1970 3:59
79So(schedule.IsScheduleAllows(86400-241*60), ShouldBeFalse) // 1/01/1970 19:58
80So(schedule.IsScheduleAllows(86400+541*60), ShouldBeFalse) // 2/01/1970 9:01
81So(schedule.IsScheduleAllows(86400-255*60), ShouldBeFalse) // 1/01/1970 19:45
82})
83}
84
85func TestIsScheduleAllows_Overlapped(t *testing.T) {
86Convey("Each day is allowed, 07:00 - 01:00", t, func() {
87scheduleData := ScheduleData{
88StartOffset: 420,
89EndOffset: 60,
90Days: []ScheduleDataDay{
91{
92Name: "Mon",
93Enabled: true,
94},
95{
96Name: "Tue",
97Enabled: true,
98},
99{
100Name: "Wed",
101Enabled: true,
102},
103{
104Name: "Thu",
105Enabled: true,
106},
107{
108Name: "Fri",
109Enabled: true,
110},
111{
112Name: "Sat",
113Enabled: true,
114},
115{
116Name: "Sun",
117Enabled: true,
118},
119},
120}
121
122So(scheduleData.IsScheduleAllows(1590429223), ShouldBeTrue) // 1590429223 - Mon, 25 May 2020, 20:53:43 MSK
123So(scheduleData.IsScheduleAllows(1590441515), ShouldBeTrue) // 1590441515 - Tue, 26 May 2020, 00:18:35 MSK
124So(scheduleData.IsScheduleAllows(1590377447), ShouldBeFalse) // 1590377447 - Mon, 25 May 2020, 06:30:47 MSK
125So(scheduleData.IsScheduleAllows(1590444047), ShouldBeFalse) // 1590444047 - Tue, 26 May 2020, 01:00:47 MSK
126})
127
128Convey("Workdays are allowed, 14:00 - 03:00", t, func() {
129scheduleData := ScheduleData{
130StartOffset: 840,
131EndOffset: 180,
132Days: []ScheduleDataDay{
133{
134Name: "Mon",
135Enabled: true,
136},
137{
138Name: "Tue",
139Enabled: true,
140},
141{
142Name: "Wed",
143Enabled: true,
144},
145{
146Name: "Thu",
147Enabled: true,
148},
149{
150Name: "Fri",
151Enabled: true,
152},
153{
154Name: "Sat",
155Enabled: false,
156},
157{
158Name: "Sun",
159Enabled: false,
160},
161},
162}
163
164So(scheduleData.IsScheduleAllows(1590144703), ShouldBeFalse) // 1590144703 - Fri, 22 May 2020, 13:51:43 MSK
165So(scheduleData.IsScheduleAllows(1590153259), ShouldBeTrue) // 1590153259 - Fri, 22 May 2020, 16:14:19 MSK
166So(scheduleData.IsScheduleAllows(1590176483), ShouldBeTrue) // 1590176483 - Fri, 22 May 2020, 22:41:23 MSK
167So(scheduleData.IsScheduleAllows(1590188282), ShouldBeTrue) // 1590188282 - Sat, 23 May 2020, 01:58:02 MSK
168So(scheduleData.IsScheduleAllows(1590231720), ShouldBeFalse) // 1590231720 - Sat, 23 May 2020, 14:02:00 MSK
169So(scheduleData.IsScheduleAllows(1590257764), ShouldBeFalse) // 1590257764 - Sat, 23 May 2020, 21:16:04 MSK
170So(scheduleData.IsScheduleAllows(1590276974), ShouldBeFalse) // 1590276974 - Sun, 24 May 2020, 02:36:14 MSK
171})
172}
173
174func TestEventsData_GetSubjectState(t *testing.T) {
175Convey("Get ERROR state", t, func() {
176message := "mes1"
177var value float64 = 1
178states := NotificationEvents{{State: OK}, {State: ERROR, Message: &message, Value: &value}}
179So(states.GetSubjectState(), ShouldResemble, ERROR)
180So(states[0].String(), ShouldResemble, "TriggerId: , Metric: \nValue: 0, OldValue: 0\nState: OK, OldState: \nMessage: \nTimestamp: 0")
181So(states[1].String(), ShouldResemble, "TriggerId: , Metric: \nValue: 1, OldValue: 0\nState: ERROR, OldState: \nMessage: mes1\nTimestamp: 0")
182})
183}
184
185func TestTriggerData_GetTags(t *testing.T) {
186Convey("Test one tag", t, func() {
187triggerData := TriggerData{
188Tags: []string{"tag1"},
189}
190So(triggerData.GetTags(), ShouldResemble, "[tag1]")
191})
192Convey("Test many tags", t, func() {
193triggerData := TriggerData{
194Tags: []string{"tag1", "tag2", "tag...orNot"},
195}
196So(triggerData.GetTags(), ShouldResemble, "[tag1][tag2][tag...orNot]")
197})
198Convey("Test no tags", t, func() {
199triggerData := TriggerData{
200Tags: make([]string, 0),
201}
202So(triggerData.GetTags(), ShouldBeEmpty)
203})
204}
205
206func TestScheduledNotification_GetKey(t *testing.T) {
207Convey("Get key", t, func() {
208notification := ScheduledNotification{
209Contact: ContactData{Type: "email", Value: "my@mail.com"},
210Event: NotificationEvent{Value: nil, State: NODATA, Metric: "my.metric"},
211Timestamp: 123456789,
212}
213So(notification.GetKey(), ShouldResemble, "email:my@mail.com::my.metric:NODATA:0:0.000000:0:123456789")
214})
215}
216
217func TestCheckData_GetOrCreateMetricState(t *testing.T) {
218Convey("Test no metric", t, func() {
219checkData := CheckData{
220Metrics: make(map[string]*MetricState),
221}
222So(
223checkData.GetOrCreateMetricState("my.metric", 12343),
224ShouldResemble,
225&MetricState{State: NODATA, Timestamp: 12343, IsNoData: true},
226)
227})
228Convey("Test has metric", t, func() {
229metricState := &MetricState{Timestamp: 11211, IsNoData: true}
230checkData := CheckData{
231Metrics: map[string]*MetricState{
232"my.metric": metricState,
233},
234}
235So(checkData.GetOrCreateMetricState("my.metric", 12343), ShouldResemble, metricState)
236})
237}
238
239func TestMetricState_GetCheckPoint(t *testing.T) {
240Convey("Get check point", t, func() {
241metricState := MetricState{Timestamp: 800, EventTimestamp: 700}
242So(metricState.GetCheckPoint(120), ShouldEqual, 700)
243
244metricState = MetricState{Timestamp: 830, EventTimestamp: 700}
245So(metricState.GetCheckPoint(120), ShouldEqual, 710)
246
247metricState = MetricState{Timestamp: 699, EventTimestamp: 700}
248So(metricState.GetCheckPoint(1), ShouldEqual, 700)
249})
250}
251
252func TestMetricState_GetEventTimestamp(t *testing.T) {
253Convey("Get event timestamp", t, func() {
254metricState := MetricState{Timestamp: 800, EventTimestamp: 0}
255So(metricState.GetEventTimestamp(), ShouldEqual, 800)
256
257metricState = MetricState{Timestamp: 830, EventTimestamp: 700}
258So(metricState.GetEventTimestamp(), ShouldEqual, 700)
259})
260}
261
262func TestTrigger_IsSimple(t *testing.T) {
263Convey("Is Simple", t, func() {
264trigger := Trigger{
265Patterns: []string{"123"},
266Targets: []string{"123"},
267}
268
269So(trigger.IsSimple(), ShouldBeTrue)
270})
271
272Convey("Not simple", t, func() {
273triggers := []Trigger{
274{Patterns: []string{"123", "1233"}},
275{Patterns: []string{"123", "1233"}, Targets: []string{"123", "1233"}},
276{Targets: []string{"123", "1233"}},
277{Patterns: []string{"123"}, Targets: []string{"123", "1233"}},
278{Patterns: []string{"123?"}, Targets: []string{"123"}},
279{Patterns: []string{"12*3"}, Targets: []string{"123"}},
280{Patterns: []string{"1{23"}, Targets: []string{"123"}},
281{Patterns: []string{"[123"}, Targets: []string{"123"}},
282{Patterns: []string{"[12*3"}, Targets: []string{"123"}},
283}
284
285for _, trigger := range triggers {
286So(trigger.IsSimple(), ShouldBeFalse)
287}
288})
289}
290
291func TestCheckData_GetEventTimestamp(t *testing.T) {
292Convey("Get event timestamp", t, func() {
293checkData := CheckData{Timestamp: 800, EventTimestamp: 0}
294So(checkData.GetEventTimestamp(), ShouldEqual, 800)
295
296checkData = CheckData{Timestamp: 830, EventTimestamp: 700}
297So(checkData.GetEventTimestamp(), ShouldEqual, 700)
298})
299}
300
301func TestCheckData_UpdateScore(t *testing.T) {
302Convey("Update score", t, func() {
303checkData := CheckData{State: ERROR}
304So(checkData.UpdateScore(), ShouldEqual, 100)
305So(checkData.Score, ShouldEqual, 100)
306
307checkData = CheckData{
308State: OK,
309Metrics: map[string]*MetricState{
310"123": {State: ERROR},
311"321": {State: OK},
312"345": {State: WARN},
313},
314}
315So(checkData.UpdateScore(), ShouldEqual, 101)
316So(checkData.Score, ShouldEqual, 101)
317
318checkData = CheckData{
319State: ERROR,
320Metrics: map[string]*MetricState{
321"123": {State: ERROR},
322"321": {State: OK},
323"345": {State: WARN},
324},
325}
326So(checkData.UpdateScore(), ShouldEqual, 201)
327So(checkData.Score, ShouldEqual, 201)
328})
329}
330
331func getDefaultSchedule() ScheduleData {
332return ScheduleData{
333StartOffset: 0,
334EndOffset: 1439,
335Days: []ScheduleDataDay{
336{
337Name: "Mon",
338Enabled: true,
339},
340{
341Name: "Tue",
342Enabled: true,
343},
344{
345Name: "Wed",
346Enabled: true,
347},
348{
349Name: "Thu",
350Enabled: true,
351},
352{
353Name: "Fri",
354Enabled: true,
355},
356{
357Name: "Sat",
358Enabled: true,
359},
360{
361Name: "Sun",
362Enabled: true,
363},
364},
365}
366}
367