X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=E2Manager%2Fhandlers%2Fhttpmsghandlers%2Fsetup_request_handler_test.go;h=5086c918830bdbee73f5847cc2fcc3644587fd04;hb=refs%2Fchanges%2F01%2F2101%2F1;hp=dddda3509a5271d674778a0df0183f639c2fbb11;hpb=1ec13d4076e7c7abefac6176462c1fee31229213;p=ric-plt%2Fe2mgr.git diff --git a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go index dddda35..5086c91 100644 --- a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go @@ -13,155 +13,377 @@ // 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 httpmsghandlers import ( - "bytes" + "e2mgr/configuration" + "e2mgr/e2managererrors" "e2mgr/e2pdus" - "e2mgr/logger" + "e2mgr/managers" "e2mgr/mocks" "e2mgr/models" - "e2mgr/rNibWriter" - "e2mgr/sessions" + "e2mgr/rmrCgo" + "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" "github.com/stretchr/testify/assert" - "strings" - "sync" + "github.com/stretchr/testify/mock" "testing" - "time" ) -func TestNewSetupRequestHandler(t *testing.T) { - - rnibWriterProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - h := NewSetupRequestHandler(rnibWriterProvider) - assert.NotNil(t, h) -} - -func TestCreateMessageSuccess(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - if err != nil { - t.Errorf("#setup_request_handler_test.TestCreateMessageSuccess - failed to initialize logger, error: %s", err) - } - messageChannel := make(chan *models.E2RequestMessage) - assert.NotPanics(t, func() { createMsg(log, messageChannel) }) - assert.NotEmpty(t, <-messageChannel) -} - -func TestParseRicId(t *testing.T) { - var testCases = []struct { - ricId string - pLMNId []byte - eNBId []byte - eNBIdBitqty uint - failure error - }{ - { - ricId: "bbbccc-abcd02/18", - pLMNId: []byte{0xbb, 0xbc, 0xcc}, - eNBId: []byte{0xab, 0xcd, 0x2}, /*00000010 -> 10000000*/ - eNBIdBitqty: e2pdus.ShortMacro_eNB_ID, - }, - { - ricId: "bbbccc-abcd0e/20", - pLMNId: []byte{0xbb, 0xbc, 0xcc}, - eNBId: []byte{0xab, 0xcd, 0xe}, - eNBIdBitqty: e2pdus.Macro_eNB_ID, - }, - { - ricId: "bbbccc-abcd07/21", - pLMNId: []byte{0xbb, 0xbc, 0xcc}, - eNBId: []byte{0xab, 0xcd, 0x7}, /*00000111 -> 00111000*/ - eNBIdBitqty: e2pdus.LongMacro_eNB_ID, - }, - { - ricId: "bbbccc-abcdef08/28", - pLMNId: []byte{0xbb, 0xbc, 0xcc}, - eNBId: []byte{0xab, 0xcd, 0xef, 0x8}, - eNBIdBitqty: e2pdus.Home_eNB_ID, - }, - { - ricId: "", - failure: fmt.Errorf("unable to extract the value of RIC_ID: EOF"), - }, - - { - ricId: "bbbccc", - failure: fmt.Errorf("unable to extract the value of RIC_ID: unexpected EOF"), - }, - { - ricId: "bbbccc-", - failure: fmt.Errorf("unable to extract the value of RIC_ID: EOF"), - }, - { - ricId: "-bbbccc", - failure: fmt.Errorf("%s", "unable to extract the value of RIC_ID: no hex data for %x string"), - }, - { - ricId: "/20", - failure: fmt.Errorf("%s", "unable to extract the value of RIC_ID: no hex data for %x string"), - }, - { - ricId: "bbbcccdd-abcdef08/28", // pLMNId too long - failure: fmt.Errorf("unable to extract the value of RIC_ID: input does not match format"), - }, - { - ricId: "bbbccc-abcdef0809/28", // eNBId too long - failure: fmt.Errorf("unable to extract the value of RIC_ID: input does not match format"), - }, - - { - ricId: "bbbc-abcdef08/28", // pLMNId too short - failure: fmt.Errorf("invalid value for RIC_ID, len(pLMNId:[187 188]) != 3"), - }, - { - ricId: "bbbccc-abcd/28", // eNBId too short - failure: fmt.Errorf("invalid value for RIC_ID, len(eNBId:[171 205]) != 3 or 4"), - }, - { - ricId: "bbbccc-abcdef08/239", // bit quantity too long - no error, will return 23 (which is invalid) - failure: fmt.Errorf("invalid value for RIC_ID, eNBIdBitqty: 23"), - }, - } - - for _, tc := range testCases { - t.Run(tc.ricId, func(t *testing.T) { - - err := parseRicID(tc.ricId) - if err != nil { - if tc.failure == nil { - t.Errorf("want: success, got: parse failed. Error: %v\n", err) - } else { - if strings.Compare(err.Error(), tc.failure.Error()) != 0 { - t.Errorf("want: %s, got: %s\n", err, tc.failure) - } - } - } else { - if bytes.Compare(tc.pLMNId, pLMNId) != 0 { - t.Errorf("want: pLMNId = %v, got: pLMNId = %v", tc.pLMNId, pLMNId) - } - - if bytes.Compare(tc.eNBId, eNBId) != 0 { - t.Errorf("want: eNBId = %v, got: eNBId = %v", tc.eNBId, eNBId) - } - - if tc.eNBIdBitqty != eNBIdBitqty { - t.Errorf("want: eNBIdBitqty = %d, got: eNBIdBitqty = %d", tc.eNBIdBitqty, eNBIdBitqty) - } - } - }) - } -} -func createMsg(log *logger.Logger, messageChannel chan *models.E2RequestMessage) { - h := SetupRequestHandler{} - E2Sessions := make(sessions.E2Sessions) - var wg sync.WaitGroup - var rd models.RequestDetails - go h.CreateMessage(log, &rd, messageChannel, E2Sessions, time.Now(), wg) - wg.Wait() +const E2TAddress = "10.0.2.15:8989" +const RanName = "test" + +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} + + readerMock := &mocks.RnibReaderMock{} + writerMock := &mocks.RnibWriterMock{} + + rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock) + + ranSetupManagerMock := &mocks.RanSetupManagerMock{} + e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} + handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManagerMock, protocol, e2tInstancesManagerMock) + + return readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock +} + +func initSetupRequestTestBasicMocks(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock) { + log := initLog(t) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} + + readerMock := &mocks.RnibReaderMock{} + writerMock := &mocks.RnibWriterMock{} + + rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock) + + rmrMessengerMock := &mocks.RmrMessengerMock{} + rmrSender := getRmrSender(rmrMessengerMock, log) + ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService) + e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log) + handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol, e2tInstancesManager) + + return readerMock, writerMock, handler, rmrMessengerMock +} + +func TestX2SetupHandleNoPortError(t *testing.T) { + readerMock, _, handler, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + sr := models.SetupRequest{"127.0.0.1", 0, RanName,} + _, err := handler.Handle(sr) + assert.IsType(t, &e2managererrors.RequestValidationError{}, err) + readerMock.AssertNotCalled(t, "GetNodeb") +} + +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 TestX2SetupHandleNoIpError(t *testing.T) { + readerMock, _, handler, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + sr := models.SetupRequest{RanPort: 8080, RanName: RanName} + _, err := handler.Handle(sr) + assert.IsType(t, &e2managererrors.RequestValidationError{}, err) + readerMock.AssertNotCalled(t, "GetNodeb") +} + +func TestX2SetupHandleInvalidIpError(t *testing.T) { + readerMock, _, handler, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + 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 TestSetupGetNodebFailure(t *testing.T) { + readerMock, _, handler, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + rnibErr := &common.ValidationError{} + nb := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + readerMock.On("GetNodeb", RanName).Return(nb, rnibErr) + + sr := models.SetupRequest{"127.0.0.1", 8080, RanName,} + _, err := handler.Handle(sr) + assert.IsType(t, &e2managererrors.RnibDbError{}, err) +} + +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 TestSetupNewRanSelectE2TInstancesNoInstances(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) + readerMock.On("GetE2TAddresses").Return([]string{}, nil) + _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) + assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err) + writerMock.AssertNotCalled(t, "SaveNodeb") + rmrMessengerMock.AssertNotCalled(t, "SendMsg") +} + +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") +} + +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") +} + +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 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) +} + +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) +} + +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") +} + +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") +} + +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") +} + +func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceError(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} + readerMock.On("GetNodeb", RanName).Return(nb, nil) + readerMock.On("GetE2TAddresses").Return([]string{}, nil) + 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) + rmrMessengerMock.AssertNotCalled(t, "SendMsg") + writerMock.AssertExpectations(t) +} + +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 TestSetupExistingRanWithoutAssocE2TInstanceSelectErrorAlreadyDisconnected(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 TestSetupExistingRanWithAssocE2TInstanceExecuteSetupRmrError(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} + readerMock.On("GetNodeb", RanName).Return(nb, nil) + updatedNb := *nb + updatedNb.ConnectionAttempts = 0 + updatedNb2 := updatedNb + updatedNb2.ConnectionAttempts++ + updatedNb3 := updatedNb2 + updatedNb3.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED + updatedNb3.ConnectionAttempts-- + writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) + writerMock.On("UpdateNodebInfo", &updatedNb2).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, true).Return(msg, e2managererrors.NewRmrError()) + writerMock.On("UpdateNodebInfo", &updatedNb3).Return(nil) + _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) + assert.IsType(t, &e2managererrors.RmrError{}, err) + writerMock.AssertExpectations(t) +} + +func TestSetupExistingRanWithAssocE2TInstanceConnectedSuccess(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") }