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 oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
111 nbIdentityList := []*entities.NbIdentity{oldNbIdentity}
112 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
114 err := ranListManager.InitNbIdentityMap()
116 t.Errorf("Error cannot init identity")
119 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
120 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, NodeType: entities.Node_GNB}
121 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
122 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,NodeType: entities.Node_GNB}
123 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
124 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
125 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
127 _, err = h.Handle(nil)
129 readerMock.AssertExpectations(t)
130 writerMock.AssertExpectations(t)
133 func TestTwoRansGetE2TAddressesEmptyListOneGetNodebFailure(t *testing.T) {
134 h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
136 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
137 oldNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
138 oldNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
139 oldNbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2}
140 readerMock.On("GetListNodebIds").Return(oldNbIdentityList, nil)
142 _ = ranListManager.InitNbIdentityMap()
145 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, NodeType: entities.Node_GNB}
146 readerMock.On("GetNodeb", "RanName_1").Return(nb1, err)
149 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
150 writerMock.On("UpdateNodebInfo", &updatedNb1).Return(nil)
152 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
153 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
155 var nb2 *entities.NodebInfo
156 readerMock.On("GetNodeb", "RanName_2").Return(nb2, common.NewInternalError(errors.New("error")))
157 _, err = h.Handle(nil)
158 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
159 writerMock.AssertNotCalled(t, "UpdateNodebInfo", nb2)
160 readerMock.AssertCalled(t, "GetE2TAddresses")
161 readerMock.AssertCalled(t, "GetListNodebIds")
162 readerMock.AssertCalled(t, "GetNodeb", "RanName_2")
165 func TestUpdateNodebInfoOnConnectionStatusInversionFailure(t *testing.T) {
166 h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
168 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
169 oldNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
170 oldNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
171 oldNbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2}
172 readerMock.On("GetListNodebIds").Return(oldNbIdentityList, nil)
174 _ = ranListManager.InitNbIdentityMap()
176 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, NodeType: entities.Node_GNB}
177 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
179 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, NodeType: entities.Node_GNB}
180 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
181 writerMock.On("UpdateNodebInfo", nb2).Return(nil)
184 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
185 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(common.NewInternalError(errors.New("error")))
187 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
188 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
190 newNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
191 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity2}, []*entities.NbIdentity{newNbIdentity2}).Return(nil)
193 _, err := h.Handle(nil)
195 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
196 writerMock.AssertCalled(t, "UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED")
197 readerMock.AssertCalled(t, "GetE2TAddresses")
198 readerMock.AssertCalled(t, "GetListNodebIds")
199 readerMock.AssertCalled(t, "GetNodeb", "RanName_1")
202 func TestTwoRansGetE2TAddressesEmptyListOneUpdateNodebInfoFailure(t *testing.T) {
203 h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
205 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
206 oldNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
207 oldNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
208 oldNbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2}
209 readerMock.On("GetListNodebIds").Return(oldNbIdentityList, nil)
211 err := ranListManager.InitNbIdentityMap()
213 t.Errorf("Error cannot init identity")
216 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, NodeType: entities.Node_GNB}
217 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
218 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, NodeType: entities.Node_GNB}
219 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
221 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
222 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
224 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
225 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
226 updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
227 writerMock.On("UpdateNodebInfo", updatedNb2).Return(common.NewInternalError(errors.New("error")))
228 _, err = h.Handle(nil)
229 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
230 readerMock.AssertCalled(t, "GetE2TAddresses")
231 readerMock.AssertCalled(t, "GetListNodebIds")
232 readerMock.AssertCalled(t, "GetNodeb", "RanName_2")
233 writerMock.AssertCalled(t, "UpdateNodebInfo", updatedNb2)
236 func TestOneRanWithStateShutDown(t *testing.T) {
237 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
238 e2tAddresses := []string{E2TAddress}
239 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
240 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
241 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
242 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
244 err := ranListManager.InitNbIdentityMap()
246 t.Errorf("Error cannot init identity")
249 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
250 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
251 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
253 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
254 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
255 updatedE2tInstance := e2tInstance
256 updatedE2tInstance.AssociatedRanList = []string{}
257 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
259 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
260 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
261 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
263 _, err = h.Handle(nil)
266 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
267 readerMock.AssertExpectations(t)
268 writerMock.AssertExpectations(t)
271 func TestOneRanShutDown(t *testing.T) {
272 h, readerMock, writerMock, _, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
273 e2tAddresses := []string{}
274 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
275 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
276 oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
277 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
279 err := ranListManager.InitNbIdentityMap()
281 t.Errorf("Error cannot init identity")
284 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
285 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
287 nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, NodeType: entities.Node_GNB}
288 writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
290 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
291 writerMock.On("UpdateNbIdentities", nb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
293 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
295 _, err = h.Handle(nil)
298 readerMock.AssertExpectations(t)
299 writerMock.AssertExpectations(t)
302 func TestOneRanTryShuttingDownSucceedsClearFails(t *testing.T) {
303 h, readerMock, writerMock, _, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
305 e2tAddresses := []string{E2TAddress}
306 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
307 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
308 oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
309 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
311 err := ranListManager.InitNbIdentityMap()
313 t.Errorf("Error cannot init identity")
316 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress, NodeType: entities.Node_GNB}
317 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
320 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
321 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
323 nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
324 writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
326 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
327 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
329 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
330 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{}, common.NewInternalError(errors.New("error")))
331 _, err = h.Handle(nil)
332 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
333 readerMock.AssertExpectations(t)
334 writerMock.AssertExpectations(t)
337 func TestOneRanTryShuttingDownUpdateNodebError(t *testing.T) {
338 h, readerMock, writerMock, _, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
340 e2tAddresses := []string{E2TAddress}
341 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
342 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
343 oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
344 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
346 err := ranListManager.InitNbIdentityMap()
348 t.Errorf("Error cannot init identity")
351 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress, NodeType: entities.Node_GNB}
352 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
355 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
356 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
358 nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
359 writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(common.NewInternalError(errors.New("error")))
361 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
362 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
364 _, err = h.Handle(nil)
366 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
367 readerMock.AssertExpectations(t)
368 writerMock.AssertExpectations(t)
371 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSendFails(t *testing.T) {
372 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
374 e2tAddresses := []string{E2TAddress}
375 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
376 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
377 oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
378 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
380 err := ranListManager.InitNbIdentityMap()
382 t.Errorf("Error cannot init identity")
385 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress, NodeType: entities.Node_GNB}
386 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
389 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
390 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
392 nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
393 writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
395 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
396 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
397 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
398 updatedE2tInstance := e2tInstance
399 updatedE2tInstance.AssociatedRanList = []string{}
400 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
402 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
403 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
405 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
406 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
407 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, e2managererrors.NewRmrError())
408 _, err = h.Handle(nil)
409 assert.IsType(t, &e2managererrors.RmrError{}, err)
410 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
411 readerMock.AssertExpectations(t)
412 writerMock.AssertExpectations(t)
415 func testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t *testing.T, partial bool) {
416 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
418 e2tAddresses := []string{E2TAddress}
419 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
420 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, !partial)
421 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}}
422 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
424 err := ranListManager.InitNbIdentityMap()
426 t.Errorf("Error cannot init identity")
429 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
430 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
431 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
432 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
433 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
434 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1", "RanName_2"}}
435 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
436 updatedE2tInstance := e2tInstance
437 updatedE2tInstance.AssociatedRanList = []string{}
438 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
440 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
441 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
442 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
443 resp, err := h.Handle(nil)
447 assert.IsType(t, &models.RedButtonPartialSuccessResponseModel{}, resp)
452 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
453 readerMock.AssertExpectations(t)
454 writerMock.AssertExpectations(t)
457 func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownSuccess(t *testing.T) {
458 testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, false)
461 func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownPartialSuccess(t *testing.T) {
462 testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, true)
465 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownUpdateFailure(t *testing.T) {
466 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
467 e2tAddresses := []string{E2TAddress}
468 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
469 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
470 oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
471 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
473 err := ranListManager.InitNbIdentityMap()
475 t.Errorf("Error cannot init identity")
478 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, AssociatedE2TInstanceAddress: E2TAddress, NodeType: entities.Node_GNB}
479 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
482 writerMock.On("UpdateNodebInfo", &updatedNb1).Return(nil)
484 nodeb1NotAssociated := *nb1
485 nodeb1NotAssociated.AssociatedE2TInstanceAddress = ""
486 nodeb1NotAssociated.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
487 writerMock.On("UpdateNodebInfo", &nodeb1NotAssociated).Return(nil)
489 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
490 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
491 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
492 updatedE2tInstance := e2tInstance
493 updatedE2tInstance.AssociatedRanList = []string{}
494 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
496 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
497 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
499 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
500 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
501 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
503 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
504 readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
506 updatedNb2 := *nb1 //&entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
507 updatedNb2.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
508 updatedNb2.AssociatedE2TInstanceAddress = ""
509 writerMock.On("UpdateNodebInfo", &updatedNb2).Return(common.NewInternalError(errors.New("error")))
511 _, err = h.Handle(nil)
513 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
514 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
515 readerMock.AssertExpectations(t)
516 writerMock.AssertExpectations(t)
519 func testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t *testing.T, partial bool) {
520 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
521 e2tAddresses := []string{E2TAddress}
522 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
523 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, !partial)
525 oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
526 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
528 err := ranListManager.InitNbIdentityMap()
530 t.Errorf("Error cannot init identity")
533 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
534 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
535 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
536 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
537 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
538 updatedE2tInstance := e2tInstance
539 updatedE2tInstance.AssociatedRanList = []string{}
540 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
542 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
543 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
544 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
546 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
547 readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
548 updatedNb2 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, NodeType: entities.Node_GNB}
549 writerMock.On("UpdateNodebInfo", updatedNb2).Return(nil)
551 newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
552 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
554 newNbIdentityShutDown := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
555 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentityShutDown}).Return(nil)
557 _, err = h.Handle(nil)
559 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
560 readerMock.AssertExpectations(t)
561 writerMock.AssertExpectations(t)
562 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
565 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownSuccess(t *testing.T) {
566 testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, false)
569 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownPartialSuccess(t *testing.T) {
570 testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, true)
573 func TestSuccessTwoE2TInstancesSixRans(t *testing.T) {
574 h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
575 e2tAddresses := []string{E2TAddress, E2TAddress2}
576 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
577 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
579 oldNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
580 oldNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
581 oldNbIdentity3 := &entities.NbIdentity{InventoryName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId3", NbId: "nbId3"}}
582 oldNbIdentity4 := &entities.NbIdentity{InventoryName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId4", NbId: "nbId4"}}
583 oldNbIdentity5 := &entities.NbIdentity{InventoryName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId5", NbId: "nbId5"}}
584 oldNbIdentity6 := &entities.NbIdentity{InventoryName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId6", NbId: "nbId6"}}
585 nbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2, oldNbIdentity3, oldNbIdentity4, oldNbIdentity5, oldNbIdentity6}
586 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
588 err := ranListManager.InitNbIdentityMap()
590 t.Errorf("Error cannot init identity")
593 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
594 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
595 updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
596 writerMock.On("UpdateNodebInfo", updatedNb2).Return(nil)
597 updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
598 writerMock.On("UpdateNodebInfo", updatedNb3).Return(nil)
599 updatedNb4 := &entities.NodebInfo{RanName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
600 writerMock.On("UpdateNodebInfo", updatedNb4).Return(nil)
601 updatedNb5 := &entities.NodebInfo{RanName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
602 writerMock.On("UpdateNodebInfo", updatedNb5).Return(nil)
603 updatedNb6 := &entities.NodebInfo{RanName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
604 writerMock.On("UpdateNodebInfo", updatedNb6).Return(nil)
606 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
607 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1", "RanName_2", "RanName_3"}}
608 e2tInstance2 := entities.E2TInstance{Address: E2TAddress2, AssociatedRanList: []string{"RanName_4", "RanName_5", "RanName_6"}}
609 readerMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{&e2tInstance, &e2tInstance2}, nil)
610 updatedE2tInstance := e2tInstance
611 updatedE2tInstance.AssociatedRanList = []string{}
612 updatedE2tInstance2 := e2tInstance2
613 updatedE2tInstance2.AssociatedRanList = []string{}
614 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
615 writerMock.On("SaveE2TInstance", &updatedE2tInstance2).Return(nil)
617 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
618 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
619 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
621 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
622 readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
623 readerMock.On("GetNodeb", "RanName_2").Return(updatedNb2, nil)
624 readerMock.On("GetNodeb", "RanName_3").Return(updatedNb3, nil)
625 readerMock.On("GetNodeb", "RanName_4").Return(updatedNb4, nil)
626 readerMock.On("GetNodeb", "RanName_5").Return(updatedNb5, nil)
627 readerMock.On("GetNodeb", "RanName_6").Return(updatedNb6, nil)
629 updatedNb1AfterTimer := *updatedNb1
630 updatedNb1AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
631 writerMock.On("UpdateNodebInfo", &updatedNb1AfterTimer).Return(nil)
632 updatedNb2AfterTimer := *updatedNb2
633 updatedNb2AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
634 writerMock.On("UpdateNodebInfo", &updatedNb2AfterTimer).Return(nil)
635 updatedNb3AfterTimer := *updatedNb3
636 updatedNb3AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
637 writerMock.On("UpdateNodebInfo", &updatedNb3AfterTimer).Return(nil)
638 updatedNb4AfterTimer := *updatedNb4
639 updatedNb4AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
640 writerMock.On("UpdateNodebInfo", &updatedNb4AfterTimer).Return(nil)
641 updatedNb5AfterTimer := *updatedNb5
642 updatedNb5AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
643 writerMock.On("UpdateNodebInfo", &updatedNb5AfterTimer).Return(nil)
644 updatedNb6AfterTimer := *updatedNb6
645 updatedNb6AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
646 writerMock.On("UpdateNodebInfo", &updatedNb6AfterTimer).Return(nil)
648 newNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
649 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity1}).Return(nil)
650 newNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
651 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity2}, []*entities.NbIdentity{newNbIdentity2}).Return(nil)
652 newNbIdentity3 := &entities.NbIdentity{InventoryName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId3", NbId: "nbId3"}}
653 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity3}, []*entities.NbIdentity{newNbIdentity3}).Return(nil)
654 newNbIdentity4 := &entities.NbIdentity{InventoryName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId4", NbId: "nbId4"}}
655 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity4}, []*entities.NbIdentity{newNbIdentity4}).Return(nil)
656 newNbIdentity5 := &entities.NbIdentity{InventoryName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId5", NbId: "nbId5"}}
657 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity5}, []*entities.NbIdentity{newNbIdentity5}).Return(nil)
658 newNbIdentity6 := &entities.NbIdentity{InventoryName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId6", NbId: "nbId6"}}
659 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity6}, []*entities.NbIdentity{newNbIdentity6}).Return(nil)
661 newNbIdentity1ShutDown := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
662 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity1ShutDown}).Return(nil)
663 newNbIdentity2ShutDown := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}}
664 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity2}, []*entities.NbIdentity{newNbIdentity2ShutDown}).Return(nil)
665 newNbIdentity3ShutDown := &entities.NbIdentity{InventoryName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId3", NbId: "nbId3"}}
666 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity3}, []*entities.NbIdentity{newNbIdentity3ShutDown}).Return(nil)
667 newNbIdentity4ShutDown := &entities.NbIdentity{InventoryName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId4", NbId: "nbId4"}}
668 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity4}, []*entities.NbIdentity{newNbIdentity4ShutDown}).Return(nil)
669 newNbIdentity5ShutDown := &entities.NbIdentity{InventoryName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId5", NbId: "nbId5"}}
670 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity5}, []*entities.NbIdentity{newNbIdentity5ShutDown}).Return(nil)
671 newNbIdentity6ShutDown := &entities.NbIdentity{InventoryName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId6", NbId: "nbId6"}}
672 writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity6}, []*entities.NbIdentity{newNbIdentity6ShutDown}).Return(nil)
674 _, err = h.Handle(nil)
676 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
677 readerMock.AssertExpectations(t)
678 writerMock.AssertExpectations(t)
679 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 18)
682 func initLog(t *testing.T) *logger.Logger {
683 log, err := logger.InitLogger(logger.DebugLevel)
685 t.Errorf("#initLog test - failed to initialize logger, error: %s", err)
690 func getRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
691 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
692 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
693 return rmrsender.NewRmrSender(log, rmrMessenger)