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\"}"
)
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 {
}
type saveNodebParams struct {
- nodebInfo *entities.NodebInfo
+ nodebInfo *entities.NodebInfo
nbIdentity *entities.NbIdentity
- err error
+ err error
}
type removeServedNrCellsParams struct {
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()
ranAlarmService := &mocks.RanAlarmServiceMock{}
ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
nodebValidator := managers.NewNodebValidator()
- handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, nodebValidator)
+ updateEnbManager := managers.NewUpdateEnbManager(log, rnibDataService, nodebValidator)
+
+ handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, nodebValidator, updateEnbManager)
controller := NewNodebController(log, handlerProvider)
return controller, readerMock, writerMock, rmrMessengerMock, e2tInstancesManager
}
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,
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)
}
}
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)
}
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{
},
},
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)
func TestControllerGetNodebIdListEmptySuccess(t *testing.T) {
var rnibError error
- nodebIdList := []*entities.NbIdentity{}
+ var nodebIdList []*entities.NbIdentity
context := controllerGetNodebIdListTestContext{
nodebIdList: nodebIdList,