@@ -335,6 +335,30 @@ static ssize_t z_impl_zsock_recvfrom_custom_fake_echo_next_req(int sock, void *b
335335 return sizeof (ack_data );
336336}
337337
338+ static ssize_t z_impl_zsock_recvfrom_custom_fake_duplicate_response (int sock , void * buf ,
339+ size_t max_len , int flags ,
340+ struct sockaddr * src_addr ,
341+ socklen_t * addrlen )
342+ {
343+ uint8_t token [TOKEN_OFFSET + COAP_TOKEN_MAX_LEN ];
344+
345+ uint16_t last_message_id = get_next_pending_message_id ();
346+
347+ restore_token (token );
348+
349+ set_next_pending_message_id (last_message_id );
350+ set_next_pending_message_id (last_message_id );
351+ store_token (token );
352+ store_token (token );
353+
354+ int ret = z_impl_zsock_recvfrom_custom_fake (sock , buf , max_len , flags , src_addr , addrlen );
355+
356+ set_socket_events (sock , ZSOCK_POLLIN );
357+ z_impl_zsock_recvfrom_fake .custom_fake = z_impl_zsock_recvfrom_custom_fake ;
358+
359+ return ret ;
360+ }
361+
338362extern void net_coap_init (void );
339363
340364static void * suite_setup (void )
@@ -829,3 +853,34 @@ ZTEST(coap_client, test_poll_err_after_response)
829853 set_socket_events (client .fd , ZSOCK_POLLERR );
830854 zassert_not_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
831855}
856+
857+ ZTEST (coap_client , test_duplicate_response )
858+ {
859+ int ret = 0 ;
860+ struct k_sem sem ;
861+ struct sockaddr address = {0 };
862+ struct coap_client_request client_request = {
863+ .method = COAP_METHOD_GET ,
864+ .confirmable = true,
865+ .path = test_path ,
866+ .fmt = COAP_CONTENT_FORMAT_TEXT_PLAIN ,
867+ .cb = coap_callback ,
868+ .payload = short_payload ,
869+ .len = strlen (short_payload ),
870+ .user_data = & sem ,
871+ };
872+
873+ zassert_ok (k_sem_init (& sem , 0 , 2 ));
874+ z_impl_zsock_recvfrom_fake .custom_fake =
875+ z_impl_zsock_recvfrom_custom_fake_duplicate_response ;
876+
877+ k_sleep (K_MSEC (1 ));
878+ LOG_INF ("Send request" );
879+ ret = coap_client_req (& client , 0 , & address , & client_request , NULL );
880+ zassert_true (ret >= 0 , "Sending request failed, %d" , ret );
881+
882+ zassert_ok (k_sem_take (& sem , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
883+ zassert_equal (last_response_code , COAP_RESPONSE_CODE_OK , "Unexpected response" );
884+
885+ zassert_equal (k_sem_take (& sem , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )), - EAGAIN , "" );
886+ }
0 commit comments