Skip to content

Commit

Permalink
Merge pull request #1277 from Azure/GitHubIssue1254
Browse files Browse the repository at this point in the history
Handle unexpected states in dev provisioning messagesender and messagereceiver state cb (issue #1254)
  • Loading branch information
ewertons authored Oct 23, 2019
2 parents d49723e + 18c095a commit 173846e
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 0 deletions.
18 changes: 18 additions & 0 deletions provisioning_client/src/prov_transport_amqp_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}
}
Expand Down Expand Up @@ -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);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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*);
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 173846e

Please sign in to comment.