8
. "github.com/smartystreets/goconvey/convey"
10
"go.avito.ru/DO/moira"
11
"go.avito.ru/DO/moira/database"
12
"go.avito.ru/DO/moira/test-helpers"
15
func StringSetShouldResemble(actual interface{}, expected ...interface{}) string {
16
sortedActual := append([]string{}, actual.([]string)...)
17
sort.Strings(sortedActual)
18
sortedExpected := append([]string{}, expected[0].([]string)...)
19
sort.Strings(sortedExpected)
20
return ShouldResemble(sortedActual, sortedExpected)
23
func TestTriggerStoring(t *testing.T) {
24
logger := test_helpers.GetTestLogger()
25
dataBase := NewDatabase(logger, config)
27
defer dataBase.flush()
29
Convey("Trigger manipulation", t, func() {
30
Convey("Test save-get-remove", func() {
31
trigger := &triggers[0]
33
//Check for not existing not writen trigger
34
actual, err := dataBase.GetTrigger(trigger.ID)
35
So(err, ShouldResemble, database.ErrNil)
36
So(actual, ShouldBeNil)
38
err = dataBase.RemoveTrigger(trigger.ID)
42
err = dataBase.SaveTrigger(trigger.ID, trigger)
45
//And check for existing by several pointers like id or tag
46
actual, err = dataBase.GetTrigger(trigger.ID)
48
So(actual, ShouldResemble, trigger)
50
ids, err := dataBase.GetTriggerIDs(false)
52
So(ids, ShouldResemble, []string{trigger.ID})
54
ids, err = dataBase.GetTagTriggerIDs(trigger.Tags[0])
56
So(ids, ShouldResemble, []string{trigger.ID})
58
ids, err = dataBase.GetPatternTriggerIDs(trigger.Patterns[0])
60
So(ids, ShouldResemble, []string{trigger.ID})
62
actualTriggers, err := dataBase.GetTriggers(ids)
64
So(actualTriggers, ShouldResemble, []*moira.Trigger{trigger})
66
//Also we write new patterns
67
actualPatterns, err := dataBase.GetPatterns()
69
So(actualPatterns, ShouldResemble, trigger.Patterns)
72
actualTags, err := dataBase.GetTagNames()
74
So(actualTags, ShouldResemble, trigger.Tags)
76
//Now just add tag and pattern in trigger and save it
78
changedTrigger := &triggers[1]
79
err = dataBase.SaveTrigger(changedTrigger.ID, changedTrigger)
82
actual, err = dataBase.GetTrigger(changedTrigger.ID)
84
So(actual.Name, ShouldResemble, changedTrigger.Name)
86
//Now we can get this trigger by two tags
87
ids, err = dataBase.GetTagTriggerIDs(changedTrigger.Tags[0])
89
So(ids, StringSetShouldResemble, []string{changedTrigger.ID})
91
ids, err = dataBase.GetTagTriggerIDs(changedTrigger.Tags[1])
93
So(ids, StringSetShouldResemble, []string{triggers[0].ID, changedTrigger.ID})
95
//And we have new tag in tags list
96
actualTags, err = dataBase.GetTagNames()
98
So(actualTags, ShouldHaveLength, 2)
100
//Also we can get this trigger by new pattern
101
ids, err = dataBase.GetPatternTriggerIDs(changedTrigger.Patterns[0])
103
So(ids, StringSetShouldResemble, []string{changedTrigger.ID})
105
ids, err = dataBase.GetPatternTriggerIDs(changedTrigger.Patterns[1])
107
So(ids, StringSetShouldResemble, []string{triggers[0].ID, changedTrigger.ID})
109
//And we have new pattern in patterns list
110
actualPatterns, err = dataBase.GetPatterns()
112
So(actualPatterns, ShouldHaveLength, 2)
114
//Now remove old tag and pattern in trigger and save it
115
changedAgainTrigger := &triggers[2]
116
err = dataBase.SaveTrigger(changedAgainTrigger.ID, changedAgainTrigger)
119
actual, err = dataBase.GetTrigger(changedAgainTrigger.ID)
121
So(actual.Name, ShouldResemble, changedAgainTrigger.Name)
123
ids, err = dataBase.GetTagTriggerIDs(changedAgainTrigger.Tags[0])
125
So(ids, StringSetShouldResemble, []string{changedAgainTrigger.ID, changedTrigger.ID})
127
ids, err = dataBase.GetTagTriggerIDs(changedAgainTrigger.Tags[1])
129
So(ids, StringSetShouldResemble, []string{changedAgainTrigger.ID})
131
//But we still has this tag in tags list with new one
132
actualTags, err = dataBase.GetTagNames()
134
So(actualTags, ShouldHaveLength, 3)
136
ids, err = dataBase.GetPatternTriggerIDs(changedAgainTrigger.Patterns[0])
138
So(ids, StringSetShouldResemble, []string{changedAgainTrigger.ID})
140
ids, err = dataBase.GetPatternTriggerIDs(changedAgainTrigger.Patterns[1])
142
So(ids, StringSetShouldResemble, []string{changedAgainTrigger.ID, changedTrigger.ID})
144
//But this pattern no more in pattern list, it is not needed
145
actualTags, err = dataBase.GetPatterns()
147
So(actualTags, ShouldHaveLength, 3)
149
//Stop it!! Remove trigger and check for no existing it by pointers
150
err = dataBase.RemoveTrigger(changedAgainTrigger.ID)
153
//And check for existing by several pointers like id or tag
154
actual, err = dataBase.GetTrigger(changedAgainTrigger.ID)
155
So(err, ShouldResemble, database.ErrNil)
156
So(actual, ShouldBeNil)
158
ids, err = dataBase.GetTagTriggerIDs(changedAgainTrigger.Tags[1])
160
So(ids, ShouldBeEmpty)
162
ids, err = dataBase.GetPatternTriggerIDs(changedAgainTrigger.Patterns[0])
164
So(ids, ShouldBeEmpty)
166
actualTriggers, err = dataBase.GetTriggers([]string{changedAgainTrigger.ID})
168
So(actualTriggers, ShouldResemble, []*moira.Trigger{nil})
171
actualTags, err = dataBase.GetTagNames()
173
So(actualTags, ShouldHaveLength, 3)
176
Convey("Save trigger with lastCheck and throttling and GetTriggerChecks", func() {
177
trigger := triggers[5]
178
triggerCheck := &moira.TriggerCheck{
182
err := dataBase.SaveTrigger(trigger.ID, &trigger)
185
actual, err := dataBase.GetTrigger(trigger.ID)
187
So(actual, ShouldResemble, &trigger)
189
actualTriggerChecks, err := dataBase.GetTriggerChecks([]string{trigger.ID})
191
So(actualTriggerChecks, ShouldResemble, []*moira.TriggerCheck{triggerCheck})
194
err = dataBase.SetTriggerLastCheck(trigger.ID, lastCheckTest)
197
triggerCheck.LastCheck = lastCheckTest
198
actualTriggerChecks, err = dataBase.GetTriggerChecks([]string{trigger.ID})
200
So(actualTriggerChecks, ShouldResemble, []*moira.TriggerCheck{triggerCheck})
203
err = dataBase.SetTriggerThrottling(trigger.ID, time.Now().Add(-time.Minute))
207
actualTriggerChecks, err = dataBase.GetTriggerChecks([]string{trigger.ID})
209
So(actualTriggerChecks, ShouldResemble, []*moira.TriggerCheck{triggerCheck})
211
//Now good throttling
212
th := time.Now().Add(time.Minute)
213
err = dataBase.SetTriggerThrottling(trigger.ID, th)
216
triggerCheck.Throttling = th.Unix()
217
actualTriggerChecks, err = dataBase.GetTriggerChecks([]string{trigger.ID})
219
So(actualTriggerChecks, ShouldResemble, []*moira.TriggerCheck{triggerCheck})
222
err = dataBase.DeleteTriggerThrottling(trigger.ID)
225
triggerCheck.Throttling = 0
226
actualTriggerChecks, err = dataBase.GetTriggerChecks([]string{trigger.ID})
228
So(actualTriggerChecks, ShouldResemble, []*moira.TriggerCheck{triggerCheck})
230
//Can not remove check data, but can remove trigger!
231
err = dataBase.RemoveTrigger(trigger.ID)
234
actualTriggerChecks, err = dataBase.GetTriggerChecks([]string{trigger.ID})
236
So(actualTriggerChecks, ShouldResemble, []*moira.TriggerCheck{nil})
241
func TestTriggerErrorConnection(t *testing.T) {
242
logger := test_helpers.GetTestLogger()
243
dataBase := NewDatabase(logger, emptyConfig)
245
defer dataBase.flush()
246
Convey("Should throw error when no connection", t, func() {
247
actual, err := dataBase.GetTriggerIDs(false)
248
So(err, ShouldNotBeNil)
249
So(actual, ShouldBeNil)
251
actual1, err := dataBase.GetTrigger("")
252
So(err, ShouldNotBeNil)
253
So(actual1, ShouldBeNil)
255
actual2, err := dataBase.GetTriggers([]string{})
256
So(err, ShouldNotBeNil)
257
So(actual2, ShouldBeNil)
259
actual3, err := dataBase.GetTriggerChecks([]string{})
260
So(err, ShouldNotBeNil)
261
So(actual3, ShouldBeNil)
263
err = dataBase.SaveTrigger("", &triggers[0])
264
So(err, ShouldNotBeNil)
266
err = dataBase.RemoveTrigger("")
267
So(err, ShouldNotBeNil)
269
actual4, err := dataBase.GetPatternTriggerIDs("")
270
So(err, ShouldNotBeNil)
271
So(actual4, ShouldBeNil)
273
err = dataBase.RemovePatternTriggerIDs("")
274
So(err, ShouldNotBeNil)
278
var triggers = []moira.Trigger{
280
ID: "triggerID-0000000000001",
281
Name: "test trigger 1 v1.0",
282
Targets: []string{"test.target.1"},
283
Tags: []string{"test-tag-1"},
284
Patterns: []string{"test.pattern.1"},
287
ID: "triggerID-0000000000002",
288
Name: "test trigger 1 v2.0",
289
Targets: []string{"test.target.1", "test.target.2"},
290
Tags: []string{"test-tag-2", "test-tag-1"},
291
Patterns: []string{"test.pattern.2", "test.pattern.1"},
294
ID: "triggerID-0000000000003",
295
Name: "test trigger 1 v3.0",
296
Targets: []string{"test.target.3"},
297
Tags: []string{"test-tag-2", "test-tag-3"},
298
Patterns: []string{"test.pattern.3", "test.pattern.2"},
301
ID: "triggerID-0000000000004",
302
Name: "test trigger 4",
303
Targets: []string{"test.target.4"},
304
Tags: []string{"test-tag-4"},
307
ID: "triggerID-0000000000005",
308
Name: "test trigger 5 (nobody is subscribed)",
309
Targets: []string{"test.target.5"},
310
Tags: []string{"test-tag-nosub"},
313
ID: "triggerID-0000000000006",
314
Name: "test trigger 6 (throttling disabled)",
315
Targets: []string{"test.target.6"},
316
Tags: []string{"test-tag-throttling-disabled"},
319
ID: "triggerID-0000000000007",
320
Name: "test trigger 7 (multiple subscribers)",
321
Targets: []string{"test.target.7"},
322
Tags: []string{"test-tag-multiple-subs"},
325
ID: "triggerID-0000000000008",
326
Name: "test trigger 8 (duplicated contacts)",
327
Targets: []string{"test.target.8"},
328
Tags: []string{"test-tag-dup-contacts"},
331
ID: "triggerID-0000000000009",
332
Name: "test trigger 9 (pseudo tag)",
333
Targets: []string{"test.target.9"},
334
Tags: []string{"test-degradation"},