6744b40212925eb6509171532e26b315cd2f7ec4
[ric-plt/e2mgr.git] / E2Manager / handlers / rmrmsghandlers / e2_term_init_notification_handler_test.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 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
18 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 //  platform project (RICP).
20
21 package rmrmsghandlers
22
23 import (
24         "bytes"
25         "e2mgr/clients"
26         "e2mgr/configuration"
27         "e2mgr/logger"
28         "e2mgr/managers"
29         "e2mgr/mocks"
30         "e2mgr/models"
31         "e2mgr/rmrCgo"
32         "e2mgr/services"
33         "e2mgr/services/rmrsender"
34         "e2mgr/tests"
35         "fmt"
36         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
37         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
38         "github.com/pkg/errors"
39         "github.com/stretchr/testify/mock"
40         "io/ioutil"
41         "net/http"
42         "testing"
43 )
44
45 const (
46         e2tInitPayload = "{\"address\":\"10.0.2.15\", \"fqdn\":\"\"}"
47         e2tInstanceAddress = "10.0.2.15"
48         podName = "podNAme_test"
49 )
50
51 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
52
53         logger := initLog(t)
54         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
55
56         readerMock := &mocks.RnibReaderMock{}
57
58         writerMock := &mocks.RnibWriterMock{}
59
60         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
61
62         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
63
64         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
65
66         ranListManager := managers.NewRanListManager(logger, rnibDataService)
67         ranAlarmService := &mocks.RanAlarmServiceMock{}
68         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService,ranListManager, ranAlarmService)
69         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
70
71         ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
72         handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManagerMock, routingManagerClientMock)
73
74         return logger, handler, readerMock, writerMock, e2tInstancesManagerMock, routingManagerClientMock
75 }
76
77 func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger.Logger, *configuration.Configuration, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock, managers.RanListManager) {
78
79         logger := initLog(t)
80         config := configuration.ParseConfiguration()
81
82         readerMock := &mocks.RnibReaderMock{}
83
84         writerMock := &mocks.RnibWriterMock{}
85         httpClientMock := &mocks.HttpClientMock{}
86
87         routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClientMock)
88         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
89
90         e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger)
91         ranListManager := managers.NewRanListManager(logger, rnibDataService)
92         ranAlarmService := services.NewRanAlarmService(logger, config)
93         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService,ranListManager, ranAlarmService)
94         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient, ranConnectStatusChangeManager)
95         ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
96         handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManager, routingManagerClient)
97         return logger, config, handler, readerMock, writerMock, httpClientMock, ranListManager
98 }
99
100 func TestE2TermInitUnmarshalPayloadFailure(t *testing.T) {
101         _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
102         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("asd")}
103         handler.Handle(notificationRequest)
104         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
105         e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
106 }
107
108 func TestE2TermInitEmptyE2TAddress(t *testing.T) {
109         _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
110         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("{\"address\":\"\"}")}
111         handler.Handle(notificationRequest)
112         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
113         e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
114 }
115
116 func TestE2TermInitGetE2TInstanceFailure(t *testing.T) {
117         _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
118         var e2tInstance *entities.E2TInstance
119         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
120         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
121         handler.Handle(notificationRequest)
122         e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
123 }
124
125 func TestE2TermInitGetE2TInstanceDbFailure(t *testing.T) {
126         _, _, handler, readerMock, writerMock, _, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
127         var e2tInstance *entities.E2TInstance
128         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
129         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
130         handler.Handle(notificationRequest)
131         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
132 }
133
134 func TestE2TermInitNewE2TInstance(t *testing.T) {
135         _, config, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
136         var e2tInstance *entities.E2TInstance
137
138         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
139         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
140
141         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
142         url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix
143         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
144
145         var e2tAddresses []string
146         readerMock.On("GetE2TAddresses").Return(e2tAddresses, common.NewResourceNotFoundError(""))
147
148         e2tAddresses = append(e2tAddresses, e2tInstanceAddress)
149         writerMock.On("SaveE2TAddresses", e2tAddresses).Return(nil)
150
151         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
152         handler.Handle(notificationRequest)
153
154         httpClientMock.AssertCalled(t, "Post", url, mock.Anything, mock.Anything)
155         writerMock.AssertCalled(t, "SaveE2TInstance", mock.Anything)
156         writerMock.AssertCalled(t, "SaveE2TAddresses", e2tAddresses)
157 }
158
159 func TestE2TermInitNewE2TInstance__RoutingManagerError(t *testing.T) {
160         _, config, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
161
162         var e2tInstance *entities.E2TInstance
163
164         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
165
166         url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix
167         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error"))
168
169         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
170         handler.Handle(notificationRequest)
171
172         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 0)
173 }
174
175 func TestE2TermInitExistingE2TInstanceNoAssociatedRans(t *testing.T) {
176         _, handler, _, _, e2tInstancesManagerMock, routingManagerClientMock := initRanLostConnectionTest(t)
177         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
178         var rtmgrErr error
179         e2tInstancesManagerMock.On("ResetKeepAliveTimestamp", e2tInstanceAddress).Return(nil)
180         routingManagerClientMock.On("AddE2TInstance", e2tInstanceAddress).Return(rtmgrErr, nil)
181         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
182         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
183         handler.Handle(notificationRequest)
184         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceAddress)
185 }
186
187 func TestE2TermInitHandlerSuccessOneRan(t *testing.T) {
188         _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
189
190         oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
191         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
192         err := ranListManager.InitNbIdentityMap()
193         if err != nil {
194                 t.Errorf("Error cannot init identity")
195         }
196
197         var rnibErr error
198         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
199         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
200
201         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
202         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
203
204         newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
205         writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
206
207         var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
208         readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
209
210         var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
211         writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
212
213         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
214         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
215         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
216         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
217
218         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
219         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
220         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
221
222         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
223
224         handler.Handle(notificationRequest)
225
226         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
227         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1)
228         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
229         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
230 }
231
232 func TestE2TermInitHandlerSuccessOneRan_RoutingManagerError(t *testing.T) {
233         _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
234
235         oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
236         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
237         err := ranListManager.InitNbIdentityMap()
238         if err != nil {
239                 t.Errorf("Error cannot init identity")
240         }
241         var rnibErr error
242         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
243         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
244
245         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
246         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
247
248         newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
249         writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
250
251         var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
252         readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
253
254         var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
255         writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
256
257         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
258         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
259         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
260         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
261
262         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
263         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error"))
264
265         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
266
267         handler.Handle(notificationRequest)
268
269         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
270         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1)
271         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
272         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
273 }
274
275 func TestE2TermInitHandlerSuccessOneRanShuttingdown(t *testing.T) {
276         _, _, handler, readerMock, writerMock, _, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
277         var rnibErr error
278
279         oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
280         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
281         err := ranListManager.InitNbIdentityMap()
282         if err != nil {
283                 t.Errorf("Error cannot init identity")
284         }
285         var initialNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
286         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
287
288         var argNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
289         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
290
291         newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
292         writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
293
294         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
295         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
296         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
297         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
298
299         handler.Handle(notificationRequest)
300
301         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
302 }
303
304 func TestE2TermInitHandlerSuccessOneRan_ToBeDeleted(t *testing.T) {
305         _, _, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
306         var rnibErr error
307
308         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
309         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
310
311         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
312         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
313
314         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
315         e2tInstance.State = entities.ToBeDeleted
316         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
317
318         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
319         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
320
321         handler.Handle(notificationRequest)
322
323         httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything)
324         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
325 }
326
327 func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) {
328
329         _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
330         test2 := "test2"
331         oldNbIdentity1 := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
332         oldNbIdentity2 := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
333         oldNbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2}
334         readerMock.On("GetListNodebIds").Return(oldNbIdentityList, nil)
335
336         err := ranListManager.InitNbIdentityMap()
337         if err != nil {
338                 t.Errorf("Error cannot init identity")
339         }
340         var rnibErr error
341
342         //First RAN
343         var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
344         var disconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
345         readerMock.On("GetNodeb", RanName).Return(firstRan, rnibErr).Return(disconnectedFirstRan, rnibErr)
346
347         var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
348         writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr)
349         newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
350         writerMock.On("UpdateNbIdentities", updatedFirstRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
351
352         var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
353         writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr)
354
355         //Second RAN
356         var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
357         var disconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
358         readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr).Return(disconnectedSecondRan, rnibErr)
359
360         var updatedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
361         writerMock.On("UpdateNodebInfo", updatedSecondRan).Return(rnibErr)
362         newNbIdentity2 := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
363         writerMock.On("UpdateNbIdentities", updatedFirstRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity2}, []*entities.NbIdentity{newNbIdentity2}).Return(nil)
364
365         var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""}
366         writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr)
367
368         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
369         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
370         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
371         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
372         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
373
374         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
375         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
376         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
377
378         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
379
380         handler.Handle(notificationRequest)
381
382         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 4)
383         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 2)
384         httpClientMock.AssertNumberOfCalls(t, "Post", 2)
385 }
386
387 func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) {
388         _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
389
390         oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
391         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
392         err := ranListManager.InitNbIdentityMap()
393         if err != nil {
394                 t.Errorf("Error cannot init identity")
395         }
396         var rnibErr error
397         test2 := "test2"
398
399         //First RAN
400         var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
401         var disconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
402         readerMock.On("GetNodeb", RanName).Return(firstRan, rnibErr).Return(disconnectedFirstRan, rnibErr)
403
404         var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
405         writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr)
406         newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
407         writerMock.On("UpdateNbIdentities", updatedFirstRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
408
409         var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
410         writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr)
411
412         //Second RAN
413         var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
414         readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr)
415
416         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
417         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
418         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
419         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
420
421         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
422         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
423         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
424
425         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
426
427         handler.Handle(notificationRequest)
428
429         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
430         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
431         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
432 }
433
434 func TestE2TermInitHandlerSuccessTwoRansFirstNotFoundFailure(t *testing.T) {
435         _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
436
437         test2 := "test2"
438         oldNbIdentity := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
439         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
440         err := ranListManager.InitNbIdentityMap()
441         if err != nil {
442                 t.Errorf("Error cannot init identity")
443         }
444         var rnibErr error
445
446         //First RAN
447         var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
448         readerMock.On("GetNodeb", RanName).Return(firstRan, common.NewResourceNotFoundError("not found"))
449
450         //Second RAN
451         var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
452         var disconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
453         readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr).Return(disconnectedSecondRan, rnibErr)
454
455         var updatedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
456         writerMock.On("UpdateNodebInfo", updatedSecondRan).Return(rnibErr)
457
458         var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""}
459         writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr)
460
461         newNbIdentity := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
462         writerMock.On("UpdateNbIdentities", updatedSecondRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
463
464         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
465         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
466         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
467         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
468         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
469
470         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
471         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
472         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
473
474         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
475
476         handler.Handle(notificationRequest)
477
478         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
479         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
480         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
481 }
482
483 func TestE2TermInitHandlerSuccessTwoRansFirstRnibInternalErrorFailure(t *testing.T) {
484         _, _, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
485
486         test2 := "test2"
487
488         //First RAN
489         var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
490         readerMock.On("GetNodeb", RanName).Return(firstRan, common.NewInternalError(fmt.Errorf("internal error")))
491
492         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
493         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
494         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
495         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
496
497         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
498
499         handler.Handle(notificationRequest)
500
501         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
502         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 0)
503         httpClientMock.AssertNumberOfCalls(t, "Post", 0)
504 }
505
506 func TestE2TermInitHandlerSuccessZeroRans(t *testing.T) {
507         _, handler, _, writerMock, e2tInstancesManagerMock, routingManagerClientMock := initRanLostConnectionTest(t)
508
509         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
510         var rtmgrErr error
511         e2tInstancesManagerMock.On("ResetKeepAliveTimestamp", e2tInstanceAddress).Return(nil)
512         routingManagerClientMock.On("AddE2TInstance", e2tInstanceAddress).Return(rtmgrErr, nil)
513         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
514         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
515
516         handler.Handle(notificationRequest)
517
518         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
519 }
520
521 func TestE2TermInitHandlerFailureGetNodebInternalError(t *testing.T) {
522         _, handler, readerMock, writerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
523
524         var nodebInfo *entities.NodebInfo
525         readerMock.On("GetNodeb", "test1").Return(nodebInfo, common.NewInternalError(fmt.Errorf("internal error")))
526
527         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
528         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1")
529         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
530         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
531         handler.Handle(notificationRequest)
532
533         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
534 }
535
536 func TestE2TermInitHandlerOneRanNoRanInNbIdentityMap(t *testing.T) {
537         _, config, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
538
539         var rnibErr error
540         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
541         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
542
543         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
544         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
545
546         var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
547         readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
548
549         var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
550         writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
551
552         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
553         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
554         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
555         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
556
557         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
558         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
559         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
560
561         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
562
563         handler.Handle(notificationRequest)
564
565         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
566         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1)
567         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
568         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
569 }
570
571 func TestE2TermInitHandlerOneRanUpdateNbIdentitiesFailure(t *testing.T) {
572         _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
573
574         oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
575         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
576         err := ranListManager.InitNbIdentityMap()
577         if err != nil {
578                 t.Errorf("Error cannot init identity")
579         }
580
581         var rnibErr error
582         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
583         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
584
585         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
586         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
587
588         newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
589         writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(common.NewInternalError(fmt.Errorf("internal error")))
590
591         var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
592         readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
593
594         var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
595         writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
596
597         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
598         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
599         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
600         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
601
602         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
603         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
604         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
605
606         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
607
608         handler.Handle(notificationRequest)
609
610         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
611         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1)
612         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
613         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
614 }
615 // TODO: extract to test_utils
616 func initRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
617         rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
618         rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
619         return rmrsender.NewRmrSender(log, rmrMessenger)
620 }
621
622 // TODO: extract to test_utils
623 func initLog(t *testing.T) *logger.Logger {
624         log, err := logger.InitLogger(logger.InfoLevel)
625         if err != nil {
626                 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)
627         }
628         return log
629 }