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