Skip to content

Commit 0168b1d

Browse files
committed
[nrf fromtree] tests: coap_client: Add test for duplicate response
Add test where we receive same UDP packet twice. Signed-off-by: Seppo Takalo <[email protected]> (cherry picked from commit 83bc1fc)
1 parent c81c410 commit 0168b1d

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

tests/net/lib/coap_client/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ add_compile_definitions(CONFIG_COAP_CLIENT_MESSAGE_HEADER_SIZE=48)
2626
add_compile_definitions(CONFIG_COAP_CLIENT_STACK_SIZE=1024)
2727
add_compile_definitions(CONFIG_COAP_CLIENT_THREAD_PRIORITY=10)
2828
add_compile_definitions(CONFIG_COAP_LOG_LEVEL=4)
29-
add_compile_definitions(CONFIG_COAP_INIT_ACK_TIMEOUT_MS=10)
29+
add_compile_definitions(CONFIG_COAP_INIT_ACK_TIMEOUT_MS=100)
3030
add_compile_definitions(CONFIG_COAP_CLIENT_MAX_REQUESTS=2)
3131
add_compile_definitions(CONFIG_COAP_CLIENT_MAX_INSTANCES=2)
3232
add_compile_definitions(CONFIG_COAP_MAX_RETRANSMIT=4)

tests/net/lib/coap_client/src/main.c

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
338362
extern void net_coap_init(void);
339363

340364
static 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

Comments
 (0)