X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=E2Manager%2Fhandlers%2Frmrmsghandlers%2Fsetup_response_notification_handler_test.go;h=b8918b4920bd8dd758edf3b62a600905e9bdb1f6;hb=d5fcd9aeaadd7fcfaa7f6cff7bc8b8d10e9e4b81;hp=3898eb42ee0e70e8c09822e7979da786339e13d4;hpb=0e58b60a82f5912f815be9292fe0c072a80b79a7;p=ric-plt%2Fe2mgr.git diff --git a/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler_test.go index 3898eb4..b8918b4 100644 --- a/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler_test.go @@ -1,19 +1,46 @@ +// +// 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. + +// This source code is part of the near-RT RIC (RAN Intelligent Controller) +// platform project (RICP). + + package rmrmsghandlers import ( + "e2mgr/configuration" + "e2mgr/converters" + "e2mgr/e2managererrors" + "e2mgr/enums" "e2mgr/logger" "e2mgr/managers" "e2mgr/mocks" "e2mgr/models" - "e2mgr/rNibWriter" + "e2mgr/rmrCgo" + "e2mgr/services" + "e2mgr/services/rmrsender" + "encoding/json" "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" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "testing" + "unsafe" ) const ( @@ -24,149 +51,290 @@ const ( EndcSetupFailureResponsePackedPdu = "4024001a0000030005400200000016400100001140087821a00000008040" ) -type setupResponseTestContext struct { - logger *logger.Logger - readerMock *mocks.RnibReaderMock - writerMock *mocks.RnibWriterMock - rnibReaderProvider func() reader.RNibReader - rnibWriterProvider func() rNibWriter.RNibWriter +type setupSuccessResponseTestCase struct { + packedPdu string setupResponseManager managers.ISetupResponseManager + msgType int + saveNodebMockError error + sendMsgError error + statusChangeMbuf *rmrCgo.MBuf +} + +type setupFailureResponseTestCase struct { + packedPdu string + setupResponseManager managers.ISetupResponseManager + msgType int + saveNodebMockError error +} + +type setupResponseTestContext struct { + logger *logger.Logger + readerMock *mocks.RnibReaderMock + writerMock *mocks.RnibWriterMock + rnibDataService services.RNibDataService + setupResponseManager managers.ISetupResponseManager + ranStatusChangeManager managers.IRanStatusChangeManager + rmrSender *rmrsender.RmrSender + rmrMessengerMock *mocks.RmrMessengerMock } func NewSetupResponseTestContext(manager managers.ISetupResponseManager) *setupResponseTestContext { - logger, _ := logger.InitLogger(logger.InfoLevel) + InfoLevel := int8(3) + logger, _ := logger.InitLogger(InfoLevel) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} readerMock := &mocks.RnibReaderMock{} writerMock := &mocks.RnibWriterMock{} + rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) + + rmrMessengerMock := &mocks.RmrMessengerMock{} + rmrSender := initRmrSender(rmrMessengerMock, logger) + + ranStatusChangeManager := managers.NewRanStatusChangeManager(logger, rmrSender) + return &setupResponseTestContext{ - logger: logger, - readerMock: readerMock, - writerMock: writerMock, - rnibReaderProvider: func() reader.RNibReader { - return readerMock - }, - rnibWriterProvider: func() rNibWriter.RNibWriter { - return writerMock - }, - setupResponseManager: manager, + logger: logger, + readerMock: readerMock, + writerMock: writerMock, + rnibDataService: rnibDataService, + setupResponseManager: manager, + ranStatusChangeManager: ranStatusChangeManager, + rmrMessengerMock: rmrMessengerMock, + rmrSender: rmrSender, } } func TestSetupResponseGetNodebFailure(t *testing.T) { notificationRequest := models.NotificationRequest{RanName: RanName} testContext := NewSetupResponseTestContext(nil) - handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response") + handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, &managers.X2SetupResponseManager{}, testContext.ranStatusChangeManager, rmrCgo.RIC_X2_SETUP_RESP) testContext.readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewInternalError(errors.New("Error"))) - handler.Handle(testContext.logger, nil, ¬ificationRequest, nil) + handler.Handle(¬ificationRequest) testContext.readerMock.AssertCalled(t, "GetNodeb", RanName) testContext.writerMock.AssertNotCalled(t, "SaveNodeb") + testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg") } func TestSetupResponseInvalidConnectionStatus(t *testing.T) { ranName := "test" notificationRequest := models.NotificationRequest{RanName: ranName} testContext := NewSetupResponseTestContext(nil) - handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response") + handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, &managers.X2SetupResponseManager{}, testContext.ranStatusChangeManager, rmrCgo.RIC_X2_SETUP_RESP) var rnibErr error testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}, rnibErr) - handler.Handle(testContext.logger, nil, ¬ificationRequest, nil) + handler.Handle(¬ificationRequest) testContext.readerMock.AssertCalled(t, "GetNodeb", ranName) testContext.writerMock.AssertNotCalled(t, "SaveNodeb") + testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg") } -func executeHandleSuccessSetupResponse(t *testing.T, packedPdu string, setupResponseManager managers.ISetupResponseManager, notificationType string, saveNodebMockReturnValue error) (*setupResponseTestContext, *entities.NodebInfo) { +func executeHandleSetupSuccessResponse(t *testing.T, tc setupSuccessResponseTestCase) (*setupResponseTestContext, *entities.NodebInfo) { var payload []byte - _, err := fmt.Sscanf(packedPdu, "%x", &payload) + _, err := fmt.Sscanf(tc.packedPdu, "%x", &payload) if err != nil { t.Fatalf("Failed converting packed pdu. Error: %v\n", err) } notificationRequest := models.NotificationRequest{RanName: RanName, Payload: payload} - testContext := NewSetupResponseTestContext(setupResponseManager) + testContext := NewSetupResponseTestContext(tc.setupResponseManager) - handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, testContext.setupResponseManager, notificationType) + handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, testContext.setupResponseManager, testContext.ranStatusChangeManager, tc.msgType) var rnibErr error nodebInfo := &entities.NodebInfo{ ConnectionStatus: entities.ConnectionStatus_CONNECTING, - ConnectionAttempts: 1, RanName: RanName, Ip: "10.0.2.2", Port: 1231, } testContext.readerMock.On("GetNodeb", RanName).Return(nodebInfo, rnibErr) - testContext.writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(saveNodebMockReturnValue) - handler.Handle(testContext.logger, nil, ¬ificationRequest, nil) + testContext.writerMock.On("SaveNodeb", mock.Anything).Return(tc.saveNodebMockError) + testContext.rmrMessengerMock.On("SendMsg", tc.statusChangeMbuf, true).Return(&rmrCgo.MBuf{}, tc.sendMsgError) + handler.Handle(¬ificationRequest) return testContext, nodebInfo } -func TestX2SetupResponse(t *testing.T) { +func getRanConnectedMbuf(nodeType entities.Node_Type) *rmrCgo.MBuf { + var xAction []byte + resourceStatusPayload := models.NewResourceStatusPayload(nodeType, enums.RIC_TO_RAN) + resourceStatusJson, _ := json.Marshal(resourceStatusPayload) + var msgSrc unsafe.Pointer + return rmrCgo.NewMBuf(rmrCgo.RAN_CONNECTED, len(resourceStatusJson), RanName, &resourceStatusJson, &xAction, msgSrc) +} + +func executeHandleSetupFailureResponse(t *testing.T, tc setupFailureResponseTestCase) (*setupResponseTestContext, *entities.NodebInfo) { + var payload []byte + _, err := fmt.Sscanf(tc.packedPdu, "%x", &payload) + if err != nil { + t.Fatalf("Failed converting packed pdu. Error: %v\n", err) + } + + notificationRequest := models.NotificationRequest{RanName: RanName, Payload: payload} + testContext := NewSetupResponseTestContext(tc.setupResponseManager) + + handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, testContext.setupResponseManager, testContext.ranStatusChangeManager, tc.msgType) + var rnibErr error - testContext, nodebInfo := executeHandleSuccessSetupResponse(t, X2SetupResponsePackedPdu, &managers.X2SetupResponseManager{}, "X2 Setup Response", rnibErr) + + nodebInfo := &entities.NodebInfo{ + ConnectionStatus: entities.ConnectionStatus_CONNECTING, + RanName: RanName, + Ip: "10.0.2.2", + Port: 1231, + } + + testContext.readerMock.On("GetNodeb", RanName).Return(nodebInfo, rnibErr) + testContext.writerMock.On("SaveNodeb", mock.Anything).Return(tc.saveNodebMockError) + handler.Handle(¬ificationRequest) + + return testContext, nodebInfo +} + +func TestX2SetupResponse(t *testing.T) { + logger := initLog(t) + var saveNodebMockError error + var sendMsgError error + tc := setupSuccessResponseTestCase{ + X2SetupResponsePackedPdu, + managers.NewX2SetupResponseManager(converters.NewX2SetupResponseConverter(logger)), + rmrCgo.RIC_X2_SETUP_RESP, + saveNodebMockError, + sendMsgError, + getRanConnectedMbuf(entities.Node_ENB), + } + + testContext, nodebInfo := executeHandleSetupSuccessResponse(t, tc) testContext.readerMock.AssertCalled(t, "GetNodeb", RanName) - testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo) + testContext.writerMock.AssertCalled(t, "SaveNodeb", nodebInfo) assert.EqualValues(t, entities.ConnectionStatus_CONNECTED, nodebInfo.ConnectionStatus) - assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts) assert.EqualValues(t, entities.Node_ENB, nodebInfo.NodeType) assert.IsType(t, &entities.NodebInfo_Enb{}, nodebInfo.Configuration) i, _ := nodebInfo.Configuration.(*entities.NodebInfo_Enb) assert.NotNil(t, i.Enb) + testContext.rmrMessengerMock.AssertCalled(t, "SendMsg", tc.statusChangeMbuf, true) } func TestX2SetupFailureResponse(t *testing.T) { - var rnibErr error - testContext, nodebInfo := executeHandleSuccessSetupResponse(t, X2SetupFailureResponsePackedPdu, &managers.X2SetupFailureResponseManager{}, "X2 Setup Failure Response", rnibErr) + logger := initLog(t) + var saveNodebMockError error + tc := setupFailureResponseTestCase{ + X2SetupFailureResponsePackedPdu, + managers.NewX2SetupFailureResponseManager(converters.NewX2SetupFailureResponseConverter(logger)), + rmrCgo.RIC_X2_SETUP_FAILURE, + saveNodebMockError, + } + + testContext, nodebInfo := executeHandleSetupFailureResponse(t, tc) testContext.readerMock.AssertCalled(t, "GetNodeb", RanName) - testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo) + testContext.writerMock.AssertCalled(t, "SaveNodeb", nodebInfo) assert.EqualValues(t, entities.ConnectionStatus_CONNECTED_SETUP_FAILED, nodebInfo.ConnectionStatus) - assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts) assert.EqualValues(t, entities.Failure_X2_SETUP_FAILURE, nodebInfo.FailureType) assert.NotNil(t, nodebInfo.SetupFailure) + testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg") } func TestEndcSetupResponse(t *testing.T) { - var rnibErr error - testContext, nodebInfo := executeHandleSuccessSetupResponse(t, EndcSetupResponsePackedPdu, &managers.EndcSetupResponseManager{}, "ENDC Setup Response", rnibErr) + logger := initLog(t) + var saveNodebMockError error + var sendMsgError error + tc := setupSuccessResponseTestCase{ + EndcSetupResponsePackedPdu, + managers.NewEndcSetupResponseManager(converters.NewEndcSetupResponseConverter(logger)), + rmrCgo.RIC_ENDC_X2_SETUP_RESP, + saveNodebMockError, + sendMsgError, + getRanConnectedMbuf(entities.Node_GNB), + } + + testContext, nodebInfo := executeHandleSetupSuccessResponse(t, tc) testContext.readerMock.AssertCalled(t, "GetNodeb", RanName) - testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo) + testContext.writerMock.AssertCalled(t, "SaveNodeb", nodebInfo) assert.EqualValues(t, entities.ConnectionStatus_CONNECTED, nodebInfo.ConnectionStatus) - assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts) assert.EqualValues(t, entities.Node_GNB, nodebInfo.NodeType) assert.IsType(t, &entities.NodebInfo_Gnb{}, nodebInfo.Configuration) i, _ := nodebInfo.Configuration.(*entities.NodebInfo_Gnb) assert.NotNil(t, i.Gnb) + testContext.rmrMessengerMock.AssertCalled(t, "SendMsg", tc.statusChangeMbuf, true) } + func TestEndcSetupFailureResponse(t *testing.T) { - var rnibErr error - testContext, nodebInfo := executeHandleSuccessSetupResponse(t, EndcSetupFailureResponsePackedPdu, &managers.EndcSetupFailureResponseManager{}, "ENDC Setup Failure Response", rnibErr) + logger := initLog(t) + var saveNodebMockError error + tc := setupFailureResponseTestCase{ + EndcSetupFailureResponsePackedPdu, + managers.NewEndcSetupFailureResponseManager(converters.NewEndcSetupFailureResponseConverter(logger)), + rmrCgo.RIC_ENDC_X2_SETUP_FAILURE, + saveNodebMockError, + } + + testContext, nodebInfo := executeHandleSetupFailureResponse(t, tc) testContext.readerMock.AssertCalled(t, "GetNodeb", RanName) - testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo) + testContext.writerMock.AssertCalled(t, "SaveNodeb", nodebInfo) assert.EqualValues(t, entities.ConnectionStatus_CONNECTED_SETUP_FAILED, nodebInfo.ConnectionStatus) - assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts) assert.EqualValues(t, entities.Failure_ENDC_X2_SETUP_FAILURE, nodebInfo.FailureType) assert.NotNil(t, nodebInfo.SetupFailure) + testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg") } func TestSetupResponseInvalidPayload(t *testing.T) { + logger := initLog(t) ranName := "test" notificationRequest := models.NotificationRequest{RanName: ranName, Payload: []byte("123")} testContext := NewSetupResponseTestContext(nil) - handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response") + handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, managers.NewX2SetupResponseManager(converters.NewX2SetupResponseConverter(logger)), testContext.ranStatusChangeManager, rmrCgo.RIC_X2_SETUP_RESP) var rnibErr error - testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, ConnectionAttempts: 1}, rnibErr) - handler.Handle(testContext.logger, nil, ¬ificationRequest, nil) + testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING}, rnibErr) + handler.Handle(¬ificationRequest) testContext.readerMock.AssertCalled(t, "GetNodeb", ranName) testContext.writerMock.AssertNotCalled(t, "SaveNodeb") + testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg") } func TestSetupResponseSaveNodebFailure(t *testing.T) { - rnibErr := common.NewInternalError(errors.New("Error")) - testContext, nodebInfo := executeHandleSuccessSetupResponse(t, X2SetupResponsePackedPdu, &managers.X2SetupResponseManager{},"X2 Setup Response", rnibErr) + logger := initLog(t) + saveNodebMockError := common.NewInternalError(errors.New("Error")) + var sendMsgError error + tc := setupSuccessResponseTestCase{ + X2SetupResponsePackedPdu, + managers.NewX2SetupResponseManager(converters.NewX2SetupResponseConverter(logger)), + rmrCgo.RIC_X2_SETUP_RESP, + saveNodebMockError, + sendMsgError, + getRanConnectedMbuf(entities.Node_ENB), + } + + testContext, nodebInfo := executeHandleSetupSuccessResponse(t, tc) + testContext.readerMock.AssertCalled(t, "GetNodeb", RanName) + testContext.writerMock.AssertCalled(t, "SaveNodeb", nodebInfo) + testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg") +} + +func TestSetupResponseStatusChangeSendFailure(t *testing.T) { + logger := initLog(t) + var saveNodebMockError error + sendMsgError := e2managererrors.NewRmrError() + tc := setupSuccessResponseTestCase{ + X2SetupResponsePackedPdu, + managers.NewX2SetupResponseManager(converters.NewX2SetupResponseConverter(logger)), + rmrCgo.RIC_X2_SETUP_RESP, + saveNodebMockError, + sendMsgError, + getRanConnectedMbuf(entities.Node_ENB), + } + + testContext, nodebInfo := executeHandleSetupSuccessResponse(t, tc) testContext.readerMock.AssertCalled(t, "GetNodeb", RanName) - testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo) -} \ No newline at end of file + testContext.writerMock.AssertCalled(t, "SaveNodeb", nodebInfo) + assert.EqualValues(t, entities.ConnectionStatus_CONNECTED, nodebInfo.ConnectionStatus) + assert.EqualValues(t, entities.Node_ENB, nodebInfo.NodeType) + + assert.IsType(t, &entities.NodebInfo_Enb{}, nodebInfo.Configuration) + i, _ := nodebInfo.Configuration.(*entities.NodebInfo_Enb) + assert.NotNil(t, i.Enb) + testContext.rmrMessengerMock.AssertCalled(t, "SendMsg", tc.statusChangeMbuf, true) +}