@@ -390,6 +390,18 @@ static ssize_t z_impl_zsock_recvfrom_custom_fake_duplicate_response(int sock, vo
390390 return ret ;
391391}
392392
393+ static ssize_t z_impl_zsock_recvfrom_custom_fake_observe (int sock , void * buf , size_t max_len ,
394+ int flags , struct sockaddr * src_addr ,
395+ socklen_t * addrlen )
396+ {
397+ int ret = z_impl_zsock_recvfrom_custom_fake_duplicate_response (sock , buf , max_len , flags ,
398+ src_addr , addrlen );
399+
400+ set_next_pending_message_id (get_next_pending_message_id () + 1 );
401+ z_impl_zsock_recvfrom_fake .custom_fake = z_impl_zsock_recvfrom_custom_fake_observe ;
402+ return ret ;
403+ }
404+
393405extern void net_coap_init (void );
394406
395407static void * suite_setup (void )
@@ -1046,3 +1058,43 @@ ZTEST(coap_client, test_duplicate_response)
10461058
10471059 zassert_equal (k_sem_take (& sem , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )), - EAGAIN , "" );
10481060}
1061+
1062+ ZTEST (coap_client , test_observe )
1063+ {
1064+ struct k_sem sem ;
1065+ struct sockaddr address = {0 };
1066+ struct coap_client_option options = {
1067+ .code = COAP_OPTION_OBSERVE ,
1068+ .value [0 ] = 0 ,
1069+ .len = 1 ,
1070+ };
1071+ struct coap_client_request client_request = {
1072+ .method = COAP_METHOD_GET ,
1073+ .confirmable = true,
1074+ .path = test_path ,
1075+ .fmt = COAP_CONTENT_FORMAT_TEXT_PLAIN ,
1076+ .cb = coap_callback ,
1077+ .payload = short_payload ,
1078+ .len = strlen (short_payload ),
1079+ .options = & options ,
1080+ .num_options = 1 ,
1081+ .user_data = & sem ,
1082+ };
1083+
1084+ zassert_ok (k_sem_init (& sem , 0 , 1 ));
1085+ z_impl_zsock_recvfrom_fake .custom_fake = z_impl_zsock_recvfrom_custom_fake_observe ;
1086+
1087+ k_sleep (K_MSEC (1 ));
1088+
1089+ zassert_ok (coap_client_req (& client , 0 , & address , & client_request , NULL ));
1090+
1091+ zassert_ok (k_sem_take (& sem , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1092+ zassert_ok (k_sem_take (& sem , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1093+ zassert_ok (k_sem_take (& sem , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1094+
1095+ coap_client_cancel_requests (& client );
1096+ zassert_ok (k_sem_take (& sem , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1097+ zassert_equal (last_response_code , - ECANCELED , "" );
1098+
1099+ zassert_not_ok (k_sem_take (& sem , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
1100+ }
0 commit comments