[RIC-431] Update release tag
[ric-plt/e2mgr.git] / E2Manager / controllers / nodeb_controller_test.go
index 0cbeb50..fc59673 100644 (file)
@@ -54,6 +54,7 @@ import (
 const (
        RanName                      = "test"
        AssociatedE2TInstanceAddress = "10.0.2.15:38000"
+       CorruptedJson                = "{\"errorCode\":401,\"errorMessage\":\"corrupted json\"}"
        ValidationFailureJson        = "{\"errorCode\":402,\"errorMessage\":\"Validation error\"}"
        ResourceNotFoundJson         = "{\"errorCode\":404,\"errorMessage\":\"Resource not found\"}"
        NodebExistsJson              = "{\"errorCode\":406,\"errorMessage\":\"Nodeb already exists\"}"
@@ -63,10 +64,12 @@ const (
 )
 
 var (
-       ServedNrCellInformationRequiredFields = []string{"cellId", "choiceNrMode", "nrMode", "nrPci", "servedPlmns"}
-       NrNeighbourInformationRequiredFields  = []string{"nrCgi", "choiceNrMode", "nrMode", "nrPci"}
+       ServedNrCellInformationRequiredFields = []string{"cellId", "choiceNrMode", "nrMode", "servedPlmns"}
+       NrNeighbourInformationRequiredFields  = []string{"nrCgi", "choiceNrMode", "nrMode"}
+       AddEnbRequestRequiredFields           = []string{"ranName", "enb", "globalNbId"}
+       GlobalIdRequiredFields                = []string{"plmnId", "nbId"}
        EnbRequiredFields                     = []string{"enbType", "servedCells"}
-       ServedCellRequiredFields              = []string{"broadcastPlmns", "cellId", "choiceEutraMode", "eutraMode", "pci", "tac"}
+       ServedCellRequiredFields              = []string{"broadcastPlmns", "cellId", "choiceEutraMode", "eutraMode", "tac"}
 )
 
 type controllerGetNodebTestContext struct {
@@ -94,9 +97,9 @@ type updateGnbCellsParams struct {
 }
 
 type saveNodebParams struct {
-       nodebInfo *entities.NodebInfo
+       nodebInfo  *entities.NodebInfo
        nbIdentity *entities.NbIdentity
-       err error
+       err        error
 }
 
 type removeServedNrCellsParams struct {
@@ -200,6 +203,47 @@ func buildServedCell(propToOmit string) map[string]interface{} {
        return ret
 }
 
+func getAddEnbRequest(propToOmit string) map[string]interface{} {
+       ret := map[string]interface{}{
+               "ranName":    RanName,
+               "globalNbId": buildGlobalNbId(""),
+               "enb":        buildEnb(""),
+       }
+
+       if len(propToOmit) != 0 {
+               delete(ret, propToOmit)
+       }
+
+       return ret
+}
+
+func buildEnb(propToOmit string) map[string]interface{} {
+       ret := map[string]interface{}{
+               "enbType": 1,
+               "servedCells": []interface{}{
+                       buildServedCell(""),
+               }}
+
+       if len(propToOmit) != 0 {
+               delete(ret, propToOmit)
+       }
+
+       return ret
+}
+
+func buildGlobalNbId(propToOmit string) map[string]interface{} {
+       ret := map[string]interface{}{
+               "plmnId": "whatever",
+               "nbId":   "whatever2",
+       }
+
+       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()
@@ -364,6 +408,7 @@ func activateControllerAddEnbMocks(context *controllerAddEnbTestContext, readerM
                        RanName:          addEnbRequest.RanName,
                        Ip:               addEnbRequest.Ip,
                        Port:             addEnbRequest.Port,
+                       NodeType:         entities.Node_ENB,
                        GlobalNbId:       addEnbRequest.GlobalNbId,
                        Configuration:    &entities.NodebInfo_Enb{Enb: addEnbRequest.Enb},
                        ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
@@ -371,7 +416,7 @@ func activateControllerAddEnbMocks(context *controllerAddEnbTestContext, readerM
 
                nbIdentity := entities.NbIdentity{InventoryName: addEnbRequest.RanName, GlobalNbId: addEnbRequest.GlobalNbId}
 
-               writerMock.On("SaveNodeb",&nbIdentity, &nodebInfo).Return(context.saveNodebParams.err)
+               writerMock.On("SaveNodeb", &nbIdentity, &nodebInfo).Return(context.saveNodebParams.err)
        }
 }
 
@@ -379,14 +424,15 @@ func controllerAddEnbTestExecuter(t *testing.T, context *controllerAddEnbTestCon
        controller, readerMock, writerMock, _, _ := setupControllerTest(t)
        writer := httptest.NewRecorder()
        r := buildAddEnbRequest(context)
-       defer r.Body.Close()
        body, _ := ioutil.ReadAll(io.LimitReader(r.Body, LimitRequest))
 
        addEnbRequest := models.AddEnbRequest{}
 
        _ = json.Unmarshal(body, &addEnbRequest)
        activateControllerAddEnbMocks(context, readerMock, writerMock, &addEnbRequest)
-       controller.AddEnb(writer, buildAddEnbRequest(context))
+       r = buildAddEnbRequest(context)
+       defer r.Body.Close()
+       controller.AddEnb(writer, r)
        assertControllerAddEnb(t, context, writer, readerMock, writerMock)
 }
 
@@ -676,6 +722,136 @@ func TestControllerUpdateGnbSuccess(t *testing.T) {
        controllerUpdateGnbTestExecuter(t, &context)
 }
 
+func TestControllerAddEnbGetNodebInternalError(t *testing.T) {
+       context := controllerAddEnbTestContext{
+               getNodebInfoResult: &getNodebInfoResult{
+                       nodebInfo: nil,
+                       rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
+               },
+               requestBody:          getAddEnbRequest(""),
+               expectedStatusCode:   http.StatusInternalServerError,
+               expectedJsonResponse: RnibErrorJson,
+       }
+
+       controllerAddEnbTestExecuter(t, &context)
+}
+
+func TestControllerAddEnbNodebExistsFailure(t *testing.T) {
+       context := controllerAddEnbTestContext{
+               getNodebInfoResult: &getNodebInfoResult{
+                       nodebInfo: &entities.NodebInfo{},
+                       rnibError: nil,
+               },
+               requestBody:          getAddEnbRequest(""),
+               expectedStatusCode:   http.StatusBadRequest,
+               expectedJsonResponse: NodebExistsJson,
+       }
+
+       controllerAddEnbTestExecuter(t, &context)
+}
+
+func TestControllerAddEnbSaveNodebFailure(t *testing.T) {
+       context := controllerAddEnbTestContext{
+               saveNodebParams: &saveNodebParams{
+                       err: common.NewInternalError(errors.New("#reader.SaveeNodeb - Internal Error")),
+               },
+               getNodebInfoResult: &getNodebInfoResult{
+                       nodebInfo: nil,
+                       rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
+               },
+               requestBody:          getAddEnbRequest(""),
+               expectedStatusCode:   http.StatusInternalServerError,
+               expectedJsonResponse: RnibErrorJson,
+       }
+
+       controllerAddEnbTestExecuter(t, &context)
+}
+
+func TestControllerAddEnbMissingRequiredRequestProps(t *testing.T) {
+
+       for _, v := range AddEnbRequestRequiredFields {
+               context := controllerAddEnbTestContext{
+                       requestBody:          getAddEnbRequest(v),
+                       expectedStatusCode:   http.StatusBadRequest,
+                       expectedJsonResponse: ValidationFailureJson,
+               }
+
+               controllerAddEnbTestExecuter(t, &context)
+       }
+}
+
+func TestControllerAddEnbInvalidRequest(t *testing.T) {
+       controller, _, _, _, _ := setupControllerTest(t)
+       writer := httptest.NewRecorder()
+
+       // Invalid json: attribute name without quotes (should be "cause":).
+       invalidJson := strings.NewReader("{ranName:\"whatever\"")
+       req, _ := http.NewRequest(http.MethodPost, AddEnbUrl, invalidJson)
+
+       controller.AddEnb(writer, req)
+       assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
+       bodyBytes, _ := ioutil.ReadAll(writer.Body)
+       assert.Equal(t, CorruptedJson, string(bodyBytes))
+
+}
+
+func TestControllerAddEnbMissingRequiredGlobalNbIdProps(t *testing.T) {
+
+       r := getAddEnbRequest("")
+
+       for _, v := range GlobalIdRequiredFields {
+               r["globalNbId"] = buildGlobalNbId(v)
+
+               context := controllerAddEnbTestContext{
+                       requestBody:          r,
+                       expectedStatusCode:   http.StatusBadRequest,
+                       expectedJsonResponse: ValidationFailureJson,
+               }
+
+               controllerAddEnbTestExecuter(t, &context)
+       }
+}
+
+func TestControllerAddEnbMissingRequiredEnbProps(t *testing.T) {
+
+       r := getAddEnbRequest("")
+
+       for _, v := range EnbRequiredFields {
+               r["enb"] = buildEnb(v)
+
+               context := controllerAddEnbTestContext{
+                       requestBody:          r,
+                       expectedStatusCode:   http.StatusBadRequest,
+                       expectedJsonResponse: ValidationFailureJson,
+               }
+
+               controllerAddEnbTestExecuter(t, &context)
+       }
+}
+
+func TestControllerAddEnbMissingRequiredServedCellProps(t *testing.T) {
+
+       r := getAddEnbRequest("")
+
+       for _, v := range ServedCellRequiredFields {
+               enb := r["enb"]
+
+               enbMap, _ := enb.(map[string]interface{})
+
+               enbMap["servedCells"] = []interface{}{
+                       buildServedCell(v),
+               }
+
+               context := controllerAddEnbTestContext{
+                       requestBody:          r,
+                       expectedStatusCode:   http.StatusBadRequest,
+                       expectedJsonResponse: ValidationFailureJson,
+               }
+
+               controllerAddEnbTestExecuter(t, &context)
+       }
+}
+
 func TestControllerAddEnbSuccess(t *testing.T) {
        context := controllerAddEnbTestContext{
                saveNodebParams: &saveNodebParams{
@@ -699,7 +875,7 @@ func TestControllerAddEnbSuccess(t *testing.T) {
                        },
                },
                expectedStatusCode:   http.StatusCreated,
-               expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"DISCONNECTED\",\"globalNbId\":{\"plmnId\":\"whatever\",\"nbId\":\"whatever2\"},\"enb\":{\"enbType\":\"MACRO_ENB\",\"servedCells\":[{\"pci\":1,\"cellId\":\"whatever\",\"tac\":\"whatever3\",\"broadcastPlmns\":[\"whatever\"],\"choiceEutraMode\":{\"fdd\":{}},\"eutraMode\":\"FDD\"}]}}",
+               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\"}]}}",
        }
 
        controllerAddEnbTestExecuter(t, &context)