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.
17 package rmrmsghandlers
28 "e2mgr/services/rmrsender"
31 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
32 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
33 "github.com/stretchr/testify/mock"
37 const e2tInstanceAddress = "10.0.2.15"
38 const e2tInitPayload = "{\"address\":\"10.0.2.15\", \"fqdn\":\"\"}"
40 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
43 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
45 rmrMessengerMock := &mocks.RmrMessengerMock{}
46 rmrSender := initRmrSender(rmrMessengerMock, logger)
48 readerMock := &mocks.RnibReaderMock{}
50 writerMock := &mocks.RnibWriterMock{}
52 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
54 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
55 ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
57 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
59 ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManagerMock)
60 handler := NewE2TermInitNotificationHandler(logger, ranReconnectionManager, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock)
62 return logger, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
65 func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock) {
68 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
70 rmrMessengerMock := &mocks.RmrMessengerMock{}
71 rmrSender := initRmrSender(rmrMessengerMock, logger)
73 readerMock := &mocks.RnibReaderMock{}
75 writerMock := &mocks.RnibWriterMock{}
76 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
78 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
79 ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
81 e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger)
82 ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManager)
83 handler := NewE2TermInitNotificationHandler(logger, ranReconnectionManager, rnibDataService, e2tInstancesManager, routingManagerClientMock)
84 return logger, handler, readerMock, writerMock, rmrMessengerMock
87 func TestE2TermInitUnmarshalPayloadFailure(t *testing.T) {
88 _, handler, _, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
89 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("asd")}
90 handler.Handle(notificationRequest)
91 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
92 e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
95 func TestE2TermInitEmptyE2TAddress(t *testing.T) {
96 _, handler, _, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
97 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("{\"address\":\"\"}")}
98 handler.Handle(notificationRequest)
99 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
100 e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
103 func TestE2TermInitGetE2TInstanceFailure(t *testing.T) {
104 _, handler, _, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
105 var e2tInstance *entities.E2TInstance
106 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
107 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
108 handler.Handle(notificationRequest)
109 e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
112 func TestE2TermInitGetE2TInstanceDbFailure(t *testing.T) {
113 _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
114 var e2tInstance *entities.E2TInstance
115 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
116 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
117 handler.Handle(notificationRequest)
118 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
119 rmrMessengerMock.AssertNotCalled(t, "SendMsg")
122 func TestE2TermInitNewE2TInstance(t *testing.T) {
123 _, handler, _, _, _, e2tInstancesManagerMock, routingManagerClient := initRanLostConnectionTest(t)
124 var e2tInstance *entities.E2TInstance
125 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
126 e2tInstance = entities.NewE2TInstance(e2tInstanceAddress)
127 e2tInstancesManagerMock.On("AddE2TInstance", e2tInstanceAddress).Return(nil)
128 routingManagerClient.On("AddE2TInstance", e2tInstanceAddress).Return(nil)
129 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
130 handler.Handle(notificationRequest)
131 routingManagerClient.AssertCalled(t, "AddE2TInstance", e2tInstanceAddress)
132 e2tInstancesManagerMock.AssertCalled(t, "AddE2TInstance", e2tInstanceAddress)
135 func TestE2TermInitNewE2TInstance_RoutingManagerError(t *testing.T) {
136 _, handler, _, _, _, e2tInstancesManagerMock, routingManagerClient := initRanLostConnectionTest(t)
137 var e2tInstance *entities.E2TInstance
138 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
139 e2tInstance = entities.NewE2TInstance(e2tInstanceAddress)
140 e2tInstancesManagerMock.On("AddE2TInstance", e2tInstanceAddress).Return(nil)
141 routingManagerClient.On("AddE2TInstance", e2tInstanceAddress).Return(fmt.Errorf("error"))
142 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
144 handler.Handle(notificationRequest)
146 routingManagerClient.AssertCalled(t, "AddE2TInstance", e2tInstanceAddress)
147 e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance", e2tInstanceAddress)
150 func TestE2TermInitExistingE2TInstanceNoAssociatedRans(t *testing.T) {
151 _, handler, _, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
152 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
153 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
154 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
155 handler.Handle(notificationRequest)
156 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceAddress)
159 func TestE2TermInitHandlerSuccessOneRan(t *testing.T) {
160 _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
163 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
164 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
166 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
167 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
169 payload := e2pdus.PackedX2setupRequest
170 xaction := []byte(RanName)
171 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
173 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
175 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
176 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
177 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
178 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
180 handler.Handle(notificationRequest)
182 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
183 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
186 func TestE2TermInitHandlerSuccessOneRanShuttingdown(t *testing.T) {
187 _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
190 var initialNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
191 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
193 var argNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
194 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
196 payload := e2pdus.PackedX2setupRequest
197 xaction := []byte(RanName)
198 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
200 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
202 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
203 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
204 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
205 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
207 handler.Handle(notificationRequest)
209 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
210 rmrMessengerMock.AssertNotCalled(t, "SendMsg")
213 func TestE2TermInitHandlerSuccessOneRan_ToBeDeleted(t *testing.T) {
214 _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
217 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
218 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
220 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
221 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
223 payload := e2pdus.PackedX2setupRequest
224 xaction := []byte(RanName)
225 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
227 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
229 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
230 e2tInstance.State = entities.ToBeDeleted
231 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
233 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
234 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
236 handler.Handle(notificationRequest)
238 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
239 rmrMessengerMock.AssertNotCalled(t, "SendMsg")
242 func TestE2TermInitHandlerSuccessOneRan_RoutingManagerFailure(t *testing.T) {
243 _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
246 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
247 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
249 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
250 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
252 payload := e2pdus.PackedX2setupRequest
253 xaction := []byte(RanName)
254 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
256 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
258 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
259 e2tInstance.State = entities.RoutingManagerFailure
260 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
262 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
263 e2tInstancesManagerMock.On("ActivateE2TInstance", e2tInstance).Return(nil)
264 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
266 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
268 handler.Handle(notificationRequest)
270 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
271 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
274 func TestE2TermInitHandlerSuccessOneRan_RoutingManagerFailure_Error(t *testing.T) {
275 _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
278 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
279 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
281 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
282 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
284 payload := e2pdus.PackedX2setupRequest
285 xaction := []byte(RanName)
286 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
288 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
290 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
291 e2tInstance.State = entities.RoutingManagerFailure
292 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
294 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
295 e2tInstancesManagerMock.On("ActivateE2TInstance", e2tInstance).Return(fmt.Errorf(" Error "))
296 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
298 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
300 handler.Handle(notificationRequest)
302 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
303 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
306 func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) {
307 _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
309 var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
310 var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
311 readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr)
312 readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr)
314 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
315 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
317 payload := e2pdus.PackedX2setupRequest
318 xaction := []byte(RanName)
319 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
321 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
323 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
324 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2")
325 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
326 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
328 handler.Handle(notificationRequest)
330 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
331 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
334 func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) {
335 _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
337 var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
338 var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
339 readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr)
340 readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr)
342 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
343 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
345 payload := e2pdus.PackedX2setupRequest
346 xaction := []byte(RanName)
347 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
349 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
351 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
352 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2")
353 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
354 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
356 handler.Handle(notificationRequest)
358 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
359 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
360 writerMock.AssertExpectations(t)
363 func TestE2TermInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
364 log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
367 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
369 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
370 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
371 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
372 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
373 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
374 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
376 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
377 var argNodeb0Fail = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
378 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
379 writerMock.On("UpdateNodebInfo", argNodeb0Fail).Return(rnibErr)
381 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
382 xaction := []byte(ids[0].InventoryName)
383 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
385 // Cannot use Mock because request MBuf contains pointers
386 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
387 //xaction = []byte(ids[1].InventoryName)
388 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
390 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, fmt.Errorf("RMR Error"))
392 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
393 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3")
394 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
395 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
397 handler.Handle(notificationRequest)
399 //test1 (before send +1, after failure +1), test2 (0) test3 (0)
400 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
401 //test1 failure (+1), test2 (0). test3 (0)
402 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
405 func TestE2TermInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
406 log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
409 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
411 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
412 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
413 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
414 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
415 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewResourceNotFoundError("not found"))
416 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
418 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
419 var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
420 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
421 writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
423 var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
424 var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
425 writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
426 writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
428 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
429 xaction := []byte(ids[0].InventoryName)
430 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
432 // Cannot use Mock because request MBuf contains pointers
433 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
434 //xaction = []byte(ids[1].InventoryName)
435 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
437 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, nil)
439 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
440 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3")
441 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
442 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
444 handler.Handle(notificationRequest)
446 readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
447 //test1 (+1), test2 failure (0) test3 (+1)
448 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
449 //test1 success (+1), test2 (0). test3 (+1)
450 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
453 func TestE2TermInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
454 log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
457 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
459 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
460 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
461 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
462 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
463 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewInternalError(fmt.Errorf("internal error")))
464 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
466 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
467 var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
468 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
469 writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
471 var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
472 var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
473 writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
474 writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
476 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
477 xaction := []byte(ids[0].InventoryName)
478 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
480 // Cannot use Mock because request MBuf contains pointers
481 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
482 //xaction = []byte(ids[1].InventoryName)
483 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
485 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, nil)
487 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
488 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3")
489 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
490 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
492 handler.Handle(notificationRequest)
494 readerMock.AssertNumberOfCalls(t, "GetNodeb", 2)
495 //test1 (+1), test2 failure (0) test3 (0)
496 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
497 //test1 success (+1), test2 (0). test3 (+1)
498 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
501 func TestE2TermInitHandlerSuccessZeroRans(t *testing.T) {
502 _, handler, _, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
504 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
505 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
506 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
508 handler.Handle(notificationRequest)
510 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
511 rmrMessengerMock.AssertNotCalled(t, "SendMsg")
514 func TestE2TermInitHandlerFailureGetNodebInternalError(t *testing.T) {
515 _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
517 var nodebInfo *entities.NodebInfo
518 readerMock.On("GetNodeb", "test1").Return(nodebInfo, common.NewInternalError(fmt.Errorf("internal error")))
520 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
521 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1")
522 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
523 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
524 handler.Handle(notificationRequest)
526 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
527 rmrMessengerMock.AssertNotCalled(t, "SendMsg")
530 func TestE2TermInitHandlerSuccessTwoRansSecondIsDisconnected(t *testing.T) {
531 _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
533 var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
534 var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
535 readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr)
536 readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr)
538 var argNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
539 writerMock.On("UpdateNodebInfo", argNodeb1).Return(rnibErr)
541 payload := e2pdus.PackedX2setupRequest
542 xaction := []byte(RanName)
543 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
545 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
547 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
548 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2")
549 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
550 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
552 handler.Handle(notificationRequest)
554 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
555 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
559 // TODO: extract to test_utils
560 func initRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
561 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
562 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
563 return rmrsender.NewRmrSender(log, rmrMessenger)
566 // TODO: extract to test_utils
567 func initLog(t *testing.T) *logger.Logger {
568 log, err := logger.InitLogger(logger.InfoLevel)
570 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)