159008c18e3231660d9b7c9c06de1ac9e25ea9a1
[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/logger"
28         "e2mgr/managers"
29         "e2mgr/mocks"
30         "e2mgr/models"
31         "e2mgr/rmrCgo"
32         "e2mgr/services"
33         "e2mgr/services/rmrsender"
34         "e2mgr/tests"
35         "fmt"
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/mock"
40         "io/ioutil"
41         "net/http"
42         "testing"
43 )
44
45 const (
46         e2tInitPayload = "{\"address\":\"10.0.2.15\", \"fqdn\":\"\"}"
47         e2tInstanceAddress = "10.0.2.15"
48 )
49
50 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
51
52         logger := initLog(t)
53         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
54
55         readerMock := &mocks.RnibReaderMock{}
56
57         writerMock := &mocks.RnibWriterMock{}
58
59         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
60
61         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
62
63         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
64         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock)
65
66         ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager)
67         handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManagerMock, routingManagerClientMock)
68
69         return logger, handler, readerMock, writerMock, e2tInstancesManagerMock, routingManagerClientMock
70 }
71
72 func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger.Logger, *configuration.Configuration, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) {
73
74         logger := initLog(t)
75         config := configuration.ParseConfiguration()
76
77         readerMock := &mocks.RnibReaderMock{}
78
79         writerMock := &mocks.RnibWriterMock{}
80         httpClientMock := &mocks.HttpClientMock{}
81
82         routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClientMock)
83         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
84
85         e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger)
86         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient)
87         ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager)
88         handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManager, routingManagerClient)
89         return logger, config, handler, readerMock, writerMock, httpClientMock
90 }
91
92 func TestE2TermInitUnmarshalPayloadFailure(t *testing.T) {
93         _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
94         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("asd")}
95         handler.Handle(notificationRequest)
96         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
97         e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
98 }
99
100 func TestE2TermInitEmptyE2TAddress(t *testing.T) {
101         _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
102         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("{\"address\":\"\"}")}
103         handler.Handle(notificationRequest)
104         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
105         e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
106 }
107
108 func TestE2TermInitGetE2TInstanceFailure(t *testing.T) {
109         _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
110         var e2tInstance *entities.E2TInstance
111         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
112         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
113         handler.Handle(notificationRequest)
114         e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
115 }
116
117 func TestE2TermInitGetE2TInstanceDbFailure(t *testing.T) {
118         _, _, handler, readerMock, writerMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
119         var e2tInstance *entities.E2TInstance
120         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error")))
121         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
122         handler.Handle(notificationRequest)
123         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
124 }
125
126 func TestE2TermInitNewE2TInstance(t *testing.T) {
127         _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
128         var e2tInstance *entities.E2TInstance
129
130         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
131         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
132
133         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
134         url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix
135         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
136
137         e2tAddresses := []string{}
138         readerMock.On("GetE2TAddresses").Return(e2tAddresses, common.NewResourceNotFoundError(""))
139
140         e2tAddresses = append(e2tAddresses, e2tInstanceAddress)
141         writerMock.On("SaveE2TAddresses", e2tAddresses).Return(nil)
142
143         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
144         handler.Handle(notificationRequest)
145
146         httpClientMock.AssertCalled(t, "Post", url, mock.Anything, mock.Anything)
147         writerMock.AssertCalled(t, "SaveE2TInstance", mock.Anything)
148         writerMock.AssertCalled(t, "SaveE2TAddresses", e2tAddresses)
149 }
150
151 func TestE2TermInitNewE2TInstance__RoutingManagerError(t *testing.T) {
152         _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
153
154         var e2tInstance *entities.E2TInstance
155
156         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found"))
157
158         url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix
159         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error"))
160
161         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
162         handler.Handle(notificationRequest)
163
164         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 0)
165 }
166
167 func TestE2TermInitExistingE2TInstanceNoAssociatedRans(t *testing.T) {
168         _, handler, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
169         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
170         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
171         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
172         handler.Handle(notificationRequest)
173         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceAddress)
174 }
175
176 func TestE2TermInitHandlerSuccessOneRan(t *testing.T) {
177         _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
178
179         var rnibErr error
180         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
181         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
182
183         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
184         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
185
186         var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
187         readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
188
189         var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
190         writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
191
192         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
193         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
194         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
195         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
196
197         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
198         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
199         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
200
201         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
202
203         handler.Handle(notificationRequest)
204
205         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
206         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
207         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
208 }
209
210 func TestE2TermInitHandlerSuccessOneRan_RoutingManagerError(t *testing.T) {
211         _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
212
213         var rnibErr error
214         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
215         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
216
217         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
218         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
219
220         var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
221         readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
222
223         var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
224         writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr)
225
226         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
227         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
228         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
229         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
230
231         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
232         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error"))
233
234         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
235
236         handler.Handle(notificationRequest)
237
238         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
239         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
240         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
241 }
242
243 func TestE2TermInitHandlerSuccessOneRanShuttingdown(t *testing.T) {
244         _, _, handler, readerMock, writerMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t)
245         var rnibErr error
246
247         var initialNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
248         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
249
250         var argNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
251         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
252
253         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
254         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
255         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
256         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
257
258         handler.Handle(notificationRequest)
259
260         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
261 }
262
263 func TestE2TermInitHandlerSuccessOneRan_ToBeDeleted(t *testing.T) {
264         _, _, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
265         var rnibErr error
266
267         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
268         readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
269
270         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
271         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
272
273         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
274         e2tInstance.State = entities.ToBeDeleted
275         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
276
277         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
278         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
279
280         handler.Handle(notificationRequest)
281
282         httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything)
283         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
284 }
285
286 func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) {
287
288         _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
289
290         var rnibErr error
291         test2 := "test2"
292
293         //First RAN
294         var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
295         var disconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
296         readerMock.On("GetNodeb", RanName).Return(firstRan, rnibErr).Return(disconnectedFirstRan, rnibErr)
297
298         var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
299         writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr)
300
301         var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
302         writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr)
303
304         //Second RAN
305         var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
306         var disconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
307         readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr).Return(disconnectedSecondRan, rnibErr)
308
309         var updatedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
310         writerMock.On("UpdateNodebInfo", updatedSecondRan).Return(rnibErr)
311
312         var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""}
313         writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr)
314
315         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
316         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
317         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
318         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
319         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
320
321         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
322         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
323         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
324
325         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
326
327         handler.Handle(notificationRequest)
328
329         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 4)
330         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 2)
331         httpClientMock.AssertNumberOfCalls(t, "Post", 2)
332 }
333
334 func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) {
335         _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
336
337         var rnibErr error
338         test2 := "test2"
339
340         //First RAN
341         var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
342         var disconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
343         readerMock.On("GetNodeb", RanName).Return(firstRan, rnibErr).Return(disconnectedFirstRan, rnibErr)
344
345         var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
346         writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr)
347
348         var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""}
349         writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr)
350
351         //Second RAN
352         var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
353         readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr)
354
355         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
356         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
357         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
358         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
359
360         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
361         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
362         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
363
364         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
365
366         handler.Handle(notificationRequest)
367
368         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
369         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
370         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
371 }
372
373 func TestE2TermInitHandlerSuccessTwoRansFirstNotFoundFailure(t *testing.T) {
374         _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
375
376         var rnibErr error
377         test2 := "test2"
378
379         //First RAN
380         var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
381         readerMock.On("GetNodeb", RanName).Return(firstRan, common.NewResourceNotFoundError("not found"))
382
383         //Second RAN
384         var secondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
385         var disconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
386         readerMock.On("GetNodeb", test2).Return(secondRan, rnibErr).Return(disconnectedSecondRan, rnibErr)
387
388         var updatedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"}
389         writerMock.On("UpdateNodebInfo", updatedSecondRan).Return(rnibErr)
390
391         var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""}
392         writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr)
393
394         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
395         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
396         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
397         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
398         writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
399
400         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
401         url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix
402         httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
403
404         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
405
406         handler.Handle(notificationRequest)
407
408         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
409         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1)
410         httpClientMock.AssertNumberOfCalls(t, "Post", 1)
411 }
412
413 func TestE2TermInitHandlerSuccessTwoRansFirstRnibInternalErrorFailure(t *testing.T) {
414         _, _, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t)
415
416         test2 := "test2"
417
418         //First RAN
419         var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
420         readerMock.On("GetNodeb", RanName).Return(firstRan, common.NewInternalError(fmt.Errorf("internal error")))
421
422         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
423         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
424         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2)
425         readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil)
426
427         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
428
429         handler.Handle(notificationRequest)
430
431         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
432         writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 0)
433         httpClientMock.AssertNumberOfCalls(t, "Post", 0)
434 }
435
436 func TestE2TermInitHandlerSuccessZeroRans(t *testing.T) {
437         _, handler, _, writerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
438
439         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
440         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
441         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
442
443         handler.Handle(notificationRequest)
444
445         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
446 }
447
448 func TestE2TermInitHandlerFailureGetNodebInternalError(t *testing.T) {
449         _, handler, readerMock, writerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t)
450
451         var nodebInfo *entities.NodebInfo
452         readerMock.On("GetNodeb", "test1").Return(nodebInfo, common.NewInternalError(fmt.Errorf("internal error")))
453
454         e2tInstance := entities.NewE2TInstance(e2tInstanceAddress)
455         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1")
456         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
457         notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)}
458         handler.Handle(notificationRequest)
459
460         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
461 }
462
463 // TODO: extract to test_utils
464 func initRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
465         rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
466         rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
467         return rmrsender.NewRmrSender(log, rmrMessenger)
468 }
469
470 // TODO: extract to test_utils
471 func initLog(t *testing.T) *logger.Logger {
472         log, err := logger.InitLogger(logger.InfoLevel)
473         if err != nil {
474                 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)
475         }
476         return log
477 }