diff --git a/fsw/cfe-core/src/inc/cfe_error.h b/fsw/cfe-core/src/inc/cfe_error.h index 03f4e1ea3..066f6353b 100644 --- a/fsw/cfe-core/src/inc/cfe_error.h +++ b/fsw/cfe-core/src/inc/cfe_error.h @@ -979,6 +979,16 @@ #define CFE_SB_BUFFER_INVALID ((int32)0xca00000e) +/** + * @brief No Message Recieved + * + * When trying to determine the last senders ID, this return + * value indicates that there was not a message recived on the pipe. + * + */ +#define CFE_SB_NO_MSG_RECV ((int32)0xca00000f) + + /** * @brief Not Implemented * diff --git a/fsw/cfe-core/src/sb/cfe_sb_api.c b/fsw/cfe-core/src/sb/cfe_sb_api.c index 5495c1784..ad668533a 100644 --- a/fsw/cfe-core/src/sb/cfe_sb_api.c +++ b/fsw/cfe-core/src/sb/cfe_sb_api.c @@ -1651,12 +1651,20 @@ uint32 CFE_SB_GetLastSenderId(CFE_SB_SenderId_t **Ptr,CFE_SB_PipeId_t PipeId) /* Get ptr to buffer descriptor for the last msg received on the given pipe */ Ptr2BufDescriptor = CFE_SB.PipeTbl[PipeId].CurrentBuff; - /* Set the receivers pointer to the adr of 'Sender' struct in buf descriptor */ - *Ptr = (CFE_SB_SenderId_t *) &Ptr2BufDescriptor -> Sender; - - CFE_SB_UnlockSharedData(__func__,__LINE__); - - return CFE_SUCCESS; + if ( Ptr2BufDescriptor == NULL ) + { + *Ptr = NULL; + CFE_SB.PipeTbl[PipeId].LastSender = CFE_SB_INVALID_MSG_ID; + CFE_SB_UnlockSharedData(__func__,__LINE__); + return CFE_SB_NO_MSG_RECV; + } + else + { + /* Set the receivers pointer to the adr of 'Sender' struct in buf descriptor */ + *Ptr = (CFE_SB_SenderId_t *) &Ptr2BufDescriptor -> Sender; + CFE_SB_UnlockSharedData(__func__,__LINE__); + return CFE_SUCCESS; + } }/* end CFE_SB_GetLastSenderId */ diff --git a/fsw/cfe-core/unit-test/sb_UT.c b/fsw/cfe-core/unit-test/sb_UT.c index 2c1f4cd7a..ac334f6d2 100644 --- a/fsw/cfe-core/unit-test/sb_UT.c +++ b/fsw/cfe-core/unit-test/sb_UT.c @@ -7531,6 +7531,7 @@ void Test_RcvMsg_API(void) Test_RcvMsg_GetLastSenderNull(); Test_RcvMsg_GetLastSenderInvalidPipe(); Test_RcvMsg_GetLastSenderInvalidCaller(); + Test_RcvMsg_GetLastSenderNoValidSender(); Test_RcvMsg_GetLastSenderSuccess(); Test_RcvMsg_Timeout(); Test_RcvMsg_PipeReadError(); @@ -7876,10 +7877,8 @@ void Test_RcvMsg_GetLastSenderInvalidCaller(void) "GetLastSenderId invalid caller test"); } /* end Test_RcvMsg_GetLastSenderInvalidCaller */ -/* -** Test successful receive last message request -*/ -void Test_RcvMsg_GetLastSenderSuccess(void) + +void Test_RcvMsg_GetLastSenderNoValidSender(void) { CFE_SB_PipeId_t PipeId; CFE_SB_SenderId_t *GLSPtr; @@ -7888,12 +7887,70 @@ void Test_RcvMsg_GetLastSenderSuccess(void) int32 ActRtn; int32 TestStat = CFE_PASS; +#ifdef UT_VERBOSE + UT_Text("Begin Test for GetLastSender No Valid Sender"); +#endif + + SB_ResetUnitTest(); + CFE_SB_CreatePipe(&PipeId, PipeDepth, "RcvMsgTestPipe"); + ActRtn = CFE_SB_GetLastSenderId(&GLSPtr, PipeId); + ExpRtn = CFE_SB_NO_MSG_RECV; + + if (ActRtn != ExpRtn) + { + snprintf(cMsg, UT_MAX_MESSAGE_LENGTH, + "Unexpected return in GetLastSenderId No Valid Sender test, " + "exp=0x%lx, act=0x%lx", + (unsigned long) ExpRtn, (unsigned long) ActRtn); + UT_Text(cMsg); + TestStat = CFE_FAIL; + } + + ExpRtn = 1; + ActRtn = UT_GetNumEventsSent(); + + if (ActRtn != ExpRtn) + { + snprintf(cMsg, UT_MAX_MESSAGE_LENGTH, + "Unexpected rtn from UT_GetNumEventsSent, exp=%ld, act=%ld", + (long) ExpRtn, (long) ActRtn); + UT_Text(cMsg); + TestStat = CFE_FAIL; + } + + CFE_SB_DeletePipe(PipeId); + UT_Report(__FILE__, __LINE__, + TestStat, "Test_RcvMsg_API", + "GetLastSenderId No Valid Sender test"); + +} /* end Test_RcvMsg_GetLastSenderNoValidSender */ + + +/* +** Test successful receive last message request +*/ +void Test_RcvMsg_GetLastSenderSuccess(void) +{ + CFE_SB_PipeId_t PipeId; + CFE_SB_SenderId_t *GLSPtr; + SB_UT_Test_Tlm_t TlmPkt; + CFE_SB_MsgPtr_t TlmPktPtr = (CFE_SB_MsgPtr_t) &TlmPkt; + CFE_SB_MsgPtr_t PtrToMsg; + uint32 PipeDepth = 10; + int32 ExpRtn; + int32 ActRtn; + int32 TestStat = CFE_PASS; + #ifdef UT_VERBOSE UT_Text("Begin Test for GetLastSender Success"); #endif SB_ResetUnitTest(); CFE_SB_CreatePipe(&PipeId, PipeDepth, "RcvMsgTestPipe"); + CFE_SB_InitMsg(&TlmPkt, SB_UT_TLM_MID, sizeof(TlmPkt), true); + CFE_SB_Subscribe(SB_UT_TLM_MID, PipeId); + CFE_SB_SendMsg(TlmPktPtr); + CFE_SB_RcvMsg(&PtrToMsg, PipeId,CFE_SB_PEND_FOREVER); ActRtn = CFE_SB_GetLastSenderId(&GLSPtr, PipeId); ExpRtn = CFE_SUCCESS; @@ -7907,7 +7964,7 @@ void Test_RcvMsg_GetLastSenderSuccess(void) TestStat = CFE_FAIL; } - ExpRtn = 1; + ExpRtn = 3; ActRtn = UT_GetNumEventsSent(); if (ActRtn != ExpRtn) diff --git a/fsw/cfe-core/unit-test/sb_UT.h b/fsw/cfe-core/unit-test/sb_UT.h index b07154e30..94831a53b 100644 --- a/fsw/cfe-core/unit-test/sb_UT.h +++ b/fsw/cfe-core/unit-test/sb_UT.h @@ -2946,6 +2946,27 @@ void Test_RcvMsg_GetLastSenderInvalidPipe(void); ******************************************************************************/ void Test_RcvMsg_GetLastSenderInvalidCaller(void); +/*****************************************************************************/ +/** +** \brief Test receive last message response when there is no last sender +** +** \par Description +** This function tests the receive last message response when no last +** sender. +** +** \par Assumptions, External Events, and Notes: +** None +** +** \returns +** This function does not return a value. +** +** \sa #UT_Text, #SB_ResetUnitTest, #CFE_SB_CreatePipe, +** \sa #CFE_SB_GetLastSenderId, #UT_GetNumEventsSent, #UT_EventIsInHistory, +** \sa #CFE_SB_DeletePipe, #UT_Report +** +******************************************************************************/ +void Test_RcvMsg_GetLastSenderNoValidSender(void); + /*****************************************************************************/ /** ** \brief Test successful receive last message request