diff --git a/source/core_mqtt_agent.c b/source/core_mqtt_agent.c index cbc9598..8b2ded9 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; @@ -495,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 @@ -652,13 +653,20 @@ 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; 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 ); @@ -819,9 +827,10 @@ 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 ); pMqttContext = &( pMqttAgentContext->mqttContext ); @@ -835,9 +844,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 +941,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 +951,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 +962,12 @@ 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 ) ); + break ; default: - /* Publish, does not need to be cast since we do not check it. */ ret = ( pParams != NULL ); break; } @@ -969,10 +983,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 +1035,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 +1240,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,18 +1313,20 @@ 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; bool paramsValid = false; - paramsValid = validateStruct( pMqttAgentContext, pCommandInfo ); + paramsValid = validateStruct( pMqttAgentContext, pCommandInfo ) && + validateParams(DISCONNECT , pDisconnectArgs ); if( paramsValid ) { statusReturn = createAndAddCommand( DISCONNECT, /* commandType */ pMqttAgentContext, /* mqttContextHandle */ - NULL, /* pMqttInfoParam */ + pDisconnectArgs, /* pMqttInfoParam */ pCommandInfo->cmdCompleteCallback, /* commandCompleteCallback */ pCommandInfo->pCmdCompleteCallbackContext, /* pCommandCompleteCallbackContext */ pCommandInfo->blockTimeMs ); 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/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 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 ); /** 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..a70f44e 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; @@ -990,46 +1006,6 @@ void test_MQTTAgent_Unsubscribe_success( void ) /* ========================================================================== */ -/** - * @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 that an MQTTNoMemory error is returned when there * is no more space to store a pending acknowledgment for @@ -1042,6 +1018,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 +1030,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 +1046,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 +1060,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 +1069,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 ); } @@ -1118,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; @@ -1138,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 ); + + } /** @@ -1206,8 +1197,21 @@ void test_MQTTAgent_ProcessLoop_success( void ) */ void test_MQTTAgent_Disconnect_Invalid_Params( void ) { - /* Call the common helper function with the function pointer and name. */ - invalidParamsTestFunc( MQTTAgent_Disconnect, "Function=MQTTAgent_Disconnect" ); + MQTTAgentContext_t agentContext = { 0 }; + MQTTStatus_t mqttStatus; + MQTTAgentCommandInfo_t commandInfo = { 0 }; + MQTTAgentCommand_t command = { 0 }; + MQTTAgentDisconnectArgs_t disconnectArgs = { 0 }; + + setupAgentContext( &agentContext ); + pCommandToReturn = &command; + commandInfo.cmdCompleteCallback = stubCompletionCallback; + + mqttStatus = MQTTAgent_Disconnect( &agentContext, NULL, &commandInfo ); + TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); + + mqttStatus = MQTTAgent_Disconnect( NULL , &disconnectArgs , &commandInfo ); + TEST_ASSERT_EQUAL( MQTTBadParameter, mqttStatus ); } /** @@ -1219,17 +1223,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 ); } @@ -1950,3 +1955,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