[RICPLT-2523] Update setup flow | Add UTs.......... 65/1965/1
authoris005q <idan.shalom@intl.att.com>
Sun, 8 Dec 2019 13:03:00 +0000 (15:03 +0200)
committeris005q <idan.shalom@intl.att.com>
Sun, 8 Dec 2019 13:03:08 +0000 (15:03 +0200)
Change-Id: I456277f461e64175e46549b2f9a0d2089cd268e9
Signed-off-by: is005q <idan.shalom@intl.att.com>
12 files changed:
E2Manager/controllers/nodeb_controller.go
E2Manager/controllers/nodeb_controller_test.go
E2Manager/e2managererrors/e2t_instance_absence_error.go [new file with mode: 0644]
E2Manager/handlers/httpmsghandlers/setup_request_handler.go
E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go
E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go
E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go
E2Manager/managers/e2t_instances_manager.go
E2Manager/managers/e2t_instances_manager_test.go
E2Manager/managers/ran_setup_manager.go
E2Manager/mocks/ran_setup_manager_mock.go [new file with mode: 0644]
E2Manager/rNibWriter/rNibWriter_test.go

index b1fd087..a8afc33 100644 (file)
@@ -225,7 +225,10 @@ func (c *NodebController) handleErrorResponse(err error, writer http.ResponseWri
                        e2Error, _ := err.(*e2managererrors.ResourceNotFoundError)
                        errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
                        httpError = http.StatusNotFound
-
+               case *e2managererrors.E2TInstanceAbsenceError:
+                       e2Error, _ := err.(*e2managererrors.E2TInstanceAbsenceError)
+                       errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
+                       httpError = http.StatusServiceUnavailable
                default:
                        e2Error := e2managererrors.NewInternalError()
                        errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
index a2acacd..6847536 100644 (file)
@@ -21,7 +21,7 @@ import (
        "bytes"
        "e2mgr/configuration"
        "e2mgr/e2managererrors"
-       //"e2mgr/e2pdus"
+       "e2mgr/e2pdus"
        "e2mgr/logger"
        "e2mgr/managers"
        "e2mgr/mocks"
@@ -62,7 +62,7 @@ type controllerGetNodebIdListTestContext struct {
        expectedJsonResponse string
 }
 
-func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock) {
+func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock) {
        log := initLog(t)
        config := configuration.ParseConfiguration()
 
@@ -74,15 +74,15 @@ func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock,
        rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
        rmrSender := getRmrSender(rmrMessengerMock, log)
        ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService)
-       e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log)
+       e2tInstancesManager := &mocks.E2TInstancesManagerMock{}
        handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, ranSetupManager, e2tInstancesManager)
        controller := NewNodebController(log, handlerProvider)
-       return controller, readerMock, writerMock, rmrMessengerMock
+       return controller, readerMock, writerMock, rmrMessengerMock, e2tInstancesManager
 }
 
 func TestX2SetupInvalidBody(t *testing.T) {
 
-       controller, _, _, _ := setupControllerTest(t)
+       controller, _, _, _, _ := setupControllerTest(t)
 
        header := http.Header{}
        header.Set("Content-Type", "application/json")
@@ -98,64 +98,71 @@ func TestX2SetupInvalidBody(t *testing.T) {
        assert.Equal(t, e2managererrors.NewInvalidJsonError().Code, errorResponse.Code)
 }
 
-//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}
-//     readerMock.On("GetNodeb", ranName).Return(nb, nil)
-//
-//     var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
-//     writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
-//
-//     payload := e2pdus.PackedX2setupRequest
-//     var xAction[]byte
-//     msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction)
-//
-//     rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
-//
-//     header := http.Header{}
-//     header.Set("Content-Type", "application/json")
-//     httpRequest := tests.GetHttpRequest()
-//     httpRequest.Header = header
-//
-//     writer := httptest.NewRecorder()
-//     controller.X2Setup(writer, httpRequest)
-//
-//     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}
-//     readerMock.On("GetNodeb", ranName).Return(nb, nil)
-//
-//     var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
-//     writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
-//
-//     payload := e2pdus.PackedEndcX2setupRequest
-//     var xAction[]byte
-//     msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction)
-//
-//     rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
-//
-//     header := http.Header{}
-//     header.Set("Content-Type", "application/json")
-//     httpRequest := tests.GetHttpRequest()
-//     httpRequest.Header = header
-//
-//     writer := httptest.NewRecorder()
-//     controller.EndcSetup(writer, httpRequest)
-//
-//     assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
-//}
+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"}
+       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"}
+       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)
+
+       rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
+
+       header := http.Header{}
+       header.Set("Content-Type", "application/json")
+       httpRequest := tests.GetHttpRequest()
+       httpRequest.Header = header
+
+       writer := httptest.NewRecorder()
+       controller.X2Setup(writer, httpRequest)
+
+       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"}
+       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"}
+       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)
+
+       rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
+
+       header := http.Header{}
+       header.Set("Content-Type", "application/json")
+       httpRequest := tests.GetHttpRequest()
+       httpRequest.Header = header
+
+       writer := httptest.NewRecorder()
+       controller.EndcSetup(writer, httpRequest)
+
+       assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
+}
 
 func TestShutdownHandlerRnibError(t *testing.T) {
-       controller, readerMock, _, _ := setupControllerTest(t)
+       controller, readerMock, _, _, _ := setupControllerTest(t)
 
        rnibErr := &common.ResourceNotFoundError{}
        var nbIdentityList []*entities.NbIdentity
@@ -172,7 +179,7 @@ func TestShutdownHandlerRnibError(t *testing.T) {
 }
 
 func controllerGetNodebTestExecuter(t *testing.T, context *controllerGetNodebTestContext) {
-       controller, readerMock, _, _ := setupControllerTest(t)
+       controller, readerMock, _, _, _ := setupControllerTest(t)
        writer := httptest.NewRecorder()
        readerMock.On("GetNodeb", context.ranName).Return(context.nodebInfo, context.rnibError)
        req, _ := http.NewRequest("GET", "/nodeb", nil)
@@ -184,7 +191,7 @@ func controllerGetNodebTestExecuter(t *testing.T, context *controllerGetNodebTes
 }
 
 func controllerGetNodebIdListTestExecuter(t *testing.T, context *controllerGetNodebIdListTestContext) {
-       controller, readerMock, _, _ := setupControllerTest(t)
+       controller, readerMock, _, _, _ := setupControllerTest(t)
        writer := httptest.NewRecorder()
        readerMock.On("GetListNodebIds").Return(context.nodebIdList, context.rnibError)
        req, _ := http.NewRequest("GET", "/nodeb/ids", nil)
@@ -281,7 +288,7 @@ func TestControllerGetNodebIdListInternal(t *testing.T) {
 }
 
 func TestHeaderValidationFailed(t *testing.T) {
-       controller, _, _, _ := setupControllerTest(t)
+       controller, _, _, _, _ := setupControllerTest(t)
 
        writer := httptest.NewRecorder()
 
@@ -298,7 +305,7 @@ func TestHeaderValidationFailed(t *testing.T) {
 }
 
 func TestShutdownStatusNoContent(t *testing.T) {
-       controller, readerMock, _, _ := setupControllerTest(t)
+       controller, readerMock, _, _, _ := setupControllerTest(t)
 
        var rnibError error
        nbIdentityList := []*entities.NbIdentity{}
@@ -311,7 +318,7 @@ func TestShutdownStatusNoContent(t *testing.T) {
 }
 
 func TestHandleInternalError(t *testing.T) {
-       controller, _, _, _ := setupControllerTest(t)
+       controller, _, _, _, _ := setupControllerTest(t)
 
        writer := httptest.NewRecorder()
        err := e2managererrors.NewInternalError()
@@ -325,7 +332,7 @@ func TestHandleInternalError(t *testing.T) {
 }
 
 func TestHandleCommandAlreadyInProgressError(t *testing.T) {
-       controller, _, _, _ := setupControllerTest(t)
+       controller, _, _, _, _ := setupControllerTest(t)
        writer := httptest.NewRecorder()
        err := e2managererrors.NewCommandAlreadyInProgressError()
 
@@ -337,8 +344,22 @@ func TestHandleCommandAlreadyInProgressError(t *testing.T) {
        assert.Equal(t, errorResponse.Message, err.Message)
 }
 
+func TestHandleE2TInstanceAbsenceError(t *testing.T) {
+       controller, _, _, _, _ := setupControllerTest(t)
+
+       writer := httptest.NewRecorder()
+       err := e2managererrors.NewE2TInstanceAbsenceError()
+
+       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 TestValidateHeaders(t *testing.T) {
-       controller, _, _, _ := setupControllerTest(t)
+       controller, _, _, _, _ := setupControllerTest(t)
 
        header := http.Header{}
        header.Set("Content-Type", "application/json")
@@ -368,11 +389,11 @@ func initLog(t *testing.T) *logger.Logger {
 }
 
 func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) {
-       controller, readerMock, _, rmrMessengerMock := setupControllerTest(t)
+       controller, readerMock, _, rmrMessengerMock, _ := setupControllerTest(t)
 
        ranName := "test1"
        payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x40}
-       var xAction[]byte
+       var xAction []byte
        msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction)
        rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil)
 
@@ -393,12 +414,12 @@ func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) {
 }
 
 func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) {
-       controller, readerMock, _, rmrMessengerMock := setupControllerTest(t)
+       controller, readerMock, _, rmrMessengerMock, _ := setupControllerTest(t)
 
        ranName := "test1"
        // o&m intervention
        payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64}
-       var xAction[]byte
+       var xAction []byte
        msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction)
        rmrMessengerMock.On("SendMsg", msg).Return(msg, nil)
 
@@ -418,7 +439,7 @@ func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) {
 }
 
 func TestX2ResetHandleFailureInvalidBody(t *testing.T) {
-       controller, _, _, _ := setupControllerTest(t)
+       controller, _, _, _ , _:= setupControllerTest(t)
 
        ranName := "test1"
 
@@ -435,7 +456,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)
diff --git a/E2Manager/e2managererrors/e2t_instance_absence_error.go b/E2Manager/e2managererrors/e2t_instance_absence_error.go
new file mode 100644 (file)
index 0000000..772d62a
--- /dev/null
@@ -0,0 +1,35 @@
+//
+// Copyright 2019 AT&T Intellectual Property
+// Copyright 2019 Nokia
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+package e2managererrors
+
+type E2TInstanceAbsenceError struct {
+       *BaseError
+}
+
+func NewE2TInstanceAbsenceError() *E2TInstanceAbsenceError {
+       return &E2TInstanceAbsenceError{
+               &BaseError{
+                       Code:    510,
+                       Message: "The New RAN can't be added, please try later.",
+               },
+       }
+}
+
+func (e *E2TInstanceAbsenceError) Error() string {
+       return e.Message
+}
index a62b185..981e9c6 100644 (file)
@@ -36,13 +36,13 @@ const (
 type SetupRequestHandler struct {
        rNibDataService     services.RNibDataService
        logger              *logger.Logger
-       ranSetupManager     *managers.RanSetupManager
+       ranSetupManager     managers.IRanSetupManager
        protocol            entities.E2ApplicationProtocol
        e2tInstancesManager managers.IE2TInstancesManager
 }
 
 func NewSetupRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService,
-       ranSetupManager *managers.RanSetupManager, protocol entities.E2ApplicationProtocol, e2tInstancesManager managers.IE2TInstancesManager) *SetupRequestHandler {
+       ranSetupManager managers.IRanSetupManager, protocol entities.E2ApplicationProtocol, e2tInstancesManager managers.IE2TInstancesManager) *SetupRequestHandler {
        return &SetupRequestHandler{
                logger:              logger,
                rNibDataService:     rNibDataService,
@@ -52,35 +52,40 @@ func NewSetupRequestHandler(logger *logger.Logger, rNibDataService services.RNib
        }
 }
 
-func (handler *SetupRequestHandler) Handle(request models.Request) (models.IResponse, error) {
+func (h *SetupRequestHandler) Handle(request models.Request) (models.IResponse, error) {
 
        setupRequest := request.(models.SetupRequest)
 
-       err := handler.validateRequestDetails(setupRequest)
+       err := h.validateRequestDetails(setupRequest)
        if err != nil {
                return nil, err
        }
 
-       nodebInfo, err := handler.rNibDataService.GetNodeb(setupRequest.RanName)
+       nodebInfo, err := h.rNibDataService.GetNodeb(setupRequest.RanName)
 
        if err != nil {
                _, ok := err.(*common.ResourceNotFoundError)
                if !ok {
-                       handler.logger.Errorf("#SetupRequestHandler.Handle - failed to get nodeB entity for ran name: %v from RNIB. Error: %s",
-                               setupRequest.RanName, err.Error())
+                       h.logger.Errorf("#SetupRequestHandler.Handle - failed to get nodeB entity for ran name: %v from RNIB. Error: %s", setupRequest.RanName, err)
                        return nil, e2managererrors.NewRnibDbError()
                }
 
-               result := handler.connectNewRan(&setupRequest, handler.protocol)
+               result := h.connectNewRan(&setupRequest, h.protocol)
+               return nil, result
+       }
+
+       if nodebInfo.ConnectionStatus == entities.ConnectionStatus_SHUTTING_DOWN {
+               h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithAssociatedE2TAddress - RAN: %s in wrong state (%s)", nodebInfo.RanName, entities.ConnectionStatus_name[int32(nodebInfo.ConnectionStatus)])
+               result := e2managererrors.NewWrongStateError(h.getActivityName(h.protocol), entities.ConnectionStatus_name[int32(nodebInfo.ConnectionStatus)])
                return nil, result
        }
 
        if len(nodebInfo.AssociatedE2TInstanceAddress) != 0 {
-               result := handler.connectExistingRanWithAssociatedE2TAddress(nodebInfo)
+               result := h.connectExistingRanWithAssociatedE2TAddress(nodebInfo)
                return nil, result
        }
 
-       result := handler.connectExistingRanWithoutAssociatedE2TAddress(nodebInfo)
+       result := h.connectExistingRanWithoutAssociatedE2TAddress(nodebInfo)
        return nil, result
 }
 
@@ -107,7 +112,21 @@ func (h *SetupRequestHandler) connectExistingRanWithoutAssociatedE2TAddress(node
        e2tAddress, err := h.e2tInstancesManager.SelectE2TInstance()
 
        if err != nil {
-               //TODO: handle
+               h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithoutAssociatedE2TAddress - RAN name: %s - failed selecting E2T instance", nodebInfo.RanName)
+
+               // TODO: reset connection attempts?
+
+               if nodebInfo.ConnectionStatus == entities.ConnectionStatus_DISCONNECTED {
+                       return err
+               }
+
+               nodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
+               updateError := h.rNibDataService.UpdateNodebInfo(nodebInfo)
+
+               if updateError != nil {
+                       h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithoutAssociatedE2TAddress - RAN name: %s - failed updating nodeb. error: %s", nodebInfo.RanName, updateError)
+               }
+
                return err
        }
 
@@ -115,7 +134,7 @@ func (h *SetupRequestHandler) connectExistingRanWithoutAssociatedE2TAddress(node
 
        if err != nil {
                h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithoutAssociatedE2TAddress - RAN name: %s - failed associating ran to e2t address %s. error: %s", nodebInfo.RanName, e2tAddress, err)
-               return e2managererrors.NewRnibDbError()
+               return err
        }
 
        nodebInfo.AssociatedE2TInstanceAddress = e2tAddress
@@ -135,19 +154,11 @@ func (h *SetupRequestHandler) connectExistingRanWithoutAssociatedE2TAddress(node
 }
 
 func (h *SetupRequestHandler) connectExistingRanWithAssociatedE2TAddress(nodebInfo *entities.NodebInfo) error {
-
-       if nodebInfo.ConnectionStatus == entities.ConnectionStatus_SHUTTING_DOWN {
-               h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithAssociatedE2TAddress - RAN: %s in wrong state (%s)", nodebInfo.RanName, entities.ConnectionStatus_name[int32(nodebInfo.ConnectionStatus)])
-               return e2managererrors.NewWrongStateError(h.getActivityName(h.protocol), entities.ConnectionStatus_name[int32(nodebInfo.ConnectionStatus)])
-       }
-
        status := entities.ConnectionStatus_CONNECTING
        if nodebInfo.ConnectionStatus == entities.ConnectionStatus_CONNECTED {
                status = nodebInfo.ConnectionStatus
        }
-
        nodebInfo.ConnectionAttempts = 0
-
        err := h.rNibDataService.UpdateNodebInfo(nodebInfo)
 
        if err != nil {
@@ -157,6 +168,7 @@ func (h *SetupRequestHandler) connectExistingRanWithAssociatedE2TAddress(nodebIn
 
        h.logger.Infof("#SetupRequestHandler.connectExistingRanWithAssociatedE2TAddress - RAN name: %s - successfully updated nodeb in rNib", nodebInfo.RanName)
 
+
        result := h.ranSetupManager.ExecuteSetup(nodebInfo, status)
        return result
 }
@@ -166,7 +178,7 @@ func (h *SetupRequestHandler) connectNewRan(request *models.SetupRequest, protoc
        e2tAddress, err := h.e2tInstancesManager.SelectE2TInstance()
 
        if err != nil {
-               //TODO: handle
+               h.logger.Errorf("#SetupRequestHandler.connectNewRan - RAN name: %s - failed selecting E2T instance", request.RanName)
                return err
        }
 
@@ -174,7 +186,7 @@ func (h *SetupRequestHandler) connectNewRan(request *models.SetupRequest, protoc
 
        if err != nil {
                h.logger.Errorf("#SetupRequestHandler.connectNewRan - RAN name: %s - failed associating ran to e2t address %s. error: %s", request.RanName, e2tAddress, err)
-               return e2managererrors.NewRnibDbError()
+               return err
        }
 
        nodebInfo, nodebIdentity := createInitialNodeInfo(request, protocol, e2tAddress)
index 5057c01..5556eb1 100644 (file)
@@ -19,295 +19,323 @@ package httpmsghandlers
 import (
        "e2mgr/configuration"
        "e2mgr/e2managererrors"
-       "e2mgr/managers"
        "e2mgr/mocks"
        "e2mgr/models"
        "e2mgr/services"
+       "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"
-       "reflect"
+       "github.com/stretchr/testify/assert"
        "testing"
 )
 
-//func TestSetupHandleNewRanSave_Error(t *testing.T) {
-//     readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
-//
-//     ranName := "RanName"
-//     rnibErr := &common.ResourceNotFoundError{}
-//     sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
-//
-//     nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
-//     readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
-//
-//     vErr := &common.ValidationError{}
-//     updatedNb, _ := createInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
-//     writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(vErr)
-//
-//     var nbUpdated = &entities.NodebInfo{RanName: ranName, Ip: sr.RanIp, Port: uint32(sr.RanPort), ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
-//     writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
-//
-//     payload := e2pdus.PackedEndcX2setupRequest
-//     xaction := []byte(ranName)
-//     msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
-//
-//     rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
-//
-//     _, actual := handler.Handle(sr)
-//     expected := &e2managererrors.RnibDbError{}
-//
-//     if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
-//             t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
-//     }
-//
-//     writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
-//     writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
-//     rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
-//}
-//
-//func TestSetupHandleNewRan_Success(t *testing.T) {
-//     readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
-//
-//     ranName := "RanName"
-//     rnibErr := &common.ResourceNotFoundError{}
-//     sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
-//
-//     nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
-//     readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
-//
-//     updatedNb, _ := createInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
-//     writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(nil)
-//
-//     var nbUpdated = &entities.NodebInfo{RanName: ranName, Ip: sr.RanIp, Port: uint32(sr.RanPort), ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
-//     writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
-//
-//     payload := e2pdus.PackedEndcX2setupRequest
-//     xaction := []byte(ranName)
-//     msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
-//
-//     rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
-//
-//     _, actual := handler.Handle(sr)
-//
-//     assert.Nil(t, actual)
-//
-//     writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
-//     writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
-//     rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
-//}
+const E2TAddress = "10.0.2.15:8989"
+const RanName = "test"
 
-//func TestEndcSetupHandleRmr_Error(t *testing.T) {
-//     readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
-//
-//     ranName := "RanName"
-//     nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
-//     readerMock.On("GetNodeb", ranName).Return(nb, nil)
-//
-//     var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
-//     writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
-//
-//     var nbDisconnected = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 0}
-//     writerMock.On("UpdateNodebInfo", nbDisconnected).Return(nil)
-//
-//     payload := e2pdus.PackedEndcX2setupRequest
-//     xaction := []byte(ranName)
-//     msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
-//
-//     rmrErr := &e2managererrors.RmrError{}
-//     rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, rmrErr)
-//
-//     sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
-//     _, actual := handler.Handle(sr)
-//
-//     if reflect.TypeOf(actual) != reflect.TypeOf(rmrErr) {
-//             t.Errorf("Error actual = %v, and Expected = %v.", actual, rmrErr)
-//     }
-//
-//     writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
-//     rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
-//}
+func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.E2TInstancesManagerMock, *mocks.RanSetupManagerMock) {
+       log := initLog(t)
+       config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
 
-//func TestEndcSetupHandleExistingDisconnectedRan_Success(t *testing.T) {
-//     readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
-//
-//     ranName := "RanName"
-//     nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
-//     readerMock.On("GetNodeb", ranName).Return(nb, nil)
-//
-//     var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
-//     writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
-//
-//     payload := e2pdus.PackedEndcX2setupRequest
-//     xaction := []byte(ranName)
-//     msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
-//
-//     rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
-//
-//     sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
-//     _, actual := handler.Handle(sr)
-//
-//     assert.Nil(t, actual)
-//
-//     writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
-//     rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
-//}
+       readerMock := &mocks.RnibReaderMock{}
+       writerMock := &mocks.RnibWriterMock{}
 
-//func TestX2SetupHandleExistingConnectedRan_Success(t *testing.T) {
-//     readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
-//
-//     ranName := "RanName"
-//     nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
-//     readerMock.On("GetNodeb", ranName).Return(nb, nil)
-//
-//     var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
-//     writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
-//
-//     payload := e2pdus.PackedX2setupRequest
-//     xaction := []byte(ranName)
-//     msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
-//
-//     rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
-//
-//     sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
-//     _, actual := handler.Handle(sr)
-//
-//     assert.Nil(t, actual)
-//
-//     writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
-//     rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
-//}
+       rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
 
-func TestX2SetupHandleRnibGet_Error(t *testing.T) {
-       readerMock, _, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       ranSetupManagerMock := &mocks.RanSetupManagerMock{}
+       e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
+       handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManagerMock, protocol, e2tInstancesManagerMock)
 
-       rnibErr := &common.ValidationError{}
-       nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
-       readerMock.On("GetNodeb", "RanName").Return(nb, rnibErr)
+       return readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock
+}
 
-       sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
-       _, actual := handler.Handle(sr)
+func TestX2SetupHandleNoPortError(t *testing.T) {
+       readerMock, _, handler, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
 
-       expected := &e2managererrors.RnibDbError{}
-       if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
-               t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
-       }
-       rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
+       sr := models.SetupRequest{"127.0.0.1", 0, RanName,}
+       _, err := handler.Handle(sr)
+       assert.IsType(t, &e2managererrors.RequestValidationError{}, err)
+       readerMock.AssertNotCalled(t, "GetNodeb")
 }
 
-//func TestEndcSetupHandleShuttingDownRan_Error(t *testing.T) {
-//     readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
-//
-//     nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
-//     readerMock.On("GetNodeb", "RanName").Return(nb, nil)
-//
-//     sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
-//     _, actual := handler.Handle(sr)
-//
-//     expected := &e2managererrors.WrongStateError{}
-//     if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
-//             t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
-//     }
-//     writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
-//     rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
-//}
-
-//func TestX2SetupHandleShuttingDownRan_Error(t *testing.T) {
-//     readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
-//
-//     nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
-//     readerMock.On("GetNodeb", "RanName").Return(nb, nil)
-//
-//     sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
-//     _, actual := handler.Handle(sr)
-//
-//     expected := &e2managererrors.WrongStateError{}
-//     if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
-//             t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
-//     }
-//     writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
-//     rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
-//}
-
-func TestX2SetupHandleNoPort_Error(t *testing.T) {
-       _, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
-
-       sr := models.SetupRequest{"127.0.0.1", 0, "RanName",}
-       _, actual := handler.Handle(sr)
-
-       expected := &e2managererrors.RequestValidationError{}
-       if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
-               t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
-       }
-       writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
-       rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
+func TestX2SetupHandleNoRanNameError(t *testing.T) {
+       readerMock, _, handler, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+
+       sr := models.SetupRequest{RanPort: 8080, RanIp: "127.0.0.1"}
+       _, err := handler.Handle(sr)
+       assert.IsType(t, &e2managererrors.RequestValidationError{}, err)
+       readerMock.AssertNotCalled(t, "GetNodeb")
 }
 
-func TestX2SetupHandleNoRanName_Error(t *testing.T) {
-       _, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+func TestX2SetupHandleNoIpError(t *testing.T) {
+       readerMock, _, handler, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
 
-       sr := models.SetupRequest{}
-       sr.RanPort = 8080
-       sr.RanIp = "127.0.0.1"
+       sr := models.SetupRequest{RanPort: 8080, RanName: RanName}
+       _, err := handler.Handle(sr)
+       assert.IsType(t, &e2managererrors.RequestValidationError{}, err)
+       readerMock.AssertNotCalled(t, "GetNodeb")
+}
 
-       _, actual := handler.Handle(sr)
+func TestX2SetupHandleInvalidIpError(t *testing.T) {
+       readerMock, _, handler, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
 
-       expected := &e2managererrors.RequestValidationError{}
-       if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
-               t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
-       }
-       writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
-       rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
+       sr := models.SetupRequest{RanPort: 8080, RanName: RanName, RanIp: "invalid ip"}
+       _, err := handler.Handle(sr)
+       assert.IsType(t, &e2managererrors.RequestValidationError{}, err)
+       readerMock.AssertNotCalled(t, "GetNodeb")
 }
 
-func TestX2SetupHandleNoIP_Error(t *testing.T) {
-       _, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+func TestX2SetupHandleGetNodebFailure(t *testing.T) {
+       readerMock, _, handler, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
 
-       sr := models.SetupRequest{}
-       sr.RanPort = 8080
-       sr.RanName = "RanName"
+       rnibErr := &common.ValidationError{}
+       nb := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
+       readerMock.On("GetNodeb", RanName).Return(nb, rnibErr)
 
-       _, actual := handler.Handle(sr)
+       sr := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       _, err := handler.Handle(sr)
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+}
 
-       expected := &e2managererrors.RequestValidationError{}
-       if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
-               t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
-       }
-       writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
-       rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
+func TestSetupNewRanSelectE2TInstancesDbError(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewRnibDbError())
+       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       e2tInstancesManagerMock.AssertNotCalled(t, "AssociateRan")
+       writerMock.AssertNotCalled(t, "SaveNodeb")
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
 }
 
-func TestX2SetupHandleInvalidIp_Error(t *testing.T) {
-       _, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+func TestSetupNewRanSelectE2TInstancesNoInstances(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewE2TInstanceAbsenceError())
+       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+       assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
+       e2tInstancesManagerMock.AssertNotCalled(t, "AssociateRan")
+       writerMock.AssertNotCalled(t, "SaveNodeb")
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
 
-       sr := models.SetupRequest{}
-       sr.RanPort = 8080
-       sr.RanName = "RanName"
-       sr.RanIp = "invalid ip"
+func TestSetupNewRanAssociateRanFailure(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+       e2tInstancesManagerMock.On("AssociateRan", RanName, E2TAddress).Return(e2managererrors.NewRnibDbError())
+       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       writerMock.AssertNotCalled(t, "SaveNodeb")
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
 
-       _, actual := handler.Handle(sr)
+func TestSetupNewRanSaveNodebFailure(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+       e2tInstancesManagerMock.On("AssociateRan", RanName, E2TAddress).Return(nil)
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST, E2TAddress)
+       writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(common.NewInternalError(fmt.Errorf("")))
+       _, err := handler.Handle(setupRequest)
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
 
-       expected := &e2managererrors.RequestValidationError{}
-       if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
-               t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
-       }
-       writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
-       rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
+func TestSetupNewRanSetupDbError(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+       e2tInstancesManagerMock.On("AssociateRan", RanName, E2TAddress).Return(nil)
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST, E2TAddress)
+       writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
+       ranSetupManagerMock.On("ExecuteSetup", nodebInfo, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRnibDbError())
+       _, err := handler.Handle(setupRequest)
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
 }
 
-func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock) {
-       log := initLog(t)
-       config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
+func TestSetupNewRanSetupRmrError(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+       e2tInstancesManagerMock.On("AssociateRan", RanName, E2TAddress).Return(nil)
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST, E2TAddress)
+       writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
+       ranSetupManagerMock.On("ExecuteSetup", nodebInfo, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRmrError())
+       _, err := handler.Handle(setupRequest)
+       assert.IsType(t, &e2managererrors.RmrError{}, err)
+}
 
-       readerMock := &mocks.RnibReaderMock{}
-       writerMock := &mocks.RnibWriterMock{}
+func TestSetupNewRanSetupSuccess(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+       e2tInstancesManagerMock.On("AssociateRan", RanName, E2TAddress).Return(nil)
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST, E2TAddress)
+       writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
+       ranSetupManagerMock.On("ExecuteSetup", nodebInfo, entities.ConnectionStatus_CONNECTING).Return(nil)
+       _, err := handler.Handle(setupRequest)
+       assert.Nil(t, err)
+}
 
-       rmrMessengerMock := &mocks.RmrMessengerMock{}
-       rmrSender := getRmrSender(rmrMessengerMock, log)
+func TestX2SetupExistingRanShuttingDown(t *testing.T) {
+       readerMock, _, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}, nil)
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       _, err := handler.Handle(setupRequest)
+       assert.IsType(t, &e2managererrors.WrongStateError{}, err)
+       e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
 
-       rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
+func TestEndcSetupExistingRanShuttingDown(t *testing.T) {
+       readerMock, _, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
+       readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}, nil)
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       _, err := handler.Handle(setupRequest)
+       assert.IsType(t, &e2managererrors.WrongStateError{}, err)
+       e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
 
-       ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService)
-       e2tInstancesManager := &mocks.E2TInstancesManagerMock{}
-       handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol, e2tInstancesManager)
+func TestSetupExistingRanWithoutAssocE2TInstanceSelectDbError(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:""}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewRnibDbError())
+       updatedNb := *nb
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       _, err := handler.Handle(setupRequest)
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
 
-       return readerMock, writerMock, handler, rmrMessengerMock, e2tInstancesManager
+func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceError(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:""}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewE2TInstanceAbsenceError())
+       updatedNb := *nb
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       _, err := handler.Handle(setupRequest)
+       assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
 }
+
+func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceErrorUpdateFailure(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:""}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewE2TInstanceAbsenceError())
+       updatedNb := *nb
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       _, err := handler.Handle(setupRequest)
+       assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
+
+func TestSetupExistingRanWithoutAssocE2TInstanceSelectErrorDisconnected(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:"", ConnectionStatus:entities.ConnectionStatus_DISCONNECTED}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, e2managererrors.NewE2TInstanceAbsenceError())
+       setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,}
+       _, err := handler.Handle(setupRequest)
+       assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err)
+       writerMock.AssertNotCalled(t, "UpdateNodebInfo")
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
+
+func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanFailure(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:""}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+       e2tInstancesManagerMock.On("AssociateRan", RanName, E2TAddress).Return(e2managererrors.NewRnibDbError())
+       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       writerMock.AssertNotCalled(t, "UpdateNodebInfo")
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
+
+func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanSucceedsUpdateNodebFails(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:""}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+       e2tInstancesManagerMock.On("AssociateRan", RanName, E2TAddress).Return(nil)
+       updatedNb := *nb
+       updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionAttempts = 0
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
+       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
+
+func TestSetupExistingRanWithoutAssocE2TInstanceExecuteSetupFailure(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:""}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+       e2tInstancesManagerMock.On("AssociateRan", RanName, E2TAddress).Return(nil)
+       updatedNb := *nb
+       updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionAttempts = 0
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+       ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRnibDbError())
+       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+}
+
+func TestSetupExistingRanWithoutAssocE2TInstanceSuccess(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:""}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+       e2tInstancesManagerMock.On("AssociateRan", RanName, E2TAddress).Return(nil)
+       updatedNb := *nb
+       updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionAttempts = 0
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+       ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
+       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+       assert.Nil(t, err)
+}
+
+func TestSetupExistingRanWithAssocE2TInstanceUpdateNodebFailure(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:E2TAddress}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       updatedNb := *nb
+       updatedNb.ConnectionAttempts = 0
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
+       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
+       e2tInstancesManagerMock.AssertNotCalled(t, "AssociateRan")
+       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+}
+
+func TestSetupExistingConnectedRanWithAssocE2TInstanceSuccess(t *testing.T) {
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus: entities.ConnectionStatus_CONNECTED}
+       readerMock.On("GetNodeb", RanName).Return(nb , nil)
+       updatedNb := *nb
+       updatedNb.ConnectionAttempts = 0
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+       ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTED).Return(nil)
+       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+       assert.Nil(t, err)
+       e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance")
+       e2tInstancesManagerMock.AssertNotCalled(t, "AssociateRan")
+}
\ No newline at end of file
index ccb726c..904e34b 100644 (file)
@@ -56,6 +56,11 @@ func (h E2TermInitNotificationHandler) Handle(request *models.NotificationReques
 
        e2tAddress := unmarshalledPayload.Address
 
+       if len(e2tAddress) == 0 {
+               h.logger.Errorf("#E2TermInitNotificationHandler - Empty E2T address received")
+               return
+       }
+
        e2tInstance, err := h.e2tInstancesManager.GetE2TInstance(e2tAddress)
 
        if err != nil {
index 5101eae..2cfc6f5 100644 (file)
@@ -66,6 +66,13 @@ func TestE2TermInitUnmarshalPayloadFailure(t *testing.T) {
        e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
 }
 
+func TestE2TermInitEmptyE2TAddress(t *testing.T) {
+       _, handler, _, _, _, e2tInstancesManagerMock := initRanLostConnectionTest(t)
+       notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte("{\"address\":\"\"}")}
+       handler.Handle(notificationRequest)
+       e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
+       e2tInstancesManagerMock.AssertNotCalled(t, "AddE2TInstance")
+}
 
 func TestE2TermInitGetE2TInstanceFailure(t *testing.T) {
        _, handler, _, _, _, e2tInstancesManagerMock := initRanLostConnectionTest(t)
index 267c778..c9bca3c 100644 (file)
@@ -1,9 +1,26 @@
+//
+// Copyright 2019 AT&T Intellectual Property
+// Copyright 2019 Nokia
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
 package managers
 
 import (
+       "e2mgr/e2managererrors"
        "e2mgr/logger"
        "e2mgr/services"
-       "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"
        "math"
@@ -69,7 +86,6 @@ func (m *E2TInstancesManager) GetE2TInstances() ([]*entities.E2TInstance, error)
        }
 
        return e2tInstances, nil
-
 }
 
 func findActiveE2TInstanceWithMinimumAssociatedRans(e2tInstances []*entities.E2TInstance) *entities.E2TInstance {
@@ -88,11 +104,6 @@ func findActiveE2TInstanceWithMinimumAssociatedRans(e2tInstances []*entities.E2T
 
 func (m *E2TInstancesManager) AddE2TInstance(e2tAddress string) error {
 
-       if len(e2tAddress) == 0 {
-               m.logger.Errorf("#AddE2TInstance - Empty E2T address received")
-               return fmt.Errorf("empty E2T address")
-       }
-
        e2tInstance := entities.NewE2TInstance(e2tAddress)
        err := m.rnibDataService.SaveE2TInstance(e2tInstance)
 
@@ -170,21 +181,20 @@ func (m *E2TInstancesManager) SelectE2TInstance() (string, error) {
        e2tInstances, err := m.GetE2TInstances()
 
        if err != nil {
-               //TODO: handle
-               return "", err
+               m.logger.Errorf("#E2TInstancesManager.SelectE2TInstance - failed retrieving E2T instances. error: %s", err)
+               return "", e2managererrors.NewRnibDbError()
        }
 
        if len(e2tInstances) == 0 {
-               //TODO: handle
-               return "", err
+               m.logger.Errorf("#E2TInstancesManager.SelectE2TInstance - No E2T instance found")
+               return "", e2managererrors.NewE2TInstanceAbsenceError()
        }
 
        min := findActiveE2TInstanceWithMinimumAssociatedRans(e2tInstances)
 
        if min == nil {
                m.logger.Errorf("#SelectE2TInstance - No active E2T instance found")
-               //TODO: handle
-               return "", fmt.Errorf("No active E2T instance found")
+               return "", e2managererrors.NewE2TInstanceAbsenceError()
        }
 
        return min.Address, nil
@@ -199,7 +209,7 @@ func (m *E2TInstancesManager) AssociateRan(ranName string, e2tAddress string) er
 
        if err != nil {
                m.logger.Errorf("#AssociateRan - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
-               return err
+               return e2managererrors.NewRnibDbError()
        }
 
        e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, ranName)
@@ -208,7 +218,7 @@ func (m *E2TInstancesManager) AssociateRan(ranName string, e2tAddress string) er
 
        if err != nil {
                m.logger.Errorf("#AssociateRan - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
-               return err
+               return e2managererrors.NewRnibDbError()
        }
 
        return nil
index ca86651..88f940b 100644 (file)
@@ -14,7 +14,8 @@ import (
        "testing"
 )
 
-const E2TAddress = "10.0.2.15"
+const E2TAddress = "10.10.2.15:9800"
+const E2TAddress2 = "10.10.2.16:9800"
 
 func initE2TInstancesManagerTest(t *testing.T) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *E2TInstancesManager) {
        logger, err := logger.InitLogger(logger.DebugLevel)
@@ -30,13 +31,6 @@ func initE2TInstancesManagerTest(t *testing.T) (*mocks.RnibReaderMock, *mocks.Rn
        return readerMock, writerMock, e2tInstancesManager
 }
 
-func TestAddNewE2TInstanceEmptyAddress(t *testing.T) {
-       _, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-       err := e2tInstancesManager.AddE2TInstance("")
-       assert.NotNil(t, err)
-       rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
-}
-
 func TestAddNewE2TInstanceSaveE2TInstanceFailure(t *testing.T) {
        rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
        rnibWriterMock.On("SaveE2TInstance", mock.Anything).Return(common.NewInternalError(errors.New("Error")))
@@ -102,253 +96,178 @@ func TestGetE2TInstanceSuccess(t *testing.T) {
 
 func TestGetE2TInstanceFailure(t *testing.T) {
        rnibReaderMock, _, e2tInstancesManager := initE2TInstancesManagerTest(t)
-       address := "10.10.2.15:9800"
        var e2tInstance *entities.E2TInstance
-       rnibReaderMock.On("GetE2TInstance", address).Return(e2tInstance, common.NewInternalError(fmt.Errorf("for test")))
-       res, err := e2tInstancesManager.GetE2TInstance(address)
+       rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("for test")))
+       res, err := e2tInstancesManager.GetE2TInstance(E2TAddress)
        assert.NotNil(t, err)
        assert.Nil(t, res)
 }
 
-//func TestAssociateRanSuccess(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//     e2tInfo1 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo1.AssociatedRanCount = 0;
-//     address2 := "10.10.2.15:9801"
-//     e2tInfo2 := entities.NewE2TInstanceInfo(address2)
-//     e2tInfo2.AssociatedRanCount = 1;
-//     e2tInfoList := []*entities.E2TInstanceInfo{e2tInfo1, e2tInfo2}
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, nil)
-//
-//     e2tInfo3 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo3.AssociatedRanCount = 1;
-//     e2tInfoList2 := []*entities.E2TInstanceInfo{e2tInfo3, e2tInfo2}
-//     rnibWriterMock.On("SaveE2TAddresses", e2tInfoList2).Return(nil)
-//
-//     e2tInstance1  := entities.NewE2TInstance(address1)
-//     rnibReaderMock.On("GetE2TInstance", address1).Return(e2tInstance1, nil)
-//     rnibWriterMock.On("SaveE2TInstance", mock.Anything).Return(nil)
-//
-//     err := e2tInstancesManager.AssociateRan("test1", address1)
-//     assert.Nil(t, err)
-//     rnibReaderMock.AssertExpectations(t)
-//     rnibWriterMock.AssertExpectations(t)
-//}
-//
-//func TestAssociateRanGetListFailure(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//
-//     var e2tInfoList []*entities.E2TInstanceInfo
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, common.NewInternalError(fmt.Errorf("for test")))
-//
-//     err := e2tInstancesManager.AssociateRan("test1", address1)
-//     assert.NotNil(t, err)
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TAddresses")
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
-//     rnibReaderMock.AssertNotCalled(t, "GetE2TInstance")
-//}
-//
-//func TestAssociateRanSaveListFailure(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//     e2tInfo1 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo1.AssociatedRanCount = 0;
-//     address2 := "10.10.2.15:9801"
-//     e2tInfo2 := entities.NewE2TInstanceInfo(address2)
-//     e2tInfo2.AssociatedRanCount = 1;
-//     e2tInfoList := []*entities.E2TInstanceInfo{e2tInfo1, e2tInfo2}
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, nil)
-//
-//     rnibWriterMock.On("SaveE2TAddresses", e2tInfoList).Return(common.NewInternalError(fmt.Errorf("for test")))
-//
-//     err := e2tInstancesManager.AssociateRan("test1", address1)
-//     assert.NotNil(t, err)
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
-//     rnibReaderMock.AssertNotCalled(t, "GetE2TInstance")
-//}
-//
-//func TestAssociateRanGetInstanceFailure(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//     e2tInfo1 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo1.AssociatedRanCount = 0;
-//     address2 := "10.10.2.15:9801"
-//     e2tInfo2 := entities.NewE2TInstanceInfo(address2)
-//     e2tInfo2.AssociatedRanCount = 1;
-//     e2tInfoList := []*entities.E2TInstanceInfo{e2tInfo1, e2tInfo2}
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, nil)
-//     rnibWriterMock.On("SaveE2TAddresses", e2tInfoList).Return(nil)
-//
-//     var e2tInstance1 *entities.E2TInstance
-//     rnibReaderMock.On("GetE2TInstance", address1).Return(e2tInstance1, common.NewInternalError(fmt.Errorf("for test")))
-//
-//     err := e2tInstancesManager.AssociateRan("test1", address1)
-//     assert.NotNil(t, err)
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
-//}
-//
-//func TestAssociateRanSaveInstanceFailure(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//     e2tInfo1 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo1.AssociatedRanCount = 0;
-//     address2 := "10.10.2.15:9801"
-//     e2tInfo2 := entities.NewE2TInstanceInfo(address2)
-//     e2tInfo2.AssociatedRanCount = 1;
-//     e2tInfoList := []*entities.E2TInstanceInfo{e2tInfo1, e2tInfo2}
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, nil)
-//
-//     e2tInfo3 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo3.AssociatedRanCount = 1;
-//     e2tInfoList2 := []*entities.E2TInstanceInfo{e2tInfo3, e2tInfo2}
-//     rnibWriterMock.On("SaveE2TAddresses", e2tInfoList2).Return(nil)
-//
-//     e2tInstance1  := entities.NewE2TInstance(address1)
-//     rnibReaderMock.On("GetE2TInstance", address1).Return(e2tInstance1, nil)
-//     rnibWriterMock.On("SaveE2TInstance", mock.Anything).Return(common.NewInternalError(fmt.Errorf("for test")))
-//
-//     err := e2tInstancesManager.AssociateRan("test1", address1)
-//     assert.NotNil(t, err)
-//     rnibReaderMock.AssertExpectations(t)
-//     rnibWriterMock.AssertExpectations(t)
-//}
-//
-//func TestDeassociateRanSuccess(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//     e2tInfo1 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo1.AssociatedRanCount = 1;
-//     address2 := "10.10.2.15:9801"
-//     e2tInfo2 := entities.NewE2TInstanceInfo(address2)
-//     e2tInfo2.AssociatedRanCount = 0;
-//     e2tInfoList := []*entities.E2TInstanceInfo{e2tInfo1, e2tInfo2}
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, nil)
-//
-//     e2tInfo3 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo3.AssociatedRanCount = 0;
-//     e2tInfoList2 := []*entities.E2TInstanceInfo{e2tInfo3, e2tInfo2}
-//     rnibWriterMock.On("SaveE2TAddresses", e2tInfoList2).Return(nil)
-//
-//     e2tInstance1  := entities.NewE2TInstance(address1)
-//     e2tInstance1.AssociatedRanList = append(e2tInstance1.AssociatedRanList, "test0", "test1")
-//     rnibReaderMock.On("GetE2TInstance", address1).Return(e2tInstance1, nil)
-//     rnibWriterMock.On("SaveE2TInstance", mock.Anything).Return(nil)
-//
-//     err := e2tInstancesManager.DissociateRan("test1", address1)
-//     assert.Nil(t, err)
-//     rnibReaderMock.AssertExpectations(t)
-//     rnibWriterMock.AssertExpectations(t)
-//}
-//
-//func TestDeassociateRanNoInstanceFound(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//     e2tInfoList := []*entities.E2TInstanceInfo{}
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, nil)
-//
-//     err := e2tInstancesManager.DissociateRan("test1", address1)
-//     assert.Nil(t, err)
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TAddresses")
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
-//     rnibReaderMock.AssertNotCalled(t, "GetE2TInstance")
-//}
-//
-//func TestDeassociateRanGetListFailure(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//
-//     var e2tInfoList []*entities.E2TInstanceInfo
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, common.NewInternalError(fmt.Errorf("for test")))
-//
-//     err := e2tInstancesManager.DissociateRan("test1", address1)
-//     assert.NotNil(t, err)
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TAddresses")
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
-//     rnibReaderMock.AssertNotCalled(t, "GetE2TInstance")
-//}
-//
-//func TestDeassociateRanSaveListFailure(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//     e2tInfo1 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo1.AssociatedRanCount = 0;
-//     address2 := "10.10.2.15:9801"
-//     e2tInfo2 := entities.NewE2TInstanceInfo(address2)
-//     e2tInfo2.AssociatedRanCount = 1;
-//     e2tInfoList := []*entities.E2TInstanceInfo{e2tInfo1, e2tInfo2}
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, nil)
-//
-//     rnibWriterMock.On("SaveE2TAddresses", e2tInfoList).Return(common.NewInternalError(fmt.Errorf("for test")))
-//
-//     err := e2tInstancesManager.DissociateRan("test1", address1)
-//     assert.NotNil(t, err)
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
-//     rnibReaderMock.AssertNotCalled(t, "GetE2TInstance")
-//}
-//
-//func TestDeassociateRanGetInstanceFailure(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//     e2tInfo1 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo1.AssociatedRanCount = 0;
-//     address2 := "10.10.2.15:9801"
-//     e2tInfo2 := entities.NewE2TInstanceInfo(address2)
-//     e2tInfo2.AssociatedRanCount = 1;
-//     e2tInfoList := []*entities.E2TInstanceInfo{e2tInfo1, e2tInfo2}
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, nil)
-//     rnibWriterMock.On("SaveE2TAddresses", e2tInfoList).Return(nil)
-//
-//     var e2tInstance1 *entities.E2TInstance
-//     rnibReaderMock.On("GetE2TInstance", address1).Return(e2tInstance1, common.NewInternalError(fmt.Errorf("for test")))
-//
-//     err := e2tInstancesManager.DissociateRan("test1", address1)
-//     assert.NotNil(t, err)
-//     rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
-//}
-//
-//func TestDeassociateRanSaveInstanceFailure(t *testing.T) {
-//     rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
-//
-//     address1 := "10.10.2.15:9800"
-//     e2tInfo1 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo1.AssociatedRanCount = 1;
-//     address2 := "10.10.2.15:9801"
-//     e2tInfo2 := entities.NewE2TInstanceInfo(address2)
-//     e2tInfo2.AssociatedRanCount = 0;
-//     e2tInfoList := []*entities.E2TInstanceInfo{e2tInfo1, e2tInfo2}
-//     rnibReaderMock.On("GetE2TInfoList").Return(e2tInfoList, nil)
-//
-//     e2tInfo3 := entities.NewE2TInstanceInfo(address1)
-//     e2tInfo3.AssociatedRanCount = 0;
-//     e2tInfoList2 := []*entities.E2TInstanceInfo{e2tInfo3, e2tInfo2}
-//     rnibWriterMock.On("SaveE2TAddresses", e2tInfoList2).Return(nil)
-//
-//     e2tInstance1  := entities.NewE2TInstance(address1)
-//     rnibReaderMock.On("GetE2TInstance", address1).Return(e2tInstance1, nil)
-//     rnibWriterMock.On("SaveE2TInstance", mock.Anything).Return(common.NewInternalError(fmt.Errorf("for test")))
-//
-//     err := e2tInstancesManager.DissociateRan("test1", address1)
-//     assert.NotNil(t, err)
-//     rnibReaderMock.AssertExpectations(t)
-//     rnibWriterMock.AssertExpectations(t)
-//}
+func TestAssociateRanSuccess(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+       e2tInstance  := entities.NewE2TInstance(E2TAddress)
+       rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
+
+       updateE2TInstance := *e2tInstance
+       updateE2TInstance.AssociatedRanList = append(updateE2TInstance.AssociatedRanList, "test1")
+
+       rnibWriterMock.On("SaveE2TInstance", &updateE2TInstance).Return(nil)
+
+       err := e2tInstancesManager.AssociateRan("test1", E2TAddress)
+       assert.Nil(t, err)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertExpectations(t)
+}
+
+func TestAssociateRanGetInstanceFailure(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+
+       var e2tInstance1 *entities.E2TInstance
+       rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, common.NewInternalError(fmt.Errorf("for test")))
+
+       err := e2tInstancesManager.AssociateRan("test1", E2TAddress)
+       assert.NotNil(t, err)
+       rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
+}
+
+func TestAssociateRanSaveInstanceFailure(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+       e2tInstance1  := entities.NewE2TInstance(E2TAddress)
+       rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, nil)
+       rnibWriterMock.On("SaveE2TInstance", mock.Anything).Return(common.NewInternalError(fmt.Errorf("for test")))
+
+       err := e2tInstancesManager.AssociateRan("test1", E2TAddress)
+       assert.NotNil(t, err)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertExpectations(t)
+}
+
+func TestDissociateRanSuccess(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+
+       e2tInstance := entities.NewE2TInstance(E2TAddress)
+       e2tInstance.AssociatedRanList = []string{"test0","test1"}
+       updatedE2TInstance := *e2tInstance
+       updatedE2TInstance.AssociatedRanList = []string{"test0"}
+       rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
+       rnibWriterMock.On("SaveE2TInstance", &updatedE2TInstance).Return(nil)
+
+       err := e2tInstancesManager.DissociateRan("test1", E2TAddress)
+       assert.Nil(t, err)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertExpectations(t)
+}
+
+func TestDissociateRanGetInstanceFailure(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+
+       var e2tInstance1 *entities.E2TInstance
+       rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, common.NewInternalError(fmt.Errorf("for test")))
+       err := e2tInstancesManager.DissociateRan("test1", E2TAddress)
+       assert.NotNil(t, err)
+       rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance")
+}
+
+func TestDissociateRanSaveInstanceFailure(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+
+       e2tInstance1  := entities.NewE2TInstance(E2TAddress)
+       rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, nil)
+       rnibWriterMock.On("SaveE2TInstance", mock.Anything).Return(common.NewInternalError(fmt.Errorf("for test")))
+
+       err := e2tInstancesManager.DissociateRan("test1", E2TAddress)
+       assert.NotNil(t, err)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertExpectations(t)
+}
+
+func TestSelectE2TInstancesGetE2TAddressesFailure(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+
+       rnibReaderMock.On("GetE2TAddresses").Return([]string{}, common.NewInternalError(fmt.Errorf("for test")))
+       address, err := e2tInstancesManager.SelectE2TInstance()
+       assert.NotNil(t, err)
+       assert.Empty(t, address)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertNotCalled(t, "GetE2TInstances")
+}
+
+func TestSelectE2TInstancesEmptyE2TAddressList(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+
+       rnibReaderMock.On("GetE2TAddresses").Return([]string{}, nil)
+       address, err := e2tInstancesManager.SelectE2TInstance()
+       assert.NotNil(t, err)
+       assert.Empty(t, address)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertNotCalled(t, "GetE2TInstances")
+}
+
+func TestSelectE2TInstancesGetE2TInstancesFailure(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+
+       addresses := []string{E2TAddress}
+       rnibReaderMock.On("GetE2TAddresses").Return(addresses, nil)
+       rnibReaderMock.On("GetE2TInstances",addresses ).Return([]*entities.E2TInstance{}, common.NewInternalError(fmt.Errorf("for test")))
+       address, err := e2tInstancesManager.SelectE2TInstance()
+       assert.NotNil(t, err)
+       assert.Empty(t, address)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertExpectations(t)
+}
+
+func TestSelectE2TInstancesEmptyE2TInstancesList(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+
+       addresses := []string{E2TAddress}
+       rnibReaderMock.On("GetE2TAddresses").Return(addresses, nil)
+       rnibReaderMock.On("GetE2TInstances",addresses ).Return([]*entities.E2TInstance{}, nil)
+       address, err := e2tInstancesManager.SelectE2TInstance()
+       assert.NotNil(t, err)
+       assert.Empty(t, address)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertExpectations(t)
+}
+
+func TestSelectE2TInstancesNoActiveE2TInstance(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+       addresses := []string{E2TAddress,E2TAddress2}
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1.State = entities.ToBeDeleted
+       e2tInstance1.AssociatedRanList = []string{"test1","test2","test3"}
+       e2tInstance2 := entities.NewE2TInstance(E2TAddress2)
+       e2tInstance2.State = entities.ToBeDeleted
+       e2tInstance2.AssociatedRanList = []string{"test4","test5","test6", "test7"}
+
+       rnibReaderMock.On("GetE2TAddresses").Return(addresses, nil)
+       rnibReaderMock.On("GetE2TInstances",addresses).Return([]*entities.E2TInstance{e2tInstance1, e2tInstance2}, nil)
+       address, err := e2tInstancesManager.SelectE2TInstance()
+       assert.NotNil(t, err)
+       assert.Equal(t, "", address)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertExpectations(t)
+}
+
+func TestSelectE2TInstancesSuccess(t *testing.T) {
+       rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t)
+       addresses := []string{E2TAddress,E2TAddress2}
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1.AssociatedRanList = []string{"test1","test2","test3"}
+       e2tInstance2 := entities.NewE2TInstance(E2TAddress2)
+       e2tInstance2.AssociatedRanList = []string{"test4","test5","test6", "test7"}
+
+       rnibReaderMock.On("GetE2TAddresses").Return(addresses, nil)
+       rnibReaderMock.On("GetE2TInstances",addresses).Return([]*entities.E2TInstance{e2tInstance1, e2tInstance2}, nil)
+       address, err := e2tInstancesManager.SelectE2TInstance()
+       assert.Nil(t, err)
+       assert.Equal(t, E2TAddress, address)
+       rnibReaderMock.AssertExpectations(t)
+       rnibWriterMock.AssertExpectations(t)
+}
 
 func TestRemoveE2TInstance(t *testing.T) {
        _, _, e2tInstancesManager := initE2TInstancesManagerTest(t)
-       address1 := "10.10.2.15:9800"
-       e2tInstance1  := entities.NewE2TInstance(address1)
+       e2tInstance1  := entities.NewE2TInstance(E2TAddress)
        err := e2tInstancesManager.RemoveE2TInstance(e2tInstance1)
        assert.Nil(t, err)
 }
\ No newline at end of file
index 0eb6027..7aaf151 100644 (file)
@@ -34,6 +34,10 @@ type RanSetupManager struct {
        rmrSender       *rmrsender.RmrSender
 }
 
+type IRanSetupManager interface {
+       ExecuteSetup(nodebInfo *entities.NodebInfo, status entities.ConnectionStatus) error
+}
+
 func NewRanSetupManager(logger *logger.Logger, rmrSender *rmrsender.RmrSender, rnibDataService services.RNibDataService) *RanSetupManager {
        return &RanSetupManager{
                logger:          logger,
diff --git a/E2Manager/mocks/ran_setup_manager_mock.go b/E2Manager/mocks/ran_setup_manager_mock.go
new file mode 100644 (file)
index 0000000..656657c
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2019 AT&T Intellectual Property
+// Copyright 2019 Nokia
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+package mocks
+
+import (
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+       "github.com/stretchr/testify/mock"
+)
+
+type RanSetupManagerMock struct {
+       mock.Mock
+}
+
+func (m *RanSetupManagerMock) ExecuteSetup(nodebInfo *entities.NodebInfo, status entities.ConnectionStatus) error {
+       args := m.Called(nodebInfo, status)
+
+       return args.Error(0)
+}
index d4ca1a0..c09ba79 100644 (file)
@@ -463,76 +463,6 @@ func TestGetRNibWriter(t *testing.T) {
        assert.NotEmpty(t, received)
 }
 
-//Integration tests
-//
-//func TestSaveEnbGnbInteg(t *testing.T){
-//     for i := 0; i<10; i++{
-//             Init("e2Manager", 1)
-//             w := GetRNibWriter()
-//             nb := entities.NodebInfo{}
-//             nb.NodeType = entities.Node_ENB
-//             nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
-//             nb.Ip = "localhost"
-//             nb.Port = uint32(5656 + i)
-//             enb := entities.Enb{}
-//             cell1 := &entities.ServedCellInfo{CellId:fmt.Sprintf("%02x",111 + i), Pci:uint32(11 + i)}
-//             cell2 := &entities.ServedCellInfo{CellId:fmt.Sprintf("%02x",222 + i), Pci:uint32(22 + i)}
-//             cell3 := &entities.ServedCellInfo{CellId:fmt.Sprintf("%02x",333 + i), Pci:uint32(33 + i)}
-//             enb.ServedCells = []*entities.ServedCellInfo{cell1, cell2, cell3}
-//             nb.Configuration = &entities.NodebInfo_Enb{Enb:&enb}
-//             plmnId := 0x02f828
-//             nbId := 0x4a952a0a
-//             nbIdentity := &entities.NbIdentity{InventoryName: fmt.Sprintf("nameEnb%d" ,i), GlobalNbId:&entities.GlobalNbId{PlmnId:fmt.Sprintf("%02x", plmnId + i), NbId:fmt.Sprintf("%02x", nbId + i)}}
-//             err := w.SaveNodeb(nbIdentity, &nb)
-//             if err != nil{
-//                     t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err)
-//             }
-//
-//             nb1 := entities.NodebInfo{}
-//             nb1.NodeType = entities.Node_GNB
-//             nb1.ConnectionStatus = entities.ConnectionStatus_CONNECTED
-//             nb1.Ip = "localhost"
-//             nb1.Port =  uint32(6565 + i)
-//             gnb := entities.Gnb{}
-//             gCell1 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",1111 + i), NrPci:uint32(1 + i)}}
-//             gCell2 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",2222 + i), NrPci:uint32(2 + i)}}
-//             gCell3 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",3333 + i), NrPci:uint32(3 + i)}}
-//             gnb.ServedNrCells = []*entities.ServedNRCell{gCell1, gCell2, gCell3,}
-//             nb1.Configuration = &entities.NodebInfo_Gnb{Gnb:&gnb}
-//             nbIdentity = &entities.NbIdentity{InventoryName: fmt.Sprintf("nameGnb%d" ,i), GlobalNbId:&entities.GlobalNbId{PlmnId:fmt.Sprintf("%02x", plmnId - i), NbId:fmt.Sprintf("%02x", nbId - i)}}
-//             err = w.SaveNodeb(nbIdentity, &nb1)
-//             if err != nil{
-//                     t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err)
-//             }
-//     }
-//}
-//
-//func TestSaveNbRanNamesInteg(t *testing.T){
-//     for i := 0; i<10; i++{
-//             Init("e2Manager", 1)
-//             w := GetRNibWriter()
-//             nb := entities.NodebInfo{}
-//             nb.ConnectionStatus = entities.ConnectionStatus_CONNECTING
-//             nb.Ip = "localhost"
-//             nb.Port = uint32(5656 + i)
-//             nbIdentity := &entities.NbIdentity{InventoryName: fmt.Sprintf("nameOnly%d" ,i)}
-//             err := w.SaveNodeb(nbIdentity, &nb)
-//             if err != nil{
-//                     t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err)
-//             }
-//     }
-//}
-//
-//func TestSaveRanLoadInformationInteg(t *testing.T){
-//             Init("e2Manager", 1)
-//             w := GetRNibWriter()
-//             ranLoadInformation := generateRanLoadInformation()
-//             err := w.SaveRanLoadInformation("ran_integ", ranLoadInformation)
-//             if err != nil{
-//                     t.Errorf("#rNibWriter_test.TestSaveRanLoadInformationInteg - Failed to save RanLoadInformation entity. Error: %v", err)
-//             }
-//}
-
 func TestSaveE2TInstanceSuccess(t *testing.T) {
        address := "10.10.2.15:9800"
        loadKey, validationErr := common.ValidateAndBuildE2TInstanceKey(address)
@@ -642,4 +572,74 @@ func TestSaveE2TInfoListSdlFailure(t *testing.T) {
        rNibErr := w.SaveE2TAddresses(e2tAddresses)
        assert.NotNil(t, rNibErr)
        assert.IsType(t, &common.InternalError{}, rNibErr)
-}
\ No newline at end of file
+}
+
+//Integration tests
+//
+//func TestSaveEnbGnbInteg(t *testing.T){
+//     for i := 0; i<10; i++{
+//             Init("e2Manager", 1)
+//             w := GetRNibWriter()
+//             nb := entities.NodebInfo{}
+//             nb.NodeType = entities.Node_ENB
+//             nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
+//             nb.Ip = "localhost"
+//             nb.Port = uint32(5656 + i)
+//             enb := entities.Enb{}
+//             cell1 := &entities.ServedCellInfo{CellId:fmt.Sprintf("%02x",111 + i), Pci:uint32(11 + i)}
+//             cell2 := &entities.ServedCellInfo{CellId:fmt.Sprintf("%02x",222 + i), Pci:uint32(22 + i)}
+//             cell3 := &entities.ServedCellInfo{CellId:fmt.Sprintf("%02x",333 + i), Pci:uint32(33 + i)}
+//             enb.ServedCells = []*entities.ServedCellInfo{cell1, cell2, cell3}
+//             nb.Configuration = &entities.NodebInfo_Enb{Enb:&enb}
+//             plmnId := 0x02f828
+//             nbId := 0x4a952a0a
+//             nbIdentity := &entities.NbIdentity{InventoryName: fmt.Sprintf("nameEnb%d" ,i), GlobalNbId:&entities.GlobalNbId{PlmnId:fmt.Sprintf("%02x", plmnId + i), NbId:fmt.Sprintf("%02x", nbId + i)}}
+//             err := w.SaveNodeb(nbIdentity, &nb)
+//             if err != nil{
+//                     t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err)
+//             }
+//
+//             nb1 := entities.NodebInfo{}
+//             nb1.NodeType = entities.Node_GNB
+//             nb1.ConnectionStatus = entities.ConnectionStatus_CONNECTED
+//             nb1.Ip = "localhost"
+//             nb1.Port =  uint32(6565 + i)
+//             gnb := entities.Gnb{}
+//             gCell1 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",1111 + i), NrPci:uint32(1 + i)}}
+//             gCell2 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",2222 + i), NrPci:uint32(2 + i)}}
+//             gCell3 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",3333 + i), NrPci:uint32(3 + i)}}
+//             gnb.ServedNrCells = []*entities.ServedNRCell{gCell1, gCell2, gCell3,}
+//             nb1.Configuration = &entities.NodebInfo_Gnb{Gnb:&gnb}
+//             nbIdentity = &entities.NbIdentity{InventoryName: fmt.Sprintf("nameGnb%d" ,i), GlobalNbId:&entities.GlobalNbId{PlmnId:fmt.Sprintf("%02x", plmnId - i), NbId:fmt.Sprintf("%02x", nbId - i)}}
+//             err = w.SaveNodeb(nbIdentity, &nb1)
+//             if err != nil{
+//                     t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err)
+//             }
+//     }
+//}
+//
+//func TestSaveNbRanNamesInteg(t *testing.T){
+//     for i := 0; i<10; i++{
+//             Init("e2Manager", 1)
+//             w := GetRNibWriter()
+//             nb := entities.NodebInfo{}
+//             nb.ConnectionStatus = entities.ConnectionStatus_CONNECTING
+//             nb.Ip = "localhost"
+//             nb.Port = uint32(5656 + i)
+//             nbIdentity := &entities.NbIdentity{InventoryName: fmt.Sprintf("nameOnly%d" ,i)}
+//             err := w.SaveNodeb(nbIdentity, &nb)
+//             if err != nil{
+//                     t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err)
+//             }
+//     }
+//}
+//
+//func TestSaveRanLoadInformationInteg(t *testing.T){
+//             Init("e2Manager", 1)
+//             w := GetRNibWriter()
+//             ranLoadInformation := generateRanLoadInformation()
+//             err := w.SaveRanLoadInformation("ran_integ", ranLoadInformation)
+//             if err != nil{
+//                     t.Errorf("#rNibWriter_test.TestSaveRanLoadInformationInteg - Failed to save RanLoadInformation entity. Error: %v", err)
+//             }
+//}