From 0c6514cc63d78644f12d6891d431878db940033c Mon Sep 17 00:00:00 2001 From: blipbloping Date: Mon, 2 Jun 2025 08:50:37 +0000 Subject: [PATCH 1/8] Point coreMQTT submodule pointer to mqtt-v5 fork --- source/dependency/coreMQTT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dependency/coreMQTT b/source/dependency/coreMQTT index 86a5750..42d843f 160000 --- a/source/dependency/coreMQTT +++ b/source/dependency/coreMQTT @@ -1 +1 @@ -Subproject commit 86a5750bb31e05fa69ef3f4e2f5e69d9317fae44 +Subproject commit 42d843f40ef2abc752a419f45f7adb7dac67e591 From a33da052526c133a7561d6a1fafcc75848fd44b9 Mon Sep 17 00:00:00 2001 From: blipbloping Date: Mon, 2 Jun 2025 09:00:45 +0000 Subject: [PATCH 2/8] Update coreMQTT submodule pointer --- source/dependency/coreMQTT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dependency/coreMQTT b/source/dependency/coreMQTT index 42d843f..80e9af0 160000 --- a/source/dependency/coreMQTT +++ b/source/dependency/coreMQTT @@ -1 +1 @@ -Subproject commit 42d843f40ef2abc752a419f45f7adb7dac67e591 +Subproject commit 80e9af01411075a9779d83d0c88909de5b639e70 From 7d7c466b84eef6af1b4891480d75906e8388694d Mon Sep 17 00:00:00 2001 From: blipbloping Date: Tue, 3 Jun 2025 10:14:25 +0000 Subject: [PATCH 3/8] Initial change to repo --- source/core_mqtt_agent.c | 70 +++++++++++-------- source/core_mqtt_agent_command_functions.c | 33 +++++---- source/include/core_mqtt_agent.h | 35 +++++++++- .../core_mqtt_agent_command_functions.h | 4 +- 4 files changed, 95 insertions(+), 47 deletions(-) diff --git a/source/core_mqtt_agent.c b/source/core_mqtt_agent.c index cbc9598..70e5259 100644 --- a/source/core_mqtt_agent.c +++ b/source/core_mqtt_agent.c @@ -142,12 +142,20 @@ static MQTTStatus_t processCommand( MQTTAgentContext_t * pMqttAgentContext, * * @param[in] pMqttContext MQTT Context * @param[in] pPacketInfo Pointer to incoming packet. - * @param[in] pDeserializedInfo Pointer to deserialized information from - * the incoming packet. + * @param[in] pDeserializedInfo Pointer to deserialized information from the incoming packet. + * @param[out] pReasonCode Pointer to a variable where the application can set the reason code + * to include in outgoing PUBLISH ACK responses. + * @param[out] sendPropsBuffer Pointer to the MQTT property builder. The application can use this + * to add properties to the outgoing response packet. + * @param[in] getPropsBuffer Pointer to the MQTT property accessor. The application can use this + * to read properties received in the incoming MQTT packet. */ static void mqttEventCallback( MQTTContext_t * pMqttContext, MQTTPacketInfo_t * pPacketInfo, - MQTTDeserializedInfo_t * pDeserializedInfo ); + MQTTDeserializedInfo_t * pDeserializedInfo, + MQTTSuccessFailReasonCode_t * pReasonCode, + MQTTPropBuilder_t * sendPropsBuffer, + MQTTPropBuilder_t * getPropsBuffer); /** * @brief Mark a command as complete after receiving an acknowledgment packet. @@ -426,9 +434,7 @@ static MQTTStatus_t createCommand( MQTTAgentCommandType_t commandType, { bool isValid, isSpace = true; MQTTStatus_t statusReturn; - const MQTTPublishInfo_t * pPublishInfo; - size_t uxHeaderBytes; - const size_t uxControlAndLengthBytes = ( size_t ) 4; /* Control, remaining length and length bytes. */ + const MQTTAgentPublishArgs_t * pPublishArgs = NULL; assert( pMqttAgentContext != NULL ); assert( pCommand != NULL ); @@ -452,26 +458,21 @@ static MQTTStatus_t createCommand( MQTTAgentCommandType_t commandType, break; case PUBLISH: - pPublishInfo = ( const MQTTPublishInfo_t * ) pMqttInfoParam; - - /* Calculate the space consumed by everything other than the - * payload. */ - uxHeaderBytes = uxControlAndLengthBytes; - uxHeaderBytes += pPublishInfo->topicNameLength; + assert( pMqttInfoParam != NULL ); + pPublishArgs = ( const MQTTAgentPublishArgs_t * ) pMqttInfoParam; /* This message type results in the broker returning an ACK. The * agent maintains an array of outstanding ACK messages. See if * the array contains space for another outstanding ack. QoS0 * publish does not result in an ack so it doesn't matter if * there is no space in the ACK array. */ - if( pPublishInfo->qos != MQTTQoS0 ) + if( pPublishArgs->pPublishInfo->qos != MQTTQoS0 ) { isSpace = isSpaceInPendingAckList( pMqttAgentContext ); } /* Will the message fit in the defined buffer? */ - isValid = ( uxHeaderBytes < pMqttAgentContext->mqttContext.networkBuffer.size ) && - ( isSpace == true ); + isValid = isSpace ; break; @@ -652,7 +653,10 @@ static MQTTAgentContext_t * getAgentFromMQTTContext( MQTTContext_t * pMQTTContex static void mqttEventCallback( MQTTContext_t * pMqttContext, MQTTPacketInfo_t * pPacketInfo, - MQTTDeserializedInfo_t * pDeserializedInfo ) + MQTTDeserializedInfo_t * pDeserializedInfo, + MQTTSuccessFailReasonCode_t * pReasonCode, + MQTTPropBuilder_t * sendPropsBuffer, + MQTTPropBuilder_t * getPropsBuffer) { MQTTAgentAckInfo_t * pAckInfo; uint16_t packetIdentifier = pDeserializedInfo->packetIdentifier; @@ -819,7 +823,7 @@ static MQTTStatus_t resendPublishes( MQTTAgentContext_t * pMqttAgentContext ) MQTTStateCursor_t cursor = MQTT_STATE_CURSOR_INITIALIZER; uint16_t packetId = MQTT_PACKET_ID_INVALID; MQTTAgentAckInfo_t * pFoundAck = NULL; - MQTTPublishInfo_t * pOriginalPublish = NULL; + MQTTAgentPublishArgs_t * pOriginalPublish = NULL; MQTTContext_t * pMqttContext; assert( pMqttAgentContext != NULL ); @@ -835,9 +839,9 @@ static MQTTStatus_t resendPublishes( MQTTAgentContext_t * pMqttAgentContext ) if( pFoundAck != NULL ) { /* Set the DUP flag. */ - pOriginalPublish = ( MQTTPublishInfo_t * ) ( pFoundAck->pOriginalCommand->pArgs ); - pOriginalPublish->dup = true; - statusResult = MQTT_Publish( pMqttContext, pOriginalPublish, packetId ); + pOriginalPublish = ( MQTTAgentPublishArgs_t * ) ( pFoundAck->pOriginalCommand->pArgs ); + pOriginalPublish->pPublishInfo->dup = true; + statusResult = MQTT_Publish( pMqttContext, pOriginalPublish->pPublishInfo, packetId, pOriginalPublish->pProperties ); if( statusResult != MQTTSuccess ) { @@ -932,6 +936,7 @@ static bool validateParams( MQTTAgentCommandType_t commandType, bool ret = false; const MQTTAgentConnectArgs_t * pConnectArgs = NULL; const MQTTAgentSubscribeArgs_t * pSubscribeArgs = NULL; + const MQTTAgentPublishArgs_t * pPublishArgs = NULL; assert( ( commandType == CONNECT ) || ( commandType == PUBLISH ) || ( commandType == SUBSCRIBE ) || ( commandType == UNSUBSCRIBE ) ); @@ -941,7 +946,8 @@ static bool validateParams( MQTTAgentCommandType_t commandType, case CONNECT: pConnectArgs = ( const MQTTAgentConnectArgs_t * ) pParams; ret = ( ( pConnectArgs != NULL ) && - ( pConnectArgs->pConnectInfo != NULL ) ); + ( pConnectArgs->pConnectInfo != NULL ) && + ( ( pConnectArgs->pWillInfo != NULL ) || ( pConnectArgs->pWillProperties == NULL ) ) ); break; case SUBSCRIBE: @@ -951,9 +957,11 @@ static bool validateParams( MQTTAgentCommandType_t commandType, ( pSubscribeArgs->pSubscribeInfo != NULL ) && ( pSubscribeArgs->numSubscriptions != 0U ) ); break; - + case PUBLISH: + pPublishArgs = ( const MQTTAgentPublishArgs_t * ) pParams; + ret = ( ( pPublishArgs != NULL ) && + ( pPublishArgs->pPublishInfo != NULL ) ); default: - /* Publish, does not need to be cast since we do not check it. */ ret = ( pParams != NULL ); break; } @@ -969,10 +977,11 @@ MQTTStatus_t MQTTAgent_Init( MQTTAgentContext_t * pMqttAgentContext, const TransportInterface_t * pTransportInterface, MQTTGetCurrentTimeFunc_t getCurrentTimeMs, MQTTAgentIncomingPublishCallback_t incomingCallback, - void * pIncomingPacketContext ) + void * pIncomingPacketContext, + uint8_t * pAckPropsBuffer, + size_t ackPropsBufferSize ) { MQTTStatus_t returnStatus; - /** * @brief Array used to maintain the outgoing publish records and their * state by the coreMQTT library. @@ -1020,7 +1029,9 @@ MQTTStatus_t MQTTAgent_Init( MQTTAgentContext_t * pMqttAgentContext, pOutgoingPublishRecords, MQTT_AGENT_MAX_OUTSTANDING_ACKS, pIncomingPublishRecords, - MQTT_AGENT_MAX_OUTSTANDING_ACKS ); + MQTT_AGENT_MAX_OUTSTANDING_ACKS, + pAckPropsBuffer, + ackPropsBufferSize ); } } #endif /* if ( MQTT_AGENT_USE_QOS_1_2_PUBLISH != 0 ) */ @@ -1223,20 +1234,20 @@ MQTTStatus_t MQTTAgent_Unsubscribe( const MQTTAgentContext_t * pMqttAgentContext /*-----------------------------------------------------------*/ MQTTStatus_t MQTTAgent_Publish( const MQTTAgentContext_t * pMqttAgentContext, - MQTTPublishInfo_t * pPublishInfo, + MQTTAgentPublishArgs_t * pPublishArgs, const MQTTAgentCommandInfo_t * pCommandInfo ) { MQTTStatus_t statusReturn = MQTTBadParameter; bool paramsValid = false; paramsValid = validateStruct( pMqttAgentContext, pCommandInfo ) && - validateParams( PUBLISH, pPublishInfo ); + validateParams( PUBLISH, pPublishArgs ); if( paramsValid ) { statusReturn = createAndAddCommand( PUBLISH, /* commandType */ pMqttAgentContext, /* mqttContextHandle */ - pPublishInfo, /* pMqttInfoParam */ + pPublishArgs, /* pMqttInfoParam */ pCommandInfo->cmdCompleteCallback, /* commandCompleteCallback */ pCommandInfo->pCmdCompleteCallbackContext, /* pCommandCompleteCallbackContext */ pCommandInfo->blockTimeMs ); @@ -1296,6 +1307,7 @@ MQTTStatus_t MQTTAgent_Connect( const MQTTAgentContext_t * pMqttAgentContext, /*-----------------------------------------------------------*/ MQTTStatus_t MQTTAgent_Disconnect( const MQTTAgentContext_t * pMqttAgentContext, + MQTTAgentDisconnectArgs_t * pDisconnectArgs, const MQTTAgentCommandInfo_t * pCommandInfo ) { MQTTStatus_t statusReturn = MQTTBadParameter; diff --git a/source/core_mqtt_agent_command_functions.c b/source/core_mqtt_agent_command_functions.c index 9a4e465..5465d50 100644 --- a/source/core_mqtt_agent_command_functions.c +++ b/source/core_mqtt_agent_command_functions.c @@ -58,29 +58,29 @@ MQTTStatus_t MQTTAgentCommand_ProcessLoop( MQTTAgentContext_t * pMqttAgentContex /*-----------------------------------------------------------*/ MQTTStatus_t MQTTAgentCommand_Publish( MQTTAgentContext_t * pMqttAgentContext, - void * pPublishArg, + void * pVoidPublishArgs, MQTTAgentCommandFuncReturns_t * pReturnFlags ) { - const MQTTPublishInfo_t * pPublishInfo; + const MQTTAgentPublishArgs_t * pPublishArgs ; MQTTStatus_t ret; assert( pMqttAgentContext != NULL ); - assert( pPublishArg != NULL ); + assert( pPublishArgs != NULL ); assert( pReturnFlags != NULL ); ( void ) memset( pReturnFlags, 0x00, sizeof( MQTTAgentCommandFuncReturns_t ) ); - pPublishInfo = ( const MQTTPublishInfo_t * ) ( pPublishArg ); + pPublishArgs = ( const MQTTAgentPublishArgs_t * ) ( pVoidPublishArgs ); - if( pPublishInfo->qos != MQTTQoS0 ) + if( pPublishArgs->pPublishInfo->qos != MQTTQoS0 ) { pReturnFlags->packetId = MQTT_GetPacketId( &( pMqttAgentContext->mqttContext ) ); } - LogInfo( ( "Publishing message to %.*s.\n", ( int ) pPublishInfo->topicNameLength, pPublishInfo->pTopicName ) ); - ret = MQTT_Publish( &( pMqttAgentContext->mqttContext ), pPublishInfo, pReturnFlags->packetId ); + LogInfo( ( "Publishing message to %.*s.\n", ( int ) pPublishArgs->pPublishInfo->topicNameLength, pPublishArgs->pPublishInfo->pTopicName ) ); + ret = MQTT_Publish( &( pMqttAgentContext->mqttContext ), pPublishArgs->pPublishInfo , pReturnFlags->packetId, pPublishArgs->pProperties ); /* Add to pending ack list, or call callback if QoS 0. */ - pReturnFlags->addAcknowledgment = ( pPublishInfo->qos != MQTTQoS0 ) && ( ret == MQTTSuccess ); + pReturnFlags->addAcknowledgment = ( pPublishArgs->pPublishInfo->qos != MQTTQoS0 ) && ( ret == MQTTSuccess ); pReturnFlags->runProcessLoop = true; return ret; @@ -106,7 +106,8 @@ MQTTStatus_t MQTTAgentCommand_Subscribe( MQTTAgentContext_t * pMqttAgentContext, ret = MQTT_Subscribe( &( pMqttAgentContext->mqttContext ), pSubscribeArgs->pSubscribeInfo, pSubscribeArgs->numSubscriptions, - pReturnFlags->packetId ); + pReturnFlags->packetId, + pSubscribeArgs->pProperties ); pReturnFlags->addAcknowledgment = ( ret == MQTTSuccess ); pReturnFlags->runProcessLoop = true; @@ -134,7 +135,8 @@ MQTTStatus_t MQTTAgentCommand_Unsubscribe( MQTTAgentContext_t * pMqttAgentContex ret = MQTT_Unsubscribe( &( pMqttAgentContext->mqttContext ), pSubscribeArgs->pSubscribeInfo, pSubscribeArgs->numSubscriptions, - pReturnFlags->packetId ); + pReturnFlags->packetId, + pSubscribeArgs->pProperties ); pReturnFlags->addAcknowledgment = ( ret == MQTTSuccess ); pReturnFlags->runProcessLoop = true; @@ -161,7 +163,9 @@ MQTTStatus_t MQTTAgentCommand_Connect( MQTTAgentContext_t * pMqttAgentContext, pConnectInfo->pConnectInfo, pConnectInfo->pWillInfo, pConnectInfo->timeoutMs, - &( pConnectInfo->sessionPresent ) ); + &( pConnectInfo->sessionPresent ), + pConnectInfo->pProperties, + pConnectInfo->pWillProperties ); /* Resume a session if one existed, else clear the list of acknowledgments. */ if( ret == MQTTSuccess ) @@ -179,17 +183,18 @@ MQTTStatus_t MQTTAgentCommand_Connect( MQTTAgentContext_t * pMqttAgentContext, /*-----------------------------------------------------------*/ MQTTStatus_t MQTTAgentCommand_Disconnect( MQTTAgentContext_t * pMqttAgentContext, - void * pUnusedArg, + void * pVoidDisconnectArgs, MQTTAgentCommandFuncReturns_t * pReturnFlags ) { MQTTStatus_t ret; + MQTTAgentDisconnectArgs_t * pDisconnectArgs; - ( void ) pUnusedArg; + pDisconnectArgs = ( MQTTAgentDisconnectArgs_t * ) ( pVoidDisconnectArgs ); assert( pMqttAgentContext != NULL ); assert( pReturnFlags != NULL ); - ret = MQTT_Disconnect( &( pMqttAgentContext->mqttContext ) ); + ret = MQTT_Disconnect( &( pMqttAgentContext->mqttContext ), pDisconnectArgs->pProperties, pDisconnectArgs->reasonCode ); ( void ) memset( pReturnFlags, 0x00, sizeof( MQTTAgentCommandFuncReturns_t ) ); pReturnFlags->endLoop = true; diff --git a/source/include/core_mqtt_agent.h b/source/include/core_mqtt_agent.h index 1f6a11d..db6cf80 100644 --- a/source/include/core_mqtt_agent.h +++ b/source/include/core_mqtt_agent.h @@ -167,8 +167,19 @@ typedef struct MQTTAgentSubscribeArgs { MQTTSubscribeInfo_t * pSubscribeInfo; /**< @brief List of MQTT subscriptions. */ size_t numSubscriptions; /**< @brief Number of elements in `pSubscribeInfo`. */ + MQTTPropBuilder_t * pProperties; /**< @brief Optional properties for the SUBSCRIBE or UNSUBSCRIBE packet. */ } MQTTAgentSubscribeArgs_t; +/** + * @ingroup mqtt_agent_struct_types + * @brief Struct holding arguments for a PUBLISH call. + */ +typedef struct MQTTAgentPublishArgs +{ + MQTTPublishInfo_t * pPublishInfo; /**< @brief MQTT publish packet information. */ + MQTTPropBuilder_t * pProperties; /**< @brief Optional properties for the PUBLISH packet. */ +} MQTTAgentPublishArgs_t; + /** * @ingroup mqtt_agent_struct_types * @brief Struct holding arguments for a CONNECT call. @@ -179,8 +190,20 @@ typedef struct MQTTAgentConnectArgs MQTTPublishInfo_t * pWillInfo; /**< @brief Optional Last Will and Testament. */ uint32_t timeoutMs; /**< @brief Maximum timeout for a CONNACK packet. */ bool sessionPresent; /**< @brief Output flag set if a previous session was present. */ + MQTTPropBuilder_t * pProperties; /**< @brief Optional properties for the CONNECT packet. */ + MQTTPropBuilder_t * pWillProperties; /**< @brief Optional properties for the Last Will and Testament. */ } MQTTAgentConnectArgs_t; +/** + * @ingroup mqtt_agent_struct_types + * @brief Struct holding arguments for a DISCONNECT call. + */ +typedef struct MQTTAgentDisconnectArgs +{ + MQTTPropBuilder_t * pProperties; /**< @brief Optional properties for the DISCONNECT packet. */ + MQTTSuccessFailReasonCode_t reasonCode ; /**< @brief Reason code for the DISCONNECT packet. */ +}MQTTAgentDisconnectArgs_t; + /** * @ingroup mqtt_agent_struct_types * @brief Struct holding arguments that are common to every command. @@ -208,6 +231,10 @@ typedef struct MQTTAgentCommandInfo * @param[in] incomingCallback The callback to execute when receiving publishes. * @param[in] pIncomingPacketContext A pointer to a context structure defined by * the application writer. + * @param[out] pAckPropsBuffer A pointer to a buffer for storing properties + * for sending acknowledgments. This buffer is used to store properties for PUBACK, + * PUBREC, PUBREL, and PUBCOMP packets. + * @param[out] ackPropsBufferSize The size of the buffer pointed to by @p pAckPropsBuffer. * * @note The @p pIncomingPacketContext context provided for the incoming publish * callback MUST remain in scope throughout the period that the agent task is running. @@ -290,7 +317,9 @@ MQTTStatus_t MQTTAgent_Init( MQTTAgentContext_t * pMqttAgentContext, const TransportInterface_t * pTransportInterface, MQTTGetCurrentTimeFunc_t getCurrentTimeMs, MQTTAgentIncomingPublishCallback_t incomingCallback, - void * pIncomingPacketContext ); + void * pIncomingPacketContext, + uint8_t * pAckPropsBuffer, + size_t ackPropsBufferSize ); /* @[declare_mqtt_agent_init] */ /** @@ -594,7 +623,7 @@ MQTTStatus_t MQTTAgent_Unsubscribe( const MQTTAgentContext_t * pMqttAgentContext */ /* @[declare_mqtt_agent_publish] */ MQTTStatus_t MQTTAgent_Publish( const MQTTAgentContext_t * pMqttAgentContext, - MQTTPublishInfo_t * pPublishInfo, + MQTTAgentPublishArgs_t * pPublishArgs, const MQTTAgentCommandInfo_t * pCommandInfo ); /* @[declare_mqtt_agent_publish] */ @@ -814,6 +843,7 @@ MQTTStatus_t MQTTAgent_Connect( const MQTTAgentContext_t * pMqttAgentContext, * task be responsible for disconnecting the MQTT connection. * * @param[in] pMqttAgentContext The MQTT agent to use. + * @param[in] pDisconnectArgs Struct holding args for MQTT_Disconnect(). * @param[in] pCommandInfo The information pertaining to the command, including: * - cmdCompleteCallback Optional callback to invoke when the command completes. * - pCmdCompleteCallbackContext Optional completion callback context. @@ -857,6 +887,7 @@ MQTTStatus_t MQTTAgent_Connect( const MQTTAgentContext_t * pMqttAgentContext, */ /* @[declare_mqtt_agent_disconnect] */ MQTTStatus_t MQTTAgent_Disconnect( const MQTTAgentContext_t * pMqttAgentContext, + MQTTAgentDisconnectArgs_t * pDisconnectArgs, const MQTTAgentCommandInfo_t * pCommandInfo ); /* @[declare_mqtt_agent_disconnect] */ diff --git a/source/include/core_mqtt_agent_command_functions.h b/source/include/core_mqtt_agent_command_functions.h index cc7e320..43ca909 100644 --- a/source/include/core_mqtt_agent_command_functions.h +++ b/source/include/core_mqtt_agent_command_functions.h @@ -218,13 +218,13 @@ MQTTStatus_t MQTTAgentCommand_Connect( MQTTAgentContext_t * pMqttAgentContext, * - MQTTAgentCommandFuncReturns_t.endLoop * * @param[in] pMqttAgentContext MQTT Agent context information. - * @param[in] pUnusedArg Unused NULL argument. + * @param[in] pUnusedArg Arguments for MQTT_Disconnect. * @param[out] pReturnFlags Flags set to indicate actions the MQTT agent should take. * * @return Status code of MQTT_Disconnect(). */ MQTTStatus_t MQTTAgentCommand_Disconnect( MQTTAgentContext_t * pMqttAgentContext, - void * pUnusedArg, + void * pVoidDisconnectArgs, MQTTAgentCommandFuncReturns_t * pReturnFlags ); /** From 9ab6e72135aaece5b7639c12fba95747441eafdc Mon Sep 17 00:00:00 2001 From: Aditi Chaudhary Date: Tue, 3 Jun 2025 16:00:46 +0530 Subject: [PATCH 4/8] Update dependency folder --- source/dependency/coreMQTT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dependency/coreMQTT b/source/dependency/coreMQTT index 80e9af0..86a5750 160000 --- a/source/dependency/coreMQTT +++ b/source/dependency/coreMQTT @@ -1 +1 @@ -Subproject commit 80e9af01411075a9779d83d0c88909de5b639e70 +Subproject commit 86a5750bb31e05fa69ef3f4e2f5e69d9317fae44 From 56244f27b55f9a5ad7907c1aa531cec0544907d3 Mon Sep 17 00:00:00 2001 From: blipbloping Date: Fri, 6 Jun 2025 14:29:48 +0000 Subject: [PATCH 5/8] Update coreMQTT-Agent Library --- source/core_mqtt_agent.c | 5 +- .../mqtt_agent_command_functions_utest.c | 39 ++-- test/unit-test/mqtt_agent_utest.c | 182 ++++++++++-------- 3 files changed, 130 insertions(+), 96 deletions(-) diff --git a/source/core_mqtt_agent.c b/source/core_mqtt_agent.c index 70e5259..c6f3485 100644 --- a/source/core_mqtt_agent.c +++ b/source/core_mqtt_agent.c @@ -826,6 +826,7 @@ static MQTTStatus_t resendPublishes( MQTTAgentContext_t * pMqttAgentContext ) MQTTAgentPublishArgs_t * pOriginalPublish = NULL; MQTTContext_t * pMqttContext; + assert( pMqttAgentContext != NULL ); pMqttContext = &( pMqttAgentContext->mqttContext ); @@ -841,7 +842,7 @@ static MQTTStatus_t resendPublishes( MQTTAgentContext_t * pMqttAgentContext ) /* Set the DUP flag. */ pOriginalPublish = ( MQTTAgentPublishArgs_t * ) ( pFoundAck->pOriginalCommand->pArgs ); pOriginalPublish->pPublishInfo->dup = true; - statusResult = MQTT_Publish( pMqttContext, pOriginalPublish->pPublishInfo, packetId, pOriginalPublish->pProperties ); + statusResult = MQTT_Publish( pMqttContext, pOriginalPublish->pPublishInfo , packetId, pOriginalPublish->pProperties ); if( statusResult != MQTTSuccess ) { @@ -1319,7 +1320,7 @@ MQTTStatus_t MQTTAgent_Disconnect( const MQTTAgentContext_t * pMqttAgentContext, { statusReturn = createAndAddCommand( DISCONNECT, /* commandType */ pMqttAgentContext, /* mqttContextHandle */ - NULL, /* pMqttInfoParam */ + pDisconnectArgs, /* pMqttInfoParam */ pCommandInfo->cmdCompleteCallback, /* commandCompleteCallback */ pCommandInfo->pCmdCompleteCallbackContext, /* pCommandCompleteCallbackContext */ pCommandInfo->blockTimeMs ); diff --git a/test/unit-test/mqtt_agent_command_functions_utest.c b/test/unit-test/mqtt_agent_command_functions_utest.c index 63ceeff..7761f95 100644 --- a/test/unit-test/mqtt_agent_command_functions_utest.c +++ b/test/unit-test/mqtt_agent_command_functions_utest.c @@ -185,16 +185,19 @@ void test_MQTTAgentCommand_ProcessLoop( void ) void test_MQTTAgentCommand_Publish_QoS0_success( void ) { MQTTAgentContext_t mqttAgentContext = { 0 }; + MQTTAgentPublishArgs_t publishArgs = { 0 }; MQTTPublishInfo_t publishInfo = { 0 }; MQTTAgentCommandFuncReturns_t returnFlags = { 0 }; MQTTStatus_t mqttStatus; /* Initializing QOS. */ publishInfo.qos = MQTTQoS0; + publishArgs.pPublishInfo = &publishInfo; + publishArgs.pProperties = NULL ; - MQTT_Publish_ExpectAndReturn( &( mqttAgentContext.mqttContext ), &publishInfo, 0, MQTTSuccess ); + MQTT_Publish_ExpectAndReturn( &( mqttAgentContext.mqttContext ), publishArgs.pPublishInfo, 0 , publishArgs.pProperties, MQTTSuccess ); - mqttStatus = MQTTAgentCommand_Publish( &mqttAgentContext, &publishInfo, &returnFlags ); + mqttStatus = MQTTAgentCommand_Publish( &mqttAgentContext, &publishArgs, &returnFlags ); TEST_ASSERT_EQUAL( MQTTSuccess, mqttStatus ); /* Ensure that returnFlags are set as intended. */ @@ -211,16 +214,18 @@ void test_MQTTAgentCommand_Publish_QoS1_success( void ) { MQTTAgentContext_t mqttAgentContext = { 0 }; MQTTPublishInfo_t publishInfo = { 0 }; + MQTTAgentPublishArgs_t publishArgs = { 0 }; MQTTAgentCommandFuncReturns_t returnFlags = { 0 }; MQTTStatus_t mqttStatus; /* Initializing QOS. */ publishInfo.qos = MQTTQoS1; + publishArgs.pPublishInfo = &publishInfo; MQTT_GetPacketId_ExpectAndReturn( &( mqttAgentContext.mqttContext ), 1 ); - MQTT_Publish_ExpectAndReturn( &( mqttAgentContext.mqttContext ), &publishInfo, 1, MQTTSuccess ); + MQTT_Publish_ExpectAndReturn( &( mqttAgentContext.mqttContext ), publishArgs.pPublishInfo, 1, publishArgs.pProperties, MQTTSuccess ); - mqttStatus = MQTTAgentCommand_Publish( &mqttAgentContext, &publishInfo, &returnFlags ); + mqttStatus = MQTTAgentCommand_Publish( &mqttAgentContext, &publishArgs, &returnFlags ); TEST_ASSERT_EQUAL( MQTTSuccess, mqttStatus ); /* Ensure that returnFlags are set as intended. */ @@ -237,15 +242,17 @@ void test_MQTTAgentCommand_Publish_QoS0_failure( void ) { MQTTAgentContext_t mqttAgentContext = { 0 }; MQTTPublishInfo_t publishInfo = { 0 }; + MQTTAgentPublishArgs_t publishArgs = { 0 }; MQTTAgentCommandFuncReturns_t returnFlags = { 0 }; MQTTStatus_t mqttStatus; /* Initializing QOS. */ publishInfo.qos = MQTTQoS0; + publishArgs.pPublishInfo = &publishInfo; - MQTT_Publish_ExpectAndReturn( &( mqttAgentContext.mqttContext ), &publishInfo, 0, MQTTSendFailed ); + MQTT_Publish_ExpectAndReturn( &( mqttAgentContext.mqttContext ), publishArgs.pPublishInfo, 0, publishArgs.pProperties, MQTTSendFailed ); - mqttStatus = MQTTAgentCommand_Publish( &mqttAgentContext, &publishInfo, &returnFlags ); + mqttStatus = MQTTAgentCommand_Publish( &mqttAgentContext, &publishArgs, &returnFlags ); TEST_ASSERT_EQUAL( MQTTSendFailed, mqttStatus ); /* Ensure that returnFlags are set as intended. */ @@ -262,16 +269,18 @@ void test_MQTTAgentCommand_Publish_QoS1_failure( void ) { MQTTAgentContext_t mqttAgentContext = { 0 }; MQTTPublishInfo_t publishInfo = { 0 }; + MQTTAgentPublishArgs_t publishArgs = { 0 }; MQTTAgentCommandFuncReturns_t returnFlags = { 0 }; MQTTStatus_t mqttStatus; /* Initializing QOS. */ publishInfo.qos = MQTTQoS1; + publishArgs.pPublishInfo = &publishInfo; MQTT_GetPacketId_ExpectAndReturn( &( mqttAgentContext.mqttContext ), 1 ); - MQTT_Publish_ExpectAndReturn( &( mqttAgentContext.mqttContext ), &publishInfo, 1, MQTTSendFailed ); + MQTT_Publish_ExpectAndReturn( &( mqttAgentContext.mqttContext ), publishArgs.pPublishInfo, 1, publishArgs.pProperties, MQTTSendFailed ); - mqttStatus = MQTTAgentCommand_Publish( &mqttAgentContext, &publishInfo, &returnFlags ); + mqttStatus = MQTTAgentCommand_Publish( &mqttAgentContext, &publishArgs, &returnFlags ); TEST_ASSERT_EQUAL( MQTTSendFailed, mqttStatus ); /* Ensure that returnFlags are set as intended. */ @@ -296,6 +305,7 @@ void test_MQTTAgentCommand_Subscribe_Success( void ) subscribeArgs.pSubscribeInfo, subscribeArgs.numSubscriptions, 1, + subscribeArgs.pProperties, MQTTSuccess ); mqttStatus = MQTTAgentCommand_Subscribe( &mqttAgentContext, &subscribeArgs, &returnFlags ); @@ -322,6 +332,7 @@ void test_MQTTAgentCommand_Subscribe_failure( void ) subscribeArgs.pSubscribeInfo, subscribeArgs.numSubscriptions, 1, + subscribeArgs.pProperties, MQTTSendFailed ); mqttStatus = MQTTAgentCommand_Subscribe( &mqttAgentContext, &subscribeArgs, &returnFlags ); @@ -348,6 +359,7 @@ void test_MQTTAgentCommand_Unsubscribe( void ) subscribeArgs.pSubscribeInfo, subscribeArgs.numSubscriptions, 1, + subscribeArgs.pProperties, MQTTSuccess ); mqttStatus = MQTTAgentCommand_Unsubscribe( &mqttAgentContext, &subscribeArgs, &returnFlags ); @@ -374,6 +386,7 @@ void test_MQTTAgentCommand_Unsubscribe_failure( void ) subscribeArgs.pSubscribeInfo, subscribeArgs.numSubscriptions, 1, + subscribeArgs.pProperties, MQTTSendFailed ); mqttStatus = MQTTAgentCommand_Unsubscribe( &mqttAgentContext, &subscribeArgs, &returnFlags ); @@ -391,11 +404,12 @@ void test_MQTTAgentCommand_Unsubscribe_failure( void ) void test_MQTTAgentCommand_Disconnect( void ) { MQTTAgentContext_t mqttAgentContext = { 0 }; + MQTTAgentDisconnectArgs_t disconnectArgs = { 0 }; MQTTAgentCommandFuncReturns_t returnFlags = { 0 }; MQTTStatus_t mqttStatus; - MQTT_Disconnect_ExpectAndReturn( &( mqttAgentContext.mqttContext ), MQTTSuccess ); - mqttStatus = MQTTAgentCommand_Disconnect( &mqttAgentContext, NULL, &returnFlags ); + MQTT_Disconnect_ExpectAndReturn( &( mqttAgentContext.mqttContext ), disconnectArgs.pProperties, disconnectArgs.reasonCode, MQTTSuccess ); + mqttStatus = MQTTAgentCommand_Disconnect( &mqttAgentContext, &disconnectArgs, &returnFlags ); TEST_ASSERT_EQUAL( MQTTSuccess, mqttStatus ); /* Ensure that returnFlags are set as intended. */ @@ -411,11 +425,12 @@ void test_MQTTAgentCommand_Disconnect( void ) void test_MQTTAgentCommand_Disconnect_failure( void ) { MQTTAgentContext_t mqttAgentContext = { 0 }; + MQTTAgentDisconnectArgs_t disconnectArgs = { 0 }; MQTTAgentCommandFuncReturns_t returnFlags = { 0 }; MQTTStatus_t mqttStatus; - MQTT_Disconnect_ExpectAndReturn( &( mqttAgentContext.mqttContext ), MQTTSendFailed ); - mqttStatus = MQTTAgentCommand_Disconnect( &mqttAgentContext, NULL, &returnFlags ); + MQTT_Disconnect_ExpectAndReturn( &( mqttAgentContext.mqttContext ), disconnectArgs.pProperties, disconnectArgs.reasonCode, MQTTSendFailed ); + mqttStatus = MQTTAgentCommand_Disconnect( &mqttAgentContext, &disconnectArgs, &returnFlags ); TEST_ASSERT_EQUAL( MQTTSendFailed, mqttStatus ); /* Ensure that returnFlags are set as intended. */ diff --git a/test/unit-test/mqtt_agent_utest.c b/test/unit-test/mqtt_agent_utest.c index f327cf0..1d6fad9 100644 --- a/test/unit-test/mqtt_agent_utest.c +++ b/test/unit-test/mqtt_agent_utest.c @@ -295,7 +295,7 @@ MQTTStatus_t MQTT_ProcessLoop_CustomStub( MQTTContext_t * pContext, packetInfo.type = packetType; deserializedInfo.packetIdentifier = packetIdentifier; - pContext->appCallback( pContext, &packetInfo, &deserializedInfo ); + pContext->appCallback( pContext, &packetInfo, &deserializedInfo, NULL, &pContext->ackPropsBuffer, NULL ); pMqttAgentContext = ( MQTTAgentContext_t * ) pContext; pMqttAgentContext->packetReceivedInLoop = false; @@ -339,13 +339,13 @@ MQTTStatus_t MQTT_ProcessLoop_FailSecondAndLaterCallsStub( MQTTContext_t * pCont if( numCalls == 0 ) { - pContext->appCallback( pContext, &packetInfo, &deserializedInfo ); + pContext->appCallback( pContext, &packetInfo, &deserializedInfo, NULL, &pContext->ackPropsBuffer, NULL ); status = MQTTSuccess; } else { /* MQTT_ProcessLoop returns failure second time. */ - pContext->appCallback( pContext, &packetInfo, &deserializedInfo ); + pContext->appCallback( pContext, &packetInfo, &deserializedInfo, NULL, &pContext->ackPropsBuffer, NULL); status = MQTTRecvFailed; } @@ -362,6 +362,8 @@ static void setupAgentContext( MQTTAgentContext_t * pAgentContext ) TransportInterface_t transportInterface = { 0 }; void * incomingPacketContext = NULL; MQTTStatus_t mqttStatus; + uint8_t ackPropsBuffer[ 100 ]; + size_t ackPropsBufferSize = sizeof( ackPropsBuffer ); messageInterface.pMsgCtx = &globalMessageContext; messageInterface.send = stubSend; @@ -378,7 +380,9 @@ static void setupAgentContext( MQTTAgentContext_t * pAgentContext ) &transportInterface, stubGetTime, stubPublishCallback, - incomingPacketContext ); + incomingPacketContext, + ackPropsBuffer, + ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTSuccess, mqttStatus ); /* Set packet ID nonzero to indicate initialization. */ @@ -455,6 +459,8 @@ void test_MQTTAgent_Init_Happy_Path( void ) void * incomingPacketContext = NULL; MQTTAgentMessageContext_t msg; MQTTStatus_t mqttStatus; + uint8_t ackPropsBuffer[ 100 ]; + size_t ackPropsBufferSize = sizeof( ackPropsBuffer ); msgInterface.pMsgCtx = &msg; msgInterface.send = stubSend; @@ -465,7 +471,7 @@ void test_MQTTAgent_Init_Happy_Path( void ) MQTT_Init_ExpectAnyArgsAndReturn( MQTTSuccess ); MQTT_InitStatefulQoS_ExpectAnyArgsAndReturn( MQTTSuccess ); - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, stubPublishCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, stubPublishCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTSuccess, mqttStatus ); TEST_ASSERT_EQUAL_PTR( stubPublishCallback, mqttAgentContext.pIncomingCallback ); TEST_ASSERT_EQUAL_PTR( incomingPacketContext, mqttAgentContext.pIncomingCallbackContext ); @@ -484,6 +490,8 @@ void test_MQTTAgent_Init_BadParameter1( void ) void * incomingPacketContext = NULL; MQTTAgentMessageContext_t msg; MQTTStatus_t mqttStatus; + uint8_t ackPropsBuffer[ 100 ]; + size_t ackPropsBufferSize = sizeof( ackPropsBuffer ); msgInterface.pMsgCtx = &msg; msgInterface.send = stubSend; @@ -494,7 +502,7 @@ void test_MQTTAgent_Init_BadParameter1( void ) MQTT_Init_ExpectAnyArgsAndReturn( MQTTSuccess ); MQTT_InitStatefulQoS_ExpectAnyArgsAndReturn( MQTTBadParameter ); - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, stubPublishCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, stubPublishCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); } @@ -510,6 +518,8 @@ void test_MQTTAgent_Init_BadParameter2( void ) void * incomingPacketContext = NULL; MQTTAgentMessageContext_t msg; MQTTStatus_t mqttStatus; + uint8_t ackPropsBuffer[ 100 ]; + size_t ackPropsBufferSize = sizeof( ackPropsBuffer ); msgInterface.pMsgCtx = &msg; msgInterface.send = stubSend; @@ -519,7 +529,7 @@ void test_MQTTAgent_Init_BadParameter2( void ) MQTT_Init_ExpectAnyArgsAndReturn( MQTTBadParameter ); - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, stubPublishCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, stubPublishCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); } @@ -536,6 +546,8 @@ void test_MQTTAgent_Init_Invalid_Params( void ) void * incomingPacketContext = NULL; MQTTAgentMessageContext_t msg; MQTTStatus_t mqttStatus; + uint8_t ackPropsBuffer[ 100 ]; + size_t ackPropsBufferSize = sizeof( ackPropsBuffer ); msgInterface.pMsgCtx = &msg; msgInterface.send = stubSend; @@ -544,51 +556,51 @@ void test_MQTTAgent_Init_Invalid_Params( void ) msgInterface.releaseCommand = stubReleaseCommand; /* Check that MQTTBadParameter is returned if any NULL parameters are passed. */ - mqttStatus = MQTTAgent_Init( NULL, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( NULL, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); - mqttStatus = MQTTAgent_Init( &mqttAgentContext, NULL, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, NULL, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, NULL, stubGetTime, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, NULL, stubGetTime, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); /* Test if NULL is passed for any of the function pointers. */ - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, NULL, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, NULL, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, NULL, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, NULL, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); msgInterface.pMsgCtx = NULL; - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); msgInterface.pMsgCtx = &msg; msgInterface.send = NULL; - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); msgInterface.send = stubSend; msgInterface.recv = NULL; - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); msgInterface.recv = stubReceive; msgInterface.releaseCommand = NULL; - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); msgInterface.releaseCommand = stubReleaseCommand; msgInterface.getCommand = NULL; - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, &networkBuffer, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); msgInterface.getCommand = stubGetCommand; /* MQTT_Init() should check the network buffer. */ MQTT_Init_ExpectAnyArgsAndReturn( MQTTBadParameter ); - mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, NULL, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext ); + mqttStatus = MQTTAgent_Init( &mqttAgentContext, &msgInterface, NULL, &transportInterface, stubGetTime, incomingCallback, incomingPacketContext, ackPropsBuffer, ackPropsBufferSize ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); } @@ -706,10 +718,12 @@ void test_MQTTAgent_ResumeSession_failed_publish( void ) MQTTStatus_t mqttStatus; MQTTAgentContext_t mqttAgentContext; MQTTAgentCommand_t command = { 0 }; - MQTTPublishInfo_t args = { 0 }; + MQTTAgentPublishArgs_t args = { 0 }; + MQTTPublishInfo_t publishInfo = { 0 }; setupAgentContext( &mqttAgentContext ); + args.pPublishInfo = &publishInfo; command.pArgs = &args; mqttAgentContext.pPendingAcks[ 0 ].packetId = 1U; mqttAgentContext.pPendingAcks[ 0 ].pOriginalCommand = &command; @@ -726,11 +740,13 @@ void test_MQTTAgent_ResumeSession_publish_resend_success( void ) MQTTStatus_t mqttStatus; MQTTAgentContext_t mqttAgentContext; MQTTAgentCommand_t command = { 0 }; - MQTTPublishInfo_t args = { 0 }; + MQTTAgentPublishArgs_t args = { 0 }; + MQTTPublishInfo_t publishInfo = { 0 }; MQTTAgentAckInfo_t ackInfo; setupAgentContext( &mqttAgentContext ); + args.pPublishInfo = &publishInfo; command.pArgs = &args; ackInfo.packetId = 1U; @@ -988,47 +1004,50 @@ void test_MQTTAgent_Unsubscribe_success( void ) TEST_ASSERT_EQUAL_PTR( stubCompletionCallback, command.pCommandCompleteCallback ); } -/* ========================================================================== */ - -/** - * @brief Test MQTTAgent_Publish() with invalid parameters. - */ -void test_MQTTAgent_Publish_Invalid_Parameters( void ) -{ - MQTTAgentContext_t agentContext = { 0 }; - MQTTStatus_t mqttStatus; - MQTTAgentCommandInfo_t commandInfo = { 0 }; - MQTTAgentCommand_t command = { 0 }; - MQTTPublishInfo_t publishInfo = { 0 }; - - setupAgentContext( &agentContext ); - pCommandToReturn = &command; - commandInfo.cmdCompleteCallback = stubCompletionCallback; - /* Test topic name. */ - publishInfo.pTopicName = "test"; - publishInfo.topicNameLength = 4; - - /* NULL parameters. */ - mqttStatus = MQTTAgent_Publish( NULL, &publishInfo, &commandInfo ); - TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); - - mqttStatus = MQTTAgent_Publish( &agentContext, NULL, &commandInfo ); - TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); - - mqttStatus = MQTTAgent_Publish( &agentContext, &publishInfo, NULL ); - TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); - - /* This needs to be large enough to hold the PUBLISH: - * 1 byte: control header - * 1 byte: remaining length - * 2 bytes: topic name length - * 1+ bytes: topic name. - * For this test case, the buffer must have size at least - * 1+1+2+4=8. */ - agentContext.mqttContext.networkBuffer.size = 6; - mqttStatus = MQTTAgent_Publish( &agentContext, &publishInfo, &commandInfo ); - TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); -} +// /* ========================================================================== */ + +// /** +// * @brief Test MQTTAgent_Publish() with invalid parameters. +// */ +// void test_MQTTAgent_Publish_Invalid_Parameters( void ) +// { +// MQTTAgentContext_t agentContext = { 0 }; +// MQTTStatus_t mqttStatus; +// MQTTAgentCommandInfo_t commandInfo = { 0 }; +// MQTTAgentCommand_t command = { 0 }; +// MQTTAgentPublishArgs_t publishArgs = { 0 }; +// MQTTPublishInfo_t publishInfo = { 0 } ; + +// setupAgentContext( &agentContext ); +// pCommandToReturn = &command; +// commandInfo.cmdCompleteCallback = stubCompletionCallback; +// /* Test topic name. */ +// publishInfo.pTopicName = "test"; +// publishInfo.topicNameLength = 4; + +// publishArgs.pPublishInfo = &publishInfo; + +// /* NULL parameters. */ +// mqttStatus = MQTTAgent_Publish( NULL, &publishArgs, &commandInfo ); +// TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); + +// mqttStatus = MQTTAgent_Publish( &agentContext, NULL, &commandInfo ); +// TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); + +// mqttStatus = MQTTAgent_Publish( &agentContext, &publishArgs, NULL ); +// TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); + +// /* This needs to be large enough to hold the PUBLISH: +// * 1 byte: control header +// * 1 byte: remaining length +// * 2 bytes: topic name length +// * 1+ bytes: topic name. +// * For this test case, the buffer must have size at least +// * 1+1+2+4=8. */ +// agentContext.mqttContext.networkBuffer.size = 6; +// mqttStatus = MQTTAgent_Publish( &agentContext, &publishArgs, &commandInfo ); +// TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); +// } /** * @brief Test that an MQTTNoMemory error is returned when there @@ -1042,6 +1061,7 @@ void test_MQTTAgent_Publish_No_Ack_Space( void ) MQTTAgentCommandInfo_t commandInfo = { 0 }; MQTTAgentCommand_t command = { 0 }; MQTTPublishInfo_t publishInfo = { 0 }; + MQTTAgentPublishArgs_t publishArgs = { 0 }; size_t i; setupAgentContext( &agentContext ); @@ -1053,6 +1073,8 @@ void test_MQTTAgent_Publish_No_Ack_Space( void ) /* Ack space is only necessary for QoS > 0. */ publishInfo.qos = MQTTQoS1; + publishArgs.pPublishInfo = &publishInfo ; + /* No space in pending ack list. */ for( i = 0; i < MQTT_AGENT_MAX_OUTSTANDING_ACKS; i++ ) { @@ -1067,7 +1089,7 @@ void test_MQTTAgent_Publish_No_Ack_Space( void ) * For this test case, the buffer must have size at least * 1+1+2+4=8. */ agentContext.mqttContext.networkBuffer.size = 10; - mqttStatus = MQTTAgent_Publish( &agentContext, &publishInfo, &commandInfo ); + mqttStatus = MQTTAgent_Publish( &agentContext, &publishArgs, &commandInfo ); TEST_ASSERT_EQUAL( MQTTNoMemory, mqttStatus ); } @@ -1081,6 +1103,7 @@ void test_MQTTAgent_Publish_success( void ) MQTTAgentCommandInfo_t commandInfo = { 0 }; MQTTAgentCommand_t command = { 0 }; MQTTPublishInfo_t publishInfo = { 0 }; + MQTTAgentPublishArgs_t publishArgs = { 0 }; setupAgentContext( &agentContext ); pCommandToReturn = &command; @@ -1089,19 +1112,13 @@ void test_MQTTAgent_Publish_success( void ) publishInfo.pTopicName = "test"; publishInfo.topicNameLength = 4; - /* This needs to be large enough to hold the PUBLISH: - * 1 byte: control header - * 1 byte: remaining length - * 2 bytes: topic name length - * 1+ bytes: topic name. - * For this test case, the buffer must have size at least - * 1+1+2+4=8. */ - agentContext.mqttContext.networkBuffer.size = 10; - mqttStatus = MQTTAgent_Publish( &agentContext, &publishInfo, &commandInfo ); + publishArgs.pPublishInfo = &publishInfo; + + mqttStatus = MQTTAgent_Publish( &agentContext, &publishArgs, &commandInfo ); TEST_ASSERT_EQUAL( MQTTSuccess, mqttStatus ); TEST_ASSERT_EQUAL_PTR( &command, globalMessageContext.pSentCommand ); TEST_ASSERT_EQUAL( PUBLISH, command.commandType ); - TEST_ASSERT_EQUAL_PTR( &publishInfo, command.pArgs ); + TEST_ASSERT_EQUAL_PTR( &publishArgs, command.pArgs ); TEST_ASSERT_EQUAL_PTR( stubCompletionCallback, command.pCommandCompleteCallback ); } @@ -1201,14 +1218,14 @@ void test_MQTTAgent_ProcessLoop_success( void ) /* ========================================================================== */ -/** - * @brief Test MQTTAgent_Disconnect() with invalid parameters. - */ -void test_MQTTAgent_Disconnect_Invalid_Params( void ) -{ - /* Call the common helper function with the function pointer and name. */ - invalidParamsTestFunc( MQTTAgent_Disconnect, "Function=MQTTAgent_Disconnect" ); -} +// /** +// * @brief Test MQTTAgent_Disconnect() with invalid parameters. +// */ +// void test_MQTTAgent_Disconnect_Invalid_Params( void ) +// { +// /* Call the common helper function with the function pointer and name. */ +// invalidParamsTestFunc( MQTTAgent_Disconnect, "Function=MQTTAgent_Disconnect" ); +// } /** * @brief Test that MQTTAgent_Disconnect() works as intended. @@ -1219,17 +1236,18 @@ void test_MQTTAgent_Disconnect_success( void ) MQTTStatus_t mqttStatus; MQTTAgentCommandInfo_t commandInfo = { 0 }; MQTTAgentCommand_t command = { 0 }; + MQTTAgentDisconnectArgs_t disconnectArgs = { 0 }; setupAgentContext( &agentContext ); pCommandToReturn = &command; commandInfo.cmdCompleteCallback = stubCompletionCallback; /* Success case. */ - mqttStatus = MQTTAgent_Disconnect( &agentContext, &commandInfo ); + mqttStatus = MQTTAgent_Disconnect( &agentContext, &disconnectArgs, &commandInfo ); TEST_ASSERT_EQUAL( MQTTSuccess, mqttStatus ); TEST_ASSERT_EQUAL_PTR( &command, globalMessageContext.pSentCommand ); TEST_ASSERT_EQUAL( DISCONNECT, command.commandType ); - TEST_ASSERT_NULL( command.pArgs ); + TEST_ASSERT_EQUAL_PTR( &disconnectArgs, command.pArgs ); TEST_ASSERT_EQUAL_PTR( stubCompletionCallback, command.pCommandCompleteCallback ); } From b52bf9d7afde5ca11a75b38e933c27c40fc10d92 Mon Sep 17 00:00:00 2001 From: blipbloping Date: Fri, 6 Jun 2025 14:33:47 +0000 Subject: [PATCH 6/8] Update coreMQTT subpointer --- source/dependency/coreMQTT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dependency/coreMQTT b/source/dependency/coreMQTT index 86a5750..80e9af0 160000 --- a/source/dependency/coreMQTT +++ b/source/dependency/coreMQTT @@ -1 +1 @@ -Subproject commit 86a5750bb31e05fa69ef3f4e2f5e69d9317fae44 +Subproject commit 80e9af01411075a9779d83d0c88909de5b639e70 From db448778b061ba42f87940cd39398234d754d130 Mon Sep 17 00:00:00 2001 From: blipbloping Date: Sun, 8 Jun 2025 18:45:40 +0000 Subject: [PATCH 7/8] Add unit tests full with branch coverage --- source/core_mqtt_agent.c | 12 +++- test/unit-test/mqtt_agent_utest.c | 116 ++++++++++++++++-------------- 2 files changed, 73 insertions(+), 55 deletions(-) diff --git a/source/core_mqtt_agent.c b/source/core_mqtt_agent.c index c6f3485..8b2ded9 100644 --- a/source/core_mqtt_agent.c +++ b/source/core_mqtt_agent.c @@ -496,7 +496,7 @@ static MQTTStatus_t createCommand( MQTTAgentCommandType_t commandType, statusReturn = ( isValid ) ? MQTTSuccess : MQTTBadParameter; - if( ( statusReturn == MQTTBadParameter ) && ( isSpace == false ) ) + if( statusReturn == MQTTBadParameter ) { /* The error was caused not by a bad parameter, but because there was * no room in the pending Ack list for the Ack response to an outgoing @@ -663,6 +663,10 @@ static void mqttEventCallback( MQTTContext_t * pMqttContext, MQTTAgentContext_t * pAgentContext; const uint8_t upperNibble = ( uint8_t ) 0xF0; + ( void ) sendPropsBuffer; /* Unused parameter. */ + ( void ) getPropsBuffer; /* Unused parameter. */ + ( void ) pReasonCode; /* Unused parameter. */ + assert( pMqttContext != NULL ); assert( pPacketInfo != NULL ); @@ -962,6 +966,7 @@ static bool validateParams( MQTTAgentCommandType_t commandType, pPublishArgs = ( const MQTTAgentPublishArgs_t * ) pParams; ret = ( ( pPublishArgs != NULL ) && ( pPublishArgs->pPublishInfo != NULL ) ); + break ; default: ret = ( pParams != NULL ); break; @@ -1314,13 +1319,14 @@ MQTTStatus_t MQTTAgent_Disconnect( const MQTTAgentContext_t * pMqttAgentContext, MQTTStatus_t statusReturn = MQTTBadParameter; bool paramsValid = false; - paramsValid = validateStruct( pMqttAgentContext, pCommandInfo ); + paramsValid = validateStruct( pMqttAgentContext, pCommandInfo ) && + validateParams(DISCONNECT , pDisconnectArgs ); if( paramsValid ) { statusReturn = createAndAddCommand( DISCONNECT, /* commandType */ pMqttAgentContext, /* mqttContextHandle */ - pDisconnectArgs, /* pMqttInfoParam */ + pDisconnectArgs, /* pMqttInfoParam */ pCommandInfo->cmdCompleteCallback, /* commandCompleteCallback */ pCommandInfo->pCmdCompleteCallbackContext, /* pCommandCompleteCallbackContext */ pCommandInfo->blockTimeMs ); diff --git a/test/unit-test/mqtt_agent_utest.c b/test/unit-test/mqtt_agent_utest.c index 1d6fad9..2eb5477 100644 --- a/test/unit-test/mqtt_agent_utest.c +++ b/test/unit-test/mqtt_agent_utest.c @@ -1004,50 +1004,7 @@ void test_MQTTAgent_Unsubscribe_success( void ) TEST_ASSERT_EQUAL_PTR( stubCompletionCallback, command.pCommandCompleteCallback ); } -// /* ========================================================================== */ - -// /** -// * @brief Test MQTTAgent_Publish() with invalid parameters. -// */ -// void test_MQTTAgent_Publish_Invalid_Parameters( void ) -// { -// MQTTAgentContext_t agentContext = { 0 }; -// MQTTStatus_t mqttStatus; -// MQTTAgentCommandInfo_t commandInfo = { 0 }; -// MQTTAgentCommand_t command = { 0 }; -// MQTTAgentPublishArgs_t publishArgs = { 0 }; -// MQTTPublishInfo_t publishInfo = { 0 } ; - -// setupAgentContext( &agentContext ); -// pCommandToReturn = &command; -// commandInfo.cmdCompleteCallback = stubCompletionCallback; -// /* Test topic name. */ -// publishInfo.pTopicName = "test"; -// publishInfo.topicNameLength = 4; - -// publishArgs.pPublishInfo = &publishInfo; - -// /* NULL parameters. */ -// mqttStatus = MQTTAgent_Publish( NULL, &publishArgs, &commandInfo ); -// TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); - -// mqttStatus = MQTTAgent_Publish( &agentContext, NULL, &commandInfo ); -// TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); - -// mqttStatus = MQTTAgent_Publish( &agentContext, &publishArgs, NULL ); -// TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); - -// /* This needs to be large enough to hold the PUBLISH: -// * 1 byte: control header -// * 1 byte: remaining length -// * 2 bytes: topic name length -// * 1+ bytes: topic name. -// * For this test case, the buffer must have size at least -// * 1+1+2+4=8. */ -// agentContext.mqttContext.networkBuffer.size = 6; -// mqttStatus = MQTTAgent_Publish( &agentContext, &publishArgs, &commandInfo ); -// TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); -// } +/* ========================================================================== */ /** * @brief Test that an MQTTNoMemory error is returned when there @@ -1135,6 +1092,9 @@ void test_MQTTAgent_Connect_Invalid_Parameters( void ) MQTTAgentCommand_t command = { 0 }; MQTTAgentConnectArgs_t connectArgs = { 0 }; MQTTConnectInfo_t connectInfo = { 0 }; + MQTTPropBuilder_t willProperties = { 0 }; + MQTTPublishInfo_t willInfo = { 0 }; + setupAgentContext( &agentContext ); pCommandToReturn = &command; @@ -1155,6 +1115,20 @@ void test_MQTTAgent_Connect_Invalid_Parameters( void ) connectArgs.pConnectInfo = NULL; mqttStatus = MQTTAgent_Connect( &agentContext, &connectArgs, &commandInfo ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); + + /*Invalid argument : will info is null while will properties are not null. */ + connectArgs.pConnectInfo = &connectInfo; + connectArgs.pWillInfo = NULL ; + connectArgs.pWillProperties = &willProperties; + mqttStatus = MQTTAgent_Connect( &agentContext, &connectArgs, &commandInfo ); + TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); + + /* Will Info is set and Will properties are also sent. */ + connectArgs.pWillInfo = &willInfo ; + mqttStatus = MQTTAgent_Connect( &agentContext, &connectArgs, &commandInfo ); + TEST_ASSERT_EQUAL( MQTTSuccess, mqttStatus ); + + } /** @@ -1218,14 +1192,23 @@ void test_MQTTAgent_ProcessLoop_success( void ) /* ========================================================================== */ -// /** -// * @brief Test MQTTAgent_Disconnect() with invalid parameters. -// */ -// void test_MQTTAgent_Disconnect_Invalid_Params( void ) -// { -// /* Call the common helper function with the function pointer and name. */ -// invalidParamsTestFunc( MQTTAgent_Disconnect, "Function=MQTTAgent_Disconnect" ); -// } +/** + * @brief Test MQTTAgent_Disconnect() with invalid parameters. + */ +void test_MQTTAgent_Disconnect_Invalid_Params( void ) +{ + MQTTAgentContext_t agentContext = { 0 }; + MQTTStatus_t mqttStatus; + MQTTAgentCommandInfo_t commandInfo = { 0 }; + MQTTAgentCommand_t command = { 0 }; + + setupAgentContext( &agentContext ); + pCommandToReturn = &command; + commandInfo.cmdCompleteCallback = stubCompletionCallback; + + mqttStatus = MQTTAgent_Disconnect( &agentContext, NULL, &commandInfo ); + TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); +} /** * @brief Test that MQTTAgent_Disconnect() works as intended. @@ -1968,3 +1951,32 @@ void test_MQTTAgent_CancelAll( void ) /* Ensure that command is released. */ TEST_ASSERT_EQUAL( 2, commandReleaseCallCount ); } + +void test_MQTTAgent_Publish_InvalidParams( void ) +{ + MQTTAgentContext_t agentContext = { 0 }; + MQTTStatus_t mqttStatus; + MQTTAgentCommandInfo_t commandInfo = { 0 }; + MQTTAgentCommand_t command = { 0 }; + MQTTPublishInfo_t publishInfo = { 0 }; + MQTTAgentPublishArgs_t publishArgs = { 0 }; + + setupAgentContext( &agentContext ); + pCommandToReturn = &command; + commandInfo.cmdCompleteCallback = stubCompletionCallback; + /* Test topic name. */ + publishInfo.pTopicName = "test"; + publishInfo.topicNameLength = 4; + + publishArgs.pPublishInfo = &publishInfo; + + mqttStatus = MQTTAgent_Publish( NULL, &publishArgs, &commandInfo ); + TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); + + mqttStatus = MQTTAgent_Publish( &agentContext, NULL, &commandInfo ); + TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); + + publishArgs.pPublishInfo = NULL ; + mqttStatus = MQTTAgent_Publish( &agentContext, &publishArgs, &commandInfo ); + TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); +} \ No newline at end of file From 5991d10903061b0c7b3efd7f467fa44ed01e62a7 Mon Sep 17 00:00:00 2001 From: blipbloping Date: Sun, 8 Jun 2025 19:00:34 +0000 Subject: [PATCH 8/8] Cover 1 branch in MQTTAgent_Disconnect --- test/unit-test/mqtt_agent_utest.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/unit-test/mqtt_agent_utest.c b/test/unit-test/mqtt_agent_utest.c index 2eb5477..a70f44e 100644 --- a/test/unit-test/mqtt_agent_utest.c +++ b/test/unit-test/mqtt_agent_utest.c @@ -1201,6 +1201,7 @@ void test_MQTTAgent_Disconnect_Invalid_Params( void ) MQTTStatus_t mqttStatus; MQTTAgentCommandInfo_t commandInfo = { 0 }; MQTTAgentCommand_t command = { 0 }; + MQTTAgentDisconnectArgs_t disconnectArgs = { 0 }; setupAgentContext( &agentContext ); pCommandToReturn = &command; @@ -1208,6 +1209,9 @@ void test_MQTTAgent_Disconnect_Invalid_Params( void ) mqttStatus = MQTTAgent_Disconnect( &agentContext, NULL, &commandInfo ); TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); + + mqttStatus = MQTTAgent_Disconnect( NULL , &disconnectArgs , &commandInfo ); + TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); } /**