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).
26 "e2mgr/e2managererrors"
31 "e2mgr/providers/httpmsghandlerprovider"
34 "e2mgr/services/rmrsender"
38 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
39 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
40 "github.com/golang/protobuf/jsonpb"
41 "github.com/gorilla/mux"
42 "github.com/pkg/errors"
43 "github.com/stretchr/testify/assert"
44 "github.com/stretchr/testify/mock"
56 AssociatedE2TInstanceAddress = "10.0.2.15:38000"
57 CorruptedJson = "{\"errorCode\":401,\"errorMessage\":\"corrupted json\"}"
58 ValidationFailureJson = "{\"errorCode\":402,\"errorMessage\":\"Validation error\"}"
59 ResourceNotFoundJson = "{\"errorCode\":404,\"errorMessage\":\"Resource not found\"}"
60 NodebExistsJson = "{\"errorCode\":406,\"errorMessage\":\"Nodeb already exists\"}"
61 RnibErrorJson = "{\"errorCode\":500,\"errorMessage\":\"RNIB error\"}"
62 InternalErrorJson = "{\"errorCode\":501,\"errorMessage\":\"Internal Server Error. Please try again later\"}"
63 AddEnbUrl = "/nodeb/enb"
67 ServedNrCellInformationRequiredFields = []string{"cellId", "choiceNrMode", "nrMode", "servedPlmns"}
68 NrNeighbourInformationRequiredFields = []string{"nrCgi", "choiceNrMode", "nrMode"}
69 AddEnbRequestRequiredFields = []string{"ranName", "enb", "globalNbId"}
70 UpdateEnbRequestRequiredFields = []string{"enb"}
71 GlobalIdRequiredFields = []string{"plmnId", "nbId"}
72 EnbRequiredFields = []string{"enbType", "servedCells"}
73 ServedCellRequiredFields = []string{"broadcastPlmns", "cellId", "choiceEutraMode", "eutraMode", "tac"}
76 type controllerGetNodebTestContext struct {
78 nodebInfo *entities.NodebInfo
80 expectedStatusCode int
81 expectedJsonResponse string
84 type controllerGetNodebIdListTestContext struct {
85 nodebIdList []*entities.NbIdentity
87 expectedStatusCode int
88 expectedJsonResponse string
91 type getNodebInfoResult struct {
92 nodebInfo *entities.NodebInfo
96 type updateGnbCellsParams struct {
100 type updateEnbCellsParams struct {
104 type addEnbParams struct {
108 type addNbIdentityParams struct {
112 type removeServedCellsParams struct {
113 servedCellInfo []*entities.ServedCellInfo
117 type removeServedNrCellsParams struct {
118 servedNrCells []*entities.ServedNRCell
122 type controllerUpdateEnbTestContext struct {
123 getNodebInfoResult *getNodebInfoResult
124 removeServedCellsParams *removeServedCellsParams
125 updateEnbCellsParams *updateEnbCellsParams
126 requestBody map[string]interface{}
127 expectedStatusCode int
128 expectedJsonResponse string
131 type controllerUpdateGnbTestContext struct {
132 getNodebInfoResult *getNodebInfoResult
133 removeServedNrCellsParams *removeServedNrCellsParams
134 updateGnbCellsParams *updateGnbCellsParams
135 requestBody map[string]interface{}
136 expectedStatusCode int
137 expectedJsonResponse string
140 type controllerAddEnbTestContext struct {
141 getNodebInfoResult *getNodebInfoResult
142 addEnbParams *addEnbParams
143 addNbIdentityParams *addNbIdentityParams
144 requestBody map[string]interface{}
145 expectedStatusCode int
146 expectedJsonResponse string
149 type controllerDeleteEnbTestContext struct {
150 getNodebInfoResult *getNodebInfoResult
151 expectedStatusCode int
152 expectedJsonResponse string
155 func generateServedNrCells(cellIds ...string) []*entities.ServedNRCell {
157 servedNrCells := []*entities.ServedNRCell{}
159 for _, v := range cellIds {
160 servedNrCells = append(servedNrCells, &entities.ServedNRCell{ServedNrCellInformation: &entities.ServedNRCellInformation{
162 ChoiceNrMode: &entities.ServedNRCellInformation_ChoiceNRMode{
163 Fdd: &entities.ServedNRCellInformation_ChoiceNRMode_FddInfo{},
165 NrMode: entities.Nr_FDD,
167 ServedPlmns: []string{"whatever"},
174 func generateServedCells(cellIds ...string) []*entities.ServedCellInfo {
176 var servedCells []*entities.ServedCellInfo
178 for i, v := range cellIds {
179 servedCells = append(servedCells, &entities.ServedCellInfo{
181 ChoiceEutraMode: &entities.ChoiceEUTRAMode{
182 Fdd: &entities.FddInfo{},
185 BroadcastPlmns: []string{"whatever"},
192 func buildNrNeighbourInformation(propToOmit string) map[string]interface{} {
193 ret := map[string]interface{}{
195 "choiceNrMode": map[string]interface{}{
196 "tdd": map[string]interface{}{},
202 if len(propToOmit) != 0 {
203 delete(ret, propToOmit)
209 func buildServedNrCellInformation(propToOmit string) map[string]interface{} {
210 ret := map[string]interface{}{
211 "cellId": "whatever",
212 "choiceNrMode": map[string]interface{}{
213 "fdd": map[string]interface{}{},
217 "servedPlmns": []interface{}{
222 if len(propToOmit) != 0 {
223 delete(ret, propToOmit)
229 func buildServedCell(propToOmit string) map[string]interface{} {
230 ret := map[string]interface{}{
231 "cellId": "whatever",
232 "choiceEutraMode": map[string]interface{}{
233 "fdd": map[string]interface{}{},
238 "broadcastPlmns": []interface{}{
243 if len(propToOmit) != 0 {
244 delete(ret, propToOmit)
250 func getUpdateEnbRequest(propToOmit string) map[string]interface{} {
251 ret := map[string]interface{}{
252 "enb": buildEnb(propToOmit),
255 if len(propToOmit) != 0 {
256 delete(ret, propToOmit)
262 func getAddEnbRequest(propToOmit string) map[string]interface{} {
263 ret := map[string]interface{}{
265 "globalNbId": buildGlobalNbId(""),
269 if len(propToOmit) != 0 {
270 delete(ret, propToOmit)
276 func buildEnb(propToOmit string) map[string]interface{} {
277 ret := map[string]interface{}{
279 "servedCells": []interface{}{
283 if len(propToOmit) != 0 {
284 delete(ret, propToOmit)
290 func buildGlobalNbId(propToOmit string) map[string]interface{} {
291 ret := map[string]interface{}{
292 "plmnId": "whatever",
296 if len(propToOmit) != 0 {
297 delete(ret, propToOmit)
303 func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, managers.RanListManager) {
305 config := configuration.ParseConfiguration()
307 rmrMessengerMock := &mocks.RmrMessengerMock{}
308 readerMock := &mocks.RnibReaderMock{}
310 writerMock := &mocks.RnibWriterMock{}
312 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
313 rmrSender := getRmrSender(rmrMessengerMock, log)
314 e2tInstancesManager := &mocks.E2TInstancesManagerMock{}
315 httpClientMock := &mocks.HttpClientMock{}
316 rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
317 ranListManager := managers.NewRanListManager(log, rnibDataService)
318 ranAlarmService := &mocks.RanAlarmServiceMock{}
319 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
320 nodebValidator := managers.NewNodebValidator()
321 updateEnbManager := managers.NewUpdateEnbManager(log, rnibDataService, nodebValidator)
322 updateGnbManager := managers.NewUpdateGnbManager(log, rnibDataService, nodebValidator)
323 handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, nodebValidator, updateEnbManager, updateGnbManager, ranListManager)
324 controller := NewNodebController(log, handlerProvider)
325 return controller, readerMock, writerMock, rmrMessengerMock, e2tInstancesManager, ranListManager
328 func setupDeleteEnbControllerTest(t *testing.T, preAddNbIdentity bool) (*NodebController, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *entities.NbIdentity) {
330 config := configuration.ParseConfiguration()
332 rmrMessengerMock := &mocks.RmrMessengerMock{}
333 readerMock := &mocks.RnibReaderMock{}
335 writerMock := &mocks.RnibWriterMock{}
337 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
338 rmrSender := getRmrSender(rmrMessengerMock, log)
339 e2tInstancesManager := &mocks.E2TInstancesManagerMock{}
340 httpClientMock := &mocks.HttpClientMock{}
341 rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
342 ranListManager := managers.NewRanListManager(log, rnibDataService)
343 var nbIdentity *entities.NbIdentity
344 if preAddNbIdentity {
345 nbIdentity = &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
346 writerMock.On("AddNbIdentity", entities.Node_ENB, nbIdentity).Return(nil)
347 ranListManager.AddNbIdentity(entities.Node_ENB, nbIdentity)
349 ranAlarmService := &mocks.RanAlarmServiceMock{}
350 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
351 nodebValidator := managers.NewNodebValidator()
352 updateEnbManager := managers.NewUpdateEnbManager(log, rnibDataService, nodebValidator)
353 updateGnbManager := managers.NewUpdateGnbManager(log, rnibDataService, nodebValidator)
355 handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, nodebValidator, updateEnbManager, updateGnbManager, ranListManager)
356 controller := NewNodebController(log, handlerProvider)
357 return controller, readerMock, writerMock, nbIdentity
360 func TestShutdownHandlerRnibError(t *testing.T) {
361 controller, _, _, _, e2tInstancesManagerMock, _ := setupControllerTest(t)
362 e2tInstancesManagerMock.On("GetE2TAddresses").Return([]string{}, e2managererrors.NewRnibDbError())
364 writer := httptest.NewRecorder()
366 controller.Shutdown(writer, tests.GetHttpRequest())
368 var errorResponse = parseJsonRequest(t, writer.Body)
370 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
371 assert.Equal(t, errorResponse.Code, e2managererrors.NewRnibDbError().Code)
374 func TestSetGeneralConfigurationHandlerRnibError(t *testing.T) {
375 controller, readerMock, _, _, _, _ := setupControllerTest(t)
377 configuration := &entities.GeneralConfiguration{}
378 readerMock.On("GetGeneralConfiguration").Return(configuration, e2managererrors.NewRnibDbError())
380 writer := httptest.NewRecorder()
382 httpRequest, _ := http.NewRequest("PUT", "https://localhost:3800/v1/nodeb/parameters", strings.NewReader("{\"enableRic\":false}"))
384 controller.SetGeneralConfiguration(writer, httpRequest)
386 var errorResponse = parseJsonRequest(t, writer.Body)
388 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
389 assert.Equal(t, e2managererrors.NewRnibDbError().Code, errorResponse.Code)
392 func TestSetGeneralConfigurationInvalidJson(t *testing.T) {
393 controller, _, _, _, _, _ := setupControllerTest(t)
395 writer := httptest.NewRecorder()
397 httpRequest, _ := http.NewRequest("PUT", "https://localhost:3800/v1/nodeb/parameters", strings.NewReader("{\"enableRic\":false, \"someValue\":false}"))
399 controller.SetGeneralConfiguration(writer, httpRequest)
401 var errorResponse = parseJsonRequest(t, writer.Body)
403 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
404 assert.Equal(t, e2managererrors.NewInvalidJsonError().Code, errorResponse.Code)
407 func controllerGetNodebTestExecuter(t *testing.T, context *controllerGetNodebTestContext) {
408 controller, readerMock, _, _, _, _ := setupControllerTest(t)
409 writer := httptest.NewRecorder()
410 readerMock.On("GetNodeb", context.ranName).Return(context.nodebInfo, context.rnibError)
411 req, _ := http.NewRequest(http.MethodGet, "/nodeb", nil)
412 req = mux.SetURLVars(req, map[string]string{"ranName": context.ranName})
413 controller.GetNodeb(writer, req)
414 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
415 bodyBytes, _ := ioutil.ReadAll(writer.Body)
416 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
419 func controllerGetNodebIdListTestExecuter(t *testing.T, context *controllerGetNodebIdListTestContext) {
420 controller, readerMock, _, _, _, ranListManager := setupControllerTest(t)
421 writer := httptest.NewRecorder()
422 readerMock.On("GetListNodebIds").Return(context.nodebIdList, context.rnibError)
424 err := ranListManager.InitNbIdentityMap()
426 t.Errorf("Error cannot init identity")
429 req, _ := http.NewRequest(http.MethodGet, "/nodeb/states", nil)
430 controller.GetNodebIdList(writer, req)
431 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
432 bodyBytes, _ := ioutil.ReadAll(writer.Body)
433 assert.Contains(t, context.expectedJsonResponse, string(bodyBytes))
436 func activateControllerUpdateEnbMocks(context *controllerUpdateEnbTestContext, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock, updateEnbRequest *models.UpdateEnbRequest) {
437 if context.getNodebInfoResult != nil {
438 readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
441 if context.removeServedCellsParams != nil {
442 writerMock.On("RemoveServedCells", RanName, context.removeServedCellsParams.servedCellInfo).Return(context.removeServedCellsParams.err)
445 if context.updateEnbCellsParams != nil {
446 updatedNodebInfo := *context.getNodebInfoResult.nodebInfo
448 if context.getNodebInfoResult.nodebInfo.SetupFromNetwork {
449 updateEnbRequest.Enb.EnbType = context.getNodebInfoResult.nodebInfo.GetEnb().EnbType
452 updatedNodebInfo.Configuration = &entities.NodebInfo_Enb{Enb: updateEnbRequest.Enb}
454 writerMock.On("UpdateEnb", &updatedNodebInfo, updateEnbRequest.Enb.ServedCells).Return(context.updateEnbCellsParams.err)
458 func activateControllerUpdateGnbMocks(context *controllerUpdateGnbTestContext, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
459 if context.getNodebInfoResult != nil {
460 readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
463 if context.removeServedNrCellsParams != nil {
464 writerMock.On("RemoveServedNrCells", RanName, context.removeServedNrCellsParams.servedNrCells).Return(context.removeServedNrCellsParams.err)
467 if context.updateGnbCellsParams != nil {
468 updatedNodebInfo := *context.getNodebInfoResult.nodebInfo
469 gnb := entities.Gnb{}
470 _ = jsonpb.Unmarshal(getJsonRequestAsBuffer(context.requestBody), &gnb)
471 updatedGnb := *updatedNodebInfo.GetGnb()
472 updatedGnb.ServedNrCells = gnb.ServedNrCells
473 writerMock.On("UpdateGnbCells", &updatedNodebInfo, gnb.ServedNrCells).Return(context.updateGnbCellsParams.err)
477 func assertControllerUpdateGnb(t *testing.T, context *controllerUpdateGnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
478 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
479 bodyBytes, _ := ioutil.ReadAll(writer.Body)
480 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
481 readerMock.AssertExpectations(t)
482 writerMock.AssertExpectations(t)
485 func assertControllerUpdateEnb(t *testing.T, context *controllerUpdateEnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
486 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
487 bodyBytes, _ := ioutil.ReadAll(writer.Body)
488 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
489 readerMock.AssertExpectations(t)
490 writerMock.AssertExpectations(t)
493 func assertControllerAddEnb(t *testing.T, context *controllerAddEnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
494 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
495 bodyBytes, _ := ioutil.ReadAll(writer.Body)
496 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
497 readerMock.AssertExpectations(t)
498 writerMock.AssertExpectations(t)
501 func assertControllerDeleteEnb(t *testing.T, context *controllerDeleteEnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
502 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
503 bodyBytes, _ := ioutil.ReadAll(writer.Body)
504 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
505 readerMock.AssertExpectations(t)
506 writerMock.AssertExpectations(t)
509 func buildUpdateEnbRequest(context *controllerUpdateEnbTestContext) *http.Request {
510 updateEnbUrl := fmt.Sprintf("/nodeb/enb/%s", RanName)
511 requestBody := getJsonRequestAsBuffer(context.requestBody)
512 req, _ := http.NewRequest(http.MethodPut, updateEnbUrl, requestBody)
513 req.Header.Set("Content-Type", "application/json")
514 req = mux.SetURLVars(req, map[string]string{"ranName": RanName})
518 func buildUpdateGnbRequest(context *controllerUpdateGnbTestContext) *http.Request {
519 updateGnbUrl := fmt.Sprintf("/nodeb/gnb/%s", RanName)
520 requestBody := getJsonRequestAsBuffer(context.requestBody)
521 req, _ := http.NewRequest(http.MethodPut, updateGnbUrl, requestBody)
522 req.Header.Set("Content-Type", "application/json")
523 req = mux.SetURLVars(req, map[string]string{"ranName": RanName})
527 func buildAddEnbRequest(context *controllerAddEnbTestContext) *http.Request {
528 requestBody := getJsonRequestAsBuffer(context.requestBody)
529 req, _ := http.NewRequest(http.MethodPost, AddEnbUrl, requestBody)
530 req.Header.Set("Content-Type", "application/json")
534 func controllerUpdateEnbTestExecuter(t *testing.T, context *controllerUpdateEnbTestContext) {
535 controller, readerMock, writerMock, _, _, _ := setupControllerTest(t)
536 writer := httptest.NewRecorder()
538 r := buildUpdateEnbRequest(context)
539 body, _ := ioutil.ReadAll(io.LimitReader(r.Body, LimitRequest))
541 updateEnbRequest := models.UpdateEnbRequest{}
542 _ = json.Unmarshal(body, &updateEnbRequest)
544 activateControllerUpdateEnbMocks(context, readerMock, writerMock, &updateEnbRequest)
545 r = buildUpdateEnbRequest(context)
548 controller.UpdateEnb(writer, r)
550 assertControllerUpdateEnb(t, context, writer, readerMock, writerMock)
553 func controllerUpdateGnbTestExecuter(t *testing.T, context *controllerUpdateGnbTestContext) {
554 controller, readerMock, writerMock, _, _, _ := setupControllerTest(t)
555 writer := httptest.NewRecorder()
557 activateControllerUpdateGnbMocks(context, readerMock, writerMock)
558 req := buildUpdateGnbRequest(context)
559 controller.UpdateGnb(writer, req)
560 assertControllerUpdateGnb(t, context, writer, readerMock, writerMock)
563 func activateControllerAddEnbMocks(context *controllerAddEnbTestContext, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock, addEnbRequest *models.AddEnbRequest) {
564 if context.getNodebInfoResult != nil {
565 readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
568 if context.addEnbParams != nil {
569 nodebInfo := entities.NodebInfo{
570 RanName: addEnbRequest.RanName,
571 Ip: addEnbRequest.Ip,
572 Port: addEnbRequest.Port,
573 NodeType: entities.Node_ENB,
574 GlobalNbId: addEnbRequest.GlobalNbId,
575 Configuration: &entities.NodebInfo_Enb{Enb: addEnbRequest.Enb},
576 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
579 writerMock.On("AddEnb", &nodebInfo).Return(context.addEnbParams.err)
582 if context.addNbIdentityParams != nil {
583 nbIdentity := entities.NbIdentity{InventoryName: addEnbRequest.RanName, GlobalNbId: addEnbRequest.GlobalNbId, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
584 writerMock.On("AddNbIdentity", entities.Node_ENB, &nbIdentity).Return(context.addNbIdentityParams.err)
588 func controllerAddEnbTestExecuter(t *testing.T, context *controllerAddEnbTestContext) {
589 controller, readerMock, writerMock, _, _, _ := setupControllerTest(t)
590 writer := httptest.NewRecorder()
591 r := buildAddEnbRequest(context)
592 body, _ := ioutil.ReadAll(io.LimitReader(r.Body, LimitRequest))
594 addEnbRequest := models.AddEnbRequest{}
596 _ = json.Unmarshal(body, &addEnbRequest)
597 activateControllerAddEnbMocks(context, readerMock, writerMock, &addEnbRequest)
598 r = buildAddEnbRequest(context)
600 controller.AddEnb(writer, r)
601 assertControllerAddEnb(t, context, writer, readerMock, writerMock)
604 func controllerDeleteEnbTestExecuter(t *testing.T, context *controllerDeleteEnbTestContext, preAddNbIdentity bool) {
605 controller, readerMock, writerMock, nbIdentity := setupDeleteEnbControllerTest(t, preAddNbIdentity)
606 readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
607 if context.getNodebInfoResult.rnibError == nil && context.getNodebInfoResult.nodebInfo.GetNodeType() == entities.Node_ENB &&
608 !context.getNodebInfoResult.nodebInfo.SetupFromNetwork {
609 writerMock.On("RemoveEnb", context.getNodebInfoResult.nodebInfo).Return(nil)
610 if preAddNbIdentity {
611 writerMock.On("RemoveNbIdentity", entities.Node_ENB, nbIdentity).Return(nil)
614 writer := httptest.NewRecorder()
615 r, _ := http.NewRequest(http.MethodDelete, AddEnbUrl+"/"+RanName, nil)
616 r.Header.Set("Content-Type", "application/json")
617 r = mux.SetURLVars(r, map[string]string{"ranName": RanName})
618 controller.DeleteEnb(writer, r)
619 assertControllerDeleteEnb(t, context, writer, readerMock, writerMock)
626 // BEGIN - UpdateGnb Validation Failure UTs
628 func TestControllerUpdateGnbEmptyServedNrCells(t *testing.T) {
629 context := controllerUpdateGnbTestContext{
630 getNodebInfoResult: nil,
631 requestBody: map[string]interface{}{
632 "servedNrCells": []interface{}{},
634 expectedStatusCode: http.StatusBadRequest,
635 expectedJsonResponse: ValidationFailureJson,
638 controllerUpdateGnbTestExecuter(t, &context)
641 func TestControllerUpdateGnbMissingServedNrCellInformation(t *testing.T) {
642 context := controllerUpdateGnbTestContext{
643 getNodebInfoResult: nil,
644 requestBody: map[string]interface{}{
645 "servedNrCells": []interface{}{
646 map[string]interface{}{
647 "servedNrCellInformation": nil,
651 expectedStatusCode: http.StatusBadRequest,
652 expectedJsonResponse: ValidationFailureJson,
655 controllerUpdateGnbTestExecuter(t, &context)
658 func TestControllerUpdateGnbMissingServedNrCellRequiredProp(t *testing.T) {
660 for _, v := range ServedNrCellInformationRequiredFields {
661 context := controllerUpdateGnbTestContext{
662 getNodebInfoResult: nil,
663 requestBody: map[string]interface{}{
664 "servedNrCells": []interface{}{
665 map[string]interface{}{
666 "servedNrCellInformation": buildServedNrCellInformation(v),
670 expectedStatusCode: http.StatusBadRequest,
671 expectedJsonResponse: ValidationFailureJson,
674 controllerUpdateGnbTestExecuter(t, &context)
678 func TestControllerUpdateGnbMissingServedNrCellFddOrTdd(t *testing.T) {
680 servedNrCellInformation := buildServedNrCellInformation("")
681 servedNrCellInformation["choiceNrMode"] = map[string]interface{}{}
683 context := controllerUpdateGnbTestContext{
684 getNodebInfoResult: nil,
685 requestBody: map[string]interface{}{
686 "servedNrCells": []interface{}{
687 map[string]interface{}{
688 "servedNrCellInformation": servedNrCellInformation,
692 expectedStatusCode: http.StatusBadRequest,
693 expectedJsonResponse: ValidationFailureJson,
696 controllerUpdateGnbTestExecuter(t, &context)
699 func TestControllerUpdateGnbMissingNeighbourInfoFddOrTdd(t *testing.T) {
701 nrNeighbourInfo := buildNrNeighbourInformation("")
702 nrNeighbourInfo["choiceNrMode"] = map[string]interface{}{}
704 context := controllerUpdateGnbTestContext{
705 getNodebInfoResult: nil,
706 requestBody: map[string]interface{}{
707 "servedNrCells": []interface{}{
708 map[string]interface{}{
709 "servedNrCellInformation": buildServedNrCellInformation(""),
710 "nrNeighbourInfos": []interface{}{
716 expectedStatusCode: http.StatusBadRequest,
717 expectedJsonResponse: ValidationFailureJson,
720 controllerUpdateGnbTestExecuter(t, &context)
723 func TestControllerUpdateGnbMissingNrNeighbourInformationRequiredProp(t *testing.T) {
725 for _, v := range NrNeighbourInformationRequiredFields {
726 context := controllerUpdateGnbTestContext{
727 getNodebInfoResult: nil,
728 requestBody: map[string]interface{}{
729 "servedNrCells": []interface{}{
730 map[string]interface{}{
731 "servedNrCellInformation": buildServedNrCellInformation(""),
732 "nrNeighbourInfos": []interface{}{
733 buildNrNeighbourInformation(v),
738 expectedStatusCode: http.StatusBadRequest,
739 expectedJsonResponse: ValidationFailureJson,
742 controllerUpdateGnbTestExecuter(t, &context)
746 // END - UpdateGnb Validation Failure UTs
748 func TestControllerUpdateGnbValidServedNrCellInformationGetNodebNotFound(t *testing.T) {
749 context := controllerUpdateGnbTestContext{
750 getNodebInfoResult: &getNodebInfoResult{
752 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
754 requestBody: map[string]interface{}{
755 "servedNrCells": []interface{}{
756 map[string]interface{}{
757 "servedNrCellInformation": buildServedNrCellInformation(""),
761 expectedStatusCode: http.StatusNotFound,
762 expectedJsonResponse: ResourceNotFoundJson,
765 controllerUpdateGnbTestExecuter(t, &context)
768 func TestControllerUpdateGnbValidServedNrCellInformationGetNodebInternalError(t *testing.T) {
769 context := controllerUpdateGnbTestContext{
770 getNodebInfoResult: &getNodebInfoResult{
772 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
774 requestBody: map[string]interface{}{
775 "servedNrCells": []interface{}{
776 map[string]interface{}{
777 "servedNrCellInformation": buildServedNrCellInformation(""),
781 expectedStatusCode: http.StatusInternalServerError,
782 expectedJsonResponse: RnibErrorJson,
785 controllerUpdateGnbTestExecuter(t, &context)
788 func TestControllerUpdateGnbGetNodebSuccessInvalidGnbConfiguration(t *testing.T) {
789 context := controllerUpdateGnbTestContext{
790 getNodebInfoResult: &getNodebInfoResult{
791 nodebInfo: &entities.NodebInfo{
793 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
794 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
795 NodeType: entities.Node_ENB,
799 requestBody: map[string]interface{}{
800 "servedNrCells": []interface{}{
801 map[string]interface{}{
802 "servedNrCellInformation": buildServedNrCellInformation(""),
803 "nrNeighbourInfos": []interface{}{
804 buildNrNeighbourInformation(""),
809 expectedStatusCode: http.StatusBadRequest,
810 expectedJsonResponse: ValidationFailureJson,
813 controllerUpdateGnbTestExecuter(t, &context)
816 func TestControllerUpdateGnbGetNodebSuccessRemoveServedNrCellsFailure(t *testing.T) {
817 oldServedNrCells := generateServedNrCells("whatever1", "whatever2")
818 context := controllerUpdateGnbTestContext{
819 removeServedNrCellsParams: &removeServedNrCellsParams{
820 err: common.NewInternalError(errors.New("#writer.UpdateGnbCells - Internal Error")),
821 servedNrCells: oldServedNrCells,
823 getNodebInfoResult: &getNodebInfoResult{
824 nodebInfo: &entities.NodebInfo{
826 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
827 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
828 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{ServedNrCells: oldServedNrCells}},
829 NodeType: entities.Node_GNB,
833 requestBody: map[string]interface{}{
834 "servedNrCells": []interface{}{
835 map[string]interface{}{
836 "servedNrCellInformation": buildServedNrCellInformation(""),
837 "nrNeighbourInfos": []interface{}{
838 buildNrNeighbourInformation(""),
843 expectedStatusCode: http.StatusInternalServerError,
844 expectedJsonResponse: RnibErrorJson,
847 controllerUpdateGnbTestExecuter(t, &context)
850 func TestControllerUpdateGnbGetNodebSuccessUpdateGnbCellsFailure(t *testing.T) {
851 oldServedNrCells := generateServedNrCells("whatever1", "whatever2")
852 context := controllerUpdateGnbTestContext{
853 removeServedNrCellsParams: &removeServedNrCellsParams{
855 servedNrCells: oldServedNrCells,
857 updateGnbCellsParams: &updateGnbCellsParams{
858 err: common.NewInternalError(errors.New("#writer.UpdateGnbCells - Internal Error")),
860 getNodebInfoResult: &getNodebInfoResult{
861 nodebInfo: &entities.NodebInfo{
863 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
864 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
865 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{ServedNrCells: oldServedNrCells}},
866 NodeType: entities.Node_GNB,
870 requestBody: map[string]interface{}{
871 "servedNrCells": []interface{}{
872 map[string]interface{}{
873 "servedNrCellInformation": buildServedNrCellInformation(""),
874 "nrNeighbourInfos": []interface{}{
875 buildNrNeighbourInformation(""),
880 expectedStatusCode: http.StatusInternalServerError,
881 expectedJsonResponse: RnibErrorJson,
884 controllerUpdateGnbTestExecuter(t, &context)
887 func TestControllerUpdateGnbExistingEmptyCellsSuccess(t *testing.T) {
888 oldServedNrCells := []*entities.ServedNRCell{}
890 context := controllerUpdateGnbTestContext{
891 updateGnbCellsParams: &updateGnbCellsParams{
894 getNodebInfoResult: &getNodebInfoResult{
895 nodebInfo: &entities.NodebInfo{
897 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
898 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
899 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{ServedNrCells: oldServedNrCells}},
900 NodeType: entities.Node_GNB,
904 requestBody: map[string]interface{}{
905 "servedNrCells": []interface{}{
906 map[string]interface{}{
907 "servedNrCellInformation": buildServedNrCellInformation(""),
908 "nrNeighbourInfos": []interface{}{
909 buildNrNeighbourInformation(""),
914 expectedStatusCode: http.StatusOK,
915 expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"CONNECTED\",\"nodeType\":\"GNB\",\"gnb\":{\"servedNrCells\":[{\"servedNrCellInformation\":{\"nrPci\":1,\"cellId\":\"whatever\",\"servedPlmns\":[\"whatever\"],\"nrMode\":\"FDD\",\"choiceNrMode\":{\"fdd\":{}}},\"nrNeighbourInfos\":[{\"nrPci\":1,\"nrCgi\":\"whatever\",\"nrMode\":\"FDD\",\"choiceNrMode\":{\"tdd\":{}}}]}]},\"associatedE2tInstanceAddress\":\"10.0.2.15:38000\"}",
918 controllerUpdateGnbTestExecuter(t, &context)
921 func TestControllerUpdateGnbSuccess(t *testing.T) {
922 oldServedNrCells := generateServedNrCells("whatever1", "whatever2")
924 context := controllerUpdateGnbTestContext{
925 removeServedNrCellsParams: &removeServedNrCellsParams{
927 servedNrCells: oldServedNrCells,
929 updateGnbCellsParams: &updateGnbCellsParams{
932 getNodebInfoResult: &getNodebInfoResult{
933 nodebInfo: &entities.NodebInfo{
935 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
936 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
937 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{ServedNrCells: oldServedNrCells}},
938 NodeType: entities.Node_GNB,
942 requestBody: map[string]interface{}{
943 "servedNrCells": []interface{}{
944 map[string]interface{}{
945 "servedNrCellInformation": buildServedNrCellInformation(""),
946 "nrNeighbourInfos": []interface{}{
947 buildNrNeighbourInformation(""),
952 expectedStatusCode: http.StatusOK,
953 expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"CONNECTED\",\"nodeType\":\"GNB\",\"gnb\":{\"servedNrCells\":[{\"servedNrCellInformation\":{\"nrPci\":1,\"cellId\":\"whatever\",\"servedPlmns\":[\"whatever\"],\"nrMode\":\"FDD\",\"choiceNrMode\":{\"fdd\":{}}},\"nrNeighbourInfos\":[{\"nrPci\":1,\"nrCgi\":\"whatever\",\"nrMode\":\"FDD\",\"choiceNrMode\":{\"tdd\":{}}}]}]},\"associatedE2tInstanceAddress\":\"10.0.2.15:38000\"}",
956 controllerUpdateGnbTestExecuter(t, &context)
963 func TestControllerUpdateEnbInvalidRequest(t *testing.T) {
964 controller, _, _, _, _, _ := setupControllerTest(t)
966 writer := httptest.NewRecorder()
967 invalidJson := strings.NewReader("{enb:\"whatever\"")
969 updateEnbUrl := fmt.Sprintf("/nodeb/enb/%s", RanName)
970 req, _ := http.NewRequest(http.MethodPut, updateEnbUrl, invalidJson)
971 req.Header.Set("Content-Type", "application/json")
972 req = mux.SetURLVars(req, map[string]string{"ranName": RanName})
974 controller.UpdateEnb(writer, req)
976 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
977 bodyBytes, _ := ioutil.ReadAll(writer.Body)
978 assert.Equal(t, CorruptedJson, string(bodyBytes))
981 func TestControllerUpdateEnbEmptyEnbType(t *testing.T) {
982 context := controllerUpdateEnbTestContext{
983 getNodebInfoResult: nil,
984 requestBody: getUpdateEnbRequest(EnbRequiredFields[0]),
985 expectedStatusCode: http.StatusBadRequest,
986 expectedJsonResponse: ValidationFailureJson,
989 controllerUpdateEnbTestExecuter(t, &context)
992 func TestControllerUpdateEnbEmptyServedCells(t *testing.T) {
993 context := controllerUpdateEnbTestContext{
994 getNodebInfoResult: nil,
995 requestBody: getUpdateEnbRequest(EnbRequiredFields[1]),
996 expectedStatusCode: http.StatusBadRequest,
997 expectedJsonResponse: ValidationFailureJson,
1000 controllerUpdateEnbTestExecuter(t, &context)
1003 func TestControllerUpdateEnbMissingEnb(t *testing.T) {
1004 context := controllerUpdateEnbTestContext{
1005 getNodebInfoResult: nil,
1006 requestBody: getUpdateEnbRequest(UpdateEnbRequestRequiredFields[0]),
1007 expectedStatusCode: http.StatusBadRequest,
1008 expectedJsonResponse: ValidationFailureJson,
1011 controllerUpdateEnbTestExecuter(t, &context)
1014 func TestControllerUpdateEnbMissingRequiredServedCellProps(t *testing.T) {
1016 r := getUpdateEnbRequest("")
1018 for _, v := range ServedCellRequiredFields {
1021 enbMap, _ := enb.(map[string]interface{})
1023 enbMap["servedCells"] = []interface{}{
1027 context := controllerUpdateEnbTestContext{
1029 expectedStatusCode: http.StatusBadRequest,
1030 expectedJsonResponse: ValidationFailureJson,
1033 controllerUpdateEnbTestExecuter(t, &context)
1037 func TestControllerUpdateEnbValidServedCellsGetNodebNotFound(t *testing.T) {
1038 context := controllerUpdateEnbTestContext{
1039 getNodebInfoResult: &getNodebInfoResult{
1041 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
1043 requestBody: getUpdateEnbRequest(""),
1044 expectedStatusCode: http.StatusNotFound,
1045 expectedJsonResponse: ResourceNotFoundJson,
1048 controllerUpdateEnbTestExecuter(t, &context)
1051 func TestControllerUpdateEnbValidServedCellsGetNodebInternalError(t *testing.T) {
1052 context := controllerUpdateEnbTestContext{
1053 getNodebInfoResult: &getNodebInfoResult{
1055 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
1057 requestBody: getUpdateEnbRequest(""),
1058 expectedStatusCode: http.StatusInternalServerError,
1059 expectedJsonResponse: RnibErrorJson,
1062 controllerUpdateEnbTestExecuter(t, &context)
1065 func TestControllerUpdateEnbGetNodebSuccessGnbTypeFailure(t *testing.T) {
1066 oldServedCells := generateServedCells("whatever1", "whatever2")
1067 context := controllerUpdateEnbTestContext{
1068 getNodebInfoResult: &getNodebInfoResult{
1069 nodebInfo: &entities.NodebInfo{
1071 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
1072 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
1073 NodeType: entities.Node_GNB,
1074 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells}},
1078 requestBody: getUpdateEnbRequest(""),
1079 expectedStatusCode: http.StatusBadRequest,
1080 expectedJsonResponse: ValidationFailureJson,
1083 controllerUpdateEnbTestExecuter(t, &context)
1086 func TestControllerUpdateEnbGetNodebSuccessRemoveServedCellsFailure(t *testing.T) {
1087 oldServedCells := generateServedCells("whatever1", "whatever2")
1088 context := controllerUpdateEnbTestContext{
1089 removeServedCellsParams: &removeServedCellsParams{
1090 err: common.NewInternalError(errors.New("#writer.RemoveServedCells - Internal Error")),
1091 servedCellInfo: oldServedCells,
1093 getNodebInfoResult: &getNodebInfoResult{
1094 nodebInfo: &entities.NodebInfo{
1096 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
1097 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
1098 NodeType: entities.Node_ENB,
1099 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells}},
1103 requestBody: getUpdateEnbRequest(""),
1104 expectedStatusCode: http.StatusInternalServerError,
1105 expectedJsonResponse: RnibErrorJson,
1108 controllerUpdateEnbTestExecuter(t, &context)
1111 func TestControllerUpdateEnbGetNodebSuccessUpdateEnbFailure(t *testing.T) {
1112 oldServedCells := generateServedCells("whatever1", "whatever2")
1113 context := controllerUpdateEnbTestContext{
1114 removeServedCellsParams: &removeServedCellsParams{
1116 servedCellInfo: oldServedCells,
1118 updateEnbCellsParams: &updateEnbCellsParams{
1119 err: common.NewInternalError(errors.New("#writer.UpdateEnb - Internal Error")),
1121 getNodebInfoResult: &getNodebInfoResult{
1122 nodebInfo: &entities.NodebInfo{
1124 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
1125 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
1126 NodeType: entities.Node_ENB,
1127 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells, EnbType: entities.EnbType_MACRO_ENB}},
1131 requestBody: getUpdateEnbRequest(""),
1132 expectedStatusCode: http.StatusInternalServerError,
1133 expectedJsonResponse: RnibErrorJson,
1136 controllerUpdateEnbTestExecuter(t, &context)
1139 func TestControllerUpdateEnbExistingEmptyCellsSuccess(t *testing.T) {
1140 oldServedCells := []*entities.ServedCellInfo{}
1141 context := controllerUpdateEnbTestContext{
1142 updateEnbCellsParams: &updateEnbCellsParams{
1145 getNodebInfoResult: &getNodebInfoResult{
1146 nodebInfo: &entities.NodebInfo{
1148 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
1149 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
1150 NodeType: entities.Node_ENB,
1151 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells, EnbType: entities.EnbType_MACRO_ENB}},
1155 requestBody: getUpdateEnbRequest(""),
1156 expectedStatusCode: http.StatusOK,
1157 expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"CONNECTED\",\"nodeType\":\"ENB\",\"enb\":{\"enbType\":\"MACRO_ENB\",\"servedCells\":[{\"pci\":1,\"cellId\":\"whatever\",\"tac\":\"whatever3\",\"broadcastPlmns\":[\"whatever\"],\"choiceEutraMode\":{\"fdd\":{}},\"eutraMode\":\"FDD\"}]},\"associatedE2tInstanceAddress\":\"10.0.2.15:38000\"}",
1160 controllerUpdateEnbTestExecuter(t, &context)
1163 func TestControllerUpdateEnbNgEnbFailure(t *testing.T) {
1165 requestBody := map[string]interface{}{
1166 "enb": map[string]interface{}{
1168 "servedCells": []interface{}{
1169 buildServedCell(""),
1173 oldServedCells := generateServedCells("whatever1", "whatever2")
1175 context := controllerUpdateEnbTestContext{
1176 getNodebInfoResult: &getNodebInfoResult{
1177 nodebInfo: &entities.NodebInfo{
1179 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
1180 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
1181 NodeType: entities.Node_ENB,
1182 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells, EnbType: entities.EnbType_MACRO_NG_ENB}},
1186 requestBody: requestBody,
1187 expectedStatusCode: http.StatusBadRequest,
1188 expectedJsonResponse: ValidationFailureJson,
1191 controllerUpdateEnbTestExecuter(t, &context)
1194 func TestControllerUpdateEnbSuccessSetupFromNwFalse(t *testing.T) {
1195 oldServedCells := generateServedCells("whatever1", "whatever2")
1196 context := controllerUpdateEnbTestContext{
1197 removeServedCellsParams: &removeServedCellsParams{
1199 servedCellInfo: oldServedCells,
1201 updateEnbCellsParams: &updateEnbCellsParams{
1204 getNodebInfoResult: &getNodebInfoResult{
1205 nodebInfo: &entities.NodebInfo{
1207 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
1208 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
1209 NodeType: entities.Node_ENB,
1210 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells, EnbType: entities.EnbType_LONG_MACRO_ENB}},
1214 requestBody: getUpdateEnbRequest(""),
1215 expectedStatusCode: http.StatusOK,
1216 expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"CONNECTED\",\"nodeType\":\"ENB\",\"enb\":{\"enbType\":\"MACRO_ENB\",\"servedCells\":[{\"pci\":1,\"cellId\":\"whatever\",\"tac\":\"whatever3\",\"broadcastPlmns\":[\"whatever\"],\"choiceEutraMode\":{\"fdd\":{}},\"eutraMode\":\"FDD\"}]},\"associatedE2tInstanceAddress\":\"10.0.2.15:38000\"}",
1219 controllerUpdateEnbTestExecuter(t, &context)
1222 func TestControllerUpdateEnbSuccessSetupFromNwTrue(t *testing.T) {
1223 oldServedCells := generateServedCells("whatever1", "whatever2")
1224 context := controllerUpdateEnbTestContext{
1225 removeServedCellsParams: &removeServedCellsParams{
1227 servedCellInfo: oldServedCells,
1229 updateEnbCellsParams: &updateEnbCellsParams{
1232 getNodebInfoResult: &getNodebInfoResult{
1233 nodebInfo: &entities.NodebInfo{
1235 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
1236 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
1237 NodeType: entities.Node_ENB,
1238 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells, EnbType: entities.EnbType_LONG_MACRO_ENB}},
1239 SetupFromNetwork: true,
1243 requestBody: getUpdateEnbRequest(""),
1244 expectedStatusCode: http.StatusOK,
1245 expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"CONNECTED\",\"nodeType\":\"ENB\",\"enb\":{\"enbType\":\"LONG_MACRO_ENB\",\"servedCells\":[{\"pci\":1,\"cellId\":\"whatever\",\"tac\":\"whatever3\",\"broadcastPlmns\":[\"whatever\"],\"choiceEutraMode\":{\"fdd\":{}},\"eutraMode\":\"FDD\"}]},\"associatedE2tInstanceAddress\":\"10.0.2.15:38000\",\"setupFromNetwork\":true}",
1248 controllerUpdateEnbTestExecuter(t, &context)
1255 func TestControllerAddEnbGetNodebInternalError(t *testing.T) {
1256 context := controllerAddEnbTestContext{
1257 getNodebInfoResult: &getNodebInfoResult{
1259 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
1261 requestBody: getAddEnbRequest(""),
1262 expectedStatusCode: http.StatusInternalServerError,
1263 expectedJsonResponse: RnibErrorJson,
1266 controllerAddEnbTestExecuter(t, &context)
1269 func TestControllerAddEnbNodebExistsFailure(t *testing.T) {
1270 context := controllerAddEnbTestContext{
1271 getNodebInfoResult: &getNodebInfoResult{
1272 nodebInfo: &entities.NodebInfo{},
1275 requestBody: getAddEnbRequest(""),
1276 expectedStatusCode: http.StatusBadRequest,
1277 expectedJsonResponse: NodebExistsJson,
1280 controllerAddEnbTestExecuter(t, &context)
1283 func TestControllerAddEnbSaveNodebFailure(t *testing.T) {
1284 context := controllerAddEnbTestContext{
1285 addEnbParams: &addEnbParams{
1286 err: common.NewInternalError(errors.New("#reader.AddEnb - Internal Error")),
1288 getNodebInfoResult: &getNodebInfoResult{
1290 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
1292 requestBody: getAddEnbRequest(""),
1293 expectedStatusCode: http.StatusInternalServerError,
1294 expectedJsonResponse: RnibErrorJson,
1297 controllerAddEnbTestExecuter(t, &context)
1300 func TestControllerAddEnbAddNbIdentityFailure(t *testing.T) {
1301 context := controllerAddEnbTestContext{
1302 addEnbParams: &addEnbParams{
1305 addNbIdentityParams: &addNbIdentityParams{
1306 err: common.NewInternalError(errors.New("#writer.addNbIdentity - Internal Error")),
1308 getNodebInfoResult: &getNodebInfoResult{
1310 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
1312 requestBody: getAddEnbRequest(""),
1313 expectedStatusCode: http.StatusInternalServerError,
1314 expectedJsonResponse: RnibErrorJson,
1317 controllerAddEnbTestExecuter(t, &context)
1320 func TestControllerAddEnbMissingRequiredRequestProps(t *testing.T) {
1322 for _, v := range AddEnbRequestRequiredFields {
1323 context := controllerAddEnbTestContext{
1324 requestBody: getAddEnbRequest(v),
1325 expectedStatusCode: http.StatusBadRequest,
1326 expectedJsonResponse: ValidationFailureJson,
1329 controllerAddEnbTestExecuter(t, &context)
1333 func TestControllerAddEnbInvalidRequest(t *testing.T) {
1334 controller, _, _, _, _, _ := setupControllerTest(t)
1335 writer := httptest.NewRecorder()
1337 // Invalid json: attribute name without quotes (should be "cause":).
1338 invalidJson := strings.NewReader("{ranName:\"whatever\"")
1339 req, _ := http.NewRequest(http.MethodPost, AddEnbUrl, invalidJson)
1341 controller.AddEnb(writer, req)
1342 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
1343 bodyBytes, _ := ioutil.ReadAll(writer.Body)
1344 assert.Equal(t, CorruptedJson, string(bodyBytes))
1348 func TestControllerAddEnbMissingRequiredGlobalNbIdProps(t *testing.T) {
1350 r := getAddEnbRequest("")
1352 for _, v := range GlobalIdRequiredFields {
1353 r["globalNbId"] = buildGlobalNbId(v)
1355 context := controllerAddEnbTestContext{
1357 expectedStatusCode: http.StatusBadRequest,
1358 expectedJsonResponse: ValidationFailureJson,
1361 controllerAddEnbTestExecuter(t, &context)
1365 func TestControllerAddEnbMissingRequiredEnbProps(t *testing.T) {
1367 r := getAddEnbRequest("")
1369 for _, v := range EnbRequiredFields {
1370 r["enb"] = buildEnb(v)
1372 context := controllerAddEnbTestContext{
1374 expectedStatusCode: http.StatusBadRequest,
1375 expectedJsonResponse: ValidationFailureJson,
1378 controllerAddEnbTestExecuter(t, &context)
1382 func TestControllerAddEnbMissingRequiredServedCellProps(t *testing.T) {
1384 r := getAddEnbRequest("")
1386 for _, v := range ServedCellRequiredFields {
1389 enbMap, _ := enb.(map[string]interface{})
1391 enbMap["servedCells"] = []interface{}{
1395 context := controllerAddEnbTestContext{
1397 expectedStatusCode: http.StatusBadRequest,
1398 expectedJsonResponse: ValidationFailureJson,
1401 controllerAddEnbTestExecuter(t, &context)
1405 func TestControllerAddEnbNgEnbFailure(t *testing.T) {
1407 requestBody := map[string]interface{}{
1409 "globalNbId": buildGlobalNbId(""),
1410 "enb": map[string]interface{}{
1412 "servedCells": []interface{}{
1413 buildServedCell(""),
1418 context := controllerAddEnbTestContext{
1419 requestBody: requestBody,
1420 expectedStatusCode: http.StatusBadRequest,
1421 expectedJsonResponse: ValidationFailureJson,
1424 controllerAddEnbTestExecuter(t, &context)
1427 func TestControllerAddEnbSuccess(t *testing.T) {
1428 context := controllerAddEnbTestContext{
1429 addEnbParams: &addEnbParams{
1432 addNbIdentityParams: &addNbIdentityParams{
1435 getNodebInfoResult: &getNodebInfoResult{
1437 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
1439 requestBody: getAddEnbRequest(""),
1440 expectedStatusCode: http.StatusCreated,
1441 expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"DISCONNECTED\",\"globalNbId\":{\"plmnId\":\"whatever\",\"nbId\":\"whatever2\"},\"nodeType\":\"ENB\",\"enb\":{\"enbType\":\"MACRO_ENB\",\"servedCells\":[{\"pci\":1,\"cellId\":\"whatever\",\"tac\":\"whatever3\",\"broadcastPlmns\":[\"whatever\"],\"choiceEutraMode\":{\"fdd\":{}},\"eutraMode\":\"FDD\"}]}}",
1444 controllerAddEnbTestExecuter(t, &context)
1447 func TestControllerDeleteEnbGetNodebInternalError(t *testing.T) {
1448 context := controllerDeleteEnbTestContext{
1449 getNodebInfoResult: &getNodebInfoResult{
1451 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
1453 expectedStatusCode: http.StatusInternalServerError,
1454 expectedJsonResponse: RnibErrorJson,
1457 controllerDeleteEnbTestExecuter(t, &context, false)
1464 func TestControllerDeleteEnbNodebNotExistsFailure(t *testing.T) {
1465 context := controllerDeleteEnbTestContext{
1466 getNodebInfoResult: &getNodebInfoResult{
1468 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found"),
1470 expectedStatusCode: http.StatusNotFound,
1471 expectedJsonResponse: ResourceNotFoundJson,
1474 controllerDeleteEnbTestExecuter(t, &context, false)
1477 func TestControllerDeleteEnbNodebNotEnb(t *testing.T) {
1478 context := controllerDeleteEnbTestContext{
1479 getNodebInfoResult: &getNodebInfoResult{
1480 nodebInfo: &entities.NodebInfo{RanName: "ran1", NodeType: entities.Node_GNB, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED},
1483 expectedStatusCode: http.StatusBadRequest,
1484 expectedJsonResponse: ValidationFailureJson,
1487 controllerDeleteEnbTestExecuter(t, &context, false)
1490 func TestControllerDeleteEnbSetupFromNetworkTrueFailure(t *testing.T) {
1491 context := controllerDeleteEnbTestContext{
1492 getNodebInfoResult: &getNodebInfoResult{
1493 nodebInfo: &entities.NodebInfo{RanName: RanName, NodeType: entities.Node_ENB, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, SetupFromNetwork: true},
1496 expectedStatusCode: http.StatusBadRequest,
1497 expectedJsonResponse: ValidationFailureJson,
1499 controllerDeleteEnbTestExecuter(t, &context, true)
1502 func TestControllerDeleteEnbSuccess(t *testing.T) {
1503 context := controllerDeleteEnbTestContext{
1504 getNodebInfoResult: &getNodebInfoResult{
1505 nodebInfo: &entities.NodebInfo{RanName: RanName, NodeType: entities.Node_ENB, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED},
1508 expectedStatusCode: http.StatusNoContent,
1509 expectedJsonResponse: "",
1511 controllerDeleteEnbTestExecuter(t, &context, true)
1514 func getJsonRequestAsBuffer(requestJson map[string]interface{}) *bytes.Buffer {
1515 b := new(bytes.Buffer)
1516 _ = json.NewEncoder(b).Encode(requestJson)
1524 func TestControllerGetNodebSuccess(t *testing.T) {
1527 context := controllerGetNodebTestContext{
1529 nodebInfo: &entities.NodebInfo{RanName: ranName, Ip: "10.0.2.15", Port: 1234},
1530 rnibError: rnibError,
1531 expectedStatusCode: http.StatusOK,
1532 expectedJsonResponse: fmt.Sprintf("{\"ranName\":\"%s\",\"ip\":\"10.0.2.15\",\"port\":1234}", ranName),
1535 controllerGetNodebTestExecuter(t, &context)
1538 func TestControllerGetNodebNotFound(t *testing.T) {
1541 var nodebInfo *entities.NodebInfo
1542 context := controllerGetNodebTestContext{
1544 nodebInfo: nodebInfo,
1545 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
1546 expectedStatusCode: http.StatusNotFound,
1547 expectedJsonResponse: ResourceNotFoundJson,
1550 controllerGetNodebTestExecuter(t, &context)
1553 func TestControllerGetNodebInternal(t *testing.T) {
1555 var nodebInfo *entities.NodebInfo
1556 context := controllerGetNodebTestContext{
1558 nodebInfo: nodebInfo,
1559 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
1560 expectedStatusCode: http.StatusInternalServerError,
1561 expectedJsonResponse: RnibErrorJson,
1564 controllerGetNodebTestExecuter(t, &context)
1567 func TestControllerGetNodebIdListSuccess(t *testing.T) {
1569 nodebIdList := []*entities.NbIdentity{
1570 {InventoryName: "test1", GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}},
1571 {InventoryName: "test2", GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}},
1574 context := controllerGetNodebIdListTestContext{
1575 nodebIdList: nodebIdList,
1576 rnibError: rnibError,
1577 expectedStatusCode: http.StatusOK,
1578 expectedJsonResponse: "[{\"inventoryName\":\"test1\",\"globalNbId\":{\"plmnId\":\"plmnId1\",\"nbId\":\"nbId1\"}},{\"inventoryName\":\"test2\",\"globalNbId\":{\"plmnId\":\"plmnId2\",\"nbId\":\"nbId2\"}}][{\"inventoryName\":\"test2\",\"globalNbId\":{\"plmnId\":\"plmnId2\",\"nbId\":\"nbId2\"}},{\"inventoryName\":\"test1\",\"globalNbId\":{\"plmnId\":\"plmnId1\",\"nbId\":\"nbId1\"}}]",
1581 controllerGetNodebIdListTestExecuter(t, &context)
1584 func TestControllerGetNodebIdListEmptySuccess(t *testing.T) {
1586 var nodebIdList []*entities.NbIdentity
1588 context := controllerGetNodebIdListTestContext{
1589 nodebIdList: nodebIdList,
1590 rnibError: rnibError,
1591 expectedStatusCode: http.StatusOK,
1592 expectedJsonResponse: "[]",
1595 controllerGetNodebIdListTestExecuter(t, &context)
1598 func TestHeaderValidationFailed(t *testing.T) {
1599 controller, _, _, _, _, _ := setupControllerTest(t)
1601 writer := httptest.NewRecorder()
1603 header := &http.Header{}
1605 controller.handleRequest(writer, header, httpmsghandlerprovider.ShutdownRequest, nil, true, 0)
1607 var errorResponse = parseJsonRequest(t, writer.Body)
1608 err := e2managererrors.NewHeaderValidationError()
1610 assert.Equal(t, http.StatusUnsupportedMediaType, writer.Result().StatusCode)
1611 assert.Equal(t, errorResponse.Code, err.Code)
1612 assert.Equal(t, errorResponse.Message, err.Message)
1615 func TestShutdownStatusNoContent(t *testing.T) {
1616 controller, readerMock, _, _, e2tInstancesManagerMock, _ := setupControllerTest(t)
1617 e2tInstancesManagerMock.On("GetE2TAddresses").Return([]string{}, nil)
1618 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, nil)
1620 writer := httptest.NewRecorder()
1621 controller.Shutdown(writer, tests.GetHttpRequest())
1623 assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
1626 func TestHandleInternalError(t *testing.T) {
1627 controller, _, _, _, _, _ := setupControllerTest(t)
1629 writer := httptest.NewRecorder()
1630 err := e2managererrors.NewInternalError()
1632 controller.handleErrorResponse(err, writer)
1633 var errorResponse = parseJsonRequest(t, writer.Body)
1635 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
1636 assert.Equal(t, errorResponse.Code, err.Code)
1637 assert.Equal(t, errorResponse.Message, err.Message)
1640 func TestHandleCommandAlreadyInProgressError(t *testing.T) {
1641 controller, _, _, _, _, _ := setupControllerTest(t)
1642 writer := httptest.NewRecorder()
1643 err := e2managererrors.NewCommandAlreadyInProgressError()
1645 controller.handleErrorResponse(err, writer)
1646 var errorResponse = parseJsonRequest(t, writer.Body)
1648 assert.Equal(t, http.StatusMethodNotAllowed, writer.Result().StatusCode)
1649 assert.Equal(t, errorResponse.Code, err.Code)
1650 assert.Equal(t, errorResponse.Message, err.Message)
1653 func TestHandleRoutingManagerError(t *testing.T) {
1654 controller, _, _, _, _, _ := setupControllerTest(t)
1655 writer := httptest.NewRecorder()
1656 err := e2managererrors.NewRoutingManagerError()
1658 controller.handleErrorResponse(err, writer)
1659 var errorResponse = parseJsonRequest(t, writer.Body)
1661 assert.Equal(t, http.StatusServiceUnavailable, writer.Result().StatusCode)
1662 assert.Equal(t, errorResponse.Code, err.Code)
1663 assert.Equal(t, errorResponse.Message, err.Message)
1666 func TestHandleE2TInstanceAbsenceError(t *testing.T) {
1667 controller, _, _, _, _, _ := setupControllerTest(t)
1669 writer := httptest.NewRecorder()
1670 err := e2managererrors.NewE2TInstanceAbsenceError()
1672 controller.handleErrorResponse(err, writer)
1673 var errorResponse = parseJsonRequest(t, writer.Body)
1675 assert.Equal(t, http.StatusServiceUnavailable, writer.Result().StatusCode)
1676 assert.Equal(t, errorResponse.Code, err.Code)
1677 assert.Equal(t, errorResponse.Message, err.Message)
1680 func TestValidateHeaders(t *testing.T) {
1681 controller, _, _, _, _, _ := setupControllerTest(t)
1683 header := http.Header{}
1684 header.Set("Content-Type", "application/json")
1685 result := controller.validateRequestHeader(&header)
1687 assert.Nil(t, result)
1690 func parseJsonRequest(t *testing.T, r io.Reader) models.ErrorResponse {
1692 var errorResponse models.ErrorResponse
1693 body, err := ioutil.ReadAll(r)
1695 t.Errorf("Error cannot deserialize json request")
1697 _ = json.Unmarshal(body, &errorResponse)
1699 return errorResponse
1702 func initLog(t *testing.T) *logger.Logger {
1703 log, err := logger.InitLogger(logger.InfoLevel)
1705 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)
1710 func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) {
1711 controller, readerMock, _, rmrMessengerMock, _, _ := setupControllerTest(t)
1714 payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x40}
1716 var msgSrc unsafe.Pointer
1717 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc)
1718 rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil)
1720 writer := httptest.NewRecorder()
1722 var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
1723 readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
1725 data4Req := map[string]interface{}{"cause": "protocol:transfer-syntax-error"}
1726 b := new(bytes.Buffer)
1727 _ = json.NewEncoder(b).Encode(data4Req)
1728 req, _ := http.NewRequest("PUT", "https://localhost:3800/nodeb-reset", b)
1729 req = mux.SetURLVars(req, map[string]string{"ranName": ranName})
1731 controller.X2Reset(writer, req)
1732 assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
1736 func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) {
1737 controller, readerMock, _, rmrMessengerMock, _, _ := setupControllerTest(t)
1741 payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64}
1743 var msgSrc unsafe.Pointer
1744 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc)
1745 rmrMessengerMock.On("SendMsg", msg, true).Return(msg, nil)
1747 writer := httptest.NewRecorder()
1749 var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
1750 readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
1753 b := new(bytes.Buffer)
1754 data4Req := map[string]interface{}{}
1755 _ = json.NewEncoder(b).Encode(data4Req)
1756 req, _ := http.NewRequest("PUT", "https://localhost:3800/nodeb-reset", b)
1757 req = mux.SetURLVars(req, map[string]string{"ranName": ranName})
1759 controller.X2Reset(writer, req)
1760 assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
1763 func TestX2ResetHandleFailureInvalidBody(t *testing.T) {
1764 controller, _, _, _, _, _ := setupControllerTest(t)
1768 writer := httptest.NewRecorder()
1770 // Invalid json: attribute name without quotes (should be "cause":).
1771 b := strings.NewReader("{cause:\"protocol:transfer-syntax-error\"")
1772 req, _ := http.NewRequest("PUT", "https://localhost:3800/nodeb-reset", b)
1773 req = mux.SetURLVars(req, map[string]string{"ranName": ranName})
1775 controller.X2Reset(writer, req)
1776 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
1780 func TestHandleErrorResponse(t *testing.T) {
1781 controller, _, _, _, _, _ := setupControllerTest(t)
1783 writer := httptest.NewRecorder()
1784 controller.handleErrorResponse(e2managererrors.NewRnibDbError(), writer)
1785 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
1787 writer = httptest.NewRecorder()
1788 controller.handleErrorResponse(e2managererrors.NewCommandAlreadyInProgressError(), writer)
1789 assert.Equal(t, http.StatusMethodNotAllowed, writer.Result().StatusCode)
1791 writer = httptest.NewRecorder()
1792 controller.handleErrorResponse(e2managererrors.NewHeaderValidationError(), writer)
1793 assert.Equal(t, http.StatusUnsupportedMediaType, writer.Result().StatusCode)
1795 writer = httptest.NewRecorder()
1796 controller.handleErrorResponse(e2managererrors.NewWrongStateError("", ""), writer)
1797 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
1799 writer = httptest.NewRecorder()
1800 controller.handleErrorResponse(e2managererrors.NewRequestValidationError(), writer)
1801 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
1803 writer = httptest.NewRecorder()
1804 controller.handleErrorResponse(e2managererrors.NewRmrError(), writer)
1805 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
1807 writer = httptest.NewRecorder()
1808 controller.handleErrorResponse(e2managererrors.NewNoConnectedRanError(), writer)
1809 assert.Equal(t, http.StatusNotFound, writer.Result().StatusCode)
1811 writer = httptest.NewRecorder()
1812 controller.handleErrorResponse(e2managererrors.NewResourceNotFoundError(), writer)
1813 assert.Equal(t, http.StatusNotFound, writer.Result().StatusCode)
1815 writer = httptest.NewRecorder()
1816 controller.handleErrorResponse(fmt.Errorf("ErrorError"), writer)
1817 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
1820 func getRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
1821 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
1822 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
1823 return rmrsender.NewRmrSender(log, rmrMessenger)