[RIC-430] - Update Connection Status on RAN List
[ric-plt/e2mgr.git] / E2Manager / handlers / httpmsghandlers / delete_all_request_handler_test.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
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
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16
17 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 //  platform project (RICP).
19
20 package httpmsghandlers
21
22 import (
23         "bytes"
24         "e2mgr/clients"
25         "e2mgr/configuration"
26         "e2mgr/e2managererrors"
27         "e2mgr/logger"
28         "e2mgr/managers"
29         "e2mgr/mocks"
30         "e2mgr/models"
31         "e2mgr/rmrCgo"
32         "e2mgr/services"
33         "e2mgr/services/rmrsender"
34         "e2mgr/tests"
35         "encoding/json"
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"
40         "io/ioutil"
41         "net/http"
42         "testing"
43 )
44
45 const E2TAddress = "10.0.2.15:8989"
46 const BaseRMUrl = "http://10.10.2.15:12020/routingmanager"
47
48 func setupDeleteAllRequestHandlerTest(t *testing.T) (*DeleteAllRequestHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.HttpClientMock, managers.RanListManager) {
49         log := initLog(t)
50         config := &configuration.Configuration{RnibWriter: configuration.RnibWriterConfig{StateChangeMessageChannel: "RAN_CONNECTION_STATUS_CHANGE"}}
51         config.BigRedButtonTimeoutSec = 1
52         config.RoutingManager.BaseUrl = BaseRMUrl
53
54         readerMock := &mocks.RnibReaderMock{}
55         writerMock := &mocks.RnibWriterMock{}
56         rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
57
58         rmrMessengerMock := &mocks.RmrMessengerMock{}
59         rmrSender := getRmrSender(rmrMessengerMock, log)
60
61         e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log)
62         httpClientMock := &mocks.HttpClientMock{}
63         rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
64
65         ranListManager := managers.NewRanListManager(log, rnibDataService)
66         ranAlarmService := services.NewRanAlarmService(log, config)
67         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
68
69         handler := NewDeleteAllRequestHandler(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, ranListManager)
70         return handler, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager
71 }
72
73 func mapE2TAddressesToE2DataList(e2tAddresses []string) models.RoutingManagerE2TDataList {
74         e2tDataList := make(models.RoutingManagerE2TDataList, len(e2tAddresses))
75
76         for i, v := range e2tAddresses {
77                 e2tDataList[i] = models.NewRoutingManagerE2TData(v)
78         }
79
80         return e2tDataList
81 }
82
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(""))
89
90         var status int
91         if ok {
92                 status = http.StatusOK
93         } else {
94                 status = http.StatusBadRequest
95         }
96         httpClientMock.On("Post", url, "application/json", body).Return(&http.Response{StatusCode: status, Body: respBody}, nil)
97 }
98
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)
105 }
106
107 func TestOneRanGetE2TAddressesEmptyList(t *testing.T) {
108         h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
109
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)
113
114         err := ranListManager.InitNbIdentityMap()
115         if err != nil {
116                 t.Errorf("Error cannot init identity")
117         }
118
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)
126         
127         _, err = h.Handle(nil)
128         assert.Nil(t, err)
129         readerMock.AssertExpectations(t)
130         writerMock.AssertExpectations(t)
131 }
132
133 func TestTwoRansGetE2TAddressesEmptyListOneGetNodebFailure(t *testing.T) {
134         h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
135
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)
141
142         _ = ranListManager.InitNbIdentityMap()
143
144         var err error
145         nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, NodeType: entities.Node_GNB}
146         readerMock.On("GetNodeb", "RanName_1").Return(nb1, err)
147
148         updatedNb1 := *nb1
149         updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
150         writerMock.On("UpdateNodebInfo", &updatedNb1).Return(nil)
151
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)
154
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")
163 }
164
165 func TestUpdateNodebInfoOnConnectionStatusInversionFailure(t *testing.T) {
166         h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
167
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)
173
174         _ = ranListManager.InitNbIdentityMap()
175
176         nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, NodeType: entities.Node_GNB}
177         readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
178
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)
182
183         updatedNb1 := *nb1
184         updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
185         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(common.NewInternalError(errors.New("error")))
186
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)
189
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)
192
193         _, err := h.Handle(nil)
194
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")
200 }
201
202 func TestTwoRansGetE2TAddressesEmptyListOneUpdateNodebInfoFailure(t *testing.T) {
203         h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t)
204
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)
210
211         err := ranListManager.InitNbIdentityMap()
212         if err != nil {
213                 t.Errorf("Error cannot init identity")
214         }
215
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)
220
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)
223
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)
234 }
235
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)
243
244         err := ranListManager.InitNbIdentityMap()
245         if err != nil {
246                 t.Errorf("Error cannot init identity")
247         }
248
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)
252
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)
258
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)
262
263         _, err = h.Handle(nil)
264
265         assert.Nil(t, err)
266         rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
267         readerMock.AssertExpectations(t)
268         writerMock.AssertExpectations(t)
269 }
270
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)
278
279         err := ranListManager.InitNbIdentityMap()
280         if err != nil {
281                 t.Errorf("Error cannot init identity")
282         }
283
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)
286
287         nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, NodeType: entities.Node_GNB}
288         writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
289
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)
292
293         readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
294
295         _, err = h.Handle(nil)
296
297         assert.Nil(t, err)
298         readerMock.AssertExpectations(t)
299         writerMock.AssertExpectations(t)
300 }
301
302 func TestOneRanTryShuttingDownSucceedsClearFails(t *testing.T) {
303         h, readerMock, writerMock, _, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
304
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)
310
311         err := ranListManager.InitNbIdentityMap()
312         if err != nil {
313                 t.Errorf("Error cannot init identity")
314         }
315
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)
318
319         updatedNb1 := *nb1
320         updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
321         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
322
323         nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
324         writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
325
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)
328
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)
335 }
336
337 func TestOneRanTryShuttingDownUpdateNodebError(t *testing.T) {
338         h, readerMock, writerMock, _, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
339
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)
345
346         err := ranListManager.InitNbIdentityMap()
347         if err != nil {
348                 t.Errorf("Error cannot init identity")
349         }
350
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)
353
354         updatedNb1 := *nb1
355         updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
356         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
357
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")))
360
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)
363
364         _, err = h.Handle(nil)
365
366         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
367         readerMock.AssertExpectations(t)
368         writerMock.AssertExpectations(t)
369 }
370
371 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSendFails(t *testing.T) {
372         h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
373
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)
379
380         err := ranListManager.InitNbIdentityMap()
381         if err != nil {
382                 t.Errorf("Error cannot init identity")
383         }
384
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)
387
388         updatedNb1 := *nb1
389         updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
390         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
391
392         nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB}
393         writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
394
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)
401
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)
404
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)
413 }
414
415 func testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t *testing.T, partial bool) {
416         h, readerMock, writerMock, rmrMessengerMock, httpClientMock, ranListManager := setupDeleteAllRequestHandlerTest(t)
417
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)
423
424         err := ranListManager.InitNbIdentityMap()
425         if err != nil {
426                 t.Errorf("Error cannot init identity")
427         }
428
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)
439
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)
444         assert.Nil(t, err)
445
446         if partial {
447                 assert.IsType(t, &models.RedButtonPartialSuccessResponseModel{}, resp)
448         } else {
449                 assert.Nil(t, resp)
450         }
451
452         rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
453         readerMock.AssertExpectations(t)
454         writerMock.AssertExpectations(t)
455 }
456
457 func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownSuccess(t *testing.T) {
458         testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, false)
459 }
460
461 func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownPartialSuccess(t *testing.T) {
462         testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, true)
463 }
464
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)
472
473         err := ranListManager.InitNbIdentityMap()
474         if err != nil {
475                 t.Errorf("Error cannot init identity")
476         }
477
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)
480
481         updatedNb1 := *nb1
482         writerMock.On("UpdateNodebInfo", &updatedNb1).Return(nil)
483
484         nodeb1NotAssociated := *nb1
485         nodeb1NotAssociated.AssociatedE2TInstanceAddress = ""
486         nodeb1NotAssociated.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
487         writerMock.On("UpdateNodebInfo", &nodeb1NotAssociated).Return(nil)
488
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)
495
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)
498
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)
502
503         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
504         readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
505
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")))
510
511         _, err = h.Handle(nil)
512
513         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
514         rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
515         readerMock.AssertExpectations(t)
516         writerMock.AssertExpectations(t)
517 }
518
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)
524
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)
527
528         err := ranListManager.InitNbIdentityMap()
529         if err != nil {
530                 t.Errorf("Error cannot init identity")
531         }
532
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)
541
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)
545
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)
550
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)
553
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)
556
557         _, err = h.Handle(nil)
558         assert.Nil(t, err)
559         rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
560         readerMock.AssertExpectations(t)
561         writerMock.AssertExpectations(t)
562         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
563 }
564
565 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownSuccess(t *testing.T) {
566         testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, false)
567 }
568
569 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownPartialSuccess(t *testing.T) {
570         testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, true)
571 }
572
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)
578
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)
587
588         err := ranListManager.InitNbIdentityMap()
589         if err != nil {
590                 t.Errorf("Error cannot init identity")
591         }
592
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)
605
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)
616
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)
620
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)
628
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)
647
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)
660
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)
673
674         _, err = h.Handle(nil)
675         assert.Nil(t, err)
676         rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
677         readerMock.AssertExpectations(t)
678         writerMock.AssertExpectations(t)
679         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 18)
680 }
681
682 func initLog(t *testing.T) *logger.Logger {
683         log, err := logger.InitLogger(logger.DebugLevel)
684         if err != nil {
685                 t.Errorf("#initLog test - failed to initialize logger, error: %s", err)
686         }
687         return log
688 }
689
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)
694 }