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 func setupDeleteAllRequestHandlerTest(t *testing.T) (*DeleteAllRequestHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.HttpClientMock) {
47 config := configuration.ParseConfiguration()
48 config.BigRedButtonTimeoutSec = 1
49 config.RoutingManager.BaseUrl = BaseRMUrl
51 readerMock := &mocks.RnibReaderMock{}
52 writerMock := &mocks.RnibWriterMock{}
53 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
55 rmrMessengerMock := &mocks.RmrMessengerMock{}
56 rmrSender := getRmrSender(rmrMessengerMock, log)
58 e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log)
59 httpClientMock := &mocks.HttpClientMock{}
60 rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
61 handler := NewDeleteAllRequestHandler(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient)
62 return handler, readerMock, writerMock, rmrMessengerMock, httpClientMock
65 func mapE2TAddressesToE2DataList(e2tAddresses []string) models.RoutingManagerE2TDataList {
66 e2tDataList := make(models.RoutingManagerE2TDataList, len(e2tAddresses))
68 for i, v := range e2tAddresses {
69 e2tDataList[i] = models.NewRoutingManagerE2TData(v)
75 func mockHttpClientDissociateAllRans(httpClientMock *mocks.HttpClientMock, e2tAddresses []string, ok bool) {
76 data := mapE2TAddressesToE2DataList(e2tAddresses)
77 marshaled, _ := json.Marshal(data)
78 body := bytes.NewBuffer(marshaled)
79 url := BaseRMUrl + clients.DissociateRanE2TInstanceApiSuffix
80 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
84 status = http.StatusOK
86 status = http.StatusBadRequest
88 httpClientMock.On("Post", url, "application/json", body).Return(&http.Response{StatusCode: status, Body: respBody}, nil)
91 func TestGetE2TAddressesFailure(t *testing.T) {
92 h, readerMock, _, _, _ := setupDeleteAllRequestHandlerTest(t)
93 readerMock.On("GetE2TAddresses").Return([]string{}, common.NewInternalError(errors.New("error")))
94 _, err := h.Handle(nil)
95 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
96 readerMock.AssertExpectations(t)
99 func TestOneRanGetE2TAddressesEmptyList(t *testing.T) {
100 h, readerMock, writerMock, _, _ := setupDeleteAllRequestHandlerTest(t)
101 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
102 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
103 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
104 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
105 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
106 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
107 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
108 _, err := h.Handle(nil)
110 readerMock.AssertExpectations(t)
111 writerMock.AssertExpectations(t)
114 func TestTwoRansGetE2TAddressesEmptyListOneGetNodebFailure(t *testing.T) {
115 h, readerMock, writerMock, _, _ := setupDeleteAllRequestHandlerTest(t)
116 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
117 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}}
118 readerMock.On("GetListNodebIds").Return(nbIdentityList, 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 var nb2 *entities.NodebInfo
124 readerMock.On("GetNodeb", "RanName_2").Return(nb2, common.NewInternalError(errors.New("error")))
125 _, err := h.Handle(nil)
126 assert.IsType(t,&e2managererrors.RnibDbError{}, err)
127 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
128 readerMock.AssertExpectations(t)
131 func TestTwoRansGetE2TAddressesEmptyListOneUpdateNodebInfoFailure(t *testing.T) {
132 h, readerMock, writerMock, _, _ := setupDeleteAllRequestHandlerTest(t)
133 readerMock.On("GetE2TAddresses").Return([]string{}, nil)
134 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}}
135 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
137 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
138 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
139 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
140 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
142 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
143 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
144 updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
145 writerMock.On("UpdateNodebInfo", updatedNb2).Return(common.NewInternalError(errors.New("error")))
146 _, err := h.Handle(nil)
147 assert.IsType(t,&e2managererrors.RnibDbError{}, err)
148 readerMock.AssertExpectations(t)
149 writerMock.AssertExpectations(t)
152 func TestOneRanDissociateSucceedsTryShuttingDownFailure(t *testing.T) {
153 h, readerMock, writerMock, _, httpClientMock := setupDeleteAllRequestHandlerTest(t)
154 e2tAddresses := []string{E2TAddress}
155 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
156 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
157 nbIdentityList := []*entities.NbIdentity{}
158 readerMock.On("GetListNodebIds").Return(nbIdentityList, common.NewInternalError(errors.New("error")))
159 _, err := h.Handle(nil)
160 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
161 readerMock.AssertExpectations(t)
162 writerMock.AssertExpectations(t)
165 func TestOneRanDissociateFailsTryShuttingDownFailure(t *testing.T) {
166 h, readerMock, writerMock, _, httpClientMock := setupDeleteAllRequestHandlerTest(t)
167 e2tAddresses := []string{E2TAddress}
169 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
170 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, false)
171 nbIdentityList := []*entities.NbIdentity{}
172 readerMock.On("GetListNodebIds").Return(nbIdentityList, common.NewInternalError(errors.New("error")))
173 _, err := h.Handle(nil)
174 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
175 readerMock.AssertExpectations(t)
176 writerMock.AssertExpectations(t)
179 func TestOneRanTryShuttingDownSucceedsClearFails(t *testing.T) {
180 h, readerMock, writerMock, _, httpClientMock := setupDeleteAllRequestHandlerTest(t)
181 e2tAddresses := []string{E2TAddress}
182 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
183 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
184 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
185 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
186 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
187 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
188 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
189 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
190 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
191 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{}, common.NewInternalError(errors.New("error")))
192 _, err := h.Handle(nil)
193 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
194 readerMock.AssertExpectations(t)
195 writerMock.AssertExpectations(t)
198 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSendFails(t *testing.T) {
199 h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
200 e2tAddresses := []string{E2TAddress}
201 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
202 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
203 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
204 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
205 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
206 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
207 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
208 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
209 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
210 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
211 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
212 updatedE2tInstance := e2tInstance
213 updatedE2tInstance.AssociatedRanList = []string{}
214 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
216 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
217 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
218 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, e2managererrors.NewRmrError())
219 _, err := h.Handle(nil)
220 assert.IsType(t, &e2managererrors.RmrError{}, err)
221 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
222 readerMock.AssertExpectations(t)
223 writerMock.AssertExpectations(t)
226 func testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t *testing.T, partial bool) {
227 h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
228 e2tAddresses := []string{E2TAddress}
229 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
230 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, !partial)
231 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}}
232 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
233 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
234 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
235 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
236 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
237 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
238 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1", "RanName_2"}}
239 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
240 updatedE2tInstance := e2tInstance
241 updatedE2tInstance.AssociatedRanList = []string{}
242 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
244 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
245 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
246 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
247 resp, err := h.Handle(nil)
251 assert.IsType(t, &models.RedButtonPartialSuccessResponseModel{}, resp)
256 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
257 readerMock.AssertExpectations(t)
258 writerMock.AssertExpectations(t)
261 func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownSuccess(t *testing.T) {
262 testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, false)
265 func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownPartialSuccess(t *testing.T) {
266 testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, true)
269 //func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsAlreadyShutdown(t *testing.T) {
270 // h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
271 // e2tAddresses := []string{E2TAddress}
273 // readerMock.On("GetE2TAddresses").Return(e2tAddresses , nil)
274 // mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses ,true)
275 // nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
276 // readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
277 // nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
278 // readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
279 // updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
280 // writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
281 // readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
282 // e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
283 // readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance }, nil)
284 // updatedE2tInstance := e2tInstance
285 // updatedE2tInstance.AssociatedRanList = []string{}
286 // writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
288 // rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
289 // mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
290 // rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
292 // readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
293 // nbAfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
294 // readerMock.On("GetNodeb", /*"RanName_1"*/mock.Anything).Return(nbAfterTimer , nil) // Since this is a second call with same arguments we send mock.Anything due to mock limitations
295 // _, err := h.Handle(nil)
296 // assert.Nil(t, err)
297 // rmrMessengerMock.AssertCalled(t, "SendMsg",mbuf, true)
298 // readerMock.AssertExpectations(t)
299 // writerMock.AssertExpectations(t)
300 // writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
303 //func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownUpdateFailure(t *testing.T) {
304 // h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
305 // e2tAddresses := []string{E2TAddress}
306 // readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
307 // mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
308 // nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
309 // readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
310 // //nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
311 // //readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
312 // updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
313 // writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
314 // readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
315 // e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
316 // readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
317 // updatedE2tInstance := e2tInstance
318 // updatedE2tInstance.AssociatedRanList = []string{}
319 // writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
321 // rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
322 // mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
323 // rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
325 // readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
326 // readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
327 // updatedNb2 := *updatedNb1
328 // updatedNb2.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
329 // writerMock.On("UpdateNodebInfo", &updatedNb2).Return(common.NewInternalError(errors.New("error")))
330 // _, err := h.Handle(nil)
331 // assert.IsType(t,&e2managererrors.RnibDbError{}, err)
332 // rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
333 // readerMock.AssertExpectations(t)
334 // writerMock.AssertExpectations(t)
337 func testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t *testing.T, partial bool) {
338 h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
339 e2tAddresses := []string{E2TAddress}
340 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
341 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, !partial)
342 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
343 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
344 //nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
345 //readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
346 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
347 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
348 readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
349 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
350 readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
351 updatedE2tInstance := e2tInstance
352 updatedE2tInstance.AssociatedRanList = []string{}
353 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
355 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
356 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
357 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
359 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
360 readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
361 updatedNb2 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
362 writerMock.On("UpdateNodebInfo", updatedNb2).Return(nil)
363 _, err := h.Handle(nil)
365 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
366 readerMock.AssertExpectations(t)
367 writerMock.AssertExpectations(t)
368 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
371 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownSuccess (t *testing.T) {
372 testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, false)
375 func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownPartialSuccess (t *testing.T) {
376 testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, true)
379 func TestSuccessTwoE2TInstancesSixRans(t *testing.T) {
380 h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
381 e2tAddresses := []string{E2TAddress, E2TAddress2}
382 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
383 mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
384 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}, {InventoryName: "RanName_3"}, {InventoryName: "RanName_4"}, {InventoryName: "RanName_5"}, {InventoryName: "RanName_6"}}
385 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
386 //nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
387 //readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
388 //nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
389 //readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
390 //nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
391 //readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
392 //nb4 := &entities.NodebInfo{RanName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress2}
393 //readerMock.On("GetNodeb", "RanName_4").Return(nb4, nil)
394 //nb5 := &entities.NodebInfo{RanName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress2}
395 //readerMock.On("GetNodeb", "RanName_5").Return(nb5, nil)
396 //nb6 := &entities.NodebInfo{RanName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress2}
397 //readerMock.On("GetNodeb", "RanName_6").Return(nb6, nil)
399 updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
400 writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
401 updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
402 writerMock.On("UpdateNodebInfo", updatedNb2).Return(nil)
403 updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
404 writerMock.On("UpdateNodebInfo", updatedNb3).Return(nil)
405 updatedNb4 := &entities.NodebInfo{RanName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
406 writerMock.On("UpdateNodebInfo", updatedNb4).Return(nil)
407 updatedNb5 := &entities.NodebInfo{RanName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
408 writerMock.On("UpdateNodebInfo", updatedNb5).Return(nil)
409 updatedNb6 := &entities.NodebInfo{RanName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
410 writerMock.On("UpdateNodebInfo", updatedNb6).Return(nil)
412 readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
413 e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1", "RanName_2", "RanName_3"}}
414 e2tInstance2 := entities.E2TInstance{Address: E2TAddress2, AssociatedRanList: []string{"RanName_4", "RanName_5", "RanName_6"}}
415 readerMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{&e2tInstance, &e2tInstance2}, nil)
416 updatedE2tInstance := e2tInstance
417 updatedE2tInstance.AssociatedRanList = []string{}
418 updatedE2tInstance2 := e2tInstance2
419 updatedE2tInstance2.AssociatedRanList = []string{}
420 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
421 writerMock.On("SaveE2TInstance", &updatedE2tInstance2).Return(nil)
423 rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
424 mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
425 rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
427 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
428 readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
429 readerMock.On("GetNodeb", "RanName_2").Return(updatedNb2, nil)
430 readerMock.On("GetNodeb", "RanName_3").Return(updatedNb3, nil)
431 readerMock.On("GetNodeb", "RanName_4").Return(updatedNb4, nil)
432 readerMock.On("GetNodeb", "RanName_5").Return(updatedNb5, nil)
433 readerMock.On("GetNodeb", "RanName_6").Return(updatedNb6, nil)
435 updatedNb1AfterTimer := *updatedNb1
436 updatedNb1AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
437 writerMock.On("UpdateNodebInfo", &updatedNb1AfterTimer).Return(nil)
438 updatedNb2AfterTimer := *updatedNb2
439 updatedNb2AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
440 writerMock.On("UpdateNodebInfo", &updatedNb2AfterTimer).Return(nil)
441 updatedNb3AfterTimer := *updatedNb3
442 updatedNb3AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
443 writerMock.On("UpdateNodebInfo", &updatedNb3AfterTimer).Return(nil)
444 updatedNb4AfterTimer := *updatedNb4
445 updatedNb4AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
446 writerMock.On("UpdateNodebInfo", &updatedNb4AfterTimer).Return(nil)
447 updatedNb5AfterTimer := *updatedNb5
448 updatedNb5AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
449 writerMock.On("UpdateNodebInfo", &updatedNb5AfterTimer).Return(nil)
450 updatedNb6AfterTimer := *updatedNb6
451 updatedNb6AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
452 writerMock.On("UpdateNodebInfo", &updatedNb6AfterTimer).Return(nil)
453 _, err := h.Handle(nil)
455 rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
456 readerMock.AssertExpectations(t)
457 writerMock.AssertExpectations(t)
458 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 12)
461 func initLog(t *testing.T) *logger.Logger {
462 log, err := logger.InitLogger(logger.DebugLevel)
464 t.Errorf("#initLog test - failed to initialize logger, error: %s", err)
469 func getRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
470 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
471 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
472 return rmrsender.NewRmrSender(log, rmrMessenger)