From a1249b433d74b3a67f86355e257611120a99fbd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Korina=20=C5=A0imi=C4=8Devi=C4=87?= Date: Thu, 29 Feb 2024 13:05:11 +0100 Subject: [PATCH] Reconnect on every Reason Code > 0x80 received in the CONNACK packet Summary: related to T13767 Reviewers: ivica Reviewed By: ivica Subscribers: miljen, iljazovic Differential Revision: https://repo.mireo.local/D28217 --- include/async_mqtt5/impl/connect_op.hpp | 19 +--------- test/integration/client_functions.cpp | 30 +++++++++++---- test/unit/connect_op.cpp | 50 ++++++++----------------- 3 files changed, 40 insertions(+), 59 deletions(-) diff --git a/include/async_mqtt5/impl/connect_op.hpp b/include/async_mqtt5/impl/connect_op.hpp index 50013a9..87ab072 100644 --- a/include/async_mqtt5/impl/connect_op.hpp +++ b/include/async_mqtt5/impl/connect_op.hpp @@ -327,9 +327,8 @@ public: if (!rc.has_value()) // reason code not allowed in CONNACK return complete(client::error::malformed_packet); - auto ec = to_asio_error(*rc); - if (ec) - return complete(ec); + if (*rc) + return complete(asio::error::try_again); if (_ctx.co_props[prop::authentication_method].has_value()) return _ctx.authenticator.async_auth( @@ -425,20 +424,6 @@ private: _cancellation_state.slot().clear(); std::move(_handler)(ec); } - - static error_code to_asio_error(reason_code rc) { - using namespace boost::asio::error; - using namespace reason_codes; - - if (rc == success) - return {}; - - if (rc == unspecified_error || rc == server_unavailable || - rc == server_busy || rc == connection_rate_exceeded) - return connection_refused; - - return access_denied; - } }; diff --git a/test/integration/client_functions.cpp b/test/integration/client_functions.cpp index b384af4..ca4f5ce 100644 --- a/test/integration/client_functions.cpp +++ b/test/integration/client_functions.cpp @@ -26,7 +26,7 @@ struct shared_test_data { error_code success {}; const std::string connack = encoders::encode_connack( - false, reason_codes::server_moved.value(), {} + false, reason_codes::success.value(), {} ); }; @@ -44,10 +44,16 @@ void run_test( client_type c(executor); client_fun(c); - c.brokers("127.0.0.1,127.0.0.1") // to avoid reconnect backoff + c.brokers("127.0.0.1") .async_run(asio::detached); - ioc.run_for(5s); + asio::steady_timer timer(executor); + timer.expires_after(700ms); + timer.async_wait( + [&c](error_code) { c.cancel(); } + ); + + ioc.run(); BOOST_TEST(broker.received_all_expected()); } @@ -291,7 +297,6 @@ struct shared_connack_prop_test_data { // data const uint8_t session_present = 1; - const uint8_t reason_code = reason_codes::server_moved.value(); const int32_t session_expiry_interval = 20; const int16_t receive_maximum = 2000; @@ -319,7 +324,7 @@ struct shared_connack_prop_test_data { "", std::nullopt, std::nullopt, 60, false, {}, std::nullopt ); const std::string connack = encoders::encode_connack( - false, reason_codes::server_moved.value(), cprops + false, reason_codes::success.value(), cprops ); private: @@ -357,11 +362,20 @@ void run_test_with_post_fun( ); client_type c(executor); - c.brokers("127.0.0.1,127.0.0.1") // to avoid reconnect backoff + c.brokers("127.0.0.1") .async_run(asio::detached); - ioc.run_for(5s); - client_fun(c); + asio::steady_timer timer(executor); + timer.expires_after(700ms); + timer.async_wait( + [&c, fun = std::forward(client_fun)](error_code) { + fun(c); + c.cancel(); + } + ); + + ioc.run(); + BOOST_TEST(broker.received_all_expected()); } diff --git a/test/unit/connect_op.cpp b/test/unit/connect_op.cpp index 299528f..f4347a7 100644 --- a/test/unit/connect_op.cpp +++ b/test/unit/connect_op.cpp @@ -81,31 +81,13 @@ BOOST_FIXTURE_TEST_CASE(successfully_connect, shared_test_data) { .reply_with(connack, after(4ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == success); + BOOST_TEST(ec == success); }; run_unit_test(std::move(broker_side), std::move(handler)); } -BOOST_FIXTURE_TEST_CASE(connection_refused, shared_test_data) { - auto refuse_connack = encoders::encode_connack( - true, reason_codes::server_unavailable.value(), {} - ); - - test::msg_exchange broker_side; - broker_side - .expect(connect) - .complete_with(success, after(2ms)) - .reply_with(refuse_connack, after(4ms)); - - auto handler = [&](error_code ec) { - BOOST_CHECK(ec == asio::error::connection_refused); - }; - - run_unit_test(std::move(broker_side), std::move(handler)); -} - -BOOST_FIXTURE_TEST_CASE(access_denied, shared_test_data) { +BOOST_FIXTURE_TEST_CASE(connack_with_fail_rc, shared_test_data) { auto denied_connack = encoders::encode_connack( true, reason_codes::bad_username_or_password.value(), {} ); @@ -117,7 +99,7 @@ BOOST_FIXTURE_TEST_CASE(access_denied, shared_test_data) { .reply_with(denied_connack, after(4ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == asio::error::access_denied); + BOOST_TEST(ec == asio::error::try_again); }; run_unit_test(std::move(broker_side), std::move(handler)); @@ -147,7 +129,7 @@ BOOST_FIXTURE_TEST_CASE(receive_wrong_packet, shared_test_data) { .reply_with(unexpected_packet, after(3ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == asio::error::try_again); + BOOST_TEST(ec == asio::error::try_again); }; run_unit_test(std::move(broker_side), std::move(handler)); @@ -164,7 +146,7 @@ BOOST_FIXTURE_TEST_CASE(malformed_connack_varlen, shared_test_data) { .reply_with(malformed_connack, after(3ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == asio::error::try_again); + BOOST_TEST(ec == asio::error::try_again); }; run_unit_test(std::move(broker_side), std::move(handler)); @@ -181,7 +163,7 @@ BOOST_FIXTURE_TEST_CASE(malformed_connack_rc, shared_test_data) { .reply_with(malformed_connack, after(3ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == client::error::malformed_packet); + BOOST_TEST(ec == client::error::malformed_packet); }; run_unit_test(std::move(broker_side), std::move(handler)); @@ -204,7 +186,7 @@ BOOST_FIXTURE_TEST_CASE(fail_reading_connack_payload, shared_test_data) { .send(fail, after(7ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == fail); + BOOST_TEST(ec == fail); }; run_unit_test(std::move(broker_side), std::move(handler)); @@ -224,7 +206,7 @@ BOOST_FIXTURE_TEST_CASE(receive_unexpected_auth, shared_test_data) { .send(auth, after(5ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == client::error::malformed_packet); + BOOST_TEST(ec == client::error::malformed_packet); }; run_unit_test(std::move(broker_side), std::move(handler)); @@ -276,7 +258,7 @@ BOOST_FIXTURE_TEST_CASE(successful_auth, shared_test_auth_data) { .reply_with(connack, after(4ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == success); + BOOST_TEST(ec == success); }; detail::mqtt_ctx mqtt_ctx; @@ -299,7 +281,7 @@ BOOST_FIXTURE_TEST_CASE(successful_auth_multi_step, shared_test_auth_data) { .reply_with(connack, after(4ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == success); + BOOST_TEST(ec == success); }; detail::mqtt_ctx mqtt_ctx; @@ -320,7 +302,7 @@ BOOST_FIXTURE_TEST_CASE(malformed_auth_rc, shared_test_auth_data) { .reply_with(malformed_auth_challenge, after(3ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == client::error::malformed_packet); + BOOST_TEST(ec == client::error::malformed_packet); }; detail::mqtt_ctx mqtt_ctx; @@ -344,7 +326,7 @@ BOOST_FIXTURE_TEST_CASE(mismatched_auth_method, shared_test_auth_data) { .reply_with(mismatched_auth_challenge, after(3ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == client::error::malformed_packet); + BOOST_TEST(ec == client::error::malformed_packet); }; detail::mqtt_ctx mqtt_ctx; @@ -363,7 +345,7 @@ BOOST_FIXTURE_TEST_CASE(fail_to_send_auth, shared_test_auth_data) { .complete_with(fail, after(2ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == fail); + BOOST_TEST(ec == fail); }; detail::mqtt_ctx mqtt_ctx; @@ -376,7 +358,7 @@ BOOST_FIXTURE_TEST_CASE(auth_step_client_initial_fail, shared_test_auth_data) { test::msg_exchange broker_side; auto handler = [&](error_code ec) { - BOOST_CHECK(ec == asio::error::try_again); + BOOST_TEST(ec == asio::error::try_again); }; detail::mqtt_ctx mqtt_ctx; @@ -393,7 +375,7 @@ BOOST_FIXTURE_TEST_CASE(auth_step_server_challenge_fail, shared_test_auth_data) .reply_with(auth_challenge, after(3ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == asio::error::try_again); + BOOST_TEST(ec == asio::error::try_again); }; detail::mqtt_ctx mqtt_ctx; @@ -413,7 +395,7 @@ BOOST_FIXTURE_TEST_CASE(auth_step_server_final_fail, shared_test_auth_data) { .reply_with(connack, after(4ms)); auto handler = [&](error_code ec) { - BOOST_CHECK(ec == asio::error::try_again); + BOOST_TEST(ec == asio::error::try_again); }; detail::mqtt_ctx mqtt_ctx;