Copy latest code to master
[ric-plt/resource-status-manager.git] / RSM / handlers / rmrmsghandlers / resource_status_initiate_notification_handler_test.go
index f6a3900..7549915 100644 (file)
 package rmrmsghandlers
 
 import (
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+       "github.com/pkg/errors"
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/mock"
        "rsm/configuration"
-       "rsm/e2pdus"
+       "rsm/enums"
        "rsm/logger"
        "rsm/mocks"
        "rsm/models"
+       "rsm/services"
+       "rsm/tests"
        "testing"
        "time"
 )
 
-func initRanConnectedNotificationHandlerTest(t *testing.T, requestName string) (ResourceStatusInitiateNotificationHandler, *mocks.ResourceStatusInitiateManagerMock, *configuration.Configuration) {
+const RanName = "test"
+
+
+func initRanConnectedNotificationHandlerTest(t *testing.T, requestName string) (ResourceStatusInitiateNotificationHandler, *mocks.RnibReaderMock, *mocks.ResourceStatusServiceMock, *mocks.RsmWriterMock, *mocks.RsmReaderMock) {
        log, err := logger.InitLogger(logger.DebugLevel)
        if err != nil {
                t.Errorf("#... - failed to initialize logger, error: %s", err)
        }
+
        config, err := configuration.ParseConfiguration()
        if err != nil {
                t.Errorf("#... - failed to parse configuration error: %s", err)
        }
-       managerMock := &mocks.ResourceStatusInitiateManagerMock{}
-       h := NewResourceStatusInitiateNotificationHandler(log, config, managerMock, requestName)
-       return h, managerMock, config
+
+       resourceStatusServiceMock := &mocks.ResourceStatusServiceMock{}
+       rnibReaderMock := &mocks.RnibReaderMock{}
+       rsmReaderMock := &mocks.RsmReaderMock{}
+       rsmWriterMock := &mocks.RsmWriterMock{}
+
+       rnibDataService := services.NewRnibDataService(log, config, rnibReaderMock, rsmReaderMock, rsmWriterMock)
+
+       h := NewResourceStatusInitiateNotificationHandler(log, rnibDataService, resourceStatusServiceMock, requestName)
+       return h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock
 }
 
 func TestHandlerInit(t *testing.T) {
-       h, _, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+       h, _, _, _, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
        assert.NotNil(t, h)
 }
 
-func TestHandleSuccess(t *testing.T) {
-       h, managerMock, config := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+func TestJsonUnmarshalError(t *testing.T) {
+       h, rnibReaderMock, resourceStatusServiceMock, _, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+
+       payloadStr := "blabla"
+       payload := []byte(payloadStr)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
+
+       rnibReaderMock.On("GetNodeb", RanName).Return(mock.AnythingOfType("*entities.NodebInfo"))
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
+       h.Handle(rmrReq)
+       rnibReaderMock.AssertNumberOfCalls(t, "GetNodeb", 0)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
+}
+
+func TestUnknownJsonValue(t *testing.T) {
+       h, rnibReaderMock, resourceStatusServiceMock, _, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+
+       payloadStr := "{\"whatever\":3}"
+       payload := []byte(payloadStr)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
+
+       rnibReaderMock.On("GetNodeb", RanName).Return(mock.AnythingOfType("*entities.NodebInfo"))
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
+       h.Handle(rmrReq)
+       rnibReaderMock.AssertNumberOfCalls(t, "GetNodeb", 0)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
+}
+
+func TestHandleGnbNode(t *testing.T) {
+       h, rnibReaderMock, resourceStatusServiceMock, _, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
 
+       payloadStr := "{\"nodeType\":2, \"messageDirection\":1}"
+       payload := []byte(payloadStr)
+       rmrReq := &models.RmrRequest{RanName: "RAN1", Payload: payload, Len: len(payload), StartTime: time.Now()}
+       rnibReaderMock.On("GetNodeb", RanName).Return(mock.AnythingOfType("*entities.NodebInfo"))
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
+       h.Handle(rmrReq)
+       rnibReaderMock.AssertNumberOfCalls(t, "GetNodeb", 0)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
+}
+
+func TestGetRsmGeneralConfigurationFailure(t *testing.T) {
+       h, _, resourceStatusServiceMock, _, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+       var rgc models.RsmGeneralConfiguration
+       rsmReaderMock.On("GetRsmGeneralConfiguration").Return(&rgc, common.NewInternalError(errors.New("Error")))
        payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
        payload := []byte(payloadStr)
-       rmrReq := &models.RmrRequest{RanName:"RAN1", Payload:payload, Len:len(payload), StartTime:time.Now()}
-       managerMock.On("Execute", rmrReq.RanName, mock.AnythingOfType("*e2pdus.ResourceStatusRequestData")).Return(nil)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
+       h.Handle(rmrReq)
+       rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
+}
 
-       resourceStatusInitiateRequestParams := &e2pdus.ResourceStatusRequestData{}
-       populateResourceStatusInitiateRequestParams(resourceStatusInitiateRequestParams, config)
+func TestEnableResourceStatusFalse(t *testing.T) {
+       h, _, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+       var err error
+       rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(false), err)
+       rsmRanInfo := models.RsmRanInfo{RanName, 0, 0, enums.Stop, true}
+       rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(err)
 
+       payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
+       payload := []byte(payloadStr)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
        h.Handle(rmrReq)
-       managerMock.AssertCalled(t, "Execute", rmrReq.RanName, resourceStatusInitiateRequestParams)
+       rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
+       rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
 }
 
-func TestHandleResourceStatusNotEnabled(t *testing.T) {
-       h, managerMock, config := initRanConnectedNotificationHandlerTest(t, "RanConnected")
-       config.ResourceStatusParams.EnableResourceStatus = false
+func TestEnableResourceStatusFalseSaveRsmRanInfoFailure(t *testing.T) {
+       h, _, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+       var err error
+       rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(false), err)
+       rsmRanInfo := models.RsmRanInfo{RanName, 0, 0, enums.Stop, true}
+       rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(common.NewInternalError(errors.New("Error")))
 
        payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
        payload := []byte(payloadStr)
-       rmrReq := &models.RmrRequest{RanName:"RAN1", Payload:payload, Len:len(payload), StartTime:time.Now()}
-       managerMock.On("Execute", rmrReq.RanName, mock.AnythingOfType("*e2pdus.ResourceStatusRequestData")).Return(nil)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
+       h.Handle(rmrReq)
+       rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
+       rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
+}
 
+func TestGetNodebFailure(t *testing.T) {
+       h, rnibReaderMock, resourceStatusServiceMock, _, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+
+       payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
+       payload := []byte(payloadStr)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
+
+       var err error
+       rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(true), err)
+
+       var nodebInfo *entities.NodebInfo
+       rnibReaderMock.On("GetNodeb", RanName).Return(nodebInfo, common.NewInternalError(errors.New("Error")))
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
        h.Handle(rmrReq)
-       managerMock.AssertNumberOfCalls(t, "Execute", 0)
+       rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
+       rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
 }
 
-func TestHandleUnknownJson(t *testing.T) {
-       h, managerMock, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+func TestInvalidConnectionStatus(t *testing.T) {
+       h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+       var err error
+       rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(true), err)
+       rnibReaderMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}, err)
+       rsmRanInfo := models.RsmRanInfo{RanName, 0, 0, enums.Stop, true}
+       rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(err)
 
-       payloadStr := "blablabla"
+       payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
        payload := []byte(payloadStr)
-       rmrReq := &models.RmrRequest{RanName:"RAN1", Payload:payload, Len:len(payload), StartTime:time.Now()}
-       managerMock.On("Execute", rmrReq.RanName, mock.AnythingOfType("*e2pdus.ResourceStatusRequestData")).Return(nil)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
+       h.Handle(rmrReq)
+       rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
+       rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
+       rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
+}
+
+func TestEnableResourceStatusTrueSaveRsmRanInfoFailure(t *testing.T) {
+       h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
 
+       payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
+       payload := []byte(payloadStr)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
+
+       var err error
+       rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(true), err)
+       rnibReaderMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}, err)
+       rsmRanInfo := models.RsmRanInfo{RanName, enums.Enb1MeasurementId, 0, enums.Start, false}
+       rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(common.NewInternalError(errors.New("Error")))
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
        h.Handle(rmrReq)
-       managerMock.AssertNumberOfCalls(t, "Execute", 0)
+       rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
+       rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
+       rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
 }
 
-func TestHandleGnbNode(t *testing.T) {
-       h, managerMock, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+func TestBuildAndSendSuccess(t *testing.T) {
+       h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
 
-       payloadStr := "{\"nodeType\":2, \"messageDirection\":1}"
+       payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
        payload := []byte(payloadStr)
-       rmrReq := &models.RmrRequest{RanName:"RAN1", Payload:payload, Len:len(payload), StartTime:time.Now()}
-       managerMock.On("Execute", rmrReq.RanName, mock.AnythingOfType("*e2pdus.ResourceStatusRequestData")).Return(nil)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
 
+       var err error
+       rgc := tests.GetRsmGeneralConfiguration(true)
+       rsmReaderMock.On("GetRsmGeneralConfiguration").Return(rgc, err)
+       nodebInfo := &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
+       rnibReaderMock.On("GetNodeb", RanName).Return(nodebInfo, err)
+       rsmRanInfo := models.RsmRanInfo{RanName, enums.Enb1MeasurementId, 0, enums.Start, false}
+       rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(err)
+
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", nodebInfo, rgc, enums.Enb1MeasurementId).Return(nil)
+       h.Handle(rmrReq)
+       rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
+       rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
+       rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 1)
+}
+
+func TestBuildAndSendError(t *testing.T) {
+       h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
+       var err error
+       nodebInfo := &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
+       rgc := tests.GetRsmGeneralConfiguration(true)
+       rsmReaderMock.On("GetRsmGeneralConfiguration").Return(rgc, err)
+       rnibReaderMock.On("GetNodeb", RanName).Return(nodebInfo, err)
+       rsmRanInfoStart := models.RsmRanInfo{RanName, enums.Enb1MeasurementId, 0, enums.Start, false}
+       rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfoStart).Return(err)
+       rsmRanInfoStop := models.RsmRanInfo{RanName, 0, 0, enums.Stop, true}
+       rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfoStop).Return(err)
+       payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
+       payload := []byte(payloadStr)
+       rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
+       resourceStatusServiceMock.On("BuildAndSendInitiateRequest", nodebInfo, rgc, enums.Enb1MeasurementId).Return(common.NewInternalError(errors.New("Error")))
        h.Handle(rmrReq)
-       managerMock.AssertNumberOfCalls(t, "Execute", 0)
+       rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
+       rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
+       resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 1)
+       rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 2)
 }