X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=E2Manager%2Fcontrollers%2Fnodeb_controller_test.go;h=4bdfd2c4fc5b29b5031bf58cffecddfaac2670b1;hb=3ae760f4378ea43575eca6e83ccc01084566e7cf;hp=4716e75af2b5009949273493d6ae164db108ad3d;hpb=b3805a9d29e2c7f6f14e3fedfa1ba504f734eea9;p=ric-plt%2Fe2mgr.git diff --git a/E2Manager/controllers/nodeb_controller_test.go b/E2Manager/controllers/nodeb_controller_test.go index 4716e75..4bdfd2c 100644 --- a/E2Manager/controllers/nodeb_controller_test.go +++ b/E2Manager/controllers/nodeb_controller_test.go @@ -38,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" @@ -57,6 +58,7 @@ const ( 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 ( @@ -84,8 +86,13 @@ type getNodebInfoResult struct { rnibError error } +type updateGnbCellsParams struct { + err error +} + type controllerUpdateGnbTestContext struct { getNodebInfoResult *getNodebInfoResult + updateGnbCellsParams *updateGnbCellsParams requestBody map[string]interface{} expectedStatusCode int expectedJsonResponse string @@ -175,10 +182,9 @@ func TestX2SetupSuccess(t *testing.T) { 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 @@ -207,10 +213,9 @@ func TestEndcSetupSuccess(t *testing.T) { 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 @@ -268,23 +273,53 @@ func controllerGetNodebIdListTestExecuter(t *testing.T, context *controllerGetNo assert.Equal(t, context.expectedJsonResponse, string(bodyBytes)) } -func controllerUpdateGnbTestExecuter(t *testing.T, context *controllerUpdateGnbTestContext) { - controller, readerMock, _, _, _ := setupControllerTest(t) - writer := httptest.NewRecorder() - +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.updateGnbCellsParams != nil { + updatedNodebInfo := *context.getNodebInfoResult.nodebInfo + gnb := entities.Gnb{} + _ = jsonpb.Unmarshal(getJsonRequestAsBuffer(context.requestBody), &gnb) + updatedNodebInfo.GetGnb().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") + } +} + +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) - assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode) - bodyBytes, _ := ioutil.ReadAll(writer.Body) - assert.Equal(t, context.expectedJsonResponse, string(bodyBytes)) + assertControllerUpdateGnb(t, context, writer, readerMock, writerMock) } func TestControllerUpdateGnbEmptyServedNrCells(t *testing.T) { @@ -370,7 +405,7 @@ func TestControllerUpdateGnbMissingNeighbourInfoFddOrTdd(t *testing.T) { "servedNrCells": []interface{}{ map[string]interface{}{ "servedNrCellInformation": buildServedNrCellInformation(""), - "nrNeighbourInfos": []interface{}{ + "nrNeighbourInfos": []interface{}{ nrNeighbourInfo, }, }, @@ -392,7 +427,7 @@ func TestControllerUpdateGnbMissingNrNeighbourInformationRequiredProp(t *testing "servedNrCells": []interface{}{ map[string]interface{}{ "servedNrCellInformation": buildServedNrCellInformation(""), - "nrNeighbourInfos": []interface{}{ + "nrNeighbourInfos": []interface{}{ buildNrNeighbourInformation(v), }, }, @@ -406,34 +441,31 @@ func TestControllerUpdateGnbMissingNrNeighbourInformationRequiredProp(t *testing } } -func TestControllerUpdateGnbValidServedNrCellInformationAndNrNeighbourInfoGetNodebSuccess(t *testing.T) { +func TestControllerUpdateGnbValidServedNrCellInformationGetNodebNotFound(t *testing.T) { context := controllerUpdateGnbTestContext{ getNodebInfoResult: &getNodebInfoResult{ - nodebInfo: &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress}, - rnibError: nil, + nodebInfo: nil, + rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"), }, requestBody: map[string]interface{}{ "servedNrCells": []interface{}{ map[string]interface{}{ "servedNrCellInformation": buildServedNrCellInformation(""), - "nrNeighbourInfos": []interface{}{ - buildNrNeighbourInformation(""), - }, }, }, }, - expectedStatusCode: http.StatusOK, - expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"CONNECTED\",\"associatedE2tInstanceAddress\":\"10.0.2.15:38000\"}", + expectedStatusCode: http.StatusNotFound, + expectedJsonResponse: ResourceNotFoundJson, } controllerUpdateGnbTestExecuter(t, &context) } -func TestControllerUpdateGnbValidServedNrCellInformationGetNodebNotFound(t *testing.T) { +func TestControllerUpdateGnbValidServedNrCellInformationGetNodebInternalError(t *testing.T) { context := controllerUpdateGnbTestContext{ getNodebInfoResult: &getNodebInfoResult{ nodebInfo: nil, - rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"), + rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")), }, requestBody: map[string]interface{}{ "servedNrCells": []interface{}{ @@ -442,23 +474,61 @@ func TestControllerUpdateGnbValidServedNrCellInformationGetNodebNotFound(t *test }, }, }, - expectedStatusCode: http.StatusNotFound, - expectedJsonResponse: ResourceNotFoundJson, + expectedStatusCode: http.StatusInternalServerError, + expectedJsonResponse: RnibErrorJson, } controllerUpdateGnbTestExecuter(t, &context) } -func TestControllerUpdateGnbValidServedNrCellInformationGetNodebInternalError(t *testing.T) { +func TestControllerUpdateGnbGetNodebSuccessInvalidGnbConfiguration(t *testing.T) { context := controllerUpdateGnbTestContext{ getNodebInfoResult: &getNodebInfoResult{ - nodebInfo: nil, - rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")), + 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 TestControllerUpdateGnbGetNodebSuccessUpdateGnbCellsFailure(t *testing.T) { + context := controllerUpdateGnbTestContext{ + 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{}}, + }, + rnibError: nil, }, requestBody: map[string]interface{}{ "servedNrCells": []interface{}{ map[string]interface{}{ "servedNrCellInformation": buildServedNrCellInformation(""), + "nrNeighbourInfos": []interface{}{ + buildNrNeighbourInformation(""), + }, }, }, }, @@ -469,6 +539,37 @@ func TestControllerUpdateGnbValidServedNrCellInformationGetNodebInternalError(t 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)