@@ -1142,3 +1142,111 @@ ZTEST(coap_client, test_request_rst)
11421142 zassert_ok (k_sem_take (& sem , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
11431143 zassert_equal (last_response_code , - ECONNRESET , "" );
11441144}
1145+
1146+ ZTEST (coap_client , test_cancel )
1147+ {
1148+ struct k_sem sem1 , sem2 ;
1149+ struct sockaddr address = {0 };
1150+ struct coap_client_request req1 = {
1151+ .method = COAP_METHOD_GET ,
1152+ .confirmable = true,
1153+ .path = test_path ,
1154+ .fmt = COAP_CONTENT_FORMAT_TEXT_PLAIN ,
1155+ .cb = coap_callback ,
1156+ .payload = short_payload ,
1157+ .len = strlen (short_payload ),
1158+ .user_data = & sem1
1159+ };
1160+ struct coap_client_request req2 = req1 ;
1161+
1162+ req2 .user_data = & sem2 ;
1163+
1164+ k_sem_init (& sem1 , 0 , 1 );
1165+ k_sem_init (& sem2 , 0 , 1 );
1166+
1167+ z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake_no_reply ;
1168+
1169+ k_sleep (K_MSEC (1 ));
1170+
1171+ zassert_ok (coap_client_req (& client , 0 , & address , & req1 , NULL ));
1172+ zassert_ok (coap_client_req (& client , 0 , & address , & req2 , NULL ));
1173+
1174+ k_sleep (K_SECONDS (1 ));
1175+
1176+ coap_client_cancel_request (& client , & req1 );
1177+ zassert_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1178+ zassert_not_ok (k_sem_take (& sem2 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1179+ zassert_equal (last_response_code , - ECANCELED , "" );
1180+
1181+ set_socket_events (client .fd , ZSOCK_POLLIN ); /* First response is the cancelled one */
1182+ zassert_not_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1183+ set_socket_events (client .fd , ZSOCK_POLLIN );
1184+ zassert_ok (k_sem_take (& sem2 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1185+ zassert_equal (last_response_code , COAP_RESPONSE_CODE_OK , "" );
1186+ }
1187+
1188+ ZTEST (coap_client , test_cancel_match )
1189+ {
1190+ struct k_sem sem1 , sem2 ;
1191+ struct sockaddr address = {0 };
1192+ struct coap_client_request req1 = {
1193+ .method = COAP_METHOD_GET ,
1194+ .confirmable = true,
1195+ .path = test_path ,
1196+ .fmt = COAP_CONTENT_FORMAT_TEXT_PLAIN ,
1197+ .cb = coap_callback ,
1198+ .payload = short_payload ,
1199+ .len = strlen (short_payload ),
1200+ .user_data = & sem1
1201+ };
1202+ struct coap_client_request req2 = req1 ;
1203+
1204+ req2 .user_data = & sem2 ;
1205+ req2 .path = "another" ;
1206+
1207+ k_sem_init (& sem1 , 0 , 1 );
1208+ k_sem_init (& sem2 , 0 , 1 );
1209+
1210+ z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake_no_reply ;
1211+
1212+ k_sleep (K_MSEC (1 ));
1213+
1214+ zassert_ok (coap_client_req (& client , 0 , & address , & req1 , NULL ));
1215+ zassert_ok (coap_client_req (& client , 0 , & address , & req2 , NULL ));
1216+
1217+ k_sleep (K_SECONDS (1 ));
1218+
1219+ /* match only one */
1220+ coap_client_cancel_request (& client , & (struct coap_client_request ) {
1221+ .path = test_path
1222+ });
1223+ zassert_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1224+ zassert_not_ok (k_sem_take (& sem2 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1225+ zassert_equal (last_response_code , - ECANCELED , "" );
1226+
1227+ zassert_ok (coap_client_req (& client , 0 , & address , & req1 , NULL ));
1228+
1229+ /* should not match */
1230+ coap_client_cancel_request (& client , & (struct coap_client_request ) {
1231+ .path = test_path ,
1232+ .user_data = & sem2 ,
1233+ });
1234+ zassert_not_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1235+ zassert_not_ok (k_sem_take (& sem2 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1236+
1237+ /* match both (all GET queries) */
1238+ coap_client_cancel_request (& client , & (struct coap_client_request ) {
1239+ .method = COAP_METHOD_GET ,
1240+ });
1241+ zassert_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1242+ zassert_ok (k_sem_take (& sem2 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1243+
1244+ zassert_ok (coap_client_req (& client , 0 , & address , & req1 , NULL ));
1245+ zassert_ok (coap_client_req (& client , 0 , & address , & req2 , NULL ));
1246+
1247+ /* match both (wildcard)*/
1248+ coap_client_cancel_request (& client , & (struct coap_client_request ) {0 });
1249+ zassert_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1250+ zassert_ok (k_sem_take (& sem2 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1251+
1252+ }
0 commit comments