2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
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
9 // http://www.apache.org/licenses/LICENSE-2.0
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.
17 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 // platform project (RICP).
20 package httpmsghandlers
26 "e2mgr/e2managererrors"
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"
44 const E2TAddress = "10.0.2.15:8989"
45 const RanName = "test"
46 const BaseRMUrl = "http://10.10.2.15:12020/routingmanager"
48 func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.E2TInstancesManagerMock, *mocks.RanSetupManagerMock, *mocks.HttpClientMock) {
50 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
51 config.RoutingManager.BaseUrl = BaseRMUrl
53 readerMock := &mocks.RnibReaderMock{}
54 writerMock := &mocks.RnibWriterMock{}
56 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
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)
66 return readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, httpClientMock
69 func initSetupRequestTestBasicMocks(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock, *mocks.HttpClientMock, *mocks.E2TInstancesManagerMock) {
71 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
72 config.RoutingManager.BaseUrl = BaseRMUrl
73 readerMock := &mocks.RnibReaderMock{}
74 writerMock := &mocks.RnibWriterMock{}
76 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
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)
87 return readerMock, writerMock, handler, rmrMessengerMock, httpClientMock, e2tInstancesManagerMock
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)
99 func TestX2SetupHandleNoPortError(t *testing.T) {
100 readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
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")
108 func TestX2SetupHandleNoRanNameError(t *testing.T) {
109 readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
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")
117 func TestX2SetupHandleNoIpError(t *testing.T) {
118 readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
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")
126 func TestX2SetupHandleInvalidIpError(t *testing.T) {
127 readerMock, _, handler, _, _, _:= initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
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")
135 func TestSetupGetNodebFailure(t *testing.T) {
136 readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
138 rnibErr := &common.ValidationError{}
139 nb := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
140 readerMock.On("GetNodeb", RanName).Return(nb, rnibErr)
142 sr := models.SetupRequest{"127.0.0.1", 8080, RanName,}
143 _, err := handler.Handle(sr)
144 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
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")
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,})
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)
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")
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)
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)
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)
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")
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")
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())
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")
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)
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())
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")
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")
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")
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)
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")
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)
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)
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)
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,})
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)
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")
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)
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)
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)
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,})
438 e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
439 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance")
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{}
452 rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg, errNIl)
453 _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
455 writerMock.AssertExpectations(t)
456 readerMock.AssertExpectations(t)
457 httpClientMock.AssertExpectations(t)