#include <resource_status_request_wrapper.h>
void test_build_pack_resource_status_request();
+ void test_build_pack_resource_status_request_stop();
void test_unpack(void);
int
main(int argc, char* argv[])
{
test_build_pack_resource_status_request();
+ test_build_pack_resource_status_request_stop();
exit(0);
}
}
+void test_build_pack_resource_status_request_stop(){
+ size_t error_buf_size = 8192;
+ size_t packed_buf_size = 4096;
+ unsigned char outBuf[packed_buf_size];
+ char errorBuf[error_buf_size];
+ const uint8_t pLMN_Identity[] = {0xa,0xb,0xc};
+ const uint8_t eUTRANCellIdentifier[] = {0xab, 0xcd, 0x70, 0};
+ const uint8_t *pLMN_Identities[] = {pLMN_Identity};
+ const uint8_t *eUTRANCellIdentifiers[] = {eUTRANCellIdentifier};
+ E2AP_PDU_t *pdu;
+
+ bool result = build_pack_resource_status_request(
+ pLMN_Identities, eUTRANCellIdentifiers, 1,
+ 15 /*measurement_ID*/, 2 /*measurement_ID2*/,
+ Registration_Request_stop /*Registration_Request_start,Registration_Request_stop,Registration_Request_partial_stop, Registration_Request_add*/,
+ 0,
+ ReportingPeriodicity_one_thousand_ms /*ReportingPeriodicity_one_thousand_ms, ReportingPeriodicity_two_thousand_ms, ReportingPeriodicity_five_thousand_ms,ReportingPeriodicity_ten_thousand_ms*/,
+ PartialSuccessIndicator_partial_success_allowed /*PartialSuccessIndicator_partial_success_allowed*/,
+ ReportingPeriodicityRSRPMR_one_hundred_20_ms /*ReportingPeriodicityRSRPMR_one_hundred_20_ms, ReportingPeriodicityRSRPMR_two_hundred_40_ms, ReportingPeriodicityRSRPMR_four_hundred_80_ms,ReportingPeriodicityRSRPMR_six_hundred_40_ms*/,
+ ReportingPeriodicityCSIR_ms5 /* ReportingPeriodicityCSIR_ms5, ReportingPeriodicityCSIR_ms10,ReportingPeriodicityCSIR_ms20,ReportingPeriodicityCSIR_ms40,ReportingPeriodicityCSIR_ms80*/,
+ &packed_buf_size, outBuf, error_buf_size, errorBuf);
+
+ if (!result) {
+ printf("#%s failed. Packing error %s\n", __func__,errorBuf);
+ return;
+ }
+ printf("packed size:%lu\nPayload:\n", packed_buf_size);
+ for (size_t i = 0; i < packed_buf_size; ++i)
+ printf("%02x",outBuf[i]);
+ printf("\n");
+
+ pdu = calloc(1, sizeof(E2AP_PDU_t));
+ if (!unpack_pdu_aux(pdu, packed_buf_size, outBuf,error_buf_size, errorBuf,ATS_ALIGNED_BASIC_PER)){
+ printf("#%s failed. Unpacking error %s\n", __func__, errorBuf);
+ }
+ errorBuf[0] = 0;
+ asn1_pdu_printer(pdu, sizeof(errorBuf), errorBuf);
+ printf("#%s: %s\n", __func__, errorBuf);
+
+ }
+
Registration_Request_start Registration_Request = iota
Registration_Request_stop
)
+
+func (rs Registration_Request) String() string {
+ return [...]string{"start", "stop"}[rs]
+}
\ No newline at end of file
}
if config.EnableResourceStatus {
- err := h.handleNotStartedRsmRanInfo(nodebInfo, rsmRanInfo, config)
- return err
+ return h.handleNotStartedRsmRanInfo(nodebInfo, rsmRanInfo, config)
}
- //err = h.handleNotStoppedRsmRanInfo(nodebInfo, rsmRanInfo, config)
- return nil
+ return h.handleNotStoppedRsmRanInfo(nodebInfo, rsmRanInfo, config)
}
-/*func (h ResourceStatusRequestHandler) handleNotStoppedRsmRanInfo(nodebInfo *entities.NodebInfo, rsmRanInfo *models.RsmRanInfo, config *models.RsmGeneralConfiguration) error {
+func (h ResourceStatusRequestHandler) handleNotStoppedRsmRanInfo(nodebInfo *entities.NodebInfo, rsmRanInfo *models.RsmRanInfo, config *models.RsmGeneralConfiguration) error {
if rsmRanInfo.Action == enums.Stop && rsmRanInfo.ActionStatus {
return nil
}
+ if rsmRanInfo.Enb2MeasurementId == 0 {
+ return rsmerrors.NewInternalError()
+ }
+
if rsmRanInfo.Action != enums.Stop {
err := h.saveRsmRanInfoStopFalse(rsmRanInfo)
}
}
- err := h.resourceStatusService.BuildAndSendStopRequest(config, rsmRanInfo.RanName, rsmRanInfo.Enb1MeasurementId, rsmRanInfo.Enb2MeasurementId)
- return err
-}*/
+ return h.resourceStatusService.BuildAndSendStopRequest(nodebInfo, config, rsmRanInfo.Enb1MeasurementId, rsmRanInfo.Enb2MeasurementId)
+}
func (h ResourceStatusRequestHandler) handleNotStartedRsmRanInfo(nodebInfo *entities.NodebInfo, rsmRanInfo *models.RsmRanInfo, config *models.RsmGeneralConfiguration) error {
if rsmRanInfo.Action == enums.Start && rsmRanInfo.ActionStatus {
}
}
- err := h.resourceStatusService.BuildAndSendInitiateRequest(nodebInfo, config, rsmRanInfo.Enb1MeasurementId)
- return err
+ return h.resourceStatusService.BuildAndSendInitiateRequest(nodebInfo, config, rsmRanInfo.Enb1MeasurementId)
}
-/*func (h ResourceStatusRequestHandler) saveRsmRanInfoStopFalse(rsmRanInfo *models.RsmRanInfo) error {
+func (h ResourceStatusRequestHandler) saveRsmRanInfoStopFalse(rsmRanInfo *models.RsmRanInfo) error {
rsmRanInfo.Action = enums.Stop
rsmRanInfo.ActionStatus = false
- err := h.rNibDataService.SaveRsmRanInfo(rsmRanInfo)
- if err != nil {
- h.logger.Errorf("#ResourceStatusRequestHandler.saveRsmRanInfoStopFalse - failed to save rsm ran data to RNIB. Error: %s", err.Error())
- return err
- }
- return nil
-}*/
+ return h.rNibDataService.SaveRsmRanInfo(rsmRanInfo)
+}
func (h ResourceStatusRequestHandler) saveRsmRanInfoStartFalse(rsmRanInfo *models.RsmRanInfo) error {
rsmRanInfo.Action = enums.Start
rsmRanInfo.ActionStatus = false
rsmRanInfo.Enb2MeasurementId = 0
- err := h.rNibDataService.SaveRsmRanInfo(rsmRanInfo)
- if err != nil {
- return err
- }
- return nil
+ return h.rNibDataService.SaveRsmRanInfo(rsmRanInfo)
}
assert.Equal(t, actualErr.Error(), rsmError.Error())
}
-/*func TestResourceStatusRequestHandlerFalseStopSuccess(t *testing.T) {
+func TestResourceStatusRequestHandlerFalseStopSuccess(t *testing.T) {
handler, readerMock, rsmReaderMock, rsmWriterMock, resourceStatusServiceMock := initTest(t)
- config := tests.GetRsmGeneralConfiguration(false)
+ config := tests.GetRsmGeneralConfiguration(true)
rsmReaderMock.On("GetRsmGeneralConfiguration").Return(config, nil)
rsmWriterMock.On("SaveRsmGeneralConfiguration", config).Return(nil)
readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
- rrInfo1 := &models.RsmRanInfo{RanName:"RanName_1", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:0, Action:enums.Start, ActionStatus:false}
- rrInfo2 := &models.RsmRanInfo{RanName:"RanName_2", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:0, Action:enums.Start, ActionStatus:true}
- rrInfo3 := &models.RsmRanInfo{RanName:"RanName_3", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:0, Action:enums.Stop, ActionStatus:false}
+ rrInfo1 := &models.RsmRanInfo{RanName:"RanName_1", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:2, Action:enums.Stop, ActionStatus:false}
+ rrInfo2 := &models.RsmRanInfo{RanName:"RanName_2", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:2, Action:enums.Stop, ActionStatus:true}
+ rrInfo3 := &models.RsmRanInfo{RanName:"RanName_3", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:2, Action:enums.Start, ActionStatus:false}
rsmReaderMock.On("GetRsmRanInfo", "RanName_1").Return(rrInfo1, nil)
rsmReaderMock.On("GetRsmRanInfo", "RanName_2").Return(rrInfo2, nil)
rsmReaderMock.On("GetRsmRanInfo", "RanName_3").Return(rrInfo3, nil)
rsmWriterMock.On("SaveRsmRanInfo", rrInfo3).Return(nil)
- resourceStatusServiceMock.On("BuildAndSendStopRequest", nb1, config, enums.Enb1MeasurementId).Return(nil)
- resourceStatusServiceMock.On("BuildAndSendStopRequest", nb3, config, enums.Enb1MeasurementId).Return(nil)
+ resourceStatusServiceMock.On("BuildAndSendStopRequest", nb1, config, rrInfo1.Enb1MeasurementId, rrInfo1.Enb2MeasurementId).Return(nil)
+ resourceStatusServiceMock.On("BuildAndSendStopRequest", nb3, config, rrInfo3.Enb1MeasurementId, rrInfo3.Enb2MeasurementId).Return(nil)
- resourceStatusRequest := models.ResourceStatusRequest{EnableResourceStatus:true}
+ resourceStatusRequest := models.ResourceStatusRequest{EnableResourceStatus:false}
actualErr := handler.Handle(resourceStatusRequest)
readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
- resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 2)
+ resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendStopRequest", 2)
assert.Equal(t, actualErr, nil)
-}*/
+}
+
+func TestResourceStatusRequestHandlerFalseNumberOfFails2(t *testing.T) {
+
+ handler, readerMock, rsmReaderMock, rsmWriterMock, resourceStatusServiceMock := initTest(t)
+
+ config := tests.GetRsmGeneralConfiguration(true)
+ rsmReaderMock.On("GetRsmGeneralConfiguration").Return(config, nil)
+ rsmWriterMock.On("SaveRsmGeneralConfiguration", config).Return(nil)
+
+ nbIdentityList := CreateIdentityList()
+ readerMock.On("GetListEnbIds").Return(nbIdentityList, nil)
+
+ nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED,}
+ nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
+ nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_CONNECTED,}
+ readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
+ readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
+ readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
+
+ err := common.NewInternalError(errors.New("Error"))
+ rrInfo1 := &models.RsmRanInfo{RanName:"RanName_1", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:2, Action:enums.Stop, ActionStatus:false}
+ rrInfo3 := &models.RsmRanInfo{RanName:"RanName_3", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:2, Action:enums.Start, ActionStatus:false}
+ rsmReaderMock.On("GetRsmRanInfo", "RanName_1").Return(rrInfo1, err)
+ rsmReaderMock.On("GetRsmRanInfo", "RanName_3").Return(rrInfo3, nil)
+
+ rsmWriterMock.On("SaveRsmRanInfo", rrInfo3).Return(nil)
+
+ resourceStatusServiceMock.On("BuildAndSendStopRequest", nb3, config, rrInfo3.Enb1MeasurementId, rrInfo3.Enb2MeasurementId).Return(nil)
+
+
+ resourceStatusRequest := models.ResourceStatusRequest{EnableResourceStatus:false}
+ actualErr := handler.Handle(resourceStatusRequest)
+
+ readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
+ rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
+ resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendStopRequest", 1)
+
+ rsmError := rsmerrors.NewRsmError(2)
+ assert.Equal(t, actualErr, rsmError)
+ assert.Equal(t, actualErr.Error(), rsmError.Error())
+}
+
+func TestResourceStatusRequestHandlerFalseNumberOfFails3(t *testing.T) {
+
+ handler, readerMock, rsmReaderMock, rsmWriterMock, resourceStatusServiceMock := initTest(t)
+
+ config := tests.GetRsmGeneralConfiguration(true)
+ rsmReaderMock.On("GetRsmGeneralConfiguration").Return(config, nil)
+ rsmWriterMock.On("SaveRsmGeneralConfiguration", config).Return(nil)
+
+ nbIdentityList := CreateIdentityList()
+ readerMock.On("GetListEnbIds").Return(nbIdentityList, nil)
+
+ err := common.NewInternalError(errors.New("Error"))
+ nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED,}
+ nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_CONNECTED,}
+ nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_CONNECTED,}
+ readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
+ readerMock.On("GetNodeb", "RanName_2").Return(nb2, err)
+ readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
+
+ rrInfo1 := &models.RsmRanInfo{RanName:"RanName_1", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:2, Action:enums.Stop, ActionStatus:false}
+ rrInfo3 := &models.RsmRanInfo{RanName:"RanName_3", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:2, Action:enums.Start, ActionStatus:false}
+ rsmReaderMock.On("GetRsmRanInfo", "RanName_1").Return(rrInfo1, nil)
+ rsmReaderMock.On("GetRsmRanInfo", "RanName_3").Return(rrInfo3, nil)
+
+ rsmWriterMock.On("SaveRsmRanInfo", rrInfo3).Return(err)
+
+ resourceStatusServiceMock.On("BuildAndSendStopRequest", nb1, config, rrInfo1.Enb1MeasurementId, rrInfo1.Enb2MeasurementId).Return(errors.New("Error"))
+
+ resourceStatusRequest := models.ResourceStatusRequest{EnableResourceStatus:false}
+ actualErr := handler.Handle(resourceStatusRequest)
+
+ readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
+ rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
+ resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendStopRequest", 1)
+
+ rsmError := rsmerrors.NewRsmError(3)
+ assert.Equal(t, actualErr, rsmError)
+ assert.Equal(t, actualErr.Error(), rsmError.Error())
+}
+
+func TestResourceStatusRequestHandlerFalseNoEnb2MeasurementId(t *testing.T) {
+
+ handler, readerMock, rsmReaderMock, rsmWriterMock, resourceStatusServiceMock := initTest(t)
+
+ config := tests.GetRsmGeneralConfiguration(true)
+ rsmReaderMock.On("GetRsmGeneralConfiguration").Return(config, nil)
+ rsmWriterMock.On("SaveRsmGeneralConfiguration", config).Return(nil)
+
+ nbIdentityList := CreateIdentityList()
+ readerMock.On("GetListEnbIds").Return(nbIdentityList, nil)
+
+ nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED,}
+ nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_CONNECTED,}
+ nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_CONNECTED,}
+ readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
+ readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
+ readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
+
+ rrInfo1 := &models.RsmRanInfo{RanName:"RanName_1", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:2, Action:enums.Stop, ActionStatus:false}
+ rrInfo2 := &models.RsmRanInfo{RanName:"RanName_2", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:2, Action:enums.Stop, ActionStatus:true}
+ rrInfo3 := &models.RsmRanInfo{RanName:"RanName_3", Enb1MeasurementId:enums.Enb1MeasurementId, Enb2MeasurementId:0, Action:enums.Start, ActionStatus:false}
+ rsmReaderMock.On("GetRsmRanInfo", "RanName_1").Return(rrInfo1, nil)
+ rsmReaderMock.On("GetRsmRanInfo", "RanName_2").Return(rrInfo2, nil)
+ rsmReaderMock.On("GetRsmRanInfo", "RanName_3").Return(rrInfo3, nil)
+
+ resourceStatusServiceMock.On("BuildAndSendStopRequest", nb1, config, rrInfo1.Enb1MeasurementId, rrInfo1.Enb2MeasurementId).Return(nil)
+
+ resourceStatusRequest := models.ResourceStatusRequest{EnableResourceStatus:false}
+ actualErr := handler.Handle(resourceStatusRequest)
+
+ readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
+ rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 0)
+ resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendStopRequest", 1)
+
+ rsmError := rsmerrors.NewRsmError(1)
+ assert.Equal(t, actualErr, rsmError)
+ assert.Equal(t, actualErr.Error(), rsmError.Error())
+}
+
func CreateIdentityList() []*entities.NbIdentity {
nbIdentity1 := entities.NbIdentity{InventoryName: "RanName_1"}
nbIdentity2 := entities.NbIdentity{InventoryName: "RanName_2"}
args := m.Called(nodeb, config, enb1MeasurementId)
return args.Error(0)
}
+
+func (m *ResourceStatusServiceMock) BuildAndSendStopRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error {
+ args := m.Called(nodeb, config, enb1MeasurementId, enb2MeasurementId)
+ return args.Error(0)
+}
\ No newline at end of file
--- /dev/null
+//
+// Copyright 2019 AT&T Intellectual Property
+// Copyright 2019 Nokia
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+package rsmerrors
+
+import "fmt"
+
+type RsmError struct {
+ *BaseError
+}
+
+func NewRsmError(numberOfFails int) *RsmError {
+ return &RsmError{
+ &BaseError{
+ Code: 503,
+ Message: fmt.Sprintf("Did not send %d resource status requests to RMR.", numberOfFails),
+ },
+ }
+}
+
+func (e *RsmError) Error() string {
+ return e.Message
+}
type IResourceStatusService interface {
BuildAndSendInitiateRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64) error
- //BuildAndSendStopRequest(config *models.RsmGeneralConfiguration, ranName string, enb1MeasurementId int64, enb2MeasurementId int64) error
+ BuildAndSendStopRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error
}
func NewResourceStatusService(logger *logger.Logger, rmrSender *rmrsender.RmrSender) *ResourceStatusService {
func (m *ResourceStatusService) BuildAndSendInitiateRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64) error {
- cellIdList, err := m.extractCellIdList(nodeb)
+ return m.buildAndSendResourceStatusRequest(enums.Registration_Request_start, nodeb, config, enb1MeasurementId, 0)
+}
- if err != nil {
- return err
- }
+func (m *ResourceStatusService) BuildAndSendStopRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error {
- requestParams := buildResourceStatusInitiateRequestParams(config, cellIdList, enb1MeasurementId)
+ return m.buildAndSendResourceStatusRequest(enums.Registration_Request_stop, nodeb, config, enb1MeasurementId, enb2MeasurementId)
+}
+
+func (m *ResourceStatusService) buildAndSendResourceStatusRequest(registrationRequest enums.Registration_Request, nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error {
- payload, payloadAsString, err := e2pdus.BuildPackedResourceStatusRequest(enums.Registration_Request_start, requestParams, e2pdus.MaxAsn1PackedBufferSize, e2pdus.MaxAsn1CodecMessageBufferSize, m.logger.DebugEnabled())
+ cellIdList, err := m.extractCellIdList(nodeb)
if err != nil {
- m.logger.Errorf("#ResourceStatusService.BuildAndSendInitiateRequest - RAN name: %s. Failed to build and pack resource status initiate request. error: %s", nodeb.RanName, err)
return err
}
- m.logger.Debugf("#ResourceStatusService.BuildAndSendInitiateRequest - RAN name: %s. Successfully build packed payload: %s", nodeb.RanName, payloadAsString)
- rmrMsg := models.NewRmrMessage(rmrcgo.RicResStatusReq, nodeb.RanName, payload)
+ requestParams := buildResourceStatusRequestParams(config, cellIdList, enb1MeasurementId, enb2MeasurementId)
- return m.rmrSender.Send(rmrMsg)
-}
-
-/*func (m *ResourceStatusService) BuildAndSendStopRequest(config *models.RsmGeneralConfiguration, ranName string, enb1MeasurementId int64, enb2MeasurementId int64) error {
-
- requestParams := &e2pdus.ResourceStatusRequestData{
- MeasurementID: e2pdus.Measurement_ID(enb1MeasurementId),
- MeasurementID2: e2pdus.Measurement_ID(enb2MeasurementId),
- }
-
- payload, payloadAsString, err := e2pdus.BuildPackedResourceStatusRequest(enums.Registration_Request_stop, requestParams, e2pdus.MaxAsn1PackedBufferSize, e2pdus.MaxAsn1CodecMessageBufferSize, m.logger.DebugEnabled())
+ payload, payloadAsString, err := e2pdus.BuildPackedResourceStatusRequest(registrationRequest, requestParams, e2pdus.MaxAsn1PackedBufferSize, e2pdus.MaxAsn1CodecMessageBufferSize, m.logger.DebugEnabled())
if err != nil {
- m.logger.Errorf("#ResourceStatusService.BuildAndSendStopRequest - RAN name: %s. Failed to build and pack resource status stop request. error: %s", ranName, err)
+ m.logger.Errorf("#ResourceStatusService.buildAndSendResourceStatusRequest - RAN name: %s. Failed to build and pack resource status %s request. error: %s", nodeb.RanName, registrationRequest, err)
return err
}
- m.logger.Debugf("#ResourceStatusService.BuildAndSendStopRequest - RAN name: %s. Successfully build packed payload: %s", ranName, payloadAsString)
- rmrMsg := models.NewRmrMessage(rmrcgo.RicResStatusReq, ranName, payload)
+ m.logger.Debugf("#ResourceStatusService.buildAndSendResourceStatusRequest - RAN name: %s. Successfully build packed payload: %s", nodeb.RanName, payloadAsString)
+ rmrMsg := models.NewRmrMessage(rmrcgo.RicResStatusReq, nodeb.RanName, payload)
return m.rmrSender.Send(rmrMsg)
-}*/
+}
func (m *ResourceStatusService) extractCellIdList(nodeb *entities.NodebInfo) ([]string, error) {
if !ok {
m.logger.Errorf("#ResourceStatusService.extractCellIdList - RAN name: %s - invalid configuration", nodeb.RanName)
- return []string{}, fmt.Errorf("Invalid configuration for RAN %s", nodeb.RanName)
+ return []string{}, fmt.Errorf("invalid configuration for RAN %s", nodeb.RanName)
}
cells := enb.Enb.ServedCells
return cellIdList, nil
}
-func buildResourceStatusInitiateRequestParams(config *models.RsmGeneralConfiguration, cellIdList []string, enb1MeasurementId int64) *e2pdus.ResourceStatusRequestData {
+func buildResourceStatusRequestParams(config *models.RsmGeneralConfiguration, cellIdList []string, enb1MeasurementId int64, enb2MeasurementId int64) *e2pdus.ResourceStatusRequestData {
return &e2pdus.ResourceStatusRequestData{
CellIdList: cellIdList,
MeasurementID: e2pdus.Measurement_ID(enb1MeasurementId),
+ MeasurementID2: e2pdus.Measurement_ID(enb2MeasurementId),
PartialSuccessAllowed: config.PartialSuccessAllowed,
PrbPeriodic: config.PrbPeriodic,
TnlLoadIndPeriodic: config.TnlLoadIndPeriodic,
const RanName = "test"
const NodebOneCellPackedExample = "0009003c00000800270003000000001c00010000260004fe000000001d400d00001f40080002f8290007ab00001e4001000040400100006d4001400091400120"
const NodebTwoCellsPackedExample = "0009004800000800270003000000001c00010000260004fe000000001d401901001f40080002f8290007ab00001f40080002f8290007ab50001e4001000040400100006d4001400091400120"
+const StopPackedExample = "0009004f0000090027000300000000280003000001001c00014000260004fe000000001d401901001f40080002f8290007ab00001f40080002f8290007ab50001e4001000040400100006d4001400091400120"
func initResourceStatusServiceTest(t *testing.T) (*mocks.RmrMessengerMock, *models.RsmGeneralConfiguration, *ResourceStatusService) {
logger, err := logger.InitLogger(logger.DebugLevel)
rmrMessengerMock.AssertNotCalled(t, "SendMsg")
}
+func TestBuildAndSendStopRequestSuccess(t *testing.T) {
+ rmrMessengerMock, rsmGeneralConfiguration, resourceStatusService := initResourceStatusServiceTest(t)
+
+ cellId1 := "02f829:0007ab00"
+ cellId2 := "02f829:0007ab50"
+ nodebInfo := &entities.NodebInfo{
+ RanName: RanName,
+ ConnectionStatus: entities.ConnectionStatus_CONNECTED,
+ Configuration: &entities.NodebInfo_Enb{
+ Enb: &entities.Enb{
+ ServedCells: []*entities.ServedCellInfo{{CellId: cellId1}, {CellId: cellId2}},
+ },
+ },
+ }
+ xaction := []byte(RanName)
+ var expectedPayload []byte
+ _, _ = fmt.Sscanf(StopPackedExample, "%x", &expectedPayload)
+ expectedMbuf := rmrcgo.NewMBuf(rmrcgo.RicResStatusReq, len(expectedPayload), RanName, &expectedPayload, &xaction)
+ var err error
+ rmrMessengerMock.On("SendMsg", expectedMbuf).Return(&rmrcgo.MBuf{}, err)
+ err = resourceStatusService.BuildAndSendStopRequest(nodebInfo, rsmGeneralConfiguration, enums.Enb1MeasurementId, 2)
+ assert.Nil(t, err)
+ rmrMessengerMock.AssertCalled(t, "SendMsg", expectedMbuf)
+}
+
+func TestBuildAndSendStopRequestSendFailure(t *testing.T) {
+ rmrMessengerMock, rsmGeneralConfiguration, resourceStatusService := initResourceStatusServiceTest(t)
+
+ xaction := []byte(RanName)
+ cellId1 := "02f829:0007ab00"
+ cellId2 := "02f829:0007ab50"
+ nodebInfo := &entities.NodebInfo{
+ RanName: RanName,
+ ConnectionStatus: entities.ConnectionStatus_CONNECTED,
+ Configuration: &entities.NodebInfo_Enb{
+ Enb: &entities.Enb{
+ ServedCells: []*entities.ServedCellInfo{{CellId: cellId1}, {CellId: cellId2}},
+ },
+ },
+ }
+
+ var err error
+ var expectedPayload []byte
+ _, _ = fmt.Sscanf(StopPackedExample, "%x", &expectedPayload)
+ expectedMbuf := rmrcgo.NewMBuf(rmrcgo.RicResStatusReq, len(expectedPayload), RanName, &expectedPayload, &xaction)
+ rmrMessengerMock.On("SendMsg", expectedMbuf).Return(&rmrcgo.MBuf{}, rsmerrors.NewRmrError())
+ err = resourceStatusService.BuildAndSendStopRequest(nodebInfo, rsmGeneralConfiguration, enums.Enb1MeasurementId, 2)
+
+ assert.NotNil(t, err)
+ rmrMessengerMock.AssertCalled(t, "SendMsg", expectedMbuf)
+}
+
func InitRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
rmrMessenger := rmrcgo.RmrMessenger(rmrMessengerMock)
rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)