Skip to content

Commit ba94169

Browse files
authored
Merge pull request #674 from redboltz/add_wc_test
Added wildcard tests.
2 parents 873b2af + 7004bf2 commit ba94169

File tree

1 file changed

+359
-0
lines changed

1 file changed

+359
-0
lines changed

test/pubsub.cpp

+359
Original file line numberDiff line numberDiff line change
@@ -3035,4 +3035,363 @@ BOOST_AUTO_TEST_CASE( pubrec_rel_comp_prop ) {
30353035
do_combi_test_sync(test);
30363036
}
30373037

3038+
BOOST_AUTO_TEST_CASE( pub_sub_wc_plus ) {
3039+
auto test = [](boost::asio::io_context& ioc, auto& c, auto finish, auto& /*b*/) {
3040+
using packet_id_t = typename std::remove_reference_t<decltype(*c)>::packet_id_t;
3041+
c->set_client_id("cid1");
3042+
c->set_clean_session(true);
3043+
3044+
packet_id_t pid_sub;
3045+
packet_id_t pid_unsub;
3046+
3047+
checker chk = {
3048+
// connect
3049+
cont("h_connack"),
3050+
// subscribe topic1 QoS0
3051+
cont("h_suback"),
3052+
// publish topic1 QoS0
3053+
cont("h_publish"),
3054+
cont("h_unsuback"),
3055+
// disconnect
3056+
cont("h_close"),
3057+
};
3058+
3059+
switch (c->get_protocol_version()) {
3060+
case MQTT_NS::protocol_version::v3_1_1:
3061+
c->set_connack_handler(
3062+
[&chk, &c, &pid_sub]
3063+
(bool sp, MQTT_NS::connect_return_code connack_return_code) {
3064+
MQTT_CHK("h_connack");
3065+
BOOST_TEST(sp == false);
3066+
BOOST_TEST(connack_return_code == MQTT_NS::connect_return_code::accepted);
3067+
pid_sub = c->subscribe("a/+/b", MQTT_NS::qos::at_most_once);
3068+
return true;
3069+
});
3070+
c->set_puback_handler(
3071+
[]
3072+
(packet_id_t) {
3073+
BOOST_CHECK(false);
3074+
return true;
3075+
});
3076+
c->set_pubrec_handler(
3077+
[]
3078+
(packet_id_t) {
3079+
BOOST_CHECK(false);
3080+
return true;
3081+
});
3082+
c->set_pubcomp_handler(
3083+
[]
3084+
(packet_id_t) {
3085+
BOOST_CHECK(false);
3086+
return true;
3087+
});
3088+
c->set_suback_handler(
3089+
[&chk, &c, &pid_sub]
3090+
(packet_id_t packet_id, std::vector<MQTT_NS::suback_return_code> results) {
3091+
MQTT_CHK("h_suback");
3092+
BOOST_TEST(packet_id == pid_sub);
3093+
BOOST_TEST(results.size() == 1U);
3094+
BOOST_TEST(results[0] == MQTT_NS::suback_return_code::success_maximum_qos_0);
3095+
c->publish("a/topic1/b", "topic1_contents", MQTT_NS::qos::at_most_once);
3096+
return true;
3097+
});
3098+
c->set_unsuback_handler(
3099+
[&chk, &c, &pid_unsub]
3100+
(packet_id_t packet_id) {
3101+
MQTT_CHK("h_unsuback");
3102+
BOOST_TEST(packet_id == pid_unsub);
3103+
c->disconnect();
3104+
return true;
3105+
});
3106+
c->set_publish_handler(
3107+
[&chk, &c, &pid_unsub]
3108+
(MQTT_NS::optional<packet_id_t> packet_id,
3109+
MQTT_NS::publish_options pubopts,
3110+
MQTT_NS::buffer topic,
3111+
MQTT_NS::buffer contents) {
3112+
MQTT_CHK("h_publish");
3113+
BOOST_TEST(pubopts.get_dup() == MQTT_NS::dup::no);
3114+
BOOST_TEST(pubopts.get_qos() == MQTT_NS::qos::at_most_once);
3115+
BOOST_TEST(pubopts.get_retain() == MQTT_NS::retain::no);
3116+
BOOST_CHECK(!packet_id);
3117+
BOOST_TEST(topic == "a/topic1/b");
3118+
BOOST_TEST(contents == "topic1_contents");
3119+
pid_unsub = c->unsubscribe("a/+/b");
3120+
return true;
3121+
});
3122+
break;
3123+
case MQTT_NS::protocol_version::v5:
3124+
c->set_v5_connack_handler(
3125+
[&chk, &c, &pid_sub]
3126+
(bool sp, MQTT_NS::v5::connect_reason_code connack_return_code, MQTT_NS::v5::properties /*props*/) {
3127+
MQTT_CHK("h_connack");
3128+
BOOST_TEST(sp == false);
3129+
BOOST_TEST(connack_return_code == MQTT_NS::v5::connect_reason_code::success);
3130+
pid_sub = c->subscribe("a/+/b", MQTT_NS::qos::at_most_once);
3131+
return true;
3132+
});
3133+
c->set_v5_puback_handler(
3134+
[]
3135+
(packet_id_t, MQTT_NS::v5::puback_reason_code, MQTT_NS::v5::properties /*props*/) {
3136+
BOOST_CHECK(false);
3137+
return true;
3138+
});
3139+
c->set_v5_pubrec_handler(
3140+
[]
3141+
(packet_id_t, MQTT_NS::v5::pubrec_reason_code, MQTT_NS::v5::properties /*props*/) {
3142+
BOOST_CHECK(false);
3143+
return true;
3144+
});
3145+
c->set_v5_pubcomp_handler(
3146+
[]
3147+
(packet_id_t, MQTT_NS::v5::pubcomp_reason_code, MQTT_NS::v5::properties /*props*/) {
3148+
BOOST_CHECK(false);
3149+
return true;
3150+
});
3151+
c->set_v5_suback_handler(
3152+
[&chk, &c, &pid_sub]
3153+
(packet_id_t packet_id, std::vector<MQTT_NS::v5::suback_reason_code> reasons, MQTT_NS::v5::properties /*props*/) {
3154+
MQTT_CHK("h_suback");
3155+
BOOST_TEST(packet_id == pid_sub);
3156+
BOOST_TEST(reasons.size() == 1U);
3157+
BOOST_TEST(reasons[0] == MQTT_NS::v5::suback_reason_code::granted_qos_0);
3158+
c->publish("a/topic1/b", "topic1_contents", MQTT_NS::qos::at_most_once);
3159+
return true;
3160+
});
3161+
c->set_v5_unsuback_handler(
3162+
[&chk, &c, &pid_unsub]
3163+
(packet_id_t packet_id, std::vector<MQTT_NS::v5::unsuback_reason_code> reasons, MQTT_NS::v5::properties /*props*/) {
3164+
MQTT_CHK("h_unsuback");
3165+
BOOST_TEST(packet_id == pid_unsub);
3166+
BOOST_TEST(reasons.size() == 1U);
3167+
BOOST_TEST(reasons[0] == MQTT_NS::v5::unsuback_reason_code::success);
3168+
c->disconnect();
3169+
return true;
3170+
});
3171+
c->set_v5_publish_handler(
3172+
[&chk, &c, &pid_unsub]
3173+
(MQTT_NS::optional<packet_id_t> packet_id,
3174+
MQTT_NS::publish_options pubopts,
3175+
MQTT_NS::buffer topic,
3176+
MQTT_NS::buffer contents,
3177+
MQTT_NS::v5::properties /*props*/) {
3178+
MQTT_CHK("h_publish");
3179+
BOOST_TEST(pubopts.get_dup() == MQTT_NS::dup::no);
3180+
BOOST_TEST(pubopts.get_qos() == MQTT_NS::qos::at_most_once);
3181+
BOOST_TEST(pubopts.get_retain() == MQTT_NS::retain::no);
3182+
BOOST_CHECK(!packet_id);
3183+
BOOST_TEST(topic == "a/topic1/b");
3184+
BOOST_TEST(contents == "topic1_contents");
3185+
pid_unsub = c->unsubscribe("a/+/b");
3186+
return true;
3187+
});
3188+
break;
3189+
default:
3190+
BOOST_CHECK(false);
3191+
break;
3192+
}
3193+
3194+
c->set_close_handler(
3195+
[&chk, &finish]
3196+
() {
3197+
MQTT_CHK("h_close");
3198+
finish();
3199+
});
3200+
c->set_error_handler(
3201+
[]
3202+
(MQTT_NS::error_code) {
3203+
BOOST_CHECK(false);
3204+
});
3205+
c->set_pub_res_sent_handler(
3206+
[]
3207+
(packet_id_t) {
3208+
BOOST_CHECK(false);
3209+
});
3210+
c->connect();
3211+
ioc.run();
3212+
BOOST_TEST(chk.all());
3213+
};
3214+
do_combi_test_sync(test);
3215+
}
3216+
3217+
BOOST_AUTO_TEST_CASE( pub_sub_wc_sharp ) {
3218+
auto test = [](boost::asio::io_context& ioc, auto& c, auto finish, auto& /*b*/) {
3219+
using packet_id_t = typename std::remove_reference_t<decltype(*c)>::packet_id_t;
3220+
c->set_client_id("cid1");
3221+
c->set_clean_session(true);
3222+
3223+
packet_id_t pid_sub;
3224+
packet_id_t pid_unsub;
3225+
3226+
checker chk = {
3227+
// connect
3228+
cont("h_connack"),
3229+
// subscribe topic1 QoS0
3230+
cont("h_suback"),
3231+
// publish topic1 QoS0
3232+
cont("h_publish"),
3233+
cont("h_unsuback"),
3234+
// disconnect
3235+
cont("h_close"),
3236+
};
3237+
3238+
switch (c->get_protocol_version()) {
3239+
case MQTT_NS::protocol_version::v3_1_1:
3240+
c->set_connack_handler(
3241+
[&chk, &c, &pid_sub]
3242+
(bool sp, MQTT_NS::connect_return_code connack_return_code) {
3243+
MQTT_CHK("h_connack");
3244+
BOOST_TEST(sp == false);
3245+
BOOST_TEST(connack_return_code == MQTT_NS::connect_return_code::accepted);
3246+
pid_sub = c->subscribe("a/#", MQTT_NS::qos::at_most_once);
3247+
return true;
3248+
});
3249+
c->set_puback_handler(
3250+
[]
3251+
(packet_id_t) {
3252+
BOOST_CHECK(false);
3253+
return true;
3254+
});
3255+
c->set_pubrec_handler(
3256+
[]
3257+
(packet_id_t) {
3258+
BOOST_CHECK(false);
3259+
return true;
3260+
});
3261+
c->set_pubcomp_handler(
3262+
[]
3263+
(packet_id_t) {
3264+
BOOST_CHECK(false);
3265+
return true;
3266+
});
3267+
c->set_suback_handler(
3268+
[&chk, &c, &pid_sub]
3269+
(packet_id_t packet_id, std::vector<MQTT_NS::suback_return_code> results) {
3270+
MQTT_CHK("h_suback");
3271+
BOOST_TEST(packet_id == pid_sub);
3272+
BOOST_TEST(results.size() == 1U);
3273+
BOOST_TEST(results[0] == MQTT_NS::suback_return_code::success_maximum_qos_0);
3274+
c->publish("a/topic1/b", "topic1_contents", MQTT_NS::qos::at_most_once);
3275+
return true;
3276+
});
3277+
c->set_unsuback_handler(
3278+
[&chk, &c, &pid_unsub]
3279+
(packet_id_t packet_id) {
3280+
MQTT_CHK("h_unsuback");
3281+
BOOST_TEST(packet_id == pid_unsub);
3282+
c->disconnect();
3283+
return true;
3284+
});
3285+
c->set_publish_handler(
3286+
[&chk, &c, &pid_unsub]
3287+
(MQTT_NS::optional<packet_id_t> packet_id,
3288+
MQTT_NS::publish_options pubopts,
3289+
MQTT_NS::buffer topic,
3290+
MQTT_NS::buffer contents) {
3291+
MQTT_CHK("h_publish");
3292+
BOOST_TEST(pubopts.get_dup() == MQTT_NS::dup::no);
3293+
BOOST_TEST(pubopts.get_qos() == MQTT_NS::qos::at_most_once);
3294+
BOOST_TEST(pubopts.get_retain() == MQTT_NS::retain::no);
3295+
BOOST_CHECK(!packet_id);
3296+
BOOST_TEST(topic == "a/topic1/b");
3297+
BOOST_TEST(contents == "topic1_contents");
3298+
pid_unsub = c->unsubscribe("a/#");
3299+
return true;
3300+
});
3301+
break;
3302+
case MQTT_NS::protocol_version::v5:
3303+
c->set_v5_connack_handler(
3304+
[&chk, &c, &pid_sub]
3305+
(bool sp, MQTT_NS::v5::connect_reason_code connack_return_code, MQTT_NS::v5::properties /*props*/) {
3306+
MQTT_CHK("h_connack");
3307+
BOOST_TEST(sp == false);
3308+
BOOST_TEST(connack_return_code == MQTT_NS::v5::connect_reason_code::success);
3309+
pid_sub = c->subscribe("a/#", MQTT_NS::qos::at_most_once);
3310+
return true;
3311+
});
3312+
c->set_v5_puback_handler(
3313+
[]
3314+
(packet_id_t, MQTT_NS::v5::puback_reason_code, MQTT_NS::v5::properties /*props*/) {
3315+
BOOST_CHECK(false);
3316+
return true;
3317+
});
3318+
c->set_v5_pubrec_handler(
3319+
[]
3320+
(packet_id_t, MQTT_NS::v5::pubrec_reason_code, MQTT_NS::v5::properties /*props*/) {
3321+
BOOST_CHECK(false);
3322+
return true;
3323+
});
3324+
c->set_v5_pubcomp_handler(
3325+
[]
3326+
(packet_id_t, MQTT_NS::v5::pubcomp_reason_code, MQTT_NS::v5::properties /*props*/) {
3327+
BOOST_CHECK(false);
3328+
return true;
3329+
});
3330+
c->set_v5_suback_handler(
3331+
[&chk, &c, &pid_sub]
3332+
(packet_id_t packet_id, std::vector<MQTT_NS::v5::suback_reason_code> reasons, MQTT_NS::v5::properties /*props*/) {
3333+
MQTT_CHK("h_suback");
3334+
BOOST_TEST(packet_id == pid_sub);
3335+
BOOST_TEST(reasons.size() == 1U);
3336+
BOOST_TEST(reasons[0] == MQTT_NS::v5::suback_reason_code::granted_qos_0);
3337+
c->publish("a/topic1/b", "topic1_contents", MQTT_NS::qos::at_most_once);
3338+
return true;
3339+
});
3340+
c->set_v5_unsuback_handler(
3341+
[&chk, &c, &pid_unsub]
3342+
(packet_id_t packet_id, std::vector<MQTT_NS::v5::unsuback_reason_code> reasons, MQTT_NS::v5::properties /*props*/) {
3343+
MQTT_CHK("h_unsuback");
3344+
BOOST_TEST(packet_id == pid_unsub);
3345+
BOOST_TEST(reasons.size() == 1U);
3346+
BOOST_TEST(reasons[0] == MQTT_NS::v5::unsuback_reason_code::success);
3347+
c->disconnect();
3348+
return true;
3349+
});
3350+
c->set_v5_publish_handler(
3351+
[&chk, &c, &pid_unsub]
3352+
(MQTT_NS::optional<packet_id_t> packet_id,
3353+
MQTT_NS::publish_options pubopts,
3354+
MQTT_NS::buffer topic,
3355+
MQTT_NS::buffer contents,
3356+
MQTT_NS::v5::properties /*props*/) {
3357+
MQTT_CHK("h_publish");
3358+
BOOST_TEST(pubopts.get_dup() == MQTT_NS::dup::no);
3359+
BOOST_TEST(pubopts.get_qos() == MQTT_NS::qos::at_most_once);
3360+
BOOST_TEST(pubopts.get_retain() == MQTT_NS::retain::no);
3361+
BOOST_CHECK(!packet_id);
3362+
BOOST_TEST(topic == "a/topic1/b");
3363+
BOOST_TEST(contents == "topic1_contents");
3364+
pid_unsub = c->unsubscribe("a/#");
3365+
return true;
3366+
});
3367+
break;
3368+
default:
3369+
BOOST_CHECK(false);
3370+
break;
3371+
}
3372+
3373+
c->set_close_handler(
3374+
[&chk, &finish]
3375+
() {
3376+
MQTT_CHK("h_close");
3377+
finish();
3378+
});
3379+
c->set_error_handler(
3380+
[]
3381+
(MQTT_NS::error_code) {
3382+
BOOST_CHECK(false);
3383+
});
3384+
c->set_pub_res_sent_handler(
3385+
[]
3386+
(packet_id_t) {
3387+
BOOST_CHECK(false);
3388+
});
3389+
c->connect();
3390+
ioc.run();
3391+
BOOST_TEST(chk.all());
3392+
};
3393+
do_combi_test_sync(test);
3394+
}
3395+
3396+
30383397
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)