[RICPLT-2527] Fix according to acceptance comments
[ric-plt/e2mgr.git] / E2Manager / handlers / httpmsghandlers / setup_request_handler_test.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16
17 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 //  platform project (RICP).
19
20 package httpmsghandlers
21
22 import (
23         "bytes"
24         "e2mgr/clients"
25         "e2mgr/configuration"
26         "e2mgr/e2managererrors"
27         "e2mgr/e2pdus"
28         "e2mgr/managers"
29         "e2mgr/mocks"
30         "e2mgr/models"
31         "e2mgr/rmrCgo"
32         "e2mgr/services"
33         "encoding/json"
34         "fmt"
35         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
36         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
37         "github.com/stretchr/testify/assert"
38         "github.com/stretchr/testify/mock"
39         "io/ioutil"
40         "net/http"
41         "testing"
42 )
43
44 const E2TAddress = "10.0.2.15:8989"
45 const RanName = "test"
46 const BaseRMUrl = "http://10.10.2.15:12020/routingmanager"
47
48 func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.E2TInstancesManagerMock, *mocks.RanSetupManagerMock, *mocks.HttpClientMock) {
49         log := initLog(t)
50         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
51         config.RoutingManager.BaseUrl = BaseRMUrl
52
53         readerMock := &mocks.RnibReaderMock{}
54         writerMock := &mocks.RnibWriterMock{}
55
56         rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
57
58         ranSetupManagerMock := &mocks.RanSetupManagerMock{}
59         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
60         httpClientMock := &mocks.HttpClientMock{}
61         mockHttpClientAssociateRan(httpClientMock)
62         rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
63         e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManagerMock, rmClient)
64         handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManagerMock, protocol, e2tInstancesManagerMock, e2tAssociationManager)
65
66         return readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, httpClientMock
67 }
68
69 func initSetupRequestTestBasicMocks(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock, *mocks.HttpClientMock) {
70         log := initLog(t)
71         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
72
73         readerMock := &mocks.RnibReaderMock{}
74         writerMock := &mocks.RnibWriterMock{}
75
76         rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
77
78         rmrMessengerMock := &mocks.RmrMessengerMock{}
79         rmrSender := getRmrSender(rmrMessengerMock, log)
80         ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService)
81         e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log)
82         httpClientMock := &mocks.HttpClientMock{}
83         rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
84         e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient)
85         handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol, e2tInstancesManager, e2tAssociationManager)
86
87         return readerMock, writerMock, handler, rmrMessengerMock, httpClientMock
88 }
89
90 func mockHttpClientAssociateRan(httpClientMock *mocks.HttpClientMock) {
91         data := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)}
92         marshaled, _ := json.Marshal(data)
93         body := bytes.NewBuffer(marshaled)
94         url := BaseRMUrl + clients.AssociateRanToE2TInstanceApiSuffix
95         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
96         httpClientMock.On("Post", url, "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
97 }
98
99 func TestX2SetupHandleNoPortError(t *testing.T) {
100         readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
101
102         sr := models.SetupRequest{"127.0.0.1", 0, RanName,}
103         _, err := handler.Handle(sr)
104         assert.IsType(t, &e2managererrors.RequestValidationError{}, err)
105         readerMock.AssertNotCalled(t, "GetNodeb")
106 }
107
108 func TestX2SetupHandleNoRanNameError(t *testing.T) {
109         readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
110
111         sr := models.SetupRequest{RanPort: 8080, RanIp: "127.0.0.1"}
112         _, err := handler.Handle(sr)
113         assert.IsType(t, &e2managererrors.RequestValidationError{}, err)
114         readerMock.AssertNotCalled(t, "GetNodeb")
115 }
116
117 func TestX2SetupHandleNoIpError(t *testing.T) {
118         readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
119
120         sr := models.SetupRequest{RanPort: 8080, RanName: RanName}
121         _, err := handler.Handle(sr)
122         assert.IsType(t, &e2managererrors.RequestValidationError{}, err)
123         readerMock.AssertNotCalled(t, "GetNodeb")
124 }
125
126 func TestX2SetupHandleInvalidIpError(t *testing.T) {
127         readerMock, _, handler, _, _, _:= initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
128
129         sr := models.SetupRequest{RanPort: 8080, RanName: RanName, RanIp: "invalid ip"}
130         _, err := handler.Handle(sr)
131         assert.IsType(t, &e2managererrors.RequestValidationError{}, err)
132         readerMock.AssertNotCalled(t, "GetNodeb")
133 }
134
135 func TestSetupGetNodebFailure(t *testing.T) {
136         readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
137
138         rnibErr := &common.ValidationError{}
139         nb := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
140         readerMock.On("GetNodeb", RanName).Return(nb, rnibErr)
141
142         sr := models.SetupRequest{"127.0.0.1", 8080, RanName,}
143         _, err := handler.Handle(sr)
144         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
145 }
146
147 func TestSetupNewRanSelectE2TInstancesDbError(t *testing.T) {
148         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
149         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
150         e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewRnibDbError())
151         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
152         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
153         e2tInstancesManagerMock.AssertNotCalled(t, "AddRanToInstance")
154         writerMock.AssertNotCalled(t, "SaveNodeb")
155         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
156 }
157
158 func TestSetupNewRanSelectE2TInstancesNoInstances(t *testing.T) {
159         readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
160         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
161         readerMock.On("GetE2TAddresses").Return([]string{}, nil)
162         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
163         assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
164         writerMock.AssertNotCalled(t, "SaveNodeb")
165         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
166 }
167
168 func TestSetupNewRanAssociateRanFailure(t *testing.T) {
169         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, httpClientMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
170         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
171         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
172         e2tInstancesManagerMock.On("AddRanToInstance", RanName, E2TAddress).Return(e2managererrors.NewRnibDbError())
173         setupRequest := &models.SetupRequest{"127.0.0.1", 8080, RanName,}
174         nb, nbIdentity := createInitialNodeInfo(setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
175         writerMock.On("SaveNodeb", nbIdentity, mock.Anything).Return(nil)
176         nb.AssociatedE2TInstanceAddress = E2TAddress
177         nb.ConnectionAttempts = 0
178         writerMock.On("UpdateNodebInfo", nb).Return(nil)
179         _, err := handler.Handle(*setupRequest)
180         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
181         writerMock.AssertExpectations(t)
182         readerMock.AssertExpectations(t)
183         e2tInstancesManagerMock.AssertExpectations(t)
184         httpClientMock.AssertExpectations(t)
185         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
186 }
187
188 func TestSetupNewRanSaveNodebFailure(t *testing.T) {
189         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
190         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
191         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
192         e2tInstancesManagerMock.On("AddRanToInstance", RanName, E2TAddress).Return(nil)
193         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
194         nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
195         writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(common.NewInternalError(fmt.Errorf("")))
196         _, err := handler.Handle(setupRequest)
197         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
198         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
199 }
200
201 func TestSetupNewRanSetupDbError(t *testing.T) {
202         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
203         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
204         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
205         e2tInstancesManagerMock.On("AddRanToInstance", RanName, E2TAddress).Return(e2managererrors.NewRnibDbError())
206         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
207         nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
208         writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
209         updatedNb := *nodebInfo
210         updatedNb.ConnectionAttempts = 0
211         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
212         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
213         _, err := handler.Handle(setupRequest)
214         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
215         readerMock.AssertExpectations(t)
216         writerMock.AssertExpectations(t)
217         ranSetupManagerMock.AssertExpectations(t)
218 }
219
220 func TestSetupNewRanSetupRmrError(t *testing.T) {
221         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
222         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
223         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
224         e2tInstancesManagerMock.On("AddRanToInstance", RanName, E2TAddress).Return(nil)
225         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
226         nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
227         writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
228         updatedNb := *nodebInfo
229         updatedNb.ConnectionAttempts = 0
230         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
231         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
232         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRmrError())
233         _, err := handler.Handle(setupRequest)
234         assert.IsType(t, &e2managererrors.RmrError{}, err)
235 }
236
237 func TestSetupNewRanSetupSuccess(t *testing.T) {
238         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
239         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
240         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
241         e2tInstancesManagerMock.On("AddRanToInstance", RanName, E2TAddress).Return(nil)
242         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
243         nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
244         writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
245         updatedNb := *nodebInfo
246         updatedNb.ConnectionAttempts = 0
247         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
248         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
249         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
250         _, err := handler.Handle(setupRequest)
251         assert.Nil(t, err)
252 }
253
254 func TestX2SetupExistingRanShuttingDown(t *testing.T) {
255         readerMock, _, handler, e2tInstancesManagerMock, ranSetupManagerMock , _:= initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
256         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}, nil)
257         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
258         _, err := handler.Handle(setupRequest)
259         assert.IsType(t, &e2managererrors.WrongStateError{}, err)
260         e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
261         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
262 }
263
264 func TestEndcSetupExistingRanShuttingDown(t *testing.T) {
265         readerMock, _, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
266         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}, nil)
267         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
268         _, err := handler.Handle(setupRequest)
269         assert.IsType(t, &e2managererrors.WrongStateError{}, err)
270         e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
271         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
272 }
273
274 func TestSetupExistingRanWithoutAssocE2TInstanceSelectDbError(t *testing.T) {
275         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
276         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
277         readerMock.On("GetNodeb", RanName).Return(nb, nil)
278         e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewRnibDbError())
279         updatedNb := *nb
280         updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
281         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
282         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
283         _, err := handler.Handle(setupRequest)
284         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
285         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
286 }
287
288 func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceError(t *testing.T) {
289         readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
290         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
291         readerMock.On("GetNodeb", RanName).Return(nb, nil)
292         readerMock.On("GetE2TAddresses").Return([]string{}, nil)
293         updatedNb := *nb
294         updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
295         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
296         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
297         _, err := handler.Handle(setupRequest)
298         assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
299         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
300         writerMock.AssertExpectations(t)
301 }
302
303 func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceErrorUpdateFailure(t *testing.T) {
304         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
305         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
306         readerMock.On("GetNodeb", RanName).Return(nb, nil)
307         e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewE2TInstanceAbsenceError())
308         updatedNb := *nb
309         updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
310         writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
311         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
312         _, err := handler.Handle(setupRequest)
313         assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
314         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
315 }
316
317 func TestSetupExistingRanWithoutAssocE2TInstanceSelectErrorAlreadyDisconnected(t *testing.T) {
318         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
319         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
320         readerMock.On("GetNodeb", RanName).Return(nb, nil)
321         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, e2managererrors.NewE2TInstanceAbsenceError())
322         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
323         _, err := handler.Handle(setupRequest)
324         assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
325         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
326         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
327 }
328
329 func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanFailure(t *testing.T) {
330         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
331         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
332         readerMock.On("GetNodeb", RanName).Return(nb, nil)
333         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
334         e2tInstancesManagerMock.On("AddRanToInstance", RanName, E2TAddress).Return(e2managererrors.NewRnibDbError())
335         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
336         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
337         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
338         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
339         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
340 }
341
342 func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanSucceedsUpdateNodebFails(t *testing.T) {
343         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
344         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
345         readerMock.On("GetNodeb", RanName).Return(nb, nil)
346         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
347         e2tInstancesManagerMock.On("AddRanToInstance", RanName, E2TAddress).Return(nil)
348         updatedNb := *nb
349         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
350         updatedNb.ConnectionAttempts = 0
351         writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
352         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
353         assert.IsType(t, /* &e2managererrors.RnibDbError{} */&common.InternalError{}, err)
354         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
355 }
356
357 func TestSetupExistingRanWithoutAssocE2TInstanceExecuteSetupFailure(t *testing.T) {
358         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
359         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
360         readerMock.On("GetNodeb", RanName).Return(nb, nil)
361         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
362         e2tInstancesManagerMock.On("AddRanToInstance", RanName, E2TAddress).Return(nil)
363         updatedNb := *nb
364         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
365         updatedNb.ConnectionAttempts = 0
366         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
367         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRnibDbError())
368         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
369         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
370 }
371
372 func TestSetupExistingRanWithoutAssocE2TInstanceSuccess(t *testing.T) {
373         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
374         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
375         readerMock.On("GetNodeb", RanName).Return(nb, nil)
376         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
377         e2tInstancesManagerMock.On("AddRanToInstance", RanName, E2TAddress).Return(nil)
378         updatedNb := *nb
379         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
380         updatedNb.ConnectionAttempts = 0
381         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
382         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
383         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
384         assert.Nil(t, err)
385 }
386
387 func TestSetupExistingRanWithAssocE2TInstanceUpdateNodebFailure(t *testing.T) {
388         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
389         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress}
390         readerMock.On("GetNodeb", RanName).Return(nb, nil)
391         updatedNb := *nb
392         updatedNb.ConnectionAttempts = 0
393         writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
394         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
395         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
396         e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
397         e2tInstancesManagerMock.AssertNotCalled(t, "AddRanToInstance")
398         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
399 }
400
401 func TestSetupExistingRanWithAssocE2TInstanceExecuteSetupRmrError(t *testing.T) {
402         readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
403         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
404         readerMock.On("GetNodeb", RanName).Return(nb, nil)
405         updatedNb := *nb
406         updatedNb.ConnectionAttempts = 0
407         updatedNb2 := updatedNb
408         updatedNb2.ConnectionAttempts++
409         updatedNb3 := updatedNb2
410         updatedNb3.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
411         updatedNb3.ConnectionAttempts--
412         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
413         writerMock.On("UpdateNodebInfo", &updatedNb2).Return(nil)
414         payload := e2pdus.PackedX2setupRequest
415         xaction := []byte(RanName)
416         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
417         rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg, e2managererrors.NewRmrError())
418         writerMock.On("UpdateNodebInfo", &updatedNb3).Return(nil)
419         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
420         assert.IsType(t, &e2managererrors.RmrError{}, err)
421         writerMock.AssertExpectations(t)
422 }
423
424 func TestSetupExistingRanWithAssocE2TInstanceConnectedSuccess(t *testing.T) {
425         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
426         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionStatus: entities.ConnectionStatus_CONNECTED}
427         readerMock.On("GetNodeb", RanName).Return(nb, nil)
428         updatedNb := *nb
429         updatedNb.ConnectionAttempts = 0
430         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
431         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTED).Return(nil)
432         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
433         assert.Nil(t, err)
434         e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
435         e2tInstancesManagerMock.AssertNotCalled(t, "AddRanToInstance")
436 }
437
438 func TestSetupExistingRanWithoutAssocE2TInstanceExecuteRoutingManagerError(t *testing.T) {
439         readerMock, writerMock, handler, _, httpClientMock := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
440         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
441         readerMock.On("GetNodeb", RanName).Return(nb, nil)
442         addresses := []string{E2TAddress}
443         readerMock.On("GetE2TAddresses").Return(addresses, nil)
444         e2tInstance := &entities.E2TInstance{Address: E2TAddress, State: entities.Active}
445         readerMock.On("GetE2TInstances", addresses).Return([]*entities.E2TInstance{e2tInstance}, nil)
446
447         data := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)}
448         marshaled, _ := json.Marshal(data)
449         body := bytes.NewBuffer(marshaled)
450         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
451         httpClientMock.On("Post", clients.AssociateRanToE2TInstanceApiSuffix, "application/json", body).Return(&http.Response{StatusCode: http.StatusBadRequest, Body: respBody}, nil)
452
453         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
454         assert.IsType(t, &e2managererrors.RoutingManagerError{}, err)
455         writerMock.AssertExpectations(t)
456         readerMock.AssertExpectations(t)
457         httpClientMock.AssertExpectations(t)
458 }