Merge "Fix license headers"
[ric-plt/e2mgr.git] / E2Manager / handlers / rmrmsghandlers / e2_term_init_notification_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
18 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 //  platform project (RICP).
20
21 package rmrmsghandlers
22
23 import (
24         "bytes"
25         "e2mgr/clients"
26         "e2mgr/configuration"
27         "e2mgr/e2pdus"
28         "e2mgr/logger"
29         "e2mgr/managers"
30         "e2mgr/mocks"
31         "e2mgr/models"
32         "e2mgr/rmrCgo"
33         "e2mgr/services"
34         "e2mgr/services/rmrsender"
35         "e2mgr/tests"
36         "fmt"
37         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
38         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
39         "github.com/pkg/errors"
40         "github.com/stretchr/testify/mock"
41         "io/ioutil"
42         "net/http"
43         "testing"
44 )
45
46 const e2tInstanceAddress = "10.0.2.15"
47 const e2tInitPayload = "{\"address\":\"10.0.2.15\", \"fqdn\":\"\"}"
48
49 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
50
51         logger := initLog(t)
52         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
53
54         rmrMessengerMock := &mocks.RmrMessengerMock{}
55         rmrSender := initRmrSender(rmrMessengerMock, logger)
56
57         readerMock := &mocks.RnibReaderMock{}
58
59         writerMock := &mocks.RnibWriterMock{}
60
61         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
62
63         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
64         ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
65
66         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
67
68         ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManagerMock)
69         handler := NewE2TermInitNotificationHandler(logger, ranReconnectionManager, e2tInstancesManagerMock, routingManagerClientMock)
70
71         return logger, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
72 }
73
74 func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger.Logger, *configuration.Configuration, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.HttpClientMock) {
75
76         logger := initLog(t)
77         config := configuration.ParseConfiguration()
78
79         rmrMessengerMock := &mocks.RmrMessengerMock{}
80         rmrSender := initRmrSender(rmrMessengerMock, logger)
81
82         readerMock := &mocks.RnibReaderMock{}
83
84         writerMock := &mocks.RnibWriterMock{}
85         httpClientMock := &mocks.HttpClientMock{}
86
87         routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClientMock)
88         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
89         ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
90
91         e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger)
92         ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManager)
93         handler := NewE2TermInitNotificationHandler(logger, ranReconnectionManager, e2tInstancesManager, routingManagerClient)
94         return logger, config, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock
95 }
96
97 func TestE2TermInitUnmarshalPayloadFailure(t *testing.T) {
98         _, handler, _, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
99         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("asd")}
100         handler.Handle(notificationRequest)
101         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
102         e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
103 }
104
105 func TestE2TermInitEmptyE2TAddress(t *testing.T) {
106         _, handler, _, _, _, e2tInstancesManagerMock, _  := initRanLostConnectionTest(t)
107         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("{\"address\":\"\"}")}
108         handler.Handle(notificationRequest)
109         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
110         e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
111 }
112
113 func TestE2TermInitGetE2TInstanceFailure(t *testing.T) {
114         _, handler, _, _, _, e2tInstancesManagerMock, _  := initRanLostConnectionTest(t)
115         var e2tInstance *entities.E2TInstance
116         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
117         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
118         handler.Handle(notificationRequest)
119         e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
120 }
121
122 func TestE2TermInitGetE2TInstanceDbFailure(t *testing.T) {
123         _, _, handler, readerMock, writerMock, rmrMessengerMock,_ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
124         var e2tInstance *entities.E2TInstance
125         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
126         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
127         handler.Handle(notificationRequest)
128         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
129         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
130 }
131
132 func TestE2TermInitNewE2TInstance(t *testing.T) {
133         _, config, handler, readerMock, writerMock, _, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
134         var e2tInstance *entities.E2TInstance
135
136         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
137         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
138
139         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
140         url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix
141         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
142
143         e2tAddresses := []string{}
144         readerMock.On("GetE2TAddresses").Return(e2tAddresses, common.NewResourceNotFoundError(""))
145
146         e2tAddresses = append(e2tAddresses, e2tInstanceAddress)
147         writerMock.On("SaveE2TAddresses", e2tAddresses).Return(nil)
148
149         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
150         handler.Handle(notificationRequest)
151
152         httpClientMock.AssertCalled(t, "Post", url, mock.Anything, mock.Anything)
153         writerMock.AssertCalled(t, "SaveE2TInstance", mock.Anything)
154         writerMock.AssertCalled(t, "SaveE2TAddresses", e2tAddresses)
155 }
156
157 func TestE2TermInitNewE2TInstance_RoutingManagerError(t *testing.T) {
158         _, config, handler, readerMock, writerMock, _, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
159         var e2tInstance *entities.E2TInstance
160
161         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
162
163         url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix
164         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error"))
165
166         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
167         handler.Handle(notificationRequest)
168
169         httpClientMock.AssertCalled(t, "Post", url, mock.Anything, mock.Anything)
170         writerMock.AssertNotCalled(t, "SaveE2TInstance", mock.Anything)
171         writerMock.AssertNotCalled(t, "SaveE2TAddresses", mock.Anything)
172 }
173
174 func TestE2TermInitExistingE2TInstanceNoAssociatedRans(t *testing.T) {
175         _, handler, _, _, _, e2tInstancesManagerMock, _  := initRanLostConnectionTest(t)
176         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
177         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
178         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
179         handler.Handle(notificationRequest)
180         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceAddress)
181 }
182
183 func TestE2TermInitHandlerSuccessOneRan(t *testing.T) {
184         _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _  := initRanLostConnectionTest(t)
185         var rnibErr error
186
187         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
188         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
189
190         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
191         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
192
193         payload := e2pdus.PackedX2setupRequest
194         xaction := []byte(RanName)
195         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
196
197         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
198
199         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
200         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
201         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
202         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
203
204         handler.Handle(notificationRequest)
205
206         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
207         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
208 }
209
210 func TestE2TermInitHandlerSuccessOneRanShuttingdown(t *testing.T) {
211         _, _, handler, readerMock, writerMock, rmrMessengerMock,_ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
212         var rnibErr error
213
214         var initialNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
215         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
216
217         var argNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
218         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
219
220         payload := e2pdus.PackedX2setupRequest
221         xaction := []byte(RanName)
222         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
223
224         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
225
226         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
227         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
228         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
229         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
230
231         handler.Handle(notificationRequest)
232
233         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
234         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
235 }
236
237 func TestE2TermInitHandlerSuccessOneRan_ToBeDeleted(t *testing.T) {
238         _, _, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock:= initRanLostConnectionTestWithRealE2tInstanceManager(t)
239         var rnibErr error
240
241         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
242         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
243
244         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
245         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
246
247         payload := e2pdus.PackedX2setupRequest
248         xaction := []byte(RanName)
249         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
250
251         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
252
253         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
254         e2tInstance.State = entities.ToBeDeleted
255         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
256
257         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
258         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
259
260         handler.Handle(notificationRequest)
261
262         httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything)
263         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
264         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
265 }
266
267 func TestE2TermInitHandlerSuccessTwoRans_RoutingManagerFailure(t *testing.T) {
268         _, _, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock:= initRanLostConnectionTestWithRealE2tInstanceManager(t)
269
270         var rnibErr error
271         var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
272         var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
273         readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr)
274         readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr)
275
276         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
277         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
278
279         payload := e2pdus.PackedX2setupRequest
280         xaction := []byte(RanName)
281         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
282
283         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
284
285         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
286         e2tInstance.State = entities.RoutingManagerFailure
287         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2")
288
289         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
290         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
291
292         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
293
294         handler.Handle(notificationRequest)
295
296         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
297         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
298
299         httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything)
300         writerMock.AssertCalled(t, "SaveE2TInstance", mock.Anything)
301 }
302
303 func TestE2TermInitHandlerSuccessOneRan_RoutingManagerFailure_Error(t *testing.T) {
304         _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _  := initRanLostConnectionTest(t)
305         var rnibErr error
306
307         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
308         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
309
310         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
311         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
312
313         payload := e2pdus.PackedX2setupRequest
314         xaction := []byte(RanName)
315         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
316
317         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
318
319         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
320         e2tInstance.State = entities.RoutingManagerFailure
321         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
322
323         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
324         e2tInstancesManagerMock.On("ActivateE2TInstance", e2tInstance).Return(fmt.Errorf(" Error "))
325         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
326
327         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
328
329         handler.Handle(notificationRequest)
330
331         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
332         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
333 }
334
335 func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) {
336         _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, httpClientMock := initRanLostConnectionTest(t)
337         var rnibErr error
338         var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
339         var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
340         readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr)
341         readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr)
342
343         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
344         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
345
346         payload := e2pdus.PackedX2setupRequest
347         xaction := []byte(RanName)
348         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
349
350         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
351
352         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
353         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2")
354         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
355         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
356
357         handler.Handle(notificationRequest)
358
359         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
360         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
361         httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything)
362 }
363
364 func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) {
365         _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
366         var rnibErr error
367         var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
368         var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
369         readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr)
370         readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr)
371
372         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
373         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
374
375         payload := e2pdus.PackedX2setupRequest
376         xaction := []byte(RanName)
377         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
378
379         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
380
381         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
382         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2")
383         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
384         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
385
386         handler.Handle(notificationRequest)
387
388         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
389         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
390         writerMock.AssertExpectations(t)
391 }
392
393 func TestE2TermInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
394         log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _  := initRanLostConnectionTest(t)
395         var rnibErr error
396
397         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
398
399         var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
400         var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
401         var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
402         readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
403         readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
404         readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
405
406         var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
407         var argNodeb0Fail = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
408         writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
409         writerMock.On("UpdateNodebInfo", argNodeb0Fail).Return(rnibErr)
410
411         payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
412         xaction := []byte(ids[0].InventoryName)
413         msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
414
415         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, fmt.Errorf("RMR Error"))
416
417         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
418         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3")
419         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
420         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
421
422         handler.Handle(notificationRequest)
423
424         //test1 (before send +1, after failure +1), test2 (0) test3 (0)
425         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
426         //test1 failure (+1), test2  (0). test3 (0)
427         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
428 }
429
430 func TestE2TermInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
431         log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _  := initRanLostConnectionTest(t)
432         var rnibErr error
433
434         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
435
436         var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
437         var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
438         var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
439         readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
440         readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewResourceNotFoundError("not found"))
441         readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
442
443         var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
444         var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
445         writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
446         writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
447
448         var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
449         var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
450         writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
451         writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
452
453         payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
454         xaction := []byte(ids[0].InventoryName)
455         msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
456
457         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, nil)
458
459         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
460         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3")
461         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
462         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
463
464         handler.Handle(notificationRequest)
465
466         readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
467         //test1 (+1), test2 failure (0) test3 (+1)
468         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
469         //test1 success (+1), test2  (0). test3 (+1)
470         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
471 }
472
473 func TestE2TermInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
474         log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _  := initRanLostConnectionTest(t)
475         var rnibErr error
476
477         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
478
479         var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
480         var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
481         var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
482         readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
483         readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewInternalError(fmt.Errorf("internal error")))
484         readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
485
486         var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
487         var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
488         writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
489         writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
490
491         var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
492         var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
493         writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
494         writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
495
496         payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
497         xaction := []byte(ids[0].InventoryName)
498         msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
499
500         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, nil)
501
502         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
503         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3")
504         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
505         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
506
507         handler.Handle(notificationRequest)
508
509         readerMock.AssertNumberOfCalls(t, "GetNodeb", 2)
510         //test1 (+1), test2 failure (0) test3 (0)
511         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
512         //test1 success (+1), test2  (0). test3 (+1)
513         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
514 }
515
516 func TestE2TermInitHandlerSuccessZeroRans(t *testing.T) {
517         _, handler, _, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _  := initRanLostConnectionTest(t)
518
519         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
520         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
521         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
522
523         handler.Handle(notificationRequest)
524
525         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
526         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
527 }
528
529 func TestE2TermInitHandlerFailureGetNodebInternalError(t *testing.T) {
530         _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
531
532         var nodebInfo *entities.NodebInfo
533         readerMock.On("GetNodeb", "test1").Return(nodebInfo, common.NewInternalError(fmt.Errorf("internal error")))
534
535         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
536         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1")
537         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
538         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
539         handler.Handle(notificationRequest)
540
541         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
542         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
543 }
544
545 func TestE2TermInitHandlerSuccessTwoRansSecondIsDisconnected(t *testing.T) {
546         _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
547         var rnibErr error
548         var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
549         var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
550         readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr)
551         readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr)
552
553         var argNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
554         writerMock.On("UpdateNodebInfo", argNodeb1).Return(rnibErr)
555
556         payload := e2pdus.PackedX2setupRequest
557         xaction := []byte(RanName)
558         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
559
560         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
561
562         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
563         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2")
564         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
565         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
566
567         handler.Handle(notificationRequest)
568
569         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
570         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
571 }
572
573
574 // TODO: extract to test_utils
575 func initRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
576         rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
577         rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
578         return rmrsender.NewRmrSender(log, rmrMessenger)
579 }
580
581 // TODO: extract to test_utils
582 func initLog(t *testing.T) *logger.Logger {
583         log, err := logger.InitLogger(logger.InfoLevel)
584         if err != nil {
585                 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)
586         }
587         return log
588 }