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.
22 "e2mgr/e2managererrors"
28 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
29 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
30 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
31 "github.com/stretchr/testify/assert"
32 "github.com/stretchr/testify/mock"
37 func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T){
40 readerMock := &mocks.RnibReaderMock{}
41 readerProvider := func() reader.RNibReader {
44 writerMock := &mocks.RnibWriterMock{}
45 writerProvider := func() rNibWriter.RNibWriter {
48 config := configuration.ParseConfiguration()
50 handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
52 var messageChannel chan<- *models.NotificationResponse
54 rnibErr := &common.RNibError{}
55 var nbIdentityList []*entities.NbIdentity
56 readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibErr)
58 expected := &e2managererrors.RnibDbError{}
59 actual := handler.Handle(log, nil, messageChannel)
60 if reflect.TypeOf(actual) != reflect.TypeOf(expected){
61 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
65 func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T){
68 readerMock := &mocks.RnibReaderMock{}
69 readerProvider := func() reader.RNibReader {
72 writerMock := &mocks.RnibWriterMock{}
73 writerProvider := func() rNibWriter.RNibWriter {
76 config := configuration.ParseConfiguration()
77 config.BigRedButtonTimeoutSec = 1
79 handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
81 messageChannel := make(chan*models.NotificationResponse)
83 rnibErr := &common.RNibError{}
84 //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown
85 nbIdentityList := createIdentityList()
87 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil).Return(nbIdentityList, rnibErr)
89 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
90 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
91 nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,}
92 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
93 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
94 readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
96 updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
97 updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
98 writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil)
99 writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(nil)
102 response := <-messageChannel
103 assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
106 expected := &e2managererrors.RnibDbError{}
107 actual := handler.Handle(log, nil, messageChannel)
108 if reflect.TypeOf(actual) != reflect.TypeOf(expected){
109 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
113 func TestHandleSuccessFlow(t *testing.T){
116 readerMock := &mocks.RnibReaderMock{}
117 readerProvider := func() reader.RNibReader {
120 writerMock := &mocks.RnibWriterMock{}
121 writerProvider := func() rNibWriter.RNibWriter {
124 config := configuration.ParseConfiguration()
125 config.BigRedButtonTimeoutSec = 1
126 handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
128 messageChannel := make(chan*models.NotificationResponse)
130 //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown
131 nbIdentityList := createIdentityList()
132 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
134 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
135 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
136 nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,}
137 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
138 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
139 readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
141 updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
142 updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
143 writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil)
144 writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(nil)
146 //after timer: ShutDown->Ignore, ShuttingDown->ShutDown
147 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
149 nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
150 nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
151 nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
152 readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil)
153 readerMock.On("GetNodeb", "RanName_2").Return(nb2AfterTimer, nil)
154 readerMock.On("GetNodeb", "RanName_3").Return(nb3AfterTimer, nil)
156 updatedNb2AfterTimer := &entities.NodebInfo{RanName:"RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
157 updatedNb3AfterTimer := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
158 writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil)
159 writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(nil)
162 response := <-messageChannel
163 assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
166 actual := handler.Handle(log, nil, messageChannel)
168 assert.Nil(t, actual)
171 func TestHandleSuccessGetNextStatusFlow(t *testing.T){
174 readerMock := &mocks.RnibReaderMock{}
175 readerProvider := func() reader.RNibReader {
178 writerMock := &mocks.RnibWriterMock{}
179 writerProvider := func() rNibWriter.RNibWriter {
182 config := configuration.ParseConfiguration()
183 config.BigRedButtonTimeoutSec = 1
184 handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
186 messageChannel := make(chan*models.NotificationResponse)
188 nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
189 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
191 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED,}
192 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
194 updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
195 writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil)
197 //after timer: ShutDown->Ignore, ShuttingDown->ShutDown
198 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
200 nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
201 readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil)
203 updatedNb1AfterTimer := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
204 writerMock.On("SaveNodeb", mock.Anything, updatedNb1AfterTimer).Return(nil)
208 response := <-messageChannel
209 assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
212 actual := handler.Handle(log, nil, messageChannel)
214 assert.Nil(t, actual)
217 func TestHandleGetNodebFailedFlow(t *testing.T){
220 readerMock := &mocks.RnibReaderMock{}
221 readerProvider := func() reader.RNibReader {
224 writerMock := &mocks.RnibWriterMock{}
225 writerProvider := func() rNibWriter.RNibWriter {
228 config := configuration.ParseConfiguration()
229 config.BigRedButtonTimeoutSec = 1
230 handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
232 messageChannel := make(chan*models.NotificationResponse)
234 //Before timer: Disconnected->ShutDown(will fail), ShuttingDown->Ignore, Connected->ShuttingDown
235 nbIdentityList := createIdentityList()
236 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
238 errRnib := &common.RNibError{}
239 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
240 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
241 nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,}
242 readerMock.On("GetNodeb", "RanName_1").Return(nb1, errRnib)
243 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
244 readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
246 updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
247 updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
248 writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(errRnib)
249 writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(nil)
251 //after timer: ShutDown->Ignore, ShuttingDown->ShutDown
252 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
254 nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
255 nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
256 nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
257 readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, errRnib)
258 readerMock.On("GetNodeb", "RanName_2").Return(nb2AfterTimer, nil)
259 readerMock.On("GetNodeb", "RanName_3").Return(nb3AfterTimer, nil)
261 updatedNb2AfterTimer := &entities.NodebInfo{RanName:"RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
262 updatedNb3AfterTimer := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
263 writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil)
264 writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(nil)
267 response := <-messageChannel
268 assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
271 actual := handler.Handle(log, nil, messageChannel)
273 assert.Nil(t, actual)
276 func TestHandleSaveFailedFlow(t *testing.T){
279 readerMock := &mocks.RnibReaderMock{}
280 readerProvider := func() reader.RNibReader {
283 writerMock := &mocks.RnibWriterMock{}
284 writerProvider := func() rNibWriter.RNibWriter {
287 config := configuration.ParseConfiguration()
288 config.BigRedButtonTimeoutSec = 1
289 handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
291 messageChannel := make(chan*models.NotificationResponse)
293 //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown(will fail)
294 nbIdentityList := createIdentityList()
295 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
297 nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
298 nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
299 nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,}
300 readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
301 readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
302 readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
304 errRnib := &common.RNibError{}
305 updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
306 updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
307 writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil)
308 writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(errRnib)
310 //after timer: ShutDown->Ignore, ShuttingDown->ShutDown(will fail)
311 readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
313 nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
314 nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
315 nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
316 readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil)
317 readerMock.On("GetNodeb", "RanName_2").Return(nb2AfterTimer, nil)
318 readerMock.On("GetNodeb", "RanName_3").Return(nb3AfterTimer, nil)
320 updatedNb2AfterTimer := &entities.NodebInfo{RanName:"RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
321 updatedNb3AfterTimer := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
322 writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil)
323 writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(errRnib)
326 response := <-messageChannel
327 assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
330 actual := handler.Handle(log, nil, messageChannel)
332 assert.Nil(t, actual)
335 func TestHandleGetListEnbIdsEmptyFlow(t *testing.T){
338 readerMock := &mocks.RnibReaderMock{}
339 readerProvider := func() reader.RNibReader {
342 writerMock := &mocks.RnibWriterMock{}
343 writerProvider := func() rNibWriter.RNibWriter {
346 config := configuration.ParseConfiguration()
348 handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
350 var messageChannel chan<- *models.NotificationResponse
352 var rnibError common.IRNibError
353 nbIdentityList := []*entities.NbIdentity{}
355 readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibError)
357 actual := handler.Handle(log, nil, messageChannel)
358 readerMock.AssertNumberOfCalls(t, "GetNodeb", 0)
359 assert.Nil(t, actual)
362 func createIdentityList() []*entities.NbIdentity {
363 nbIdentity1 := entities.NbIdentity{InventoryName: "RanName_1"}
364 nbIdentity2 := entities.NbIdentity{InventoryName: "RanName_2"}
365 nbIdentity3 := entities.NbIdentity{InventoryName: "RanName_3"}
367 var nbIdentityList []*entities.NbIdentity
368 nbIdentityList = append(nbIdentityList, &nbIdentity1)
369 nbIdentityList = append(nbIdentityList, &nbIdentity2)
370 nbIdentityList = append(nbIdentityList, &nbIdentity3)
372 return nbIdentityList
375 func initLog(t *testing.T) *logger.Logger {
376 log, err := logger.InitLogger(logger.InfoLevel)
378 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)