diff --git a/test/sub.cpp b/test/sub.cpp index 304bd0b03..8ee3e2d3d 100644 --- a/test/sub.cpp +++ b/test/sub.cpp @@ -105,6 +105,102 @@ BOOST_AUTO_TEST_CASE( pub_qos0_sub_string_single ) { do_combi_test_sync(test); } +BOOST_AUTO_TEST_CASE( sub_v5_options ) { + auto test = [](boost::asio::io_service& ios, auto& c, auto& s, auto& /*b*/) { + using packet_id_t = typename std::remove_reference_t::packet_id_t; + c->set_clean_session(true); + + + checker chk = { + // connect + cont("h_connack"), + // subscribe topic1 + cont("h_suback"), + // unsubscribe topic1 + cont("h_unsuback"), + // disconnect + cont("h_close"), + }; + + switch (c->get_protocol_version()) { + case MQTT_NS::protocol_version::v3_1_1: + c->set_connack_handler( + [&chk, &c] + (bool sp, std::uint8_t connack_return_code) { + MQTT_CHK("h_connack"); + BOOST_TEST(sp == false); + BOOST_TEST(connack_return_code == MQTT_NS::connect_return_code::accepted); + c->subscribe("topic1", MQTT_NS::qos::at_most_once); + return true; + }); + c->set_suback_handler( + [&chk, &c] + (packet_id_t /*packet_id*/, std::vector> /*results*/) { + MQTT_CHK("h_suback"); + c->unsubscribe("topic1"); + return true; + }); + c->set_unsuback_handler( + [&chk, &c] + (packet_id_t /*packet_id*/) { + MQTT_CHK("h_unsuback"); + c->disconnect(); + return true; + }); + break; + case MQTT_NS::protocol_version::v5: + c->set_v5_connack_handler( + [&chk, &c] + (bool sp, std::uint8_t connack_return_code, std::vector /*props*/) { + MQTT_CHK("h_connack"); + BOOST_TEST(sp == false); + BOOST_TEST(connack_return_code == MQTT_NS::connect_return_code::accepted); + std::uint8_t option = 0; + MQTT_NS::subscribe::set_qos(option, MQTT_NS::qos::at_most_once); + MQTT_NS::subscribe::set_no_local(option, true); + MQTT_NS::subscribe::set_retain_as_published(option, true); + MQTT_NS::subscribe::set_retain_handling(option, 2); + c->subscribe("topic1", MQTT_NS::qos::at_most_once); + return true; + }); + c->set_v5_suback_handler( + [&chk, &c] + (packet_id_t /*packet_id*/, std::vector /*reasons*/, std::vector /*props*/) { + MQTT_CHK("h_suback"); + c->unsubscribe("topic1"); + return true; + }); + c->set_v5_unsuback_handler( + [&chk, &c] + (packet_id_t /*packet_id*/, std::vector /*reasons*/, std::vector /*props*/) { + MQTT_CHK("h_unsuback"); + c->disconnect(); + return true; + }); + break; + default: + BOOST_CHECK(false); + break; + } + + c->set_close_handler( + [&chk, &s] + () { + MQTT_CHK("h_close"); + s.close(); + }); + c->set_error_handler( + [] + (boost::system::error_code const&) { + BOOST_CHECK(false); + }); + c->connect(); + ios.run(); + BOOST_TEST(chk.all()); + }; + do_combi_test_sync(test); +} + BOOST_AUTO_TEST_CASE( pub_qos0_sub_string_multi_arg ) { auto test = [](boost::asio::io_service& ios, auto& c, auto& s, auto& /*b*/) { using packet_id_t = typename std::remove_reference_t::packet_id_t;