diff --git a/provisioning_client/src/prov_transport_amqp_common.c b/provisioning_client/src/prov_transport_amqp_common.c index e46381f154..311a650922 100644 --- a/provisioning_client/src/prov_transport_amqp_common.c +++ b/provisioning_client/src/prov_transport_amqp_common.c @@ -195,6 +195,15 @@ static void on_message_sender_state_changed_callback(void* context, MESSAGE_SEND amqp_info->transport_state = TRANSPORT_CLIENT_STATE_ERROR; amqp_info->amqp_state = AMQP_STATE_ERROR; break; + default: + LogError("on_message_sender_state_changed_callback received unexpected state %d", amqp_info->msg_recv_state); + + amqp_info->amqp_state = AMQP_STATE_ERROR; + amqp_info->transport_state = TRANSPORT_CLIENT_STATE_ERROR; + if (amqp_info->status_cb != NULL) + { + amqp_info->status_cb(PROV_DEVICE_TRANSPORT_STATUS_ERROR, amqp_info->retry_after_value, amqp_info->status_ctx); + } } } } @@ -233,6 +242,15 @@ static void on_message_receiver_state_changed_callback(const void* user_ctx, MES amqp_info->transport_state = TRANSPORT_CLIENT_STATE_ERROR; amqp_info->amqp_state = AMQP_STATE_ERROR; break; + default: + LogError("on_message_receiver_state_changed_callback received unexpected state %d", amqp_info->msg_recv_state); + + amqp_info->amqp_state = AMQP_STATE_ERROR; + amqp_info->transport_state = TRANSPORT_CLIENT_STATE_ERROR; + if (amqp_info->status_cb != NULL) + { + amqp_info->status_cb(PROV_DEVICE_TRANSPORT_STATUS_ERROR, amqp_info->retry_after_value, amqp_info->status_ctx); + } } } } diff --git a/provisioning_client/tests/prov_transport_amqp_common_ut/prov_transport_amqp_common_ut.c b/provisioning_client/tests/prov_transport_amqp_common_ut/prov_transport_amqp_common_ut.c index 262c59535f..20531e8fc4 100644 --- a/provisioning_client/tests/prov_transport_amqp_common_ut/prov_transport_amqp_common_ut.c +++ b/provisioning_client/tests/prov_transport_amqp_common_ut/prov_transport_amqp_common_ut.c @@ -482,6 +482,8 @@ BEGIN_TEST_SUITE(prov_transport_amqp_common_ut) REGISTER_UMOCK_ALIAS_TYPE(HTTP_CLIENT_REQUEST_TYPE, int); REGISTER_UMOCK_ALIAS_TYPE(MESSAGE_SENDER_HANDLE, void*); REGISTER_UMOCK_ALIAS_TYPE(MESSAGE_RECEIVER_HANDLE, void*); + REGISTER_UMOCK_ALIAS_TYPE(MESSAGE_RECEIVER_STATE, int); + REGISTER_UMOCK_ALIAS_TYPE(MESSAGE_SENDER_STATE, int); REGISTER_UMOCK_ALIAS_TYPE(LINK_HANDLE, void*); REGISTER_UMOCK_ALIAS_TYPE(SASL_MECHANISM_HANDLE, void*); REGISTER_UMOCK_ALIAS_TYPE(SESSION_HANDLE, void*); @@ -1621,6 +1623,54 @@ BEGIN_TEST_SUITE(prov_transport_amqp_common_ut) prov_transport_common_amqp_destroy(handle); } + TEST_FUNCTION(prov_transport_common_amqp_on_message_receiver_state_changed_callback_unexpected_state) + { + PROV_DEVICE_TRANSPORT_HANDLE handle = prov_transport_common_amqp_create(TEST_URI_VALUE, TRANSPORT_HSM_TYPE_TPM, TEST_SCOPE_ID_VALUE, TEST_DPS_API_VALUE, on_transport_io, on_transport_error, NULL); + (void)prov_transport_common_amqp_open(handle, TEST_REGISTRATION_ID_VALUE, TEST_BUFFER_VALUE, TEST_BUFFER_VALUE, on_transport_register_data_cb, NULL, on_transport_status_cb, NULL, on_transport_challenge_callback, NULL); + prov_transport_common_amqp_dowork(handle); + g_msg_sndr_state_changed(g_msg_sndr_state_changed_ctx, MESSAGE_SENDER_STATE_OPEN, MESSAGE_SENDER_STATE_OPENING); + g_msg_rcvr_state_changed(g_msg_rcvr_state_changed_ctx, (MESSAGE_RECEIVER_STATE)333333, MESSAGE_RECEIVER_STATE_OPENING); + umock_c_reset_all_calls(); + + //arrange + STRICT_EXPECTED_CALL(connection_dowork(IGNORED_PTR_ARG)); + STRICT_EXPECTED_CALL(on_transport_register_data_cb(PROV_DEVICE_TRANSPORT_RESULT_ERROR, IGNORED_PTR_ARG, IGNORED_PTR_ARG, IGNORED_PTR_ARG, IGNORED_PTR_ARG)); + + //act + prov_transport_common_amqp_dowork(handle); + + //assert + ASSERT_ARE_EQUAL(char_ptr, umock_c_get_expected_calls(), umock_c_get_actual_calls()); + + //cleanup + prov_transport_common_amqp_close(handle); + prov_transport_common_amqp_destroy(handle); + } + + TEST_FUNCTION(prov_transport_common_amqp_on_message_sender_state_changed_callback_unexpected_state) + { + PROV_DEVICE_TRANSPORT_HANDLE handle = prov_transport_common_amqp_create(TEST_URI_VALUE, TRANSPORT_HSM_TYPE_TPM, TEST_SCOPE_ID_VALUE, TEST_DPS_API_VALUE, on_transport_io, on_transport_error, NULL); + (void)prov_transport_common_amqp_open(handle, TEST_REGISTRATION_ID_VALUE, TEST_BUFFER_VALUE, TEST_BUFFER_VALUE, on_transport_register_data_cb, NULL, on_transport_status_cb, NULL, on_transport_challenge_callback, NULL); + prov_transport_common_amqp_dowork(handle); + g_msg_sndr_state_changed(g_msg_sndr_state_changed_ctx, (MESSAGE_SENDER_STATE)333333, MESSAGE_SENDER_STATE_OPENING); + g_msg_rcvr_state_changed(g_msg_rcvr_state_changed_ctx, MESSAGE_RECEIVER_STATE_OPEN, MESSAGE_RECEIVER_STATE_OPENING); + umock_c_reset_all_calls(); + + //arrange + STRICT_EXPECTED_CALL(connection_dowork(IGNORED_PTR_ARG)); + STRICT_EXPECTED_CALL(on_transport_register_data_cb(PROV_DEVICE_TRANSPORT_RESULT_ERROR, IGNORED_PTR_ARG, IGNORED_PTR_ARG, IGNORED_PTR_ARG, IGNORED_PTR_ARG)); + + //act + prov_transport_common_amqp_dowork(handle); + + //assert + ASSERT_ARE_EQUAL(char_ptr, umock_c_get_expected_calls(), umock_c_get_actual_calls()); + + //cleanup + prov_transport_common_amqp_close(handle); + prov_transport_common_amqp_destroy(handle); + } + /* Tests_PROV_TRANSPORT_AMQP_COMMON_07_050: [ The reciever and sender endpoints addresses shall be constructed in the following manner: amqps://[hostname]/[scope_id]/registrations/[registration_id] ] */ /* Tests_PROV_TRANSPORT_AMQP_COMMON_07_053: [ When then transport_state is set to TRANSPORT_CLIENT_STATE_REG_SEND, prov_transport_common_amqp_dowork shall send a AMQP_REGISTER_ME message ] */ TEST_FUNCTION(prov_transport_common_amqp_dowork_register_succeed)