X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=E2Manager%2Fhandlers%2Fhttpmsghandlers%2Fsetup_request_handler_test.go;h=9fc75fecbd6c2e3dab31c78a26ce0a3db90a948b;hb=25ffe73b7261ce3f87c653062df79ed7d8aa2278;hp=23cb44f467f9f670b6c83d793f269382ccb918be;hpb=15d3982b5eda43a5b5b9054d7ecb026448c6ca16;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 23cb44f..9fc75fe 100644 --- a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go @@ -20,292 +20,439 @@ package httpmsghandlers import ( - "e2mgr/rnibBuilders" + "bytes" + "e2mgr/clients" "e2mgr/configuration" "e2mgr/e2managererrors" "e2mgr/e2pdus" "e2mgr/managers" "e2mgr/mocks" "e2mgr/models" - "e2mgr/rNibWriter" "e2mgr/rmrCgo" "e2mgr/services" + "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/stretchr/testify/assert" "github.com/stretchr/testify/mock" - "reflect" + "io/ioutil" + "net/http" "testing" ) -func TestSetupHandleNewRanSave_Error(t *testing.T) { - readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST) +const E2TAddress = "10.0.2.15:8989" +const RanName = "test" +const BaseRMUrl = "http://10.10.2.15:12020/routingmanager" - 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, _ := rnibBuilders.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) +func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.E2TInstancesManagerMock, *mocks.RanSetupManagerMock, *mocks.HttpClientMock) { + log := initLog(t) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} + config.RoutingManager.BaseUrl = BaseRMUrl - rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil) + readerMock := &mocks.RnibReaderMock{} + writerMock := &mocks.RnibWriterMock{} - _, actual := handler.Handle(sr) - expected := &e2managererrors.RnibDbError{} + rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock) - if reflect.TypeOf(actual) != reflect.TypeOf(expected) { - t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) - } + ranSetupManagerMock := &mocks.RanSetupManagerMock{} + e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} + httpClientMock := &mocks.HttpClientMock{} + mockHttpClientAssociateRan(httpClientMock) + rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) + e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManagerMock, rmClient) + handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManagerMock, protocol, e2tInstancesManagerMock, e2tAssociationManager) - writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1) - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) + return readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, httpClientMock } -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, _ := rnibBuilders.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) +func initSetupRequestTestBasicMocks(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock, *mocks.HttpClientMock, *mocks.E2TInstancesManagerMock) { + log := initLog(t) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} + config.RoutingManager.BaseUrl = BaseRMUrl + readerMock := &mocks.RnibReaderMock{} + writerMock := &mocks.RnibWriterMock{} - _, actual := handler.Handle(sr) + rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock) - assert.Nil(t, actual) + rmrMessengerMock := &mocks.RmrMessengerMock{} + rmrSender := getRmrSender(rmrMessengerMock, log) + ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService) + e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} + httpClientMock := &mocks.HttpClientMock{} + rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) + e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManagerMock, rmClient) + handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol, e2tInstancesManagerMock, e2tAssociationManager) - writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1) - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) + return readerMock, writerMock, handler, rmrMessengerMock, httpClientMock, e2tInstancesManagerMock } -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 mockHttpClientAssociateRan(httpClientMock *mocks.HttpClientMock) { + data := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)} + marshaled, _ := json.Marshal(data) + body := bytes.NewBuffer(marshaled) + url := BaseRMUrl + clients.AssociateRanToE2TInstanceApiSuffix + respBody := ioutil.NopCloser(bytes.NewBufferString("")) + httpClientMock.On("Post", url, "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) } -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) +func TestX2SetupHandleNoPortError(t *testing.T) { + readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - assert.Nil(t, actual) - - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) + sr := models.SetupRequest{"127.0.0.1", 0, RanName,} + _, err := handler.Handle(sr) + assert.IsType(t, &e2managererrors.RequestValidationError{}, err) + readerMock.AssertNotCalled(t, "GetNodeb") } -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) +func TestX2SetupHandleNoRanNameError(t *testing.T) { + readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - payload := e2pdus.PackedX2setupRequest - xaction := []byte(ranName) - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) + sr := models.SetupRequest{RanPort: 8080, RanIp: "127.0.0.1"} + _, err := handler.Handle(sr) + assert.IsType(t, &e2managererrors.RequestValidationError{}, err) + readerMock.AssertNotCalled(t, "GetNodeb") +} - rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) +func TestX2SetupHandleNoIpError(t *testing.T) { + readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - sr := models.SetupRequest{"127.0.0.1", 8080, ranName,} - _, actual := handler.Handle(sr) + sr := models.SetupRequest{RanPort: 8080, RanName: RanName} + _, err := handler.Handle(sr) + assert.IsType(t, &e2managererrors.RequestValidationError{}, err) + readerMock.AssertNotCalled(t, "GetNodeb") +} - assert.Nil(t, actual) +func TestX2SetupHandleInvalidIpError(t *testing.T) { + readerMock, _, handler, _, _, _:= initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) + 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 TestX2SetupHandleRnibGet_Error(t *testing.T) { - readerMock, _, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) +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",} - _, actual := handler.Handle(sr) + nb := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + readerMock.On("GetNodeb", RanName).Return(nb, rnibErr) - 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", 8080, RanName,} + _, err := handler.Handle(sr) + assert.IsType(t, &e2managererrors.RnibDbError{}, err) } -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 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, "AddRansToInstance") + writerMock.AssertNotCalled(t, "SaveNodeb") + ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") } -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) +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(E2TAddress, nil) + e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) + setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} + nodebInfo, _ := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil) + updatedNb := *nodebInfo + updatedNb.ConnectionAttempts = 0 + updatedNb.AssociatedE2TInstanceAddress = E2TAddress + 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) +} - 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 TestSetupNewRanAssociateRanFailure(t *testing.T) { + readerMock, writerMock, handler, e2tInstancesManagerMock, _, httpClientMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) + e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) + e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError()) + setupRequest := &models.SetupRequest{"127.0.0.1", 8080, RanName,} + nb, nbIdentity := createInitialNodeInfo(setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + writerMock.On("SaveNodeb", nbIdentity, mock.Anything).Return(nil) + writerMock.On("UpdateNodebInfo", nb).Return(nil) + nb.AssociatedE2TInstanceAddress = E2TAddress + nb.ConnectionAttempts = 0 + mockHttpClientAssociateRan(httpClientMock) + _, err := handler.Handle(*setupRequest) + assert.IsType(t, &e2managererrors.RnibDbError{}, err) } -func TestX2SetupHandleNoRanName_Error(t *testing.T) { - _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) +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("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) + setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} + nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(common.NewInternalError(fmt.Errorf(""))) + _, err := handler.Handle(setupRequest) + assert.IsType(t, &e2managererrors.RnibDbError{}, err) + ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") +} - sr := models.SetupRequest{} - sr.RanPort = 8080 - sr.RanIp = "127.0.0.1" +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("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError()) + setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} + nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil) + updatedNb := *nodebInfo + updatedNb.ConnectionAttempts = 0 + updatedNb.AssociatedE2TInstanceAddress = E2TAddress + writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) + _, err := handler.Handle(setupRequest) + assert.IsType(t, &e2managererrors.RnibDbError{}, err) + readerMock.AssertExpectations(t) + writerMock.AssertExpectations(t) + ranSetupManagerMock.AssertExpectations(t) +} - _, actual := handler.Handle(sr) +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("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) + setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} + nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil) + updatedNb := *nodebInfo + updatedNb.ConnectionAttempts = 0 + updatedNb.AssociatedE2TInstanceAddress = E2TAddress + writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) + ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRmrError()) + _, err := handler.Handle(setupRequest) + assert.IsType(t, &e2managererrors.RmrError{}, 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 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("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) + setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} + nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil) + updatedNb := *nodebInfo + updatedNb.ConnectionAttempts = 0 + updatedNb.AssociatedE2TInstanceAddress = E2TAddress + writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) + ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil) + _, err := handler.Handle(setupRequest) + assert.Nil(t, err) } -func TestX2SetupHandleNoIP_Error(t *testing.T) { - _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) +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") +} - sr := models.SetupRequest{} - sr.RanPort = 8080 - sr.RanName = "RanName" +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") +} - _, actual := handler.Handle(sr) +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") +} - 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 TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceError(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock, httpClientMock,e2tInstancesManagerMock:= 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) + writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) + setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} + e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) + e2tInstancesManagerMock.On("AddRansToInstance", "10.0.2.15:8989", []string{"test"}).Return(nil) + mockHttpClientAssociateRan(httpClientMock) + _, err := handler.Handle(setupRequest) + assert.IsType(t, &e2managererrors.InternalError{}, err) + rmrMessengerMock.AssertNotCalled(t, "SendMsg") + writerMock.AssertExpectations(t) } -func TestX2SetupHandleInvalidIp_Error(t *testing.T) { - _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) +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") +} - sr := models.SetupRequest{} - sr.RanPort = 8080 - sr.RanName = "RanName" - sr.RanIp = "invalid ip" +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") +} - _, actual := handler.Handle(sr) +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("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError()) + writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) + _, 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") +} - 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 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("AddRansToInstance", E2TAddress, []string{RanName}).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{} */&common.InternalError{}, err) + ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") } -func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock) { - log := initLog(t) - config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} +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("AddRansToInstance", E2TAddress, []string{RanName}).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) +} - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } +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("AddRansToInstance", E2TAddress, []string{RanName}).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) +} - rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrSender := getRmrSender(rmrMessengerMock, log) +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, "AddRansToInstance") + ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") +} - rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider) +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) +} - ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService) - handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol) +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, "AddRansToInstance") +} - return readerMock, writerMock, handler, rmrMessengerMock +func TestSetupExistingRanWithoutAssocE2TInstanceExecuteRoutingManagerError(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock, httpClientMock, e2tInstancesManagerMock := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} + readerMock.On("GetNodeb", RanName).Return(nb, nil) + writerMock.On("UpdateNodebInfo", nb).Return(nil) + e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) + mockHttpClientAssociateRan(httpClientMock) + e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil) + msg := &rmrCgo.MBuf{} + var errNIl error + rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg, errNIl) + _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) + assert.Nil(t, err) + writerMock.AssertExpectations(t) + readerMock.AssertExpectations(t) + httpClientMock.AssertExpectations(t) }