X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=E2Manager%2Fcontrollers%2Fnodeb_controller_test.go;h=c61249ede8774a93b7620c5f5e0efb711e9698e6;hb=d916e2aef4c415d9865643fafa8c181a9fdfd65b;hp=e0c392f9d07baed726b980b91b33d69d28639b53;hpb=e597612ca39c11bb5b562b9e492e5340a618dba9;p=ric-plt%2Fe2mgr.git diff --git a/E2Manager/controllers/nodeb_controller_test.go b/E2Manager/controllers/nodeb_controller_test.go index e0c392f..c61249e 100644 --- a/E2Manager/controllers/nodeb_controller_test.go +++ b/E2Manager/controllers/nodeb_controller_test.go @@ -17,7 +17,6 @@ // This source code is part of the near-RT RIC (RAN Intelligent Controller) // platform project (RICP). - package controllers import ( @@ -39,6 +38,7 @@ import ( "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" + "github.com/golang/protobuf/jsonpb" "github.com/gorilla/mux" "github.com/pkg/errors" "github.com/stretchr/testify/assert" @@ -49,6 +49,21 @@ import ( "net/http/httptest" "strings" "testing" + "unsafe" +) + +const ( + RanName = "test" + AssociatedE2TInstanceAddress = "10.0.2.15:38000" + ValidationFailureJson = "{\"errorCode\":402,\"errorMessage\":\"Validation error\"}" + ResourceNotFoundJson = "{\"errorCode\":404,\"errorMessage\":\"Resource not found\"}" + RnibErrorJson = "{\"errorCode\":500,\"errorMessage\":\"RNIB error\"}" + InternalErrorJson = "{\"errorCode\":501,\"errorMessage\":\"Internal Server Error. Please try again later\"}" +) + +var ( + ServedNrCellInformationRequiredFields = []string{"cellId", "choiceNrMode", "nrMode", "nrPci", "servedPlmns"} + NrNeighbourInformationRequiredFields = []string{"nrCgi", "choiceNrMode", "nrMode", "nrPci"} ) type controllerGetNodebTestContext struct { @@ -66,6 +81,87 @@ type controllerGetNodebIdListTestContext struct { expectedJsonResponse string } +type getNodebInfoResult struct { + nodebInfo *entities.NodebInfo + rnibError error +} + +type updateGnbCellsParams struct { + err error +} + +type removeServedNrCellsParams struct { + servedNrCells []*entities.ServedNRCell + err error +} + +type controllerUpdateGnbTestContext struct { + getNodebInfoResult *getNodebInfoResult + removeServedNrCellsParams *removeServedNrCellsParams + updateGnbCellsParams *updateGnbCellsParams + requestBody map[string]interface{} + expectedStatusCode int + expectedJsonResponse string +} + +func generateServedNrCells(cellIds ...string) []*entities.ServedNRCell { + + servedNrCells := []*entities.ServedNRCell{} + + for _, v := range cellIds { + servedNrCells = append(servedNrCells, &entities.ServedNRCell{ServedNrCellInformation: &entities.ServedNRCellInformation{ + CellId: v, + ChoiceNrMode: &entities.ServedNRCellInformation_ChoiceNRMode{ + Fdd: &entities.ServedNRCellInformation_ChoiceNRMode_FddInfo{ + + }, + }, + NrMode: entities.Nr_FDD, + NrPci: 5, + ServedPlmns: []string{"whatever"}, + }}) + } + + return servedNrCells +} + +func buildNrNeighbourInformation(propToOmit string) map[string]interface{} { + ret := map[string]interface{}{ + "nrCgi": "whatever", + "choiceNrMode": map[string]interface{}{ + "tdd": map[string]interface{}{}, + }, + "nrMode": 1, + "nrPci": 1, + } + + if len(propToOmit) != 0 { + delete(ret, propToOmit) + } + + return ret +} + +func buildServedNrCellInformation(propToOmit string) map[string]interface{} { + ret := map[string]interface{}{ + "cellId": "whatever", + "choiceNrMode": map[string]interface{}{ + "fdd": map[string]interface{}{}, + }, + "nrMode": 1, + "nrPci": 1, + "servedPlmns": []interface{}{ + "whatever", + }, + } + + if len(propToOmit) != 0 { + delete(ret, propToOmit) + } + + return ret +} + func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock) { log := initLog(t) config := configuration.ParseConfiguration() @@ -82,7 +178,7 @@ func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock, httpClientMock := &mocks.HttpClientMock{} rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient) - handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, ranSetupManager, e2tInstancesManager, e2tAssociationManager) + handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, ranSetupManager, e2tInstancesManager, e2tAssociationManager, rmClient) controller := NewNodebController(log, handlerProvider) return controller, readerMock, writerMock, rmrMessengerMock, e2tInstancesManager } @@ -110,18 +206,18 @@ func TestX2SetupSuccess(t *testing.T) { controller, readerMock, writerMock, rmrMessengerMock, _ := setupControllerTest(t) ranName := "test" - nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress:"10.0.2.15:8989"} + nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"} readerMock.On("GetNodeb", ranName).Return(nb, nil) var nbUpdated = *nb - nbUpdated.ConnectionAttempts = 0 writerMock.On("UpdateNodebInfo", &nbUpdated).Return(nil) - var nbUpdated2 = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1, AssociatedE2TInstanceAddress:"10.0.2.15:8989"} + var nbUpdated2 = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"} writerMock.On("UpdateNodebInfo", nbUpdated2).Return(nil) payload := e2pdus.PackedX2setupRequest var xAction []byte - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction) + var msgSrc unsafe.Pointer + msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc) rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) @@ -136,24 +232,23 @@ func TestX2SetupSuccess(t *testing.T) { assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode) } - func TestEndcSetupSuccess(t *testing.T) { controller, readerMock, writerMock, rmrMessengerMock, _ := setupControllerTest(t) ranName := "test" - nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress:"10.0.2.15:8989"} + nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"} readerMock.On("GetNodeb", ranName).Return(nb, nil) var nbUpdated = *nb - nbUpdated.ConnectionAttempts = 0 writerMock.On("UpdateNodebInfo", &nbUpdated).Return(nil) - var nbUpdated2 = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1, AssociatedE2TInstanceAddress:"10.0.2.15:8989"} + var nbUpdated2 = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"} writerMock.On("UpdateNodebInfo", nbUpdated2).Return(nil) payload := e2pdus.PackedEndcX2setupRequest - var xAction[]byte - msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction) + var xAction []byte + var msgSrc unsafe.Pointer + msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc) rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) @@ -169,11 +264,8 @@ func TestEndcSetupSuccess(t *testing.T) { } func TestShutdownHandlerRnibError(t *testing.T) { - controller, readerMock, _, _, _ := setupControllerTest(t) - - rnibErr := &common.ResourceNotFoundError{} - var nbIdentityList []*entities.NbIdentity - readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibErr) + controller, _, _, _, e2tInstancesManagerMock := setupControllerTest(t) + e2tInstancesManagerMock.On("GetE2TAddresses").Return([]string{}, e2managererrors.NewRnibDbError()) writer := httptest.NewRecorder() @@ -189,7 +281,7 @@ func controllerGetNodebTestExecuter(t *testing.T, context *controllerGetNodebTes controller, readerMock, _, _, _ := setupControllerTest(t) writer := httptest.NewRecorder() readerMock.On("GetNodeb", context.ranName).Return(context.nodebInfo, context.rnibError) - req, _ := http.NewRequest("GET", "/nodeb", nil) + req, _ := http.NewRequest(http.MethodGet, "/nodeb", nil) req = mux.SetURLVars(req, map[string]string{"ranName": context.ranName}) controller.GetNodeb(writer, req) assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode) @@ -201,13 +293,363 @@ func controllerGetNodebIdListTestExecuter(t *testing.T, context *controllerGetNo controller, readerMock, _, _, _ := setupControllerTest(t) writer := httptest.NewRecorder() readerMock.On("GetListNodebIds").Return(context.nodebIdList, context.rnibError) - req, _ := http.NewRequest("GET", "/nodeb/ids", nil) + req, _ := http.NewRequest(http.MethodGet, "/nodeb/ids", nil) controller.GetNodebIdList(writer, req) assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode) bodyBytes, _ := ioutil.ReadAll(writer.Body) assert.Equal(t, context.expectedJsonResponse, string(bodyBytes)) } +func activateControllerUpdateGnbMocks(context *controllerUpdateGnbTestContext, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) { + if context.getNodebInfoResult != nil { + readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError) + } + + if context.removeServedNrCellsParams != nil { + writerMock.On("RemoveServedNrCells", RanName, context.removeServedNrCellsParams.servedNrCells).Return(context.removeServedNrCellsParams.err) + } + + if context.updateGnbCellsParams != nil { + updatedNodebInfo := *context.getNodebInfoResult.nodebInfo + gnb := entities.Gnb{} + _ = jsonpb.Unmarshal(getJsonRequestAsBuffer(context.requestBody), &gnb) + updatedGnb := *updatedNodebInfo.GetGnb() + updatedGnb.ServedNrCells = gnb.ServedNrCells + writerMock.On("UpdateGnbCells", &updatedNodebInfo, gnb.ServedNrCells).Return(context.updateGnbCellsParams.err) + } +} + +func assertControllerUpdateGnb(t *testing.T, context *controllerUpdateGnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) { + assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode) + bodyBytes, _ := ioutil.ReadAll(writer.Body) + assert.Equal(t, context.expectedJsonResponse, string(bodyBytes)) + readerMock.AssertExpectations(t) + writerMock.AssertExpectations(t) + + if context.getNodebInfoResult != nil { + readerMock.AssertNotCalled(t, "GetNodeb") + } + + if context.updateGnbCellsParams != nil { + writerMock.AssertNotCalled(t, "UpdateGnb") + } + + if context.removeServedNrCellsParams != nil { + writerMock.AssertNotCalled(t, "RemoveServedNrCells") + } +} + +func buildUpdateGnbRequest(context *controllerUpdateGnbTestContext) *http.Request { + updateGnbUrl := fmt.Sprintf("/nodeb/%s/update", RanName) + requestBody := getJsonRequestAsBuffer(context.requestBody) + req, _ := http.NewRequest(http.MethodGet, updateGnbUrl, requestBody) + req.Header.Set("Content-Type", "application/json") + req = mux.SetURLVars(req, map[string]string{"ranName": RanName}) + return req +} + +func controllerUpdateGnbTestExecuter(t *testing.T, context *controllerUpdateGnbTestContext) { + controller, readerMock, writerMock, _, _ := setupControllerTest(t) + writer := httptest.NewRecorder() + + activateControllerUpdateGnbMocks(context, readerMock, writerMock) + req := buildUpdateGnbRequest(context) + controller.UpdateGnb(writer, req) + assertControllerUpdateGnb(t, context, writer, readerMock, writerMock) +} + +func TestControllerUpdateGnbEmptyServedNrCells(t *testing.T) { + context := controllerUpdateGnbTestContext{ + getNodebInfoResult: nil, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + }, + }, + expectedStatusCode: http.StatusBadRequest, + expectedJsonResponse: ValidationFailureJson, + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func TestControllerUpdateGnbMissingServedNrCellInformation(t *testing.T) { + context := controllerUpdateGnbTestContext{ + getNodebInfoResult: nil, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": nil, + }, + }, + }, + expectedStatusCode: http.StatusBadRequest, + expectedJsonResponse: ValidationFailureJson, + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func TestControllerUpdateGnbMissingServedNrCellRequiredProp(t *testing.T) { + + for _, v := range ServedNrCellInformationRequiredFields { + context := controllerUpdateGnbTestContext{ + getNodebInfoResult: nil, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": buildServedNrCellInformation(v), + }, + }, + }, + expectedStatusCode: http.StatusBadRequest, + expectedJsonResponse: ValidationFailureJson, + } + + controllerUpdateGnbTestExecuter(t, &context) + } +} + +func TestControllerUpdateGnbMissingServedNrCellFddOrTdd(t *testing.T) { + + servedNrCellInformation := buildServedNrCellInformation("") + servedNrCellInformation["choiceNrMode"] = map[string]interface{}{} + + context := controllerUpdateGnbTestContext{ + getNodebInfoResult: nil, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": servedNrCellInformation, + }, + }, + }, + expectedStatusCode: http.StatusBadRequest, + expectedJsonResponse: ValidationFailureJson, + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func TestControllerUpdateGnbMissingNeighbourInfoFddOrTdd(t *testing.T) { + + nrNeighbourInfo := buildNrNeighbourInformation("") + nrNeighbourInfo["choiceNrMode"] = map[string]interface{}{} + + context := controllerUpdateGnbTestContext{ + getNodebInfoResult: nil, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": buildServedNrCellInformation(""), + "nrNeighbourInfos": []interface{}{ + nrNeighbourInfo, + }, + }, + }, + }, + expectedStatusCode: http.StatusBadRequest, + expectedJsonResponse: ValidationFailureJson, + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func TestControllerUpdateGnbMissingNrNeighbourInformationRequiredProp(t *testing.T) { + + for _, v := range NrNeighbourInformationRequiredFields { + context := controllerUpdateGnbTestContext{ + getNodebInfoResult: nil, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": buildServedNrCellInformation(""), + "nrNeighbourInfos": []interface{}{ + buildNrNeighbourInformation(v), + }, + }, + }, + }, + expectedStatusCode: http.StatusBadRequest, + expectedJsonResponse: ValidationFailureJson, + } + + controllerUpdateGnbTestExecuter(t, &context) + } +} + +func TestControllerUpdateGnbValidServedNrCellInformationGetNodebNotFound(t *testing.T) { + context := controllerUpdateGnbTestContext{ + getNodebInfoResult: &getNodebInfoResult{ + nodebInfo: nil, + rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"), + }, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": buildServedNrCellInformation(""), + }, + }, + }, + expectedStatusCode: http.StatusNotFound, + expectedJsonResponse: ResourceNotFoundJson, + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func TestControllerUpdateGnbValidServedNrCellInformationGetNodebInternalError(t *testing.T) { + context := controllerUpdateGnbTestContext{ + getNodebInfoResult: &getNodebInfoResult{ + nodebInfo: nil, + rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")), + }, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": buildServedNrCellInformation(""), + }, + }, + }, + expectedStatusCode: http.StatusInternalServerError, + expectedJsonResponse: RnibErrorJson, + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func TestControllerUpdateGnbGetNodebSuccessInvalidGnbConfiguration(t *testing.T) { + context := controllerUpdateGnbTestContext{ + getNodebInfoResult: &getNodebInfoResult{ + nodebInfo: &entities.NodebInfo{ + RanName: RanName, + ConnectionStatus: entities.ConnectionStatus_CONNECTED, + AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress, + }, + rnibError: nil, + }, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": buildServedNrCellInformation(""), + "nrNeighbourInfos": []interface{}{ + buildNrNeighbourInformation(""), + }, + }, + }, + }, + expectedStatusCode: http.StatusInternalServerError, + expectedJsonResponse: InternalErrorJson, + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func TestControllerUpdateGnbGetNodebSuccessRemoveServedNrCellsFailure(t *testing.T) { + oldServedNrCells := generateServedNrCells("whatever1","whatever2") + context := controllerUpdateGnbTestContext{ + removeServedNrCellsParams: &removeServedNrCellsParams{ + err: common.NewInternalError(errors.New("#writer.UpdateGnbCells - Internal Error")), + servedNrCells: oldServedNrCells, + }, + getNodebInfoResult: &getNodebInfoResult{ + nodebInfo: &entities.NodebInfo{ + RanName: RanName, + ConnectionStatus: entities.ConnectionStatus_CONNECTED, + AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress, + Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{ServedNrCells: oldServedNrCells}}, + }, + rnibError: nil, + }, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": buildServedNrCellInformation(""), + "nrNeighbourInfos": []interface{}{ + buildNrNeighbourInformation(""), + }, + }, + }, + }, + expectedStatusCode: http.StatusInternalServerError, + expectedJsonResponse: RnibErrorJson, + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func TestControllerUpdateGnbGetNodebSuccessUpdateGnbCellsFailure(t *testing.T) { + oldServedNrCells := generateServedNrCells("whatever1","whatever2") + context := controllerUpdateGnbTestContext{ + removeServedNrCellsParams: &removeServedNrCellsParams{ + err: nil, + servedNrCells: oldServedNrCells, + }, + updateGnbCellsParams: &updateGnbCellsParams{ + err: common.NewInternalError(errors.New("#writer.UpdateGnbCells - Internal Error")), + }, + getNodebInfoResult: &getNodebInfoResult{ + nodebInfo: &entities.NodebInfo{ + RanName: RanName, + ConnectionStatus: entities.ConnectionStatus_CONNECTED, + AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress, + Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{ServedNrCells: oldServedNrCells}}, + }, + rnibError: nil, + }, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": buildServedNrCellInformation(""), + "nrNeighbourInfos": []interface{}{ + buildNrNeighbourInformation(""), + }, + }, + }, + }, + expectedStatusCode: http.StatusInternalServerError, + expectedJsonResponse: RnibErrorJson, + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func TestControllerUpdateGnbSuccess(t *testing.T) { + context := controllerUpdateGnbTestContext{ + updateGnbCellsParams: &updateGnbCellsParams{ + err: nil, + }, + getNodebInfoResult: &getNodebInfoResult{ + nodebInfo: &entities.NodebInfo{ + RanName: RanName, + ConnectionStatus: entities.ConnectionStatus_CONNECTED, + AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress, + Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}}, + }, + rnibError: nil, + }, + requestBody: map[string]interface{}{ + "servedNrCells": []interface{}{ + map[string]interface{}{ + "servedNrCellInformation": buildServedNrCellInformation(""), + "nrNeighbourInfos": []interface{}{ + buildNrNeighbourInformation(""), + }, + }, + }, + }, + expectedStatusCode: http.StatusOK, + expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"CONNECTED\",\"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\"}", + } + + controllerUpdateGnbTestExecuter(t, &context) +} + +func getJsonRequestAsBuffer(requestJson map[string]interface{}) *bytes.Buffer { + b := new(bytes.Buffer) + _ = json.NewEncoder(b).Encode(requestJson) + return b; +} + func TestControllerGetNodebSuccess(t *testing.T) { ranName := "test" var rnibError error @@ -231,7 +673,7 @@ func TestControllerGetNodebNotFound(t *testing.T) { nodebInfo: nodebInfo, rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"), expectedStatusCode: http.StatusNotFound, - expectedJsonResponse: "{\"errorCode\":404,\"errorMessage\":\"Resource not found\"}", + expectedJsonResponse: ResourceNotFoundJson, } controllerGetNodebTestExecuter(t, &context) @@ -245,7 +687,7 @@ func TestControllerGetNodebInternal(t *testing.T) { nodebInfo: nodebInfo, rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")), expectedStatusCode: http.StatusInternalServerError, - expectedJsonResponse: "{\"errorCode\":500,\"errorMessage\":\"RNIB error\"}", + expectedJsonResponse: RnibErrorJson, } controllerGetNodebTestExecuter(t, &context) @@ -288,7 +730,7 @@ func TestControllerGetNodebIdListInternal(t *testing.T) { nodebIdList: nodebIdList, rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")), expectedStatusCode: http.StatusInternalServerError, - expectedJsonResponse: "{\"errorCode\":500,\"errorMessage\":\"RNIB error\"}", + expectedJsonResponse: RnibErrorJson, } controllerGetNodebIdListTestExecuter(t, &context) @@ -312,11 +754,9 @@ func TestHeaderValidationFailed(t *testing.T) { } func TestShutdownStatusNoContent(t *testing.T) { - controller, readerMock, _, _, _ := setupControllerTest(t) - - var rnibError error - nbIdentityList := []*entities.NbIdentity{} - readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibError) + controller, readerMock, _, _, e2tInstancesManagerMock := setupControllerTest(t) + e2tInstancesManagerMock.On("GetE2TAddresses").Return([]string{}, nil) + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, nil) writer := httptest.NewRecorder() controller.Shutdown(writer, tests.GetHttpRequest()) @@ -351,6 +791,19 @@ func TestHandleCommandAlreadyInProgressError(t *testing.T) { assert.Equal(t, errorResponse.Message, err.Message) } +func TestHandleRoutingManagerError(t *testing.T) { + controller, _, _, _, _ := setupControllerTest(t) + writer := httptest.NewRecorder() + err := e2managererrors.NewRoutingManagerError() + + controller.handleErrorResponse(err, writer) + var errorResponse = parseJsonRequest(t, writer.Body) + + assert.Equal(t, http.StatusServiceUnavailable, writer.Result().StatusCode) + assert.Equal(t, errorResponse.Code, err.Code) + assert.Equal(t, errorResponse.Message, err.Message) +} + func TestHandleE2TInstanceAbsenceError(t *testing.T) { controller, _, _, _, _ := setupControllerTest(t) @@ -382,7 +835,7 @@ func parseJsonRequest(t *testing.T, r io.Reader) models.ErrorResponse { if err != nil { t.Errorf("Error cannot deserialize json request") } - json.Unmarshal(body, &errorResponse) + _ =json.Unmarshal(body, &errorResponse) return errorResponse } @@ -401,7 +854,8 @@ func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) { ranName := "test1" payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x40} var xAction []byte - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction) + var msgSrc unsafe.Pointer + msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc) rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil) writer := httptest.NewRecorder() @@ -427,7 +881,8 @@ func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) { // o&m intervention payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64} var xAction []byte - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction) + var msgSrc unsafe.Pointer + msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc) rmrMessengerMock.On("SendMsg", msg, true).Return(msg, nil) writer := httptest.NewRecorder() @@ -446,7 +901,7 @@ func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) { } func TestX2ResetHandleFailureInvalidBody(t *testing.T) { - controller, _, _, _ , _:= setupControllerTest(t) + controller, _, _, _, _ := setupControllerTest(t) ranName := "test1" @@ -463,7 +918,7 @@ func TestX2ResetHandleFailureInvalidBody(t *testing.T) { } func TestHandleErrorResponse(t *testing.T) { - controller, _, _, _ , _:= setupControllerTest(t) + controller, _, _, _, _ := setupControllerTest(t) writer := httptest.NewRecorder() controller.handleErrorResponse(e2managererrors.NewRnibDbError(), writer)