diff --git a/include/aws/mqtt/private/v5/mqtt3_to_mqtt5_adapter_impl.h b/include/aws/mqtt/private/v5/mqtt3_to_mqtt5_adapter_impl.h index 70cfec64..3db60d3f 100644 --- a/include/aws/mqtt/private/v5/mqtt3_to_mqtt5_adapter_impl.h +++ b/include/aws/mqtt/private/v5/mqtt3_to_mqtt5_adapter_impl.h @@ -293,6 +293,12 @@ struct aws_mqtt_client_connection_5_impl { aws_mqtt_client_on_connection_closed_fn *on_closed; void *on_closed_user_data; + aws_mqtt_client_on_connection_success_fn *on_connection_success; + void *on_connection_success_user_data; + + aws_mqtt_client_on_connection_failure_fn *on_connection_failure; + void *on_connection_failure_user_data; + aws_mqtt_client_publish_received_fn *on_any_publish; void *on_any_publish_user_data; diff --git a/source/v5/mqtt3_to_mqtt5_adapter.c b/source/v5/mqtt3_to_mqtt5_adapter.c index 492c1e67..ed80f16f 100644 --- a/source/v5/mqtt3_to_mqtt5_adapter.c +++ b/source/v5/mqtt3_to_mqtt5_adapter.c @@ -338,31 +338,38 @@ static int s_aws_mqtt3_to_mqtt5_adapter_safe_lifecycle_handler( switch (event->event_type) { case AWS_MQTT5_CLET_CONNECTION_SUCCESS: - if (adapter->adapter_state == AWS_MQTT_AS_FIRST_CONNECT) { - /* - * If the 311 view is that this is an initial connection attempt, then invoke the completion callback - * and move to the stay-connected state. - */ - if (adapter->on_connection_complete != NULL) { - (*adapter->on_connection_complete)( - &adapter->base, - event->error_code, - 0, - event->settings->rejoined_session, - adapter->on_connection_complete_user_data); - - adapter->on_connection_complete = NULL; - adapter->on_connection_complete_user_data = NULL; + if (adapter->adapter_state != AWS_MQTT_AS_STAY_DISCONNECTED) { + if (adapter->on_connection_success != NULL) { + (*adapter->on_connection_success)( + &adapter->base, 0, event->settings->rejoined_session, adapter->on_connection_success_user_data); } - adapter->adapter_state = AWS_MQTT_AS_STAY_CONNECTED; - } else if (adapter->adapter_state == AWS_MQTT_AS_STAY_CONNECTED) { - /* - * If the 311 view is that we're in the stay-connected state (ie we've successfully done or simulated - * an initial connection), then invoke the connection resumption callback. - */ - if (adapter->on_resumed != NULL) { - (*adapter->on_resumed)( - &adapter->base, 0, event->settings->rejoined_session, adapter->on_resumed_user_data); + + if (adapter->adapter_state == AWS_MQTT_AS_FIRST_CONNECT) { + /* + * If the 311 view is that this is an initial connection attempt, then invoke the completion + * callback and move to the stay-connected state. + */ + if (adapter->on_connection_complete != NULL) { + (*adapter->on_connection_complete)( + &adapter->base, + event->error_code, + 0, + event->settings->rejoined_session, + adapter->on_connection_complete_user_data); + + adapter->on_connection_complete = NULL; + adapter->on_connection_complete_user_data = NULL; + } + adapter->adapter_state = AWS_MQTT_AS_STAY_CONNECTED; + } else if (adapter->adapter_state == AWS_MQTT_AS_STAY_CONNECTED) { + /* + * If the 311 view is that we're in the stay-connected state (ie we've successfully done or + * simulated an initial connection), then invoke the connection resumption callback. + */ + if (adapter->on_resumed != NULL) { + (*adapter->on_resumed)( + &adapter->base, 0, event->settings->rejoined_session, adapter->on_resumed_user_data); + } } } break; @@ -380,19 +387,27 @@ static int s_aws_mqtt3_to_mqtt5_adapter_safe_lifecycle_handler( * put the adapter into the "disconnected" state, simulating the way the 311 client stops after an * initial connection failure. */ - if (event->error_code != AWS_ERROR_MQTT_CONNECTION_RESET_FOR_ADAPTER_CONNECT && - adapter->adapter_state == AWS_MQTT_AS_FIRST_CONNECT) { - - if (adapter->on_connection_complete != NULL) { - (*adapter->on_connection_complete)( - &adapter->base, event->error_code, 0, false, adapter->on_connection_complete_user_data); - - adapter->on_connection_complete = NULL; - adapter->on_connection_complete_user_data = NULL; + if (event->error_code != AWS_ERROR_MQTT_CONNECTION_RESET_FOR_ADAPTER_CONNECT) { + if (adapter->adapter_state != AWS_MQTT_AS_STAY_DISCONNECTED) { + if (adapter->on_connection_failure != NULL) { + (*adapter->on_connection_failure)( + &adapter->base, event->error_code, adapter->on_connection_failure_user_data); + } + + if (adapter->adapter_state == AWS_MQTT_AS_FIRST_CONNECT) { + if (adapter->on_connection_complete != NULL) { + (*adapter->on_connection_complete)( + &adapter->base, event->error_code, 0, false, adapter->on_connection_complete_user_data); + + adapter->on_connection_complete = NULL; + adapter->on_connection_complete_user_data = NULL; + } + + adapter->adapter_state = AWS_MQTT_AS_STAY_DISCONNECTED; + } } - - adapter->adapter_state = AWS_MQTT_AS_STAY_DISCONNECTED; } + break; case AWS_MQTT5_CLET_DISCONNECTION: @@ -745,6 +760,89 @@ static int s_aws_mqtt_client_connection_5_set_interruption_handlers( return AWS_OP_SUCCESS; } +struct aws_mqtt_set_connection_result_handlers_task { + struct aws_task task; + struct aws_allocator *allocator; + struct aws_mqtt_client_connection_5_impl *adapter; + + aws_mqtt_client_on_connection_success_fn *on_connection_success; + void *on_connection_success_user_data; + + aws_mqtt_client_on_connection_failure_fn *on_connection_failure; + void *on_connection_failure_user_data; +}; + +static void s_set_connection_result_handlers_task_fn(struct aws_task *task, void *arg, enum aws_task_status status) { + (void)task; + + struct aws_mqtt_set_connection_result_handlers_task *set_task = arg; + struct aws_mqtt_client_connection_5_impl *adapter = set_task->adapter; + + if (status != AWS_TASK_STATUS_RUN_READY) { + goto done; + } + + adapter->on_connection_success = set_task->on_connection_success; + adapter->on_connection_success_user_data = set_task->on_connection_success_user_data; + adapter->on_connection_failure = set_task->on_connection_failure; + adapter->on_connection_failure_user_data = set_task->on_connection_failure_user_data; + +done: + + aws_ref_count_release(&adapter->internal_refs); + + aws_mem_release(set_task->allocator, set_task); +} + +static struct aws_mqtt_set_connection_result_handlers_task *s_aws_mqtt_set_connection_result_handlers_task_new( + struct aws_allocator *allocator, + struct aws_mqtt_client_connection_5_impl *adapter, + aws_mqtt_client_on_connection_success_fn *on_connection_success, + void *on_connection_success_user_data, + aws_mqtt_client_on_connection_failure_fn *on_connection_failure, + void *on_connection_failure_user_data) { + + struct aws_mqtt_set_connection_result_handlers_task *set_task = + aws_mem_calloc(allocator, 1, sizeof(struct aws_mqtt_set_connection_result_handlers_task)); + + aws_task_init( + &set_task->task, s_set_connection_result_handlers_task_fn, (void *)set_task, "SetConnectionResultHandlersTask"); + set_task->allocator = adapter->allocator; + set_task->adapter = (struct aws_mqtt_client_connection_5_impl *)aws_ref_count_acquire(&adapter->internal_refs); + set_task->on_connection_success = on_connection_success; + set_task->on_connection_success_user_data = on_connection_success_user_data; + set_task->on_connection_failure = on_connection_failure; + set_task->on_connection_failure_user_data = on_connection_failure_user_data; + + return set_task; +} + +static int s_aws_mqtt_client_connection_5_set_connection_result_handlers( + void *impl, + aws_mqtt_client_on_connection_success_fn *on_connection_success, + void *on_connection_success_user_data, + aws_mqtt_client_on_connection_failure_fn *on_connection_failure, + void *on_connection_failure_user_data) { + struct aws_mqtt_client_connection_5_impl *adapter = impl; + + struct aws_mqtt_set_connection_result_handlers_task *task = s_aws_mqtt_set_connection_result_handlers_task_new( + adapter->allocator, + adapter, + on_connection_success, + on_connection_success_user_data, + on_connection_failure, + on_connection_failure_user_data); + if (task == NULL) { + AWS_LOGF_ERROR( + AWS_LS_MQTT_CLIENT, "id=%p: failed to create set connection result handlers task", (void *)adapter); + return AWS_OP_ERR; + } + + aws_event_loop_schedule_task_now(adapter->loop, &task->task); + + return AWS_OP_SUCCESS; +} + struct aws_mqtt_set_on_closed_handler_task { struct aws_task task; struct aws_allocator *allocator; @@ -2415,7 +2513,7 @@ static struct aws_mqtt_client_connection_vtable s_aws_mqtt_client_connection_5_v .set_http_proxy_options_fn = s_aws_mqtt_client_connection_5_set_http_proxy_options, .set_host_resolution_options_fn = s_aws_mqtt_client_connection_5_set_host_resolution_options, .set_reconnect_timeout_fn = s_aws_mqtt_client_connection_5_set_reconnect_timeout, - .set_connection_result_handlers = NULL, // TODO: Need update with introduction of mqtt5 lifeCycleEventCallback + .set_connection_result_handlers = s_aws_mqtt_client_connection_5_set_connection_result_handlers, .set_connection_interruption_handlers_fn = s_aws_mqtt_client_connection_5_set_interruption_handlers, .set_connection_closed_handler_fn = s_aws_mqtt_client_connection_5_set_on_closed_handler, .set_on_any_publish_handler_fn = s_aws_mqtt_client_connection_5_set_on_any_publish_handler, diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7c04fb0e..247d363f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -370,6 +370,7 @@ add_test_case(mqtt3to5_adapter_connect_bad_connectivity) add_test_case(mqtt3to5_adapter_connect_bad_connectivity_with_mqtt5_restart) add_test_case(mqtt3to5_adapter_connect_failure_connect_success_via_mqtt5) add_test_case(mqtt3to5_adapter_connect_failure_bad_config_success_good_config) +add_test_case(mqtt3to5_adapter_connect_reconnect_failures) add_test_case(mqtt3to5_adapter_connect_success_disconnect_connect) add_test_case(mqtt3to5_adapter_connect_success_stop_mqtt5_disconnect_success) add_test_case(mqtt3to5_adapter_disconnect_success) diff --git a/tests/v5/mqtt3_to_mqtt5_adapter_tests.c b/tests/v5/mqtt3_to_mqtt5_adapter_tests.c index b4486f38..7ea99b46 100644 --- a/tests/v5/mqtt3_to_mqtt5_adapter_tests.c +++ b/tests/v5/mqtt3_to_mqtt5_adapter_tests.c @@ -28,6 +28,8 @@ enum aws_mqtt3_lifecycle_event_type { AWS_MQTT3_LET_RESUMED, AWS_MQTT3_LET_CLOSED, AWS_MQTT3_LET_DISCONNECTION_COMPLETE, + AWS_MQTT3_LET_CONNECTION_SUCCESS, + AWS_MQTT3_LET_CONNECTION_FAILURE, }; struct aws_mqtt3_lifecycle_event { @@ -163,14 +165,6 @@ static bool s_aws_mqtt3_operation_event_equals( return true; } -struct aws_mqtt3_to_mqtt5_adapter_test_fixture_config { - aws_mqtt_client_on_connection_interrupted_fn *on_interrupted; - aws_mqtt_client_on_connection_resumed_fn *on_resumed; - aws_mqtt_client_on_connection_closed_fn *on_closed; - - void *callback_user_data; -}; - struct aws_mqtt3_to_mqtt5_adapter_test_fixture { struct aws_mqtt5_client_mock_test_fixture mqtt5_fixture; @@ -182,8 +176,6 @@ struct aws_mqtt3_to_mqtt5_adapter_test_fixture { struct aws_mutex lock; struct aws_condition_variable signal; - - struct aws_mqtt3_to_mqtt5_adapter_test_fixture_config config; }; static void s_init_adapter_connection_options_from_fixture( @@ -430,6 +422,10 @@ static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_closed_handler( struct aws_mqtt_client_connection *connection, struct on_connection_closed_data *data, void *userdata) { + + (void)connection; + (void)data; + struct aws_mqtt3_to_mqtt5_adapter_test_fixture *fixture = userdata; /* record the event */ @@ -443,17 +439,15 @@ static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_closed_handler( aws_array_list_push_back(&fixture->lifecycle_events, &event); aws_mutex_unlock(&fixture->lock); aws_condition_variable_notify_all(&fixture->signal); - - /* invoke user callback if registered */ - if (fixture->config.on_closed) { - (*fixture->config.on_closed)(connection, data, fixture->config.callback_user_data); - } } static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_interrupted_handler( struct aws_mqtt_client_connection *connection, int error_code, void *userdata) { + + (void)connection; + struct aws_mqtt3_to_mqtt5_adapter_test_fixture *fixture = userdata; /* record the event */ @@ -468,11 +462,6 @@ static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_interrupted_handler( aws_array_list_push_back(&fixture->lifecycle_events, &event); aws_mutex_unlock(&fixture->lock); aws_condition_variable_notify_all(&fixture->signal); - - /* invoke user callback if registered */ - if (fixture->config.on_interrupted) { - (*fixture->config.on_interrupted)(connection, error_code, fixture->config.callback_user_data); - } } static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_resumed_handler( @@ -480,6 +469,9 @@ static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_resumed_handler( enum aws_mqtt_connect_return_code return_code, bool session_present, void *userdata) { + + (void)connection; + struct aws_mqtt3_to_mqtt5_adapter_test_fixture *fixture = userdata; /* record the event */ @@ -495,11 +487,54 @@ static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_resumed_handler( aws_array_list_push_back(&fixture->lifecycle_events, &event); aws_mutex_unlock(&fixture->lock); aws_condition_variable_notify_all(&fixture->signal); +} - /* invoke user callback if registered */ - if (fixture->config.on_resumed) { - (*fixture->config.on_resumed)(connection, return_code, session_present, fixture->config.callback_user_data); - } +static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_connection_failure_handler( + struct aws_mqtt_client_connection *connection, + int error_code, + void *userdata) { + + (void)connection; + + struct aws_mqtt3_to_mqtt5_adapter_test_fixture *fixture = userdata; + + /* record the event */ + struct aws_mqtt3_lifecycle_event event; + AWS_ZERO_STRUCT(event); + + event.type = AWS_MQTT3_LET_CONNECTION_FAILURE; + aws_high_res_clock_get_ticks(&event.timestamp); + event.error_code = error_code; + + aws_mutex_lock(&fixture->lock); + aws_array_list_push_back(&fixture->lifecycle_events, &event); + aws_mutex_unlock(&fixture->lock); + aws_condition_variable_notify_all(&fixture->signal); +} + +static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_connection_success_handler( + struct aws_mqtt_client_connection *connection, + enum aws_mqtt_connect_return_code return_code, + bool session_present, + void *userdata) { + + (void)connection; + + struct aws_mqtt3_to_mqtt5_adapter_test_fixture *fixture = userdata; + + /* record the event */ + struct aws_mqtt3_lifecycle_event event; + AWS_ZERO_STRUCT(event); + + event.type = AWS_MQTT3_LET_CONNECTION_SUCCESS; + aws_high_res_clock_get_ticks(&event.timestamp); + event.return_code = return_code; + event.session_present = session_present; + + aws_mutex_lock(&fixture->lock); + aws_array_list_push_back(&fixture->lifecycle_events, &event); + aws_mutex_unlock(&fixture->lock); + aws_condition_variable_notify_all(&fixture->signal); } static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_record_connection_complete( @@ -549,8 +584,7 @@ static void s_aws_mqtt3_to_mqtt5_adapter_test_fixture_record_disconnection_compl int aws_mqtt3_to_mqtt5_adapter_test_fixture_init( struct aws_mqtt3_to_mqtt5_adapter_test_fixture *fixture, struct aws_allocator *allocator, - struct aws_mqtt5_client_mqtt5_mock_test_fixture_options *mqtt5_fixture_config, - struct aws_mqtt3_to_mqtt5_adapter_test_fixture_config *config) { + struct aws_mqtt5_client_mqtt5_mock_test_fixture_options *mqtt5_fixture_config) { AWS_ZERO_STRUCT(*fixture); if (aws_mqtt5_client_mock_test_fixture_init(&fixture->mqtt5_fixture, allocator, mqtt5_fixture_config)) { @@ -568,10 +602,6 @@ int aws_mqtt3_to_mqtt5_adapter_test_fixture_init( aws_mutex_init(&fixture->lock); aws_condition_variable_init(&fixture->signal); - if (config) { - fixture->config = *config; - } - aws_mqtt_client_connection_set_connection_closed_handler( fixture->connection, s_aws_mqtt3_to_mqtt5_adapter_test_fixture_closed_handler, fixture); aws_mqtt_client_connection_set_connection_interruption_handlers( @@ -580,6 +610,12 @@ int aws_mqtt3_to_mqtt5_adapter_test_fixture_init( fixture, s_aws_mqtt3_to_mqtt5_adapter_test_fixture_resumed_handler, fixture); + aws_mqtt_client_connection_set_connection_result_handlers( + fixture->connection, + s_aws_mqtt3_to_mqtt5_adapter_test_fixture_connection_success_handler, + fixture, + s_aws_mqtt3_to_mqtt5_adapter_test_fixture_connection_failure_handler, + fixture); return AWS_OP_SUCCESS; } @@ -701,7 +737,7 @@ static int s_do_mqtt3to5_adapter_config_test( }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture test_fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&test_fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&test_fixture, allocator, &test_fixture_options)); struct aws_mqtt5_client *client = test_fixture.mqtt5_fixture.client; @@ -900,7 +936,7 @@ static int s_mqtt3to5_adapter_connect_success_fn(struct aws_allocator *allocator }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -915,6 +951,9 @@ static int s_mqtt3to5_adapter_connect_success_fn(struct aws_allocator *allocator s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CONNECTION_COMPLETE, 1); struct aws_mqtt3_lifecycle_event expected_events[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, }, @@ -944,7 +983,7 @@ static int s_do_mqtt3to5_adapter_connect_success_disconnect_success_cycle( }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -967,6 +1006,9 @@ static int s_do_mqtt3to5_adapter_connect_success_disconnect_success_cycle( s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CLOSED, i + 1); struct aws_mqtt3_lifecycle_event expected_event_sequence[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, }, @@ -977,13 +1019,14 @@ static int s_do_mqtt3to5_adapter_connect_success_disconnect_success_cycle( .type = AWS_MQTT3_LET_CLOSED, }, }; + size_t sequence_size = AWS_ARRAY_SIZE(expected_event_sequence); - size_t expected_event_count = (i + 1) * 3; + size_t expected_event_count = (i + 1) * sequence_size; struct aws_mqtt3_lifecycle_event *expected_events = aws_mem_calloc(allocator, expected_event_count, sizeof(struct aws_mqtt3_lifecycle_event)); for (size_t j = 0; j < i + 1; ++j) { - for (size_t k = 0; k < 3; ++k) { - *(expected_events + j * 3 + k) = expected_event_sequence[k]; + for (size_t k = 0; k < sequence_size; ++k) { + *(expected_events + j * sequence_size + k) = expected_event_sequence[k]; } } @@ -1045,7 +1088,7 @@ static int s_mqtt3to5_adapter_connect_success_connect_failure_fn(struct aws_allo }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -1064,6 +1107,9 @@ static int s_mqtt3to5_adapter_connect_success_connect_failure_fn(struct aws_allo s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CONNECTION_COMPLETE, 2); struct aws_mqtt3_lifecycle_event expected_events[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, }, @@ -1101,7 +1147,7 @@ static int s_mqtt3to5_adapter_connect_success_sloppy_shutdown_fn(struct aws_allo }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -1138,6 +1184,9 @@ static int s_aws_mqtt5_server_disconnect_after_connect( static int s_verify_bad_connectivity_callbacks(struct aws_mqtt3_to_mqtt5_adapter_test_fixture *fixture) { struct aws_mqtt3_lifecycle_event expected_events_start[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, }, @@ -1145,6 +1194,9 @@ static int s_verify_bad_connectivity_callbacks(struct aws_mqtt3_to_mqtt5_adapter .type = AWS_MQTT3_LET_INTERRUPTED, .error_code = AWS_ERROR_MQTT5_DISCONNECT_RECEIVED, }, + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_RESUMED, }, @@ -1152,6 +1204,9 @@ static int s_verify_bad_connectivity_callbacks(struct aws_mqtt3_to_mqtt5_adapter .type = AWS_MQTT3_LET_INTERRUPTED, .error_code = AWS_ERROR_MQTT5_DISCONNECT_RECEIVED, }, + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_RESUMED, }, @@ -1226,7 +1281,7 @@ static int s_mqtt3to5_adapter_connect_bad_connectivity_fn(struct aws_allocator * }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); ASSERT_SUCCESS(s_do_bad_connectivity_basic_test(&fixture)); @@ -1265,7 +1320,7 @@ static int s_mqtt3to5_adapter_connect_bad_connectivity_with_mqtt5_restart_fn( }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); ASSERT_SUCCESS(s_do_bad_connectivity_basic_test(&fixture)); @@ -1302,7 +1357,7 @@ int aws_mqtt5_mock_server_handle_connect_succeed_on_or_after_nth( struct aws_mqtt5_packet_connack_view connack_view; AWS_ZERO_STRUCT(connack_view); - if (context->connection_attempts >= context->required_connection_failure_count) { + if (context->connection_attempts >= context->required_connection_count_threshold) { connack_view.reason_code = AWS_MQTT5_CRC_SUCCESS; aws_high_res_clock_get_ticks(&context->connect_timestamp); } else { @@ -1324,7 +1379,7 @@ static int s_mqtt3to5_adapter_connect_failure_connect_success_via_mqtt5_fn(struc aws_mqtt_library_init(allocator); struct aws_mqtt5_mock_server_reconnect_state mock_server_state = { - .required_connection_failure_count = 1, + .required_connection_count_threshold = 1, }; struct mqtt5_client_test_options test_options; @@ -1340,7 +1395,7 @@ static int s_mqtt3to5_adapter_connect_failure_connect_success_via_mqtt5_fn(struc }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -1356,6 +1411,10 @@ static int s_mqtt3to5_adapter_connect_failure_connect_success_via_mqtt5_fn(struc s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CONNECTION_COMPLETE, 1); struct aws_mqtt3_lifecycle_event expected_events[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_FAILURE, + .error_code = AWS_ERROR_MQTT5_CONNACK_CONNECTION_REFUSED, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, .error_code = AWS_ERROR_MQTT5_CONNACK_CONNECTION_REFUSED, @@ -1376,10 +1435,17 @@ static int s_mqtt3to5_adapter_connect_failure_connect_success_via_mqtt5_fn(struc s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CONNECTION_COMPLETE, 2); struct aws_mqtt3_lifecycle_event expected_reconnect_events[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_FAILURE, + .error_code = AWS_ERROR_MQTT5_CONNACK_CONNECTION_REFUSED, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, .error_code = AWS_ERROR_MQTT5_CONNACK_CONNECTION_REFUSED, }, + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, }, @@ -1422,7 +1488,7 @@ static int s_mqtt3to5_adapter_connect_failure_bad_config_success_good_config_fn( }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -1440,6 +1506,11 @@ static int s_mqtt3to5_adapter_connect_failure_bad_config_success_good_config_fn( s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CONNECTION_COMPLETE, 1); struct aws_mqtt3_lifecycle_event expected_events[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_FAILURE, + .error_code = AWS_ERROR_FILE_INVALID_PATH, + .skip_error_code_equality = true, /* the error code here is platform-dependent */ + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, .error_code = AWS_ERROR_FILE_INVALID_PATH, @@ -1455,11 +1526,19 @@ static int s_mqtt3to5_adapter_connect_failure_bad_config_success_good_config_fn( s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CONNECTION_COMPLETE, 2); struct aws_mqtt3_lifecycle_event expected_reconnect_events[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_FAILURE, + .error_code = AWS_ERROR_FILE_INVALID_PATH, + .skip_error_code_equality = true, /* the error code here is platform-dependent */ + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, .error_code = AWS_ERROR_FILE_INVALID_PATH, .skip_error_code_equality = true, /* the error code here is platform-dependent */ }, + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, }, @@ -1480,6 +1559,119 @@ AWS_TEST_CASE( mqtt3to5_adapter_connect_failure_bad_config_success_good_config, s_mqtt3to5_adapter_connect_failure_bad_config_success_good_config_fn) +int aws_mqtt5_mock_server_handle_connect_fail_on_or_after_nth( + void *packet, + struct aws_mqtt5_server_mock_connection_context *connection, + void *user_data) { + (void)packet; + + struct aws_mqtt5_mock_server_reconnect_state *context = user_data; + + bool send_disconnect = false; + struct aws_mqtt5_packet_connack_view connack_view; + AWS_ZERO_STRUCT(connack_view); + + if (context->connection_attempts >= context->required_connection_count_threshold) { + connack_view.reason_code = AWS_MQTT5_CRC_NOT_AUTHORIZED; + } else { + connack_view.reason_code = AWS_MQTT5_CRC_SUCCESS; + aws_high_res_clock_get_ticks(&context->connect_timestamp); + send_disconnect = true; + } + + ++context->connection_attempts; + + aws_mqtt5_mock_server_send_packet(connection, AWS_MQTT5_PT_CONNACK, &connack_view); + + if (send_disconnect) { + struct aws_mqtt5_packet_disconnect_view disconnect = { + .reason_code = AWS_MQTT5_DRC_SERVER_SHUTTING_DOWN, + }; + + aws_mqtt5_mock_server_send_packet(connection, AWS_MQTT5_PT_DISCONNECT, &disconnect); + } + + return AWS_OP_SUCCESS; +} + +/* + * Establishes a successful connection then drops it followed by a perma-failure loop, verify we receive + * the new connection failure callbacks. + */ +static int s_mqtt3to5_adapter_connect_reconnect_failures_fn(struct aws_allocator *allocator, void *ctx) { + (void)ctx; + + aws_mqtt_library_init(allocator); + + struct aws_mqtt5_mock_server_reconnect_state mock_server_state = { + .required_connection_count_threshold = 1, + }; + + 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_CONNECT] = + aws_mqtt5_mock_server_handle_connect_fail_on_or_after_nth; + + 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, + .mock_server_user_data = &mock_server_state, + }; + + struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); + + struct aws_mqtt_client_connection *adapter = 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_mqtt3_to_mqtt5_adapter_test_fixture_record_connection_complete; + connection_options.user_data = &fixture; + + aws_mqtt_client_connection_connect(adapter, &connection_options); + + s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CONNECTION_COMPLETE, 1); + s_wait_for_n_adapter_lifecycle_events(&fixture, AWS_MQTT3_LET_CONNECTION_FAILURE, 3); + + aws_mqtt_client_connection_disconnect(adapter, NULL, NULL); + + struct aws_mqtt3_lifecycle_event expected_events[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, + { + .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, + }, + { + .type = AWS_MQTT3_LET_INTERRUPTED, + .error_code = AWS_ERROR_MQTT5_DISCONNECT_RECEIVED, + }, + { + .type = AWS_MQTT3_LET_CONNECTION_FAILURE, + .error_code = AWS_ERROR_MQTT5_CONNACK_CONNECTION_REFUSED, + }, + { + .type = AWS_MQTT3_LET_CONNECTION_FAILURE, + .error_code = AWS_ERROR_MQTT5_CONNACK_CONNECTION_REFUSED, + }, + { + .type = AWS_MQTT3_LET_CONNECTION_FAILURE, + .error_code = AWS_ERROR_MQTT5_CONNACK_CONNECTION_REFUSED, + }, + }; + ASSERT_SUCCESS(s_aws_mqtt3_to_mqtt5_adapter_test_fixture_verify_lifecycle_sequence_starts_with( + &fixture, AWS_ARRAY_SIZE(expected_events), expected_events)); + + aws_mqtt3_to_mqtt5_adapter_test_fixture_clean_up(&fixture); + aws_mqtt_library_clean_up(); + + return AWS_OP_SUCCESS; +} + +AWS_TEST_CASE(mqtt3to5_adapter_connect_reconnect_failures, s_mqtt3to5_adapter_connect_reconnect_failures_fn) + /* * Connect successfully then disconnect followed by a connect with no intervening wait. Verifies simple reliable * action and event sequencing. @@ -1498,7 +1690,7 @@ static int s_mqtt3to5_adapter_connect_success_disconnect_connect_fn(struct aws_a }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -1526,6 +1718,9 @@ static int s_mqtt3to5_adapter_connect_success_disconnect_connect_fn(struct aws_a */ struct aws_mqtt3_lifecycle_event expected_sequence_beginning[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, }, @@ -1538,6 +1733,9 @@ static int s_mqtt3to5_adapter_connect_success_disconnect_connect_fn(struct aws_a &fixture, AWS_ARRAY_SIZE(expected_sequence_beginning), expected_sequence_beginning)); struct aws_mqtt3_lifecycle_event expected_sequence_ending[] = { + { + .type = AWS_MQTT3_LET_CONNECTION_SUCCESS, + }, { .type = AWS_MQTT3_LET_CONNECTION_COMPLETE, }, @@ -1576,7 +1774,7 @@ static int s_mqtt3to5_adapter_connect_success_stop_mqtt5_disconnect_success_fn( }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -1626,7 +1824,7 @@ static int s_mqtt3to5_adapter_disconnect_success_fn(struct aws_allocator *alloca }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -1672,7 +1870,7 @@ static int s_mqtt3to5_adapter_connect_success_disconnect_success_disconnect_succ }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *adapter = fixture.connection; @@ -1729,7 +1927,7 @@ static int s_mqtt3to5_adapter_operation_allocation_simple_fn(struct aws_allocato }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; struct aws_mqtt_client_connection_5_impl *adapter = connection->impl; @@ -1773,7 +1971,7 @@ static int s_mqtt3to5_adapter_operation_allocation_wraparound_fn(struct aws_allo }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; struct aws_mqtt_client_connection_5_impl *adapter = connection->impl; @@ -1824,7 +2022,7 @@ static int s_mqtt3to5_adapter_operation_allocation_exhaustion_fn(struct aws_allo }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; struct aws_mqtt_client_connection_5_impl *adapter = connection->impl; @@ -1924,7 +2122,7 @@ static int s_mqtt3to5_adapter_publish_failure_invalid_fn(struct aws_allocator *a }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -1985,7 +2183,7 @@ static int s_mqtt3to5_adapter_publish_failure_offline_queue_policy_fn(struct aws }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2048,7 +2246,7 @@ static int s_mqtt3to5_adapter_publish_success_qos0_fn(struct aws_allocator *allo }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2107,7 +2305,7 @@ static int s_mqtt3to5_adapter_publish_success_qos1_fn(struct aws_allocator *allo }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2166,7 +2364,7 @@ static int s_mqtt3to5_adapter_publish_no_ack_fn(struct aws_allocator *allocator, }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2226,7 +2424,7 @@ static int s_mqtt3to5_adapter_publish_interrupted_fn(struct aws_allocator *alloc }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2409,7 +2607,7 @@ static int s_mqtt3to5_adapter_subscribe_single_success_fn(struct aws_allocator * }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2535,7 +2733,7 @@ static int s_mqtt3to5_adapter_subscribe_multi_success_fn(struct aws_allocator *a }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2638,7 +2836,7 @@ static int s_mqtt3to5_adapter_subscribe_single_failure_fn(struct aws_allocator * }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2711,7 +2909,7 @@ static int s_mqtt3to5_adapter_subscribe_single_invalid_fn(struct aws_allocator * }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2764,7 +2962,7 @@ static int s_mqtt3to5_adapter_subscribe_multi_failure_fn(struct aws_allocator *a }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2842,7 +3040,7 @@ static int s_mqtt3to5_adapter_subscribe_multi_invalid_fn(struct aws_allocator *a }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -2906,7 +3104,7 @@ static int s_mqtt3to5_adapter_subscribe_single_publish_fn(struct aws_allocator * }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -3003,7 +3201,7 @@ static int s_mqtt3to5_adapter_subscribe_multi_overlapping_publish_fn(struct aws_ }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -3168,7 +3366,7 @@ static int s_mqtt3to5_adapter_unsubscribe_success_fn(struct aws_allocator *alloc }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -3324,7 +3522,7 @@ static int s_mqtt3to5_adapter_unsubscribe_failure_fn(struct aws_allocator *alloc }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -3379,7 +3577,7 @@ static int s_mqtt3to5_adapter_unsubscribe_invalid_fn(struct aws_allocator *alloc }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -3429,7 +3627,7 @@ static int s_mqtt3to5_adapter_unsubscribe_overlapped_fn(struct aws_allocator *al }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -3601,7 +3799,7 @@ static int s_mqtt3to5_adapter_get_stats_fn(struct aws_allocator *allocator, void }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -3686,7 +3884,7 @@ static int s_mqtt3to5_adapter_resubscribe_nothing_fn(struct aws_allocator *alloc }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; @@ -3745,7 +3943,7 @@ static int s_mqtt3to5_adapter_resubscribe_something_fn(struct aws_allocator *all }; struct aws_mqtt3_to_mqtt5_adapter_test_fixture fixture; - ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options, NULL)); + ASSERT_SUCCESS(aws_mqtt3_to_mqtt5_adapter_test_fixture_init(&fixture, allocator, &test_fixture_options)); struct aws_mqtt_client_connection *connection = fixture.connection; diff --git a/tests/v5/mqtt5_client_tests.c b/tests/v5/mqtt5_client_tests.c index 27e5b5ce..78d9c935 100644 --- a/tests/v5/mqtt5_client_tests.c +++ b/tests/v5/mqtt5_client_tests.c @@ -1520,7 +1520,7 @@ int aws_mqtt5_mock_server_handle_connect_succeed_on_nth( struct aws_mqtt5_packet_connack_view connack_view; AWS_ZERO_STRUCT(connack_view); - if (context->connection_attempts == context->required_connection_failure_count) { + if (context->connection_attempts == context->required_connection_count_threshold) { connack_view.reason_code = AWS_MQTT5_CRC_SUCCESS; aws_high_res_clock_get_ticks(&context->connect_timestamp); } else { @@ -1616,7 +1616,7 @@ static int s_mqtt5_client_reconnect_backoff_insufficient_reset_fn(struct aws_all aws_mqtt5_client_test_init_default_options(&test_options); struct aws_mqtt5_mock_server_reconnect_state mock_server_state = { - .required_connection_failure_count = 6, + .required_connection_count_threshold = 6, /* quick disconnect should not reset reconnect delay */ .successful_connection_disconnect_delay_ms = RECONNECT_TEST_BACKOFF_RESET_DELAY / 5, }; @@ -1736,7 +1736,7 @@ static int s_mqtt5_client_reconnect_backoff_sufficient_reset_fn(struct aws_alloc aws_mqtt5_client_test_init_default_options(&test_options); struct aws_mqtt5_mock_server_reconnect_state mock_server_state = { - .required_connection_failure_count = 6, + .required_connection_count_threshold = 6, /* slow disconnect should reset reconnect delay */ .successful_connection_disconnect_delay_ms = RECONNECT_TEST_BACKOFF_RESET_DELAY * 2, }; diff --git a/tests/v5/mqtt5_testing_utils.h b/tests/v5/mqtt5_testing_utils.h index 36daea90..e4fa6de8 100644 --- a/tests/v5/mqtt5_testing_utils.h +++ b/tests/v5/mqtt5_testing_utils.h @@ -129,7 +129,7 @@ struct mqtt5_client_test_options { }; struct aws_mqtt5_mock_server_reconnect_state { - size_t required_connection_failure_count; + size_t required_connection_count_threshold; size_t connection_attempts; uint64_t connect_timestamp;