Skip to content

Commit

Permalink
Test: add testcase to test recption of subscribe ack after a disconnect
Browse files Browse the repository at this point in the history
  • Loading branch information
alfred2g committed Sep 20, 2023
1 parent d1a8040 commit fc11e14
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 1 deletion.
2 changes: 1 addition & 1 deletion source/v5/mqtt5_to_mqtt3_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -2187,7 +2187,7 @@ static void s_aws_mqtt5_to_mqtt3_adapter_subscribe_completion_fn(

struct aws_mqtt5_to_mqtt3_adapter_operation_subscribe *subscribe_op = complete_ctx;
struct aws_mqtt_client_connection_5_impl *adapter = subscribe_op->base.adapter;
int reason_code_count = 0;
size_t reason_code_count = 0;

if (suback != NULL) {
reason_code_count = suback->reason_code_count;
Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,7 @@ add_test_case(mqtt5to3_adapter_unsubscribe_overlapped)
add_test_case(mqtt5to3_adapter_get_stats)
add_test_case(mqtt5to3_adapter_resubscribe_nothing)
add_test_case(mqtt5to3_adapter_resubscribe_something)
add_test_case(mqtt5to3_adapter_subscribe_single_success_null_suback)

add_test_case(mqtt_subscription_set_add_empty_not_subbed)
add_test_case(mqtt_subscription_set_add_single_path)
Expand Down
85 changes: 85 additions & 0 deletions tests/v5/mqtt5_to_mqtt3_adapter_tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -2686,6 +2686,91 @@ static int s_mqtt5to3_adapter_subscribe_single_success_fn(struct aws_allocator *

AWS_TEST_CASE(mqtt5to3_adapter_subscribe_single_success, s_mqtt5to3_adapter_subscribe_single_success_fn)

/*
* This function tests receiving a subscribe acknowlege after disconnecting from
* the server.
* it expects a AWS_MQTT_QOS_FAILURE return
*/
static int s_mqtt5to3_adapter_subscribe_single_success_null_suback_fn(struct aws_allocator *allocator, void *ctx) {
(void)ctx;

aws_mqtt_library_init(allocator);

struct mqtt5_client_test_options test_options;
aws_mqtt5_client_test_init_default_options(&test_options);

test_options.server_function_table.packet_handlers[AWS_MQTT5_PT_SUBSCRIBE] =
s_mqtt5_mock_server_handle_subscribe_suback_success;

struct aws_mqtt5_client_mqtt5_mock_test_fixture_options test_fixture_options = {
.client_options = &test_options.client_options,
.server_function_table = &test_options.server_function_table,
};

struct aws_mqtt5_to_mqtt3_adapter_test_fixture fixture;
ASSERT_SUCCESS(aws_mqtt5_to_mqtt3_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options));

struct aws_mqtt_client_connection *connection = fixture.connection;

struct aws_mqtt_connection_options connection_options;
s_init_adapter_connection_options_from_fixture(&connection_options, &fixture);

connection_options.on_connection_complete = s_aws_mqtt5_to_mqtt3_adapter_test_fixture_record_connection_complete;
connection_options.user_data = &fixture;

aws_mqtt_client_connection_connect(connection, &connection_options);

s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CONNECTION_COMPLETE, 1);

struct aws_byte_cursor topic = aws_byte_cursor_from_c_str("derp");

aws_mqtt_client_connection_subscribe(
connection,
&topic,
AWS_MQTT_QOS_AT_LEAST_ONCE,
s_aws_mqtt5_to_mqtt3_adapter_test_fixture_record_topic_specific_publish,
&fixture,
NULL,
s_aws_mqtt5_to_mqtt3_adapter_test_fixture_record_subscribe_complete,
&fixture);

struct aws_mqtt_topic_subscription expected_subs[1] = {
{
.topic = topic,
.qos = AWS_MQTT_QOS_FAILURE,
},
};

struct aws_mqtt3_operation_event expected_events[] = {
{
.type = AWS_MQTT3_OET_SUBSCRIBE_COMPLETE,
.error_code = AWS_ERROR_MQTT5_USER_REQUESTED_STOP,
},
};
aws_array_list_init_static_from_initialized(
&expected_events[0].granted_subscriptions,
(void *)expected_subs,
1,
sizeof(struct aws_mqtt_topic_subscription));

aws_mqtt_client_connection_disconnect(
connection, s_aws_mqtt5_to_mqtt3_adapter_test_fixture_record_disconnection_complete, &fixture);

s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_DISCONNECTION_COMPLETE, 1);

s_wait_for_n_adapter_operation_events(&fixture, AWS_MQTT3_OET_SUBSCRIBE_COMPLETE, 1);

ASSERT_SUCCESS(s_aws_mqtt5_to_mqtt3_adapter_test_fixture_verify_operation_sequence(
&fixture, AWS_ARRAY_SIZE(expected_events), expected_events, AWS_ARRAY_SIZE(expected_events)));

aws_mqtt5_to_mqtt3_adapter_test_fixture_clean_up(&fixture);
aws_mqtt_library_clean_up();

return AWS_OP_SUCCESS;
}

AWS_TEST_CASE(mqtt5to3_adapter_subscribe_single_success_null_suback, s_mqtt5to3_adapter_subscribe_single_success_null_suback_fn)

static void s_aws_mqtt5_to_mqtt3_adapter_test_fixture_record_subscribe_multi_complete(
struct aws_mqtt_client_connection *connection,
uint16_t packet_id,
Expand Down

0 comments on commit fc11e14

Please sign in to comment.