9fc75fecbd6c2e3dab31c78a26ce0a3db90a948b
[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, *mocks.E2TInstancesManagerMock) {
70         log := initLog(t)
71         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
72         config.RoutingManager.BaseUrl = BaseRMUrl
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         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
82         httpClientMock := &mocks.HttpClientMock{}
83         rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
84         e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManagerMock, rmClient)
85         handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol, e2tInstancesManagerMock, e2tAssociationManager)
86
87         return readerMock, writerMock, handler, rmrMessengerMock, httpClientMock, e2tInstancesManagerMock
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, "AddRansToInstance")
154         writerMock.AssertNotCalled(t, "SaveNodeb")
155         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
156 }
157
158 func TestSetupNewRanSelectE2TInstancesNoInstances(t *testing.T) {
159         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
160         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
161         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
162         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
163         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
164         nodebInfo, _ := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
165         writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
166         updatedNb := *nodebInfo
167         updatedNb.ConnectionAttempts = 0
168         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
169         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
170         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
171         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
172         assert.Nil(t, err)
173 }
174
175 func TestSetupNewRanAssociateRanFailure(t *testing.T) {
176         readerMock, writerMock, handler, e2tInstancesManagerMock, _, httpClientMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
177         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
178         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
179         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError())
180         setupRequest := &models.SetupRequest{"127.0.0.1", 8080, RanName,}
181         nb, nbIdentity := createInitialNodeInfo(setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
182         writerMock.On("SaveNodeb", nbIdentity, mock.Anything).Return(nil)
183         writerMock.On("UpdateNodebInfo", nb).Return(nil)
184         nb.AssociatedE2TInstanceAddress = E2TAddress
185         nb.ConnectionAttempts = 0
186         mockHttpClientAssociateRan(httpClientMock)
187         _, err := handler.Handle(*setupRequest)
188         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
189 }
190
191 func TestSetupNewRanSaveNodebFailure(t *testing.T) {
192         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
193         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
194         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
195         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
196         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
197         nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
198         writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(common.NewInternalError(fmt.Errorf("")))
199         _, err := handler.Handle(setupRequest)
200         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
201         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
202 }
203
204 func TestSetupNewRanSetupDbError(t *testing.T) {
205         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
206         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
207         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
208         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError())
209         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
210         nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
211         writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
212         updatedNb := *nodebInfo
213         updatedNb.ConnectionAttempts = 0
214         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
215         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
216         _, err := handler.Handle(setupRequest)
217         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
218         readerMock.AssertExpectations(t)
219         writerMock.AssertExpectations(t)
220         ranSetupManagerMock.AssertExpectations(t)
221 }
222
223 func TestSetupNewRanSetupRmrError(t *testing.T) {
224         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
225         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
226         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
227         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
228         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
229         nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
230         writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
231         updatedNb := *nodebInfo
232         updatedNb.ConnectionAttempts = 0
233         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
234         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
235         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRmrError())
236         _, err := handler.Handle(setupRequest)
237         assert.IsType(t, &e2managererrors.RmrError{}, err)
238 }
239
240 func TestSetupNewRanSetupSuccess(t *testing.T) {
241         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
242         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
243         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
244         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
245         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
246         nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
247         writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
248         updatedNb := *nodebInfo
249         updatedNb.ConnectionAttempts = 0
250         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
251         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
252         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
253         _, err := handler.Handle(setupRequest)
254         assert.Nil(t, err)
255 }
256
257 func TestX2SetupExistingRanShuttingDown(t *testing.T) {
258         readerMock, _, handler, e2tInstancesManagerMock, ranSetupManagerMock , _:= initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
259         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}, nil)
260         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
261         _, err := handler.Handle(setupRequest)
262         assert.IsType(t, &e2managererrors.WrongStateError{}, err)
263         e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
264         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
265 }
266
267 func TestEndcSetupExistingRanShuttingDown(t *testing.T) {
268         readerMock, _, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
269         readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}, nil)
270         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
271         _, err := handler.Handle(setupRequest)
272         assert.IsType(t, &e2managererrors.WrongStateError{}, err)
273         e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
274         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
275 }
276
277 func TestSetupExistingRanWithoutAssocE2TInstanceSelectDbError(t *testing.T) {
278         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
279         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
280         readerMock.On("GetNodeb", RanName).Return(nb, nil)
281         e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewRnibDbError())
282         updatedNb := *nb
283         updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
284         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
285         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
286         _, err := handler.Handle(setupRequest)
287         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
288         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
289 }
290
291 func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceError(t *testing.T) {
292         readerMock, writerMock, handler, rmrMessengerMock, httpClientMock,e2tInstancesManagerMock:= initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
293         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
294         readerMock.On("GetNodeb", RanName).Return(nb, nil)
295         readerMock.On("GetE2TAddresses").Return([]string{}, nil)
296         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
297         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
298         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
299         e2tInstancesManagerMock.On("AddRansToInstance", "10.0.2.15:8989", []string{"test"}).Return(nil)
300         mockHttpClientAssociateRan(httpClientMock)
301         _, err := handler.Handle(setupRequest)
302         assert.IsType(t, &e2managererrors.InternalError{}, err)
303         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
304         writerMock.AssertExpectations(t)
305 }
306
307 func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceErrorUpdateFailure(t *testing.T) {
308         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
309         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
310         readerMock.On("GetNodeb", RanName).Return(nb, nil)
311         e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewE2TInstanceAbsenceError())
312         updatedNb := *nb
313         updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
314         writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
315         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
316         _, err := handler.Handle(setupRequest)
317         assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
318         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
319 }
320
321 func TestSetupExistingRanWithoutAssocE2TInstanceSelectErrorAlreadyDisconnected(t *testing.T) {
322         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
323         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
324         readerMock.On("GetNodeb", RanName).Return(nb, nil)
325         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, e2managererrors.NewE2TInstanceAbsenceError())
326         setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
327         _, err := handler.Handle(setupRequest)
328         assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
329         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
330         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
331 }
332
333 func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanFailure(t *testing.T) {
334         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
335         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
336         readerMock.On("GetNodeb", RanName).Return(nb, nil)
337         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
338         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError())
339         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
340         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
341         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
342         writerMock.AssertNotCalled(t, "UpdateNodebInfo")
343         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
344 }
345
346 func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanSucceedsUpdateNodebFails(t *testing.T) {
347         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
348         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
349         readerMock.On("GetNodeb", RanName).Return(nb, nil)
350         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
351         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
352         updatedNb := *nb
353         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
354         updatedNb.ConnectionAttempts = 0
355         writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
356         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
357         assert.IsType(t, /* &e2managererrors.RnibDbError{} */&common.InternalError{}, err)
358         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
359 }
360
361 func TestSetupExistingRanWithoutAssocE2TInstanceExecuteSetupFailure(t *testing.T) {
362         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
363         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
364         readerMock.On("GetNodeb", RanName).Return(nb, nil)
365         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
366         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
367         updatedNb := *nb
368         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
369         updatedNb.ConnectionAttempts = 0
370         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
371         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRnibDbError())
372         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
373         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
374 }
375
376 func TestSetupExistingRanWithoutAssocE2TInstanceSuccess(t *testing.T) {
377         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
378         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
379         readerMock.On("GetNodeb", RanName).Return(nb, nil)
380         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
381         e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
382         updatedNb := *nb
383         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
384         updatedNb.ConnectionAttempts = 0
385         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
386         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
387         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
388         assert.Nil(t, err)
389 }
390
391 func TestSetupExistingRanWithAssocE2TInstanceUpdateNodebFailure(t *testing.T) {
392         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
393         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress}
394         readerMock.On("GetNodeb", RanName).Return(nb, nil)
395         updatedNb := *nb
396         updatedNb.ConnectionAttempts = 0
397         writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
398         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
399         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
400         e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
401         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance")
402         ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
403 }
404
405 func TestSetupExistingRanWithAssocE2TInstanceExecuteSetupRmrError(t *testing.T) {
406         readerMock, writerMock, handler, rmrMessengerMock, _, _ := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
407         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
408         readerMock.On("GetNodeb", RanName).Return(nb, nil)
409         updatedNb := *nb
410         updatedNb.ConnectionAttempts = 0
411         updatedNb2 := updatedNb
412         updatedNb2.ConnectionAttempts++
413         updatedNb3 := updatedNb2
414         updatedNb3.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
415         updatedNb3.ConnectionAttempts--
416         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
417         writerMock.On("UpdateNodebInfo", &updatedNb2).Return(nil)
418         payload := e2pdus.PackedX2setupRequest
419         xaction := []byte(RanName)
420         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
421         rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg, e2managererrors.NewRmrError())
422         writerMock.On("UpdateNodebInfo", &updatedNb3).Return(nil)
423         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
424         assert.IsType(t, &e2managererrors.RmrError{}, err)
425         writerMock.AssertExpectations(t)
426 }
427
428 func TestSetupExistingRanWithAssocE2TInstanceConnectedSuccess(t *testing.T) {
429         readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
430         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionStatus: entities.ConnectionStatus_CONNECTED}
431         readerMock.On("GetNodeb", RanName).Return(nb, nil)
432         updatedNb := *nb
433         updatedNb.ConnectionAttempts = 0
434         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
435         ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTED).Return(nil)
436         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
437         assert.Nil(t, err)
438         e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
439         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance")
440 }
441
442 func TestSetupExistingRanWithoutAssocE2TInstanceExecuteRoutingManagerError(t *testing.T) {
443         readerMock, writerMock, handler, rmrMessengerMock, httpClientMock, e2tInstancesManagerMock := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
444         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
445         readerMock.On("GetNodeb", RanName).Return(nb, nil)
446         writerMock.On("UpdateNodebInfo", nb).Return(nil)
447         e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
448         mockHttpClientAssociateRan(httpClientMock)
449         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
450         msg := &rmrCgo.MBuf{}
451         var errNIl error
452         rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg, errNIl)
453         _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
454         assert.Nil(t, err)
455         writerMock.AssertExpectations(t)
456         readerMock.AssertExpectations(t)
457         httpClientMock.AssertExpectations(t)
458 }