2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
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
9 // http://www.apache.org/licenses/LICENSE-2.0
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.
18 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 // platform project (RICP).
21 package rmrmsghandlers
33 "e2mgr/services/rmrsender"
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"
46 e2tInitPayload = "{\"address\":\"10.0.2.15\", \"fqdn\":\"\"}"
47 e2tInstanceAddress = "10.0.2.15"
48 podName = "podNAme_test"
51 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
54 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
56 readerMock := &mocks.RnibReaderMock{}
58 writerMock := &mocks.RnibWriterMock{}
60 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
62 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
64 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
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)
71 ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
72 handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManagerMock, routingManagerClientMock)
74 return logger, handler, readerMock, writerMock, e2tInstancesManagerMock, routingManagerClientMock
77 func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger.Logger, *configuration.Configuration, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock, managers.RanListManager) {
80 config := configuration.ParseConfiguration()
82 readerMock := &mocks.RnibReaderMock{}
84 writerMock := &mocks.RnibWriterMock{}
85 httpClientMock := &mocks.HttpClientMock{}
87 routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClientMock)
88 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
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
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")
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")
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")
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")
134 func TestE2TermInitNewE2TInstance(t *testing.T) {
135 _, config, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
136 var e2tInstance *entities.E2TInstance
138 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
139 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
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)
145 var e2tAddresses []string
146 readerMock.On("GetE2TAddresses").Return(e2tAddresses, common.NewResourceNotFoundError(""))
148 e2tAddresses = append(e2tAddresses, e2tInstanceAddress)
149 writerMock.On("SaveE2TAddresses", e2tAddresses).Return(nil)
151 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
152 handler.Handle(notificationRequest)
154 httpClientMock.AssertCalled(t, "Post", url, mock.Anything, mock.Anything)
155 writerMock.AssertCalled(t, "SaveE2TInstance", mock.Anything)
156 writerMock.AssertCalled(t, "SaveE2TAddresses", e2tAddresses)
159 func TestE2TermInitNewE2TInstance__RoutingManagerError(t *testing.T) {
160 _, config, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
162 var e2tInstance *entities.E2TInstance
164 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
166 url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix
167 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error"))
169 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
170 handler.Handle(notificationRequest)
172 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 0)
175 func TestE2TermInitExistingE2TInstanceNoAssociatedRans(t *testing.T) {
176 _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
177 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
178 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
179 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
180 handler.Handle(notificationRequest)
181 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceAddress)
184 func TestE2TermInitHandlerSuccessOneRan(t *testing.T) {
185 _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
187 oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
188 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
189 err := ranListManager.InitNbIdentityMap()
191 t.Errorf("Error cannot init identity")
195 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
196 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
198 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
199 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
201 newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
202 writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
204 var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
205 readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
207 var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
208 writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
210 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
211 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
212 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
213 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
215 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
216 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
217 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
219 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
221 handler.Handle(notificationRequest)
223 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
224 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1)
225 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
226 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
229 func TestE2TermInitHandlerSuccessOneRan_RoutingManagerError(t *testing.T) {
230 _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
232 oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
233 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
234 err := ranListManager.InitNbIdentityMap()
236 t.Errorf("Error cannot init identity")
239 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
240 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
242 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
243 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
245 newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
246 writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
248 var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
249 readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
251 var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
252 writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
254 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
255 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
256 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
257 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
259 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
260 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error"))
262 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
264 handler.Handle(notificationRequest)
266 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
267 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1)
268 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
269 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
272 func TestE2TermInitHandlerSuccessOneRanShuttingdown(t *testing.T) {
273 _, _, handler, readerMock, writerMock, _, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
276 oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
277 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
278 err := ranListManager.InitNbIdentityMap()
280 t.Errorf("Error cannot init identity")
282 var initialNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
283 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
285 var argNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
286 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
288 newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
289 writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
291 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
292 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
293 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
294 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
296 handler.Handle(notificationRequest)
298 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
301 func TestE2TermInitHandlerSuccessOneRan_ToBeDeleted(t *testing.T) {
302 _, _, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
305 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
306 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
308 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
309 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
311 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
312 e2tInstance.State = entities.ToBeDeleted
313 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
315 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
316 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
318 handler.Handle(notificationRequest)
320 httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything)
321 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
324 func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) {
326 _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
328 oldNbIdentity1 := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
329 oldNbIdentity2 := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
330 oldNbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2}
331 readerMock.On("GetListNodebIds").Return(oldNbIdentityList, nil)
333 err := ranListManager.InitNbIdentityMap()
335 t.Errorf("Error cannot init identity")
340 var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
341 var disconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
342 readerMock.On("GetNodeb", RanName).Return(firstRan, rnibErr).Return(disconnectedFirstRan, rnibErr)
344 var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
345 writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr)
346 newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
347 writerMock.On("UpdateNbIdentities", updatedFirstRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
349 var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
350 writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr)
353 var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
354 var disconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
355 readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr).Return(disconnectedSecondRan, rnibErr)
357 var updatedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
358 writerMock.On("UpdateNodebInfo", updatedSecondRan).Return(rnibErr)
359 newNbIdentity2 := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
360 writerMock.On("UpdateNbIdentities", updatedFirstRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity2}, []*entities.NbIdentity{newNbIdentity2}).Return(nil)
362 var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""}
363 writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr)
365 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
366 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
367 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
368 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
369 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
371 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
372 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
373 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
375 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
377 handler.Handle(notificationRequest)
379 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 4)
380 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 2)
381 httpClientMock.AssertNumberOfCalls(t, "Post", 2)
384 func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) {
385 _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
387 oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
388 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
389 err := ranListManager.InitNbIdentityMap()
391 t.Errorf("Error cannot init identity")
397 var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
398 var disconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
399 readerMock.On("GetNodeb", RanName).Return(firstRan, rnibErr).Return(disconnectedFirstRan, rnibErr)
401 var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
402 writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr)
403 newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
404 writerMock.On("UpdateNbIdentities", updatedFirstRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
406 var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
407 writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr)
410 var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
411 readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr)
413 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
414 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
415 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
416 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
418 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
419 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
420 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
422 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
424 handler.Handle(notificationRequest)
426 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
427 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
428 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
431 func TestE2TermInitHandlerSuccessTwoRansFirstNotFoundFailure(t *testing.T) {
432 _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
435 oldNbIdentity := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
436 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
437 err := ranListManager.InitNbIdentityMap()
439 t.Errorf("Error cannot init identity")
444 var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
445 readerMock.On("GetNodeb", RanName).Return(firstRan, common.NewResourceNotFoundError("not found"))
448 var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
449 var disconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
450 readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr).Return(disconnectedSecondRan, rnibErr)
452 var updatedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
453 writerMock.On("UpdateNodebInfo", updatedSecondRan).Return(rnibErr)
455 var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""}
456 writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr)
458 newNbIdentity := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
459 writerMock.On("UpdateNbIdentities", updatedSecondRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
461 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
462 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
463 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
464 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
465 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
467 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
468 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
469 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
471 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
473 handler.Handle(notificationRequest)
475 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
476 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
477 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
480 func TestE2TermInitHandlerSuccessTwoRansFirstRnibInternalErrorFailure(t *testing.T) {
481 _, _, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
486 var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
487 readerMock.On("GetNodeb", RanName).Return(firstRan, common.NewInternalError(fmt.Errorf("internal error")))
489 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
490 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
491 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
492 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
494 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
496 handler.Handle(notificationRequest)
498 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
499 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 0)
500 httpClientMock.AssertNumberOfCalls(t, "Post", 0)
503 func TestE2TermInitHandlerSuccessZeroRans(t *testing.T) {
504 _, handler, _, writerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
506 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
507 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
508 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
510 handler.Handle(notificationRequest)
512 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
515 func TestE2TermInitHandlerFailureGetNodebInternalError(t *testing.T) {
516 _, handler, readerMock, writerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
518 var nodebInfo *entities.NodebInfo
519 readerMock.On("GetNodeb", "test1").Return(nodebInfo, common.NewInternalError(fmt.Errorf("internal error")))
521 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
522 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1")
523 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
524 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
525 handler.Handle(notificationRequest)
527 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
530 func TestE2TermInitHandlerOneRanNoRanInNbIdentityMap(t *testing.T) {
531 _, config, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
534 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
535 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
537 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
538 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
540 var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
541 readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
543 var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
544 writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
546 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
547 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
548 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
549 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
551 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
552 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
553 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
555 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
557 handler.Handle(notificationRequest)
559 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
560 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1)
561 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
562 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
565 func TestE2TermInitHandlerOneRanUpdateNbIdentitiesFailure(t *testing.T) {
566 _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t)
568 oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
569 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
570 err := ranListManager.InitNbIdentityMap()
572 t.Errorf("Error cannot init identity")
576 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
577 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
579 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
580 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
582 newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
583 writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(common.NewInternalError(fmt.Errorf("internal error")))
585 var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
586 readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
588 var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
589 writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
591 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName)
592 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
593 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
594 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
596 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
597 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
598 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
600 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
602 handler.Handle(notificationRequest)
604 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
605 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1)
606 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
607 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
609 // TODO: extract to test_utils
610 func initRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
611 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
612 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
613 return rmrsender.NewRmrSender(log, rmrMessenger)
616 // TODO: extract to test_utils
617 func initLog(t *testing.T) *logger.Logger {
618 log, err := logger.InitLogger(logger.InfoLevel)
620 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)