From 83bc1fcb46b6c32d324c9c4d0fa697b51dfb5a0e Mon Sep 17 00:00:00 2001 From: Seppo Takalo Date: Mon, 11 Nov 2024 14:36:46 +0200 Subject: [PATCH] tests: coap_client: Add test for duplicate response Add test where we receive same UDP packet twice. Signed-off-by: Seppo Takalo --- tests/net/lib/coap_client/CMakeLists.txt | 2 +- tests/net/lib/coap_client/src/main.c | 55 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/tests/net/lib/coap_client/CMakeLists.txt b/tests/net/lib/coap_client/CMakeLists.txt index f8d21563b57..6e3b6353e08 100644 --- a/tests/net/lib/coap_client/CMakeLists.txt +++ b/tests/net/lib/coap_client/CMakeLists.txt @@ -26,7 +26,7 @@ add_compile_definitions(CONFIG_COAP_CLIENT_MESSAGE_HEADER_SIZE=48) add_compile_definitions(CONFIG_COAP_CLIENT_STACK_SIZE=1024) add_compile_definitions(CONFIG_COAP_CLIENT_THREAD_PRIORITY=10) add_compile_definitions(CONFIG_COAP_LOG_LEVEL=4) -add_compile_definitions(CONFIG_COAP_INIT_ACK_TIMEOUT_MS=10) +add_compile_definitions(CONFIG_COAP_INIT_ACK_TIMEOUT_MS=100) add_compile_definitions(CONFIG_COAP_CLIENT_MAX_REQUESTS=2) add_compile_definitions(CONFIG_COAP_CLIENT_MAX_INSTANCES=2) add_compile_definitions(CONFIG_COAP_MAX_RETRANSMIT=4) diff --git a/tests/net/lib/coap_client/src/main.c b/tests/net/lib/coap_client/src/main.c index e066f86bae6..d03160ca53f 100644 --- a/tests/net/lib/coap_client/src/main.c +++ b/tests/net/lib/coap_client/src/main.c @@ -335,6 +335,30 @@ static ssize_t z_impl_zsock_recvfrom_custom_fake_echo_next_req(int sock, void *b return sizeof(ack_data); } +static ssize_t z_impl_zsock_recvfrom_custom_fake_duplicate_response(int sock, void *buf, + size_t max_len, int flags, + struct sockaddr *src_addr, + socklen_t *addrlen) +{ + uint8_t token[TOKEN_OFFSET + COAP_TOKEN_MAX_LEN]; + + uint16_t last_message_id = get_next_pending_message_id(); + + restore_token(token); + + set_next_pending_message_id(last_message_id); + set_next_pending_message_id(last_message_id); + store_token(token); + store_token(token); + + int ret = z_impl_zsock_recvfrom_custom_fake(sock, buf, max_len, flags, src_addr, addrlen); + + set_socket_events(sock, ZSOCK_POLLIN); + z_impl_zsock_recvfrom_fake.custom_fake = z_impl_zsock_recvfrom_custom_fake; + + return ret; +} + extern void net_coap_init(void); static void *suite_setup(void) @@ -829,3 +853,34 @@ ZTEST(coap_client, test_poll_err_after_response) set_socket_events(client.fd, ZSOCK_POLLERR); zassert_not_ok(k_sem_take(&sem1, K_MSEC(MORE_THAN_EXCHANGE_LIFETIME_MS))); } + +ZTEST(coap_client, test_duplicate_response) +{ + int ret = 0; + struct k_sem sem; + struct sockaddr address = {0}; + struct coap_client_request client_request = { + .method = COAP_METHOD_GET, + .confirmable = true, + .path = test_path, + .fmt = COAP_CONTENT_FORMAT_TEXT_PLAIN, + .cb = coap_callback, + .payload = short_payload, + .len = strlen(short_payload), + .user_data = &sem, + }; + + zassert_ok(k_sem_init(&sem, 0, 2)); + z_impl_zsock_recvfrom_fake.custom_fake = + z_impl_zsock_recvfrom_custom_fake_duplicate_response; + + k_sleep(K_MSEC(1)); + LOG_INF("Send request"); + ret = coap_client_req(&client, 0, &address, &client_request, NULL); + zassert_true(ret >= 0, "Sending request failed, %d", ret); + + zassert_ok(k_sem_take(&sem, K_MSEC(MORE_THAN_EXCHANGE_LIFETIME_MS))); + zassert_equal(last_response_code, COAP_RESPONSE_CODE_OK, "Unexpected response"); + + zassert_equal(k_sem_take(&sem, K_MSEC(MORE_THAN_EXCHANGE_LIFETIME_MS)), -EAGAIN, ""); +}