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 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 // platform project (RICP).
20 package httpmsghandlers
26 "e2mgr/e2managererrors"
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/assert"
45 const E2TAddress = "10.0.2.15:8989"
46 const BaseRMUrl = "http://10.10.2.15:12020/routingmanager"
48 func setupDeleteAllRequestHandlerTest(t *testing.T) (*DeleteAllRequestHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.HttpClientMock, managers.RanListManager) {
50 config := &configuration.Configuration{RnibWriter: configuration.RnibWriterConfig{StateChangeMessageChannel: "RAN_CONNECTION_STATUS_CHANGE"}}
51 config.BigRedButtonTimeoutSec = 1
52 config.RoutingManager.BaseUrl = BaseRMUrl
54 readerMock := &mocks.RnibReaderMock{}
55 writerMock := &mocks.RnibWriterMock{}
56 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
58 rmrMessengerMock := &mocks.RmrMessengerMock{}
59 rmrSender := getRmrSender(rmrMessengerMock, log)
61 e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log)
62 httpClientMock := &mocks.HttpClientMock{}
63 rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
65 ranListManager := managers.NewRanListManager(log, rnibDataService)
66 ranAlarmService := services.NewRanAlarmService(log, config)
67 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
69 handler := NewDeleteAllRequestHandler(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, ranListManager)
70 return handler, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager
73 func mapE2TAddressesToE2DataList(e2tAddresses []string) models.RoutingManagerE2TDataList {
74 e2tDataList := make(models.RoutingManagerE2TDataList, len(e2tAddresses))
76 for i, v := range e2tAddresses {
77 e2tDataList[i] = models.NewRoutingManagerE2TData(v)
83 func mockHttpClientDissociateAllRans(httpClientMock *mocks.HttpClientMock, e2tAddresses []string, ok bool) {
84 data := mapE2TAddressesToE2DataList(e2tAddresses)
85 marshaled, _ := json.Marshal(data)
86 body := bytes.NewBuffer(marshaled)
87 url := BaseRMUrl + clients.DissociateRanE2TInstanceApiSuffix
88 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
92 status = http.StatusOK
94 status = http.StatusBadRequest
96 httpClientMock.On("Post", url, "application/json", body).Return(&http.Response{StatusCode: status, Body: respBody}, nil)
99 func TestGetE2TAddressesFailure(t *testing.T) {
100 h, readerMock, _, _, _, _ := setupDeleteAllRequestHandlerTest(t)
101 readerMock.On("GetE2TAddresses").Return([]string{}, common.NewInternalError(errors.New("error")))
102 _, err := h.Handle(nil)
103 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
104 readerMock.AssertExpectations(t)
107 func TestOneRanGetE2TAddressesEmptyList(t *testing.T) {
108 h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
110 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
111 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
113 err := ranListManager.InitNbIdentityMap()
115 t.Errorf("Error cannot init identity")
118 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
119 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
120 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
121 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
122 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
123 _, err = h.Handle(nil)
125 readerMock.AssertExpectations(t)
126 writerMock.AssertExpectations(t)
129 func TestTwoRansGetE2TAddressesEmptyListOneGetNodebFailure(t *testing.T) {
130 h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
132 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
133 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}}
134 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
136 _ = ranListManager.InitNbIdentityMap()
139 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
140 readerMock.On("GetNodeb", "RanName_1").Return(nb1, err)
143 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
144 writerMock.On("UpdateNodebInfo", &updatedNb1).Return(nil)
146 var nb2 *entities.NodebInfo
147 readerMock.On("GetNodeb", "RanName_2").Return(nb2, common.NewInternalError(errors.New("error")))
148 _, err = h.Handle(nil)
149 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
150 writerMock.AssertExpectations(t)
151 readerMock.AssertExpectations(t)
154 func TestUpdateNodebInfoOnConnectionStatusInversionFailure(t *testing.T) {
155 h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
157 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
158 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}}
159 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
161 _ = ranListManager.InitNbIdentityMap()
163 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED}
164 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
167 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
168 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(common.NewInternalError(errors.New("error")))
170 _, err := h.Handle(nil)
172 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
173 writerMock.AssertExpectations(t)
174 readerMock.AssertExpectations(t)
177 func TestTwoRansGetE2TAddressesEmptyListOneUpdateNodebInfoFailure(t *testing.T) {
178 h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
180 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
181 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}}
182 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
184 err := ranListManager.InitNbIdentityMap()
186 t.Errorf("Error cannot init identity")
189 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
190 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
191 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
192 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
194 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
195 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
196 updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
197 writerMock.On("UpdateNodebInfo", updatedNb2).Return(common.NewInternalError(errors.New("error")))
198 _, err = h.Handle(nil)
199 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
200 readerMock.AssertExpectations(t)
201 writerMock.AssertExpectations(t)
204 func TestOneRanWithStateShutDown(t *testing.T) {
205 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
206 e2tAddresses := []string{E2TAddress}
207 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
208 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
209 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
210 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
212 err := ranListManager.InitNbIdentityMap()
214 t.Errorf("Error cannot init identity")
217 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
218 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
219 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
221 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
222 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
223 updatedE2tInstance := e2tInstance
224 updatedE2tInstance.AssociatedRanList = []string{}
225 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
227 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
228 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
229 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
231 _, err = h.Handle(nil)
234 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
235 readerMock.AssertExpectations(t)
236 writerMock.AssertExpectations(t)
239 func TestOneRanShutDown(t *testing.T) {
240 h, readerMock, writerMock, _, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
241 e2tAddresses := []string{}
242 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
243 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
244 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
245 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
247 err := ranListManager.InitNbIdentityMap()
249 t.Errorf("Error cannot init identity")
252 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
253 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
255 nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
256 writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
258 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
260 _, err = h.Handle(nil)
263 readerMock.AssertExpectations(t)
264 writerMock.AssertExpectations(t)
267 func TestOneRanTryShuttingDownSucceedsClearFails(t *testing.T) {
268 h, readerMock, writerMock, _, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
270 e2tAddresses := []string{E2TAddress}
271 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
272 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
273 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
274 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
276 err := ranListManager.InitNbIdentityMap()
278 t.Errorf("Error cannot init identity")
281 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
282 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
285 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
286 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
288 nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
289 writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
291 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
292 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{}, common.NewInternalError(errors.New("error")))
293 _, err = h.Handle(nil)
294 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
295 readerMock.AssertExpectations(t)
296 writerMock.AssertExpectations(t)
299 func TestOneRanTryShuttingDownUpdateNodebError(t *testing.T) {
300 h, readerMock, writerMock, _, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
302 e2tAddresses := []string{E2TAddress}
303 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
304 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
305 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
306 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
308 err := ranListManager.InitNbIdentityMap()
310 t.Errorf("Error cannot init identity")
313 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
314 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
317 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
318 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
320 nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
321 writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(common.NewInternalError(errors.New("error")))
323 _, err = h.Handle(nil)
325 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
326 readerMock.AssertExpectations(t)
327 writerMock.AssertExpectations(t)
330 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSendFails(t *testing.T) {
331 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
333 e2tAddresses := []string{E2TAddress}
334 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
335 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
336 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
337 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
339 err := ranListManager.InitNbIdentityMap()
341 t.Errorf("Error cannot init identity")
344 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
345 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
348 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
349 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
351 nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
352 writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
354 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
355 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
356 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
357 updatedE2tInstance := e2tInstance
358 updatedE2tInstance.AssociatedRanList = []string{}
359 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
361 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
362 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
363 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, e2managererrors.NewRmrError())
364 _, err = h.Handle(nil)
365 assert.IsType(t, &e2managererrors.RmrError{}, err)
366 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
367 readerMock.AssertExpectations(t)
368 writerMock.AssertExpectations(t)
371 func testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t *testing.T, partial bool) {
372 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
374 e2tAddresses := []string{E2TAddress}
375 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
376 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, !partial)
377 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}}
378 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
380 err := ranListManager.InitNbIdentityMap()
382 t.Errorf("Error cannot init identity")
385 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
386 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
387 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
388 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
389 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
390 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1", "RanName_2"}}
391 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
392 updatedE2tInstance := e2tInstance
393 updatedE2tInstance.AssociatedRanList = []string{}
394 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
396 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
397 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
398 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
399 resp, err := h.Handle(nil)
403 assert.IsType(t, &models.RedButtonPartialSuccessResponseModel{}, resp)
408 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
409 readerMock.AssertExpectations(t)
410 writerMock.AssertExpectations(t)
413 func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownSuccess(t *testing.T) {
414 testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, false)
417 func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownPartialSuccess(t *testing.T) {
418 testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, true)
421 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownUpdateFailure(t *testing.T) {
422 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
423 e2tAddresses := []string{E2TAddress}
424 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
425 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
426 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
427 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
429 err := ranListManager.InitNbIdentityMap()
431 t.Errorf("Error cannot init identity")
434 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, AssociatedE2TInstanceAddress: E2TAddress}
435 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
437 updatedNb1 := *nb1 //&entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, AssociatedE2TInstanceAddress: E2TAddress}
438 writerMock.On("UpdateNodebInfo", &updatedNb1).Return(nil)
440 nodeb1NotAssociated := *nb1
441 nodeb1NotAssociated.AssociatedE2TInstanceAddress = ""
442 nodeb1NotAssociated.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
443 writerMock.On("UpdateNodebInfo", &nodeb1NotAssociated).Return(nil)
445 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
446 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
447 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
448 updatedE2tInstance := e2tInstance
449 updatedE2tInstance.AssociatedRanList = []string{}
450 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
452 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
453 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
454 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
456 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
457 readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
459 updatedNb2 := *nb1 //&entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
460 updatedNb2.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
461 updatedNb2.AssociatedE2TInstanceAddress = ""
462 writerMock.On("UpdateNodebInfo", &updatedNb2).Return(common.NewInternalError(errors.New("error")))
464 _, err = h.Handle(nil)
466 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
467 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
468 readerMock.AssertExpectations(t)
469 writerMock.AssertExpectations(t)
472 func testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t *testing.T, partial bool) {
473 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
474 e2tAddresses := []string{E2TAddress}
475 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
476 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, !partial)
477 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
478 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
480 err := ranListManager.InitNbIdentityMap()
482 t.Errorf("Error cannot init identity")
485 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
486 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
487 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
488 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
489 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
490 updatedE2tInstance := e2tInstance
491 updatedE2tInstance.AssociatedRanList = []string{}
492 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
494 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
495 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
496 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
498 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
499 readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
500 updatedNb2 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
501 writerMock.On("UpdateNodebInfo", updatedNb2).Return(nil)
502 _, err = h.Handle(nil)
504 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
505 readerMock.AssertExpectations(t)
506 writerMock.AssertExpectations(t)
507 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
510 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownSuccess(t *testing.T) {
511 testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, false)
514 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownPartialSuccess(t *testing.T) {
515 testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, true)
518 func TestSuccessTwoE2TInstancesSixRans(t *testing.T) {
519 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
520 e2tAddresses := []string{E2TAddress, E2TAddress2}
521 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
522 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
523 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}, {InventoryName: "RanName_3"}, {InventoryName: "RanName_4"}, {InventoryName: "RanName_5"}, {InventoryName: "RanName_6"}}
524 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
526 err := ranListManager.InitNbIdentityMap()
528 t.Errorf("Error cannot init identity")
531 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
532 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
533 updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
534 writerMock.On("UpdateNodebInfo", updatedNb2).Return(nil)
535 updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
536 writerMock.On("UpdateNodebInfo", updatedNb3).Return(nil)
537 updatedNb4 := &entities.NodebInfo{RanName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
538 writerMock.On("UpdateNodebInfo", updatedNb4).Return(nil)
539 updatedNb5 := &entities.NodebInfo{RanName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
540 writerMock.On("UpdateNodebInfo", updatedNb5).Return(nil)
541 updatedNb6 := &entities.NodebInfo{RanName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
542 writerMock.On("UpdateNodebInfo", updatedNb6).Return(nil)
544 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
545 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1", "RanName_2", "RanName_3"}}
546 e2tInstance2 := entities.E2TInstance{Address: E2TAddress2, AssociatedRanList: []string{"RanName_4", "RanName_5", "RanName_6"}}
547 readerMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{&e2tInstance, &e2tInstance2}, nil)
548 updatedE2tInstance := e2tInstance
549 updatedE2tInstance.AssociatedRanList = []string{}
550 updatedE2tInstance2 := e2tInstance2
551 updatedE2tInstance2.AssociatedRanList = []string{}
552 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
553 writerMock.On("SaveE2TInstance", &updatedE2tInstance2).Return(nil)
555 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
556 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
557 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
559 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
560 readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
561 readerMock.On("GetNodeb", "RanName_2").Return(updatedNb2, nil)
562 readerMock.On("GetNodeb", "RanName_3").Return(updatedNb3, nil)
563 readerMock.On("GetNodeb", "RanName_4").Return(updatedNb4, nil)
564 readerMock.On("GetNodeb", "RanName_5").Return(updatedNb5, nil)
565 readerMock.On("GetNodeb", "RanName_6").Return(updatedNb6, nil)
567 updatedNb1AfterTimer := *updatedNb1
568 updatedNb1AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
569 writerMock.On("UpdateNodebInfo", &updatedNb1AfterTimer).Return(nil)
570 updatedNb2AfterTimer := *updatedNb2
571 updatedNb2AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
572 writerMock.On("UpdateNodebInfo", &updatedNb2AfterTimer).Return(nil)
573 updatedNb3AfterTimer := *updatedNb3
574 updatedNb3AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
575 writerMock.On("UpdateNodebInfo", &updatedNb3AfterTimer).Return(nil)
576 updatedNb4AfterTimer := *updatedNb4
577 updatedNb4AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
578 writerMock.On("UpdateNodebInfo", &updatedNb4AfterTimer).Return(nil)
579 updatedNb5AfterTimer := *updatedNb5
580 updatedNb5AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
581 writerMock.On("UpdateNodebInfo", &updatedNb5AfterTimer).Return(nil)
582 updatedNb6AfterTimer := *updatedNb6
583 updatedNb6AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
584 writerMock.On("UpdateNodebInfo", &updatedNb6AfterTimer).Return(nil)
585 _, err = h.Handle(nil)
587 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
588 readerMock.AssertExpectations(t)
589 writerMock.AssertExpectations(t)
590 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 18)
593 func initLog(t *testing.T) *logger.Logger {
594 log, err := logger.InitLogger(logger.DebugLevel)
596 t.Errorf("#initLog test - failed to initialize logger, error: %s", err)
601 func getRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
602 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
603 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
604 return rmrsender.NewRmrSender(log, rmrMessenger)