@@ -3035,4 +3035,363 @@ BOOST_AUTO_TEST_CASE( pubrec_rel_comp_prop ) {
3035
3035
do_combi_test_sync (test);
3036
3036
}
3037
3037
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
+
3038
3397
BOOST_AUTO_TEST_SUITE_END ()
0 commit comments