Fixing UT issues of Alarm Manager
[ric-plt/alarm-go.git] / manager / cmd / manager_test.go
1 /*
2  *  Copyright (c) 2020 AT&T Intellectual Property.
3  *  Copyright (c) 2020 Nokia.
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  * This source code is part of the near-RT RIC (RAN Intelligent Controller)
18  * platform project (RICP).
19  */
20
21 package main
22
23 import (
24         "bytes"
25         "encoding/json"
26         "fmt"
27         "io"
28         "io/ioutil"
29         "net"
30         "net/http"
31         "net/http/httptest"
32         "os"
33         "os/exec"
34         "strconv"
35         "strings"
36         "testing"
37         "time"
38
39         "gerrit.o-ran-sc.org/r/ric-plt/alarm-go/alarm"
40         "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
41         "github.com/gorilla/mux"
42         "github.com/prometheus/alertmanager/api/v2/models"
43         "github.com/stretchr/testify/assert"
44 )
45
46 var alarmManager *AlarmManager
47 var alarmer *alarm.RICAlarm
48 var eventChan chan string
49
50 // Test cases
51 func TestMain(M *testing.M) {
52         alarmManager = NewAlarmManager("localhost:9093", 500, false)
53         alarmManager.alertInterval = 20000
54         go alarmManager.Run(false, 5)
55         time.Sleep(time.Duration(10) * time.Second)
56
57         // Wait until RMR is up-and-running
58         for !xapp.Rmr.IsReady() {
59                 time.Sleep(time.Duration(1) * time.Second)
60         }
61
62         alarmer, _ = alarm.InitAlarm("my-pod", "my-app")
63         alarmManager.alarmClient = alarmer
64         time.Sleep(time.Duration(5) * time.Second)
65         eventChan = make(chan string)
66
67         os.Exit(M.Run())
68 }
69
70 func TestGetPreDefinedAlarmDefinitions(t *testing.T) {
71         xapp.Logger.Info("TestGetPreDefinedAlarmDefinitions")
72         var alarmDefinition alarm.AlarmDefinition
73         req, _ := http.NewRequest("GET", "/ric/v1/alarms/define", nil)
74         vars := map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
75         req = mux.SetURLVars(req, vars)
76         handleFunc := http.HandlerFunc(alarmManager.GetAlarmDefinition)
77         response := executeRequest(req, handleFunc)
78         checkResponseCode(t, http.StatusOK, response.Code)
79         json.NewDecoder(response.Body).Decode(&alarmDefinition)
80         xapp.Logger.Info("alarm definition = %v", alarmDefinition)
81     if alarmDefinition.AlarmId != alarm.E2_CONNECTION_PROBLEM || alarmDefinition.AlarmText != "E2 CONNECTION PROBLEM" {
82                 t.Errorf("Incorrect alarm definition")
83         }
84 }
85
86 func TestSetAlarmDefinitions(t *testing.T) {
87         xapp.Logger.Info("TestSetAlarmDefinitions")
88         
89     var alarm72004Definition alarm.AlarmDefinition
90         alarm72004Definition.AlarmId = alarm.E2_CONNECTION_PROBLEM
91         alarm72004Definition.AlarmText = "E2 CONNECTIVITY LOST TO E-NODEB/G-NODEB"
92         alarm72004Definition.EventType = "Communication error"
93         alarm72004Definition.OperationInstructions = "Not defined"
94         alarm72004Definition.RaiseDelay = 0
95         alarm72004Definition.ClearDelay = 0
96
97         var alarm72008Definition alarm.AlarmDefinition
98         alarm72008Definition.AlarmId = alarm.ACTIVE_ALARM_EXCEED_MAX_THRESHOLD
99         alarm72008Definition.AlarmText = "ACTIVE ALARM EXCEED MAX THRESHOLD"
100         alarm72008Definition.EventType = "storage warning"
101         alarm72008Definition.OperationInstructions = "Clear alarms or raise threshold"
102         alarm72008Definition.RaiseDelay = 0
103         alarm72008Definition.ClearDelay = 0
104
105         var alarm72009Definition alarm.AlarmDefinition
106         alarm72009Definition.AlarmId = alarm.ALARM_HISTORY_EXCEED_MAX_THRESHOLD
107         alarm72009Definition.AlarmText = "ALARM HISTORY EXCEED MAX THRESHOLD"
108         alarm72009Definition.EventType = "storage warning"
109         alarm72009Definition.OperationInstructions = "Clear alarms or raise threshold"
110         alarm72009Definition.RaiseDelay = 0
111         alarm72009Definition.ClearDelay = 0
112
113         pbodyParams := RicAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarm72004Definition, &alarm72008Definition, &alarm72009Definition}}
114         pbodyEn, _ := json.Marshal(pbodyParams)
115         req, _ := http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(pbodyEn))
116         handleFunc := http.HandlerFunc(alarmManager.SetAlarmDefinition)
117         response := executeRequest(req, handleFunc)
118         status := checkResponseCode(t, http.StatusOK, response.Code)
119         xapp.Logger.Info("status = %v", status)
120 }
121
122
123 func TestSetAlarmConfigDecodeError(t *testing.T) {
124         xapp.Logger.Info("TestSetAlarmConfigDecodeError")
125
126         var jsonStr = []byte(`{"test":"Invalid Alarm Data", "test1" 123}`)
127         req, _ := http.NewRequest("POST", "/ric/v1/alarms", bytes.NewBuffer(jsonStr))
128         handleFunc := http.HandlerFunc(alarmManager.SetAlarmConfig)
129         response := executeRequest(req, handleFunc)
130         status := checkResponseCode(t,http.StatusOK,response.Code)
131         xapp.Logger.Info("status = %v", status)
132 }
133
134 func TestSetAlarmDefinitionDecodeError(t *testing.T) {
135         xapp.Logger.Info("TestSetAlarmDefinitionDecodeError")
136
137         var jsonStr = []byte(`{"test":"Invalid Alarm Data", "test1" 123}`)
138         req, _ := http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(jsonStr))
139         handleFunc := http.HandlerFunc(alarmManager.SetAlarmDefinition)
140         response := executeRequest(req, handleFunc)
141         status := checkResponseCode(t,http.StatusBadRequest,response.Code)
142         xapp.Logger.Info("status = %v", status)
143 }
144
145 func TestRaiseAlarmEmptyBody(t *testing.T) {
146         xapp.Logger.Info("TestRaiseAlarmEmptyBody")
147         req, _ := http.NewRequest("POST", "/ric/v1/alarms", nil)
148         handleFunc := http.HandlerFunc(alarmManager.RaiseAlarm)
149         response := executeRequest(req, handleFunc)
150         status := checkResponseCode(t,http.StatusOK,response.Code)
151         xapp.Logger.Info("status = %v", status)
152 }
153
154 func TestSetAlarmDefinitionsEmptyBody(t *testing.T) {
155         xapp.Logger.Info("TestSetAlarmDefinitionsEmptyBody")
156         req, _ := http.NewRequest("POST", "/ric/v1/alarms/define", nil)
157         handleFunc := http.HandlerFunc(alarmManager.SetAlarmDefinition)
158         response := executeRequest(req, handleFunc)
159         status := checkResponseCode(t,http.StatusBadRequest,response.Code)
160         xapp.Logger.Info("status = %v", status)
161 }
162
163 func TestClearAlarmEmptyBody(t *testing.T) {
164         xapp.Logger.Info("TestClearAlarmEmptyBody")
165         req, _ := http.NewRequest("DELETE", "/ric/v1/alarms", nil)
166         handleFunc := http.HandlerFunc(alarmManager.ClearAlarm)
167         response := executeRequest(req, handleFunc)
168         status := checkResponseCode(t,http.StatusOK,response.Code)
169         xapp.Logger.Info("status = %v", status)
170 }
171
172 func TestGetAlarmDefinitions(t *testing.T) {
173         xapp.Logger.Info("TestGetAlarmDefinitions")
174         var alarmDefinition alarm.AlarmDefinition
175         req, _ := http.NewRequest("GET", "/ric/v1/alarms/define", nil)
176         vars := map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
177         req = mux.SetURLVars(req, vars)
178         handleFunc := http.HandlerFunc(alarmManager.GetAlarmDefinition)
179         response := executeRequest(req, handleFunc)
180         checkResponseCode(t, http.StatusOK, response.Code)
181         json.NewDecoder(response.Body).Decode(&alarmDefinition)
182         xapp.Logger.Info("alarm definition = %v", alarmDefinition)
183         if alarmDefinition.AlarmId != alarm.E2_CONNECTION_PROBLEM || alarmDefinition.AlarmText != "E2 CONNECTION PROBLEM" {
184                 t.Errorf("Incorrect alarm definition")
185         }
186 }
187
188 func TestDeleteAlarmDefinitions(t *testing.T) {
189         xapp.Logger.Info("TestDeleteAlarmDefinitions")
190         //Get all
191         var ricAlarmDefinitions RicAlarmDefinitions
192         req, _ := http.NewRequest("GET", "/ric/v1/alarms/define", nil)
193         req = mux.SetURLVars(req, nil)
194         handleFunc := http.HandlerFunc(alarmManager.GetAlarmDefinition)
195         response := executeRequest(req, handleFunc)
196         checkResponseCode(t, http.StatusOK, response.Code)
197         json.NewDecoder(response.Body).Decode(&ricAlarmDefinitions)
198         for _, alarmDefinition := range ricAlarmDefinitions.AlarmDefinitions {
199                 xapp.Logger.Info("alarm definition = %v", *alarmDefinition)
200         }
201
202         //Delete 72004
203         req, _ = http.NewRequest("DELETE", "/ric/v1/alarms/define", nil)
204         vars := map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
205         req = mux.SetURLVars(req, vars)
206         handleFunc = http.HandlerFunc(alarmManager.DeleteAlarmDefinition)
207         response = executeRequest(req, handleFunc)
208         checkResponseCode(t, http.StatusOK, response.Code)
209
210         //Get 72004 fail
211         req, _ = http.NewRequest("GET", "/ric/v1/alarms/define", nil)
212         vars = map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
213         req = mux.SetURLVars(req, vars)
214         handleFunc = http.HandlerFunc(alarmManager.GetAlarmDefinition)
215         response = executeRequest(req, handleFunc)
216         checkResponseCode(t, http.StatusBadRequest, response.Code)
217
218         //Set 72004 success
219         var alarm72004Definition alarm.AlarmDefinition
220         alarm72004Definition.AlarmId = alarm.E2_CONNECTION_PROBLEM
221         alarm72004Definition.AlarmText = "E2 CONNECTION PROBLEM"
222         alarm72004Definition.EventType = "Processing error"
223         alarm72004Definition.OperationInstructions = "Not defined"
224         alarm72004Definition.RaiseDelay = 0
225         alarm72004Definition.ClearDelay = 0
226         pbodyParams := RicAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarm72004Definition}}
227         pbodyEn, _ := json.Marshal(pbodyParams)
228         req, _ = http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(pbodyEn))
229         handleFunc = http.HandlerFunc(alarmManager.SetAlarmDefinition)
230         response = executeRequest(req, handleFunc)
231         checkResponseCode(t, http.StatusOK, response.Code)
232
233         //Get 72004 success
234         req, _ = http.NewRequest("GET", "/ric/v1/alarms/define", nil)
235         vars = map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
236         req = mux.SetURLVars(req, vars)
237         handleFunc = http.HandlerFunc(alarmManager.GetAlarmDefinition)
238         response = executeRequest(req, handleFunc)
239         checkResponseCode(t, http.StatusOK, response.Code)
240 }
241
242 func TestNewAlarmStoredAndPostedSucess(t *testing.T) {
243         xapp.Logger.Info("TestNewAlarmStoredAndPostedSucess")
244         ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
245         defer ts.Close()
246
247         a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityCritical, "Some App data", "eth 0 1")
248         assert.Nil(t, alarmer.Raise(a), "raise failed")
249
250         VerifyAlarm(t, a, 1)
251
252         var activeAlarms []AlarmNotification
253         activeAlarms = make([]AlarmNotification, 1)
254         req, _ := http.NewRequest("GET", "/ric/v1/alarms/active", nil)
255         req = mux.SetURLVars(req, nil)
256         handleFunc := http.HandlerFunc(alarmManager.GetActiveAlarms)
257         response := executeRequest(req, handleFunc)
258         checkResponseCode(t, http.StatusOK, response.Code)
259
260         // Decode the json output from handler
261         json.NewDecoder(response.Body).Decode(activeAlarms)
262         if len(activeAlarms) != 1 {
263                 t.Errorf("Incorrect alarm alarm count")
264         }
265
266         var alarmHistory []AlarmNotification
267         alarmHistory = make([]AlarmNotification, 1)
268         req, _ = http.NewRequest("GET", "/ric/v1/alarms/history", nil)
269         req = mux.SetURLVars(req, nil)
270         handleFunc = http.HandlerFunc(alarmManager.GetAlarmHistory)
271         response = executeRequest(req, handleFunc)
272         checkResponseCode(t, http.StatusOK, response.Code)
273
274         // Decode the json output from handler
275         json.NewDecoder(response.Body).Decode(alarmHistory)
276         if len(alarmHistory) != 1 {
277                 t.Errorf("Incorrect alarm history count")
278         }
279 }
280
281 func TestAlarmClearedSucess(t *testing.T) {
282         xapp.Logger.Info("TestAlarmClearedSucess")
283         ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
284         defer ts.Close()
285
286         // Raise the alarm
287         a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityCritical, "Some App data", "eth 0 1")
288         assert.Nil(t, alarmer.Raise(a), "raise failed")
289
290         VerifyAlarm(t, a, 1)
291
292         // Now Clear the alarm and check alarm is removed
293         a = alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityCritical, "Some App data", "eth 0 1")
294     assert.Nil(t, alarmer.Clear(a), "clear failed")
295
296         time.Sleep(time.Duration(2) * time.Second)
297         assert.Equal(t, len(alarmManager.activeAlarms), 0)
298 }
299
300 func TestMultipleAlarmsRaisedSucess(t *testing.T) {
301         xapp.Logger.Info("TestMultipleAlarmsRaisedSucess")
302         ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
303         defer ts.Close()
304
305         // Raise two alarms
306         a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
307     assert.Nil(t, alarmer.Raise(a), "raise failed")
308
309         b := alarmer.NewAlarm(alarm.ACTIVE_ALARM_EXCEED_MAX_THRESHOLD, alarm.SeverityMinor, "Hello", "abcd 11")
310         assert.Nil(t, alarmer.Raise(b), "raise failed")
311
312         time.Sleep(time.Duration(5) * time.Second)
313
314         xapp.Logger.Info("VerifyAlarm: %d %+v", len(alarmManager.activeAlarms), alarmManager.activeAlarms)
315         VerifyAlarm(t, a, 1)
316         xapp.Logger.Info("VerifyAlarm: %d %+v", len(alarmManager.activeAlarms), alarmManager.activeAlarms)
317         VerifyAlarm(t, b, 2)
318 }
319
320 func TestMultipleAlarmsClearedSucess(t *testing.T) {
321         xapp.Logger.Info("TestMultipleAlarmsClearedSucess")
322         ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
323         defer ts.Close()
324
325         // Raise two alarms
326         a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
327         assert.Nil(t, alarmer.Clear(a), "clear failed")
328
329         b := alarmer.NewAlarm(alarm.ACTIVE_ALARM_EXCEED_MAX_THRESHOLD, alarm.SeverityMinor, "Hello", "abcd 11")
330         assert.Nil(t, alarmer.Clear(b), "clear failed")
331
332         time.Sleep(time.Duration(2) * time.Second)
333         assert.Equal(t, len(alarmManager.activeAlarms), 0)
334 }
335
336 func TestAlarmsSuppresedSucess(t *testing.T) {
337         xapp.Logger.Info("TestAlarmsSuppresedSucess")
338         ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
339         defer ts.Close()
340
341         // Raise two similar/matching alarms ... the second one suppresed
342         a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
343         assert.Nil(t, alarmer.Raise(a), "raise failed")
344         assert.Nil(t, alarmer.Raise(a), "raise failed")
345
346         VerifyAlarm(t, a, 1)
347         assert.Nil(t, alarmer.Clear(a), "clear failed")
348 }
349
350 func TestInvalidAlarms(t *testing.T) {
351         xapp.Logger.Info("TestInvalidAlarms")
352         a := alarmer.NewAlarm(1111, alarm.SeverityMajor, "Some App data", "eth 0 1")
353         assert.Nil(t, alarmer.Raise(a), "raise failed")
354         time.Sleep(time.Duration(2) * time.Second)
355 }
356
357 func TestAlarmHandlingErrorCases(t *testing.T) {
358         xapp.Logger.Info("TestAlarmHandlingErrorCases")
359         ok, err := alarmManager.HandleAlarms(&xapp.RMRParams{})
360         assert.Equal(t, err.Error(), "unexpected end of JSON input")
361         assert.Nil(t, ok, "raise failed")
362 }
363
364 func TestConsumeUnknownMessage(t *testing.T) {
365         xapp.Logger.Info("TestConsumeUnknownMessage")
366         err := alarmManager.Consume(&xapp.RMRParams{})
367         assert.Nil(t, err, "raise failed")
368 }
369
370 func TestStatusCallback(t *testing.T) {
371         xapp.Logger.Info("TestStatusCallback")
372         assert.Equal(t, true, alarmManager.StatusCB())
373 }
374
375 func TestActiveAlarmMaxThresholds(t *testing.T) {
376         xapp.Logger.Info("TestActiveAlarmMaxThresholds")
377         ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
378         alarmManager.maxActiveAlarms = 0
379         alarmManager.maxAlarmHistory = 10
380
381         a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityCritical, "Some Application data", "eth 0 2")
382         assert.Nil(t, alarmer.Raise(a), "raise failed")
383
384         var alarmConfigParams alarm.AlarmConfigParams
385         req, _ := http.NewRequest("GET", "/ric/v1/alarms/config", nil)
386         req = mux.SetURLVars(req, nil)
387         handleFunc := http.HandlerFunc(alarmManager.GetAlarmConfig)
388         response := executeRequest(req, handleFunc)
389
390         // Check HTTP Status Code
391         checkResponseCode(t, http.StatusOK, response.Code)
392
393         // Decode the json output from handler
394         json.NewDecoder(response.Body).Decode(&alarmConfigParams)
395         if alarmConfigParams.MaxActiveAlarms != 0 || alarmConfigParams.MaxAlarmHistory != 10 {
396                 t.Errorf("Incorrect alarm thresholds")
397         }
398
399         time.Sleep(time.Duration(1) * time.Second)
400         alarmManager.maxActiveAlarms = 5000
401         alarmManager.maxAlarmHistory = 20000
402         VerifyAlarm(t, a, 2)
403         VerifyAlarm(t, a, 2)
404         ts.Close()
405 }
406
407 func TestGetPrometheusAlerts(t *testing.T) {
408         time.Sleep(1 * time.Second)
409         xapp.Logger.Info("TestGetPrometheusAlerts")
410         ts := CreatePromAlertSimulator2(t, "GET", "/alerts?active=true&inhibited=true&silenced=true&unprocessed=true")
411
412         commandReady := make(chan bool, 1)
413         command := "cli/alarm-cli"
414         args := []string{"alerts", "--active", "true", "--inhibited", "true", "--silenced", "--unprocessed", "true", "true", "--host", "localhost", "--port", "9093", "flushall"}
415         ExecCLICommand(commandReady, command, args...)
416         <-commandReady
417
418         ts.Close()
419 }
420
421 func TestDelayedAlarmRaiseAndClear(t *testing.T) {
422         xapp.Logger.Info("TestDelayedAlarmRaiseAndClear")
423
424         activeAlarmsBeforeTest := len(alarmManager.activeAlarms)
425         alarmHistoryBeforeTest := len(alarmManager.alarmHistory)
426
427         // Add new alarm definition
428         var alarm9999Definition alarm.AlarmDefinition
429         alarm9999Definition.AlarmId = 9999
430         alarm9999Definition.AlarmText = "DELAYED TEST ALARM"
431         alarm9999Definition.EventType = "Test type"
432         alarm9999Definition.OperationInstructions = "Not defined"
433         alarm9999Definition.RaiseDelay = 1
434         alarm9999Definition.ClearDelay = 1
435         pbodyParams := RicAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarm9999Definition}}
436         pbodyEn, _ := json.Marshal(pbodyParams)
437         req, _ := http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(pbodyEn))
438         handleFunc := http.HandlerFunc(alarmManager.SetAlarmDefinition)
439         response := executeRequest(req, handleFunc)
440         checkResponseCode(t, http.StatusOK, response.Code)
441
442         // Verify 9999 alarm definition
443         req, _ = http.NewRequest("GET", "/ric/v1/alarms/define", nil)
444         vars := map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
445         req = mux.SetURLVars(req, vars)
446         handleFunc = http.HandlerFunc(alarmManager.GetAlarmDefinition)
447         response = executeRequest(req, handleFunc)
448         checkResponseCode(t, http.StatusOK, response.Code)
449
450         ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
451         defer ts.Close()
452
453         // Raise alarm. Posting alert and updating alarm history should be delayed
454         a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
455         assert.Nil(t, alarmer.Raise(a), "raise failed")
456         VerifyAlarm(t, a, activeAlarmsBeforeTest+1)
457
458         // Clear the alarm and check the alarm is removed. Posting alert clear and updating alarm history should be delayed
459         assert.Nil(t, alarmer.Clear(a), "clear failed")
460
461         time.Sleep(time.Duration(2) * time.Second)
462         assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
463         assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest+2)
464 }
465
466 func TestDelayedAlarmRaiseAndClear2(t *testing.T) {
467         xapp.Logger.Info("TestDelayedAlarmRaiseAndClear2")
468
469         activeAlarmsBeforeTest := len(alarmManager.activeAlarms)
470         alarmHistoryBeforeTest := len(alarmManager.alarmHistory)
471
472         ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
473         defer ts.Close()
474
475         // Raise two alarms. The first should be delayed
476         a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
477         assert.Nil(t, alarmer.Raise(a), "raise failed")
478         VerifyAlarm(t, a, activeAlarmsBeforeTest+1)
479
480         b := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
481         assert.Nil(t, alarmer.Raise(b), "raise failed")
482         VerifyAlarm(t, b, activeAlarmsBeforeTest+2)
483
484         // Clear two alarms. The first should be delayed. Check the alarms are removed
485         assert.Nil(t, alarmer.Clear(a), "clear failed")
486         assert.Nil(t, alarmer.Clear(b), "clear failed")
487
488         time.Sleep(time.Duration(2) * time.Second)
489         assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
490         assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest+4)
491 }
492
493 func TestDelayedAlarmRaiseAndClear3(t *testing.T) {
494         xapp.Logger.Info("TestDelayedAlarmRaiseAndClear3")
495
496         // Delete exisitng 9999 alarm definition
497         req, _ := http.NewRequest("DELETE", "/ric/v1/alarms/define", nil)
498         vars := map[string]string{"alarmId": strconv.FormatUint(9999, 10)}
499         req = mux.SetURLVars(req, vars)
500         handleFunc := http.HandlerFunc(alarmManager.DeleteAlarmDefinition)
501         response := executeRequest(req, handleFunc)
502         checkResponseCode(t, http.StatusOK, response.Code)
503
504         // Add updated 9999 alarm definition
505         var alarm9999Definition alarm.AlarmDefinition
506         alarm9999Definition.AlarmId = 9999
507         alarm9999Definition.AlarmText = "DELAYED TEST ALARM"
508         alarm9999Definition.EventType = "Test type"
509         alarm9999Definition.OperationInstructions = "Not defined"
510         alarm9999Definition.RaiseDelay = 1
511         alarm9999Definition.ClearDelay = 0
512         pbodyParams := RicAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarm9999Definition}}
513         pbodyEn, _ := json.Marshal(pbodyParams)
514         req, _ = http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(pbodyEn))
515         handleFunc = http.HandlerFunc(alarmManager.SetAlarmDefinition)
516         response = executeRequest(req, handleFunc)
517         checkResponseCode(t, http.StatusOK, response.Code)
518
519         // Verify 9999 alarm definition
520         req, _ = http.NewRequest("GET", "/ric/v1/alarms/define", nil)
521         vars = map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
522         req = mux.SetURLVars(req, vars)
523         handleFunc = http.HandlerFunc(alarmManager.GetAlarmDefinition)
524         response = executeRequest(req, handleFunc)
525         checkResponseCode(t, http.StatusOK, response.Code)
526
527         activeAlarmsBeforeTest := len(alarmManager.activeAlarms)
528         alarmHistoryBeforeTest := len(alarmManager.alarmHistory)
529
530         ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
531         defer ts.Close()
532
533         // Raise two alarms. The first should be delayed
534         a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
535         assert.Nil(t, alarmer.Raise(a), "raise failed")
536         VerifyAlarm(t, a, activeAlarmsBeforeTest+1)
537
538         b := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
539         assert.Nil(t, alarmer.Raise(b), "raise failed")
540         VerifyAlarm(t, b, activeAlarmsBeforeTest+2)
541
542         // Clear two alarms. The first should be delayed. Check the alarms are removed
543         assert.Nil(t, alarmer.Clear(a), "clear failed")
544         assert.Nil(t, alarmer.Clear(b), "clear failed")
545
546         time.Sleep(time.Duration(2) * time.Second)
547         assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
548         assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest+4)
549 }
550
551 func TestClearExpiredAlarms(t *testing.T) {
552         xapp.Logger.Info("TestClearExpiredAlarms")
553
554         a := alarm.AlarmMessage{
555                 Alarm:       alarmer.NewAlarm(72004, alarm.SeverityWarning, "threshold", ""),
556                 AlarmAction: alarm.AlarmActionRaise,
557                 AlarmTime:   time.Now().UnixNano(),
558         }
559         d := alarm.RICAlarmDefinitions[72004]
560         n := AlarmNotification{a, *d}
561         alarmManager.activeAlarms = make([]AlarmNotification, 0)
562         alarmManager.UpdateActiveAlarmList(&n)
563
564         // Unknown SP
565         a.Alarm.SpecificProblem = 1234
566         assert.False(t, alarmManager.ClearExpiredAlarms(n, 0, false), "ClearExpiredAlarms failed")
567
568         // TTL is 0
569         d.TimeToLive = 0
570         assert.False(t, alarmManager.ClearExpiredAlarms(n, 0, false), "ClearExpiredAlarms failed")
571
572         // TTL not expired
573         a.Alarm.SpecificProblem = 72004
574         d.TimeToLive = 2
575         assert.False(t, alarmManager.ClearExpiredAlarms(n, 0, false), "ClearExpiredAlarms failed")
576
577         // TTL expired, alarm should be cleared
578         time.Sleep(time.Duration(3) * time.Second)
579         assert.Equal(t, len(alarmManager.activeAlarms), 1)
580         assert.True(t, alarmManager.ClearExpiredAlarms(n, 0, false), "ClearExpiredAlarms failed")
581         assert.Equal(t, len(alarmManager.activeAlarms), 0)
582 }
583
584 func TestSetAlarmConfig(t *testing.T) {
585         xapp.Logger.Info("TestSetAlarmConfig")
586
587         var setAlarmConfig alarm.AlarmConfigParams
588         setAlarmConfig.MaxActiveAlarms = 500
589         setAlarmConfig.MaxAlarmHistory = 2000
590
591         pbodyEn, _ := json.Marshal(setAlarmConfig)
592         req, _ := http.NewRequest("POST", "/ric/v1/alarms/config", bytes.NewBuffer(pbodyEn))
593         handleFunc := http.HandlerFunc(alarmManager.SetAlarmConfig)
594         response := executeRequest(req, handleFunc)
595         checkResponseCode(t, http.StatusOK, response.Code)
596
597         var getAlarmConfig alarm.AlarmConfigParams
598         req, _ = http.NewRequest("GET", "/ric/v1/alarms/config", nil)
599         req = mux.SetURLVars(req, nil)
600         handleFunc = http.HandlerFunc(alarmManager.GetAlarmConfig)
601         response = executeRequest(req, handleFunc)
602         checkResponseCode(t, http.StatusOK, response.Code)
603
604         // Decode the json output from handler
605         json.NewDecoder(response.Body).Decode(&getAlarmConfig)
606         if getAlarmConfig.MaxActiveAlarms != 500 || getAlarmConfig.MaxAlarmHistory != 2000 {
607                 t.Errorf("Incorrect alarm thresholds")
608         }
609
610         // Revert ot default
611         setAlarmConfig.MaxActiveAlarms = 5000
612         setAlarmConfig.MaxAlarmHistory = 20000
613
614         pbodyEn, _ = json.Marshal(setAlarmConfig)
615         req, _ = http.NewRequest("POST", "/ric/v1/alarms/config", bytes.NewBuffer(pbodyEn))
616         handleFunc = http.HandlerFunc(alarmManager.SetAlarmConfig)
617         response = executeRequest(req, handleFunc)
618         checkResponseCode(t, http.StatusOK, response.Code)
619
620         req, _ = http.NewRequest("GET", "/ric/v1/alarms/config", nil)
621         req = mux.SetURLVars(req, nil)
622         handleFunc = http.HandlerFunc(alarmManager.GetAlarmConfig)
623         response = executeRequest(req, handleFunc)
624         checkResponseCode(t, http.StatusOK, response.Code)
625
626         // Decode the json output from handler
627         json.NewDecoder(response.Body).Decode(&getAlarmConfig)
628         if getAlarmConfig.MaxActiveAlarms != 5000 || getAlarmConfig.MaxAlarmHistory != 20000 {
629                 t.Errorf("Incorrect alarm thresholds")
630         }
631 }
632
633 func TestConfigChangeCB(t *testing.T) {
634         xapp.Logger.Info("TestConfigChangeCB")
635         alarmManager.ConfigChangeCB("AlarmManager")
636 }
637
638 func TestPersistentStorage(t *testing.T) {
639     xapp.Logger.Info("TestPersistentStorage")
640     alarmManager.alarmInfoPvFile = "../../definitions/sample.json"
641     alarmManager.ReadAlarmInfoFromPersistentVolume()
642 }
643
644 func TestReadAlarmDefinitionFromJsonWrongFilename(t *testing.T) {
645   // use   to set wrong file name os.Setenv("SITE_TITLE", "Test Site")
646     xapp.Logger.Info("TestReadAlarmDefinitionFromJsonWrongFilename")
647     os.Setenv("DEF_FILE","test.json")
648     alarmManager.ReadAlarmDefinitionFromJson()
649   // correct the filename
650 }
651
652 func TestReadAlarmDefinitionFromJsonInvalidFilename(t *testing.T) {
653   // use   to set wrong file name os.Setenv("SITE_TITLE", "Test Site")
654     xapp.Logger.Info("TestReadAlarmDefinitionFromJsonInvalidFilename")
655     os.Setenv("DEF_FILE","../../definitions/test.json")
656     alarmManager.ReadAlarmDefinitionFromJson()
657   // correct the filename
658 }
659
660 func TestPostAlarm(t *testing.T) {
661         xapp.Logger.Info("TestPostAlarm")
662         var activeAlarms []AlarmNotification
663         activeAlarms = make([]AlarmNotification, 1)
664         alarmManager.PostAlarm(&activeAlarms[0])
665 }
666
667 func TestPostAlarm1(t *testing.T) {
668         xapp.Logger.Info("TestPostAlarm")
669         var activeAlarms []AlarmNotification
670         activeAlarms = make([]AlarmNotification, 2)
671         alarmManager.PostAlarm(&activeAlarms[0])
672 }
673
674 func TestNewAlarmManagerOther(t *testing.T){
675     NewAlarmManager("", 0, true)
676 }
677
678 func TestStatusCallbackFailure(t *testing.T) {
679         xapp.Logger.Info("TestStatusCallbackFailure")
680         alarmManager.rmrReady = false 
681         assert.Equal(t, false, alarmManager.StatusCB())
682 }
683
684 func TestConfigChangeCBFailure(t *testing.T) {
685         xapp.Logger.Info("TestConfigChangeCBFailure")
686         alarmManager.maxActiveAlarms = 0
687         alarmManager.maxAlarmHistory = 0
688         alarmManager.ConfigChangeCB("AlarmManager")
689 }
690
691
692 func VerifyAlarm(t *testing.T, a alarm.Alarm, expectedCount int) string {
693         receivedAlert := waitForEvent()
694
695         assert.Equal(t, expectedCount, len(alarmManager.activeAlarms))
696         _, ok := alarmManager.IsMatchFound(a)
697         assert.True(t, ok)
698
699         return receivedAlert
700 }
701
702 func VerifyAlert(t *testing.T, receivedAlert, expectedAlert string) {
703         receivedAlert = strings.Replace(fmt.Sprintf("%v", receivedAlert), "\r\n", " ", -1)
704         //assert.Equal(t, receivedAlert, e)
705 }
706
707 func CreatePromAlertSimulator(t *testing.T, method, url string, status int, respData interface{}) *httptest.Server {
708         l, err := net.Listen("tcp", "localhost:9093")
709         if err != nil {
710                 t.Error("Failed to create listener: " + err.Error())
711         }
712         ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
713                 assert.Equal(t, r.Method, method)
714                 assert.Equal(t, r.URL.String(), url)
715
716                 fireEvent(t, r.Body)
717
718                 w.Header().Add("Content-Type", "application/json")
719                 w.WriteHeader(status)
720                 b, _ := json.Marshal(respData)
721                 w.Write(b)
722         }))
723         ts.Listener.Close()
724         ts.Listener = l
725
726         ts.Start()
727
728         return ts
729 }
730
731 func CreatePromAlertSimulator2(t *testing.T, method, url string) *httptest.Server {
732         l, err := net.Listen("tcp", "localhost:9093")
733         if err != nil {
734                 t.Error("Failed to create listener: " + err.Error())
735         }
736         ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
737                 assert.Equal(t, r.Method, method)
738                 assert.Equal(t, r.URL.String(), url)
739
740                 w.Header().Add("Content-Type", "application/json")
741                 w.WriteHeader(200)
742                 // Read alerts from file
743                 payload, err := readJSONFromFile("../testresources/prometheus-alerts.json")
744                 if err != nil {
745                         t.Error("Failed to send response: ", err)
746                 }
747                 _, err = w.Write(payload)
748                 if err != nil {
749                         t.Error("Failed to send response: " + err.Error())
750                 }
751         }))
752         ts.Listener.Close()
753         ts.Listener = l
754         ts.Start()
755         return ts
756 }
757
758 func waitForEvent() string {
759         receivedAlert := <-eventChan
760         return receivedAlert
761 }
762
763 func fireEvent(t *testing.T, body io.ReadCloser) {
764         reqBody, err := ioutil.ReadAll(body)
765         assert.Nil(t, err, "ioutil.ReadAll failed")
766         assert.NotNil(t, reqBody, "ioutil.ReadAll failed")
767
768         eventChan <- fmt.Sprintf("%s", reqBody)
769 }
770
771 func executeRequest(req *http.Request, handleR http.HandlerFunc) *httptest.ResponseRecorder {
772         rr := httptest.NewRecorder()
773
774         handleR.ServeHTTP(rr, req)
775
776         return rr
777 }
778
779 func checkResponseCode(t *testing.T, expected, actual int) bool {
780         if expected != actual {
781                 t.Errorf("Expected response code %d. Got %d\n", expected, actual)
782                 return false
783         }
784         return true
785 }
786
787 func ExecCLICommand(commandReady chan bool, command string, args ...string) {
788         go func() {
789                 xapp.Logger.Info("Giving CLI command")
790                 cmd := exec.Command(command, args...)
791                 cmd.Dir = "../"
792                 output, err := cmd.CombinedOutput()
793                 if err != nil {
794                         xapp.Logger.Info("CLI command failed out: %s", err)
795                 }
796                 xapp.Logger.Info("CLI command output: %s", output)
797                 commandReady <- true
798                 xapp.Logger.Info("CLI command completed")
799         }()
800 }
801
802 func readJSONFromFile(filename string) ([]byte, error) {
803         file, err := ioutil.ReadFile(filename)
804         if err != nil {
805                 err := fmt.Errorf("readJSONFromFile() failed: Error: %v", err)
806                 return nil, err
807         }
808         return file, nil
809 }
810
811