[RICPLT-2483] resource status request - stop added 88/1688/1
authorIrina <ib565x@intl.att.com>
Wed, 20 Nov 2019 08:10:04 +0000 (10:10 +0200)
committerIrina <ib565x@intl.att.com>
Wed, 20 Nov 2019 08:10:15 +0000 (10:10 +0200)
Change-Id: Icb0ddffce42680391ea33d12dfbf8af4f4d0ff43
Signed-off-by: Irina <ib565x@intl.att.com>
RSM/asn1codec/src/tests/resource_status_request_wrapper_test.c
RSM/enums/registration_request.go
RSM/handlers/httpmsghandlers/resource_status_request_handler.go
RSM/handlers/httpmsghandlers/resource_status_request_handler_test.go
RSM/mocks/resource_status_service_mock.go
RSM/rsmerrors/rsm_error.go [new file with mode: 0644]
RSM/services/resource_status_service.go
RSM/services/resource_status_service_test.go

index 2b504c6..7cd8a8d 100644 (file)
     #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);
     }
 
@@ -84,3 +86,44 @@ or Third bits is set to 1,
 
     }
 
+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);
+
+    }
+
index 4dc7341..3025f62 100644 (file)
@@ -24,3 +24,7 @@ const (
        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
index 77b3f30..6de6c59 100644 (file)
@@ -93,19 +93,21 @@ func (h ResourceStatusRequestHandler) saveAndSendRsmRanInfo(nodebInfo *entities.
        }
 
        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)
@@ -114,9 +116,8 @@ func (h ResourceStatusRequestHandler) saveAndSendRsmRanInfo(nodebInfo *entities.
                }
        }
 
-       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 {
@@ -131,30 +132,20 @@ func (h ResourceStatusRequestHandler) handleNotStartedRsmRanInfo(nodebInfo *enti
                }
        }
 
-       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)
 }
index dfe62cd..4109f39 100644 (file)
@@ -231,11 +231,11 @@ func TestResourceStatusRequestHandlerTrueNumberOfFails3(t *testing.T) {
        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)
 
@@ -249,28 +249,149 @@ func TestResourceStatusRequestHandlerTrueNumberOfFails3(t *testing.T) {
        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"}
index 1597795..f7ff2be 100644 (file)
@@ -31,3 +31,8 @@ func (m *ResourceStatusServiceMock) BuildAndSendInitiateRequest(nodeb *entities.
        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
diff --git a/RSM/rsmerrors/rsm_error.go b/RSM/rsmerrors/rsm_error.go
new file mode 100644 (file)
index 0000000..e4ca044
--- /dev/null
@@ -0,0 +1,37 @@
+//
+// 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
+}
index 974b594..6f0df7e 100644 (file)
@@ -35,7 +35,7 @@ type ResourceStatusService struct {
 
 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 {
@@ -47,46 +47,36 @@ func NewResourceStatusService(logger *logger.Logger, rmrSender *rmrsender.RmrSen
 
 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) {
 
@@ -94,7 +84,7 @@ func (m *ResourceStatusService) extractCellIdList(nodeb *entities.NodebInfo) ([]
 
        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
@@ -112,10 +102,11 @@ func (m *ResourceStatusService) extractCellIdList(nodeb *entities.NodebInfo) ([]
        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,
index cb017d0..9b4e962 100644 (file)
@@ -35,6 +35,7 @@ import (
 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)
@@ -186,6 +187,58 @@ func TestPackFailure(t *testing.T) {
        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)