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"
45 const e2tInitPayload = "{\"address\":\"10.0.2.15\", \"fqdn\":\"\"}"
47 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
50 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
52 readerMock := &mocks.RnibReaderMock{}
54 writerMock := &mocks.RnibWriterMock{}
56 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
58 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
60 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
61 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock)
63 ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager)
64 handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManagerMock, routingManagerClientMock)
66 return logger, handler, readerMock, writerMock, e2tInstancesManagerMock, routingManagerClientMock
69 func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger.Logger, *configuration.Configuration, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) {
72 config := configuration.ParseConfiguration()
74 readerMock := &mocks.RnibReaderMock{}
76 writerMock := &mocks.RnibWriterMock{}
77 httpClientMock := &mocks.HttpClientMock{}
79 routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClientMock)
80 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
82 e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger)
83 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient)
84 ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager)
85 handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManager, routingManagerClient)
86 return logger, config, handler, readerMock, writerMock, httpClientMock
89 func TestE2TermInitUnmarshalPayloadFailure(t *testing.T) {
90 _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
91 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("asd")}
92 handler.Handle(notificationRequest)
93 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
94 e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
97 func TestE2TermInitEmptyE2TAddress(t *testing.T) {
98 _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
99 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("{\"address\":\"\"}")}
100 handler.Handle(notificationRequest)
101 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
102 e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
105 func TestE2TermInitGetE2TInstanceFailure(t *testing.T) {
106 _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
107 var e2tInstance *entities.E2TInstance
108 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
109 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
110 handler.Handle(notificationRequest)
111 e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
114 func TestE2TermInitGetE2TInstanceDbFailure(t *testing.T) {
115 _, _, handler, readerMock, writerMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
116 var e2tInstance *entities.E2TInstance
117 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
118 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
119 handler.Handle(notificationRequest)
120 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
123 func TestE2TermInitNewE2TInstance(t *testing.T) {
124 _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
125 var e2tInstance *entities.E2TInstance
127 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
128 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
130 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
131 url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix
132 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
134 e2tAddresses := []string{}
135 readerMock.On("GetE2TAddresses").Return(e2tAddresses, common.NewResourceNotFoundError(""))
137 e2tAddresses = append(e2tAddresses, e2tInstanceAddress)
138 writerMock.On("SaveE2TAddresses", e2tAddresses).Return(nil)
140 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
141 handler.Handle(notificationRequest)
143 httpClientMock.AssertCalled(t, "Post", url, mock.Anything, mock.Anything)
144 writerMock.AssertCalled(t, "SaveE2TInstance", mock.Anything)
145 writerMock.AssertCalled(t, "SaveE2TAddresses", e2tAddresses)
148 func TestE2TermInitNewE2TInstance__RoutingManagerError(t *testing.T) {
149 _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
151 var e2tInstance *entities.E2TInstance
153 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
155 url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix
156 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error"))
158 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
159 handler.Handle(notificationRequest)
161 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 0)
164 func TestE2TermInitExistingE2TInstanceNoAssociatedRans(t *testing.T) {
165 _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
166 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
167 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
168 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
169 handler.Handle(notificationRequest)
170 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceAddress)
173 func TestE2TermInitHandlerSuccessOneRan(t *testing.T) {
174 _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
177 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
178 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
180 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
181 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
183 var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
184 readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
186 var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
187 writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
189 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
190 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
191 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
192 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
194 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
195 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
196 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
198 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
200 handler.Handle(notificationRequest)
202 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
203 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
204 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
207 func TestE2TermInitHandlerSuccessOneRan_RoutingManagerError(t *testing.T) {
208 _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
211 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
212 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
214 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
215 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
217 var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
218 readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
220 var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
221 writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
223 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
224 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
225 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
226 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
228 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
229 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error"))
231 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
233 handler.Handle(notificationRequest)
235 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
236 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
237 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
240 func TestE2TermInitHandlerSuccessOneRanShuttingdown(t *testing.T) {
241 _, _, handler, readerMock, writerMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
244 var initialNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
245 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
247 var argNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
248 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
250 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
251 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
252 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
253 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
255 handler.Handle(notificationRequest)
257 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
260 func TestE2TermInitHandlerSuccessOneRan_ToBeDeleted(t *testing.T) {
261 _, _, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
264 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
265 readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
267 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
268 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
270 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
271 e2tInstance.State = entities.ToBeDeleted
272 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
274 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
275 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
277 handler.Handle(notificationRequest)
279 httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything)
280 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
283 func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) {
285 _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
291 var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
292 var disconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
293 readerMock.On("GetNodeb", RanName).Return(firstRan, rnibErr).Return(disconnectedFirstRan, rnibErr)
295 var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
296 writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr)
298 var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
299 writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr)
302 var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
303 var disconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
304 readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr).Return(disconnectedSecondRan, rnibErr)
306 var updatedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
307 writerMock.On("UpdateNodebInfo", updatedSecondRan).Return(rnibErr)
309 var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""}
310 writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr)
312 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
313 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
314 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
315 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
316 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
318 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
319 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
320 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
322 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
324 handler.Handle(notificationRequest)
326 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 4)
327 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 2)
328 httpClientMock.AssertNumberOfCalls(t, "Post", 2)
331 func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) {
332 _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
338 var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
339 var disconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
340 readerMock.On("GetNodeb", RanName).Return(firstRan, rnibErr).Return(disconnectedFirstRan, rnibErr)
342 var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
343 writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr)
345 var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
346 writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr)
349 var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
350 readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr)
352 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
353 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
354 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
355 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
357 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
358 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
359 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
361 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
363 handler.Handle(notificationRequest)
365 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
366 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
367 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
370 func TestE2TermInitHandlerSuccessTwoRansFirstNotFoundFailure(t *testing.T) {
371 _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
377 var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
378 readerMock.On("GetNodeb", RanName).Return(firstRan, common.NewResourceNotFoundError("not found"))
381 var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
382 var disconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
383 readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr).Return(disconnectedSecondRan, rnibErr)
385 var updatedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
386 writerMock.On("UpdateNodebInfo", updatedSecondRan).Return(rnibErr)
388 var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""}
389 writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr)
391 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
392 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
393 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
394 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
395 writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
397 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
398 url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
399 httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
401 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
403 handler.Handle(notificationRequest)
405 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
406 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
407 httpClientMock.AssertNumberOfCalls(t, "Post", 1)
410 func TestE2TermInitHandlerSuccessTwoRansFirstRnibInternalErrorFailure(t *testing.T) {
411 _, _, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
416 var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
417 readerMock.On("GetNodeb", RanName).Return(firstRan, common.NewInternalError(fmt.Errorf("internal error")))
419 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
420 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
421 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
422 readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
424 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
426 handler.Handle(notificationRequest)
428 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
429 writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 0)
430 httpClientMock.AssertNumberOfCalls(t, "Post", 0)
433 func TestE2TermInitHandlerSuccessZeroRans(t *testing.T) {
434 _, handler, _, writerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
436 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
437 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
438 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
440 handler.Handle(notificationRequest)
442 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
445 func TestE2TermInitHandlerFailureGetNodebInternalError(t *testing.T) {
446 _, handler, readerMock, writerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
448 var nodebInfo *entities.NodebInfo
449 readerMock.On("GetNodeb", "test1").Return(nodebInfo, common.NewInternalError(fmt.Errorf("internal error")))
451 e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
452 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1")
453 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
454 notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
455 handler.Handle(notificationRequest)
457 writerMock.AssertNotCalled(t, "UpdateNodebInfo")
460 // TODO: extract to test_utils
461 func initRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
462 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
463 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
464 return rmrsender.NewRmrSender(log, rmrMessenger)
467 // TODO: extract to test_utils
468 func initLog(t *testing.T) *logger.Logger {
469 log, err := logger.InitLogger(logger.InfoLevel)
471 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)