Skip to content

Commit 4441745

Browse files
SyverHaraldsennordicjm
authored andcommitted
tests: net: lib: downloader: Add CoAP retransmission test
Add a test for CoAP retransmission in the downloader library. Signed-off-by: Syver Haraldsen <[email protected]>
1 parent e44216c commit 4441745

File tree

1 file changed

+103
-4
lines changed
  • tests/subsys/net/lib/downloader/src

1 file changed

+103
-4
lines changed

tests/subsys/net/lib/downloader/src/main.c

Lines changed: 103 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
#define FILE_PATH_LONG "this/path/is/too/long/to/fit/in/the/buffer/provided/to/the/downloader/" \
3939
"for/download_get_with_file_and_hostname"
4040

41+
#define TEST_COAP_RETRIES 5
42+
#define TEST_EXPECTED_RECVFROM_CALLS (TEST_COAP_RETRIES - 2)
43+
4144
#define HTTP_HDR_OK "HTTP/1.1 200 OK\r\n" \
4245
"Accept-Ranges: bytes\r\n" \
4346
"Age: 497805\r\n" \
@@ -1005,6 +1008,29 @@ static ssize_t z_impl_zsock_recvfrom_coap(
10051008
return 32;
10061009
}
10071010

1011+
static ssize_t z_impl_zsock_recvfrom_coap_timeout(int sock, void *buf, size_t max_len, int flags,
1012+
struct sockaddr *src_addr, socklen_t *addrlen)
1013+
{
1014+
errno = EAGAIN;
1015+
return -1;
1016+
}
1017+
1018+
static int recovery_call_count;
1019+
1020+
static ssize_t z_impl_zsock_recvfrom_coap_timeout_then_data(int sock, void *buf, size_t max_len,
1021+
int flags, struct sockaddr *src_addr,
1022+
socklen_t *addrlen)
1023+
{
1024+
if (recovery_call_count == 0) {
1025+
recovery_call_count++;
1026+
errno = EAGAIN;
1027+
return -1;
1028+
}
1029+
1030+
recovery_call_count++;
1031+
return z_impl_zsock_recvfrom_coap(sock, buf, max_len, flags, src_addr, addrlen);
1032+
}
1033+
10081034
int coap_get_option_int_ok(const struct coap_packet *cpkt, uint16_t code)
10091035
{
10101036
return 0;
@@ -1028,16 +1054,15 @@ bool coap_pending_cycle_ok(struct coap_pending *pending)
10281054
return true;
10291055
}
10301056

1031-
bool coap_pending_cycle_5(struct coap_pending *pending)
1057+
bool coap_pending_cycles(struct coap_pending *pending)
10321058
{
1033-
pending->timeout = 1000 * (5 - coap_pending_cycle_fake.call_count);
1059+
pending->timeout = 1000 * (TEST_COAP_RETRIES - coap_pending_cycle_fake.call_count);
10341060

10351061
if (pending->timeout) {
10361062
return true;
10371063
}
10381064

10391065
return false;
1040-
10411066
}
10421067

10431068
int coap_update_from_block_ok(const struct coap_packet *cpkt,
@@ -1945,7 +1970,7 @@ void test_downloader_get_coap_bad_header_code_timeout(void)
19451970
z_impl_zsock_recvfrom_fake.custom_fake = z_impl_zsock_recvfrom_coap;
19461971

19471972
coap_get_transmission_parameters_fake.custom_fake = coap_get_transmission_parameters_ok;
1948-
coap_pending_cycle_fake.custom_fake = coap_pending_cycle_5;
1973+
coap_pending_cycle_fake.custom_fake = coap_pending_cycles;
19491974
coap_header_get_type_fake.custom_fake = coap_header_get_type_ack;
19501975
coap_header_get_code_fake.custom_fake = coap_header_get_code_bad;
19511976
coap_packet_get_payload_fake.custom_fake = coap_packet_get_payload_ok;
@@ -1959,6 +1984,80 @@ void test_downloader_get_coap_bad_header_code_timeout(void)
19591984
dl_wait_for_event(DOWNLOADER_EVT_DEINITIALIZED, K_SECONDS(1));
19601985
}
19611986

1987+
void test_downloader_get_coap_retransmission_timeout(void)
1988+
{
1989+
int err;
1990+
struct downloader_evt evt;
1991+
1992+
err = downloader_init(&dl, &dl_cfg);
1993+
TEST_ASSERT_EQUAL(0, err);
1994+
1995+
zsock_getaddrinfo_fake.custom_fake = zsock_getaddrinfo_server_ok;
1996+
zsock_freeaddrinfo_fake.custom_fake = zsock_freeaddrinfo_server_ipv6;
1997+
z_impl_zsock_socket_fake.custom_fake = z_impl_zsock_socket_coap_ipv6_ok;
1998+
z_impl_zsock_connect_fake.custom_fake = z_impl_zsock_connect_ipv6_ok;
1999+
z_impl_zsock_setsockopt_fake.custom_fake = z_impl_zsock_setsockopt_coap_ok;
2000+
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_ok;
2001+
z_impl_zsock_recvfrom_fake.custom_fake = z_impl_zsock_recvfrom_coap_timeout;
2002+
2003+
coap_get_transmission_parameters_fake.custom_fake = coap_get_transmission_parameters_ok;
2004+
coap_pending_cycle_fake.custom_fake = coap_pending_cycles;
2005+
coap_header_get_type_fake.custom_fake = coap_header_get_type_ack;
2006+
coap_header_get_code_fake.custom_fake = coap_header_get_code_ok;
2007+
coap_packet_get_payload_fake.custom_fake = coap_packet_get_payload_ok;
2008+
2009+
err = downloader_get(&dl, &dl_host_cfg, COAP_URL, 0);
2010+
TEST_ASSERT_EQUAL(0, err);
2011+
2012+
evt = dl_wait_for_event(DOWNLOADER_EVT_ERROR, K_SECONDS(3));
2013+
TEST_ASSERT_EQUAL(-ETIMEDOUT, evt.error);
2014+
TEST_ASSERT_EQUAL(TEST_EXPECTED_RECVFROM_CALLS, z_impl_zsock_recvfrom_fake.call_count);
2015+
2016+
downloader_deinit(&dl);
2017+
dl_wait_for_event(DOWNLOADER_EVT_DEINITIALIZED, K_SECONDS(1));
2018+
}
2019+
2020+
void test_downloader_get_coap_retransmission_recovery(void)
2021+
{
2022+
int err;
2023+
struct downloader_evt evt;
2024+
2025+
err = downloader_init(&dl, &dl_cfg);
2026+
TEST_ASSERT_EQUAL(0, err);
2027+
2028+
zsock_getaddrinfo_fake.custom_fake = zsock_getaddrinfo_server_ok;
2029+
zsock_freeaddrinfo_fake.custom_fake = zsock_freeaddrinfo_server_ipv6;
2030+
z_impl_zsock_socket_fake.custom_fake = z_impl_zsock_socket_coap_ipv6_ok;
2031+
z_impl_zsock_connect_fake.custom_fake = z_impl_zsock_connect_ipv6_ok;
2032+
z_impl_zsock_setsockopt_fake.custom_fake = z_impl_zsock_setsockopt_coap_ok;
2033+
2034+
RESET_FAKE(z_impl_zsock_sendto);
2035+
RESET_FAKE(z_impl_zsock_recvfrom);
2036+
recovery_call_count = 0;
2037+
2038+
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_ok;
2039+
z_impl_zsock_recvfrom_fake.custom_fake = z_impl_zsock_recvfrom_coap_timeout_then_data;
2040+
2041+
coap_get_transmission_parameters_fake.custom_fake = coap_get_transmission_parameters_ok;
2042+
RESET_FAKE(coap_pending_cycle);
2043+
coap_pending_cycle_fake.custom_fake = coap_pending_cycles;
2044+
coap_header_get_type_fake.custom_fake = coap_header_get_type_ack;
2045+
coap_header_get_code_fake.custom_fake = coap_header_get_code_ok;
2046+
coap_packet_get_payload_fake.custom_fake = coap_packet_get_payload_ok;
2047+
2048+
err = downloader_get(&dl, &dl_host_cfg, COAP_URL, 0);
2049+
TEST_ASSERT_EQUAL(0, err);
2050+
2051+
evt = dl_wait_for_event(DOWNLOADER_EVT_DONE, K_SECONDS(3));
2052+
TEST_ASSERT_EQUAL(DOWNLOADER_EVT_DONE, evt.id);
2053+
2054+
TEST_ASSERT_EQUAL(2, coap_pending_cycle_fake.call_count);
2055+
TEST_ASSERT_EQUAL(2, z_impl_zsock_recvfrom_fake.call_count);
2056+
2057+
downloader_deinit(&dl);
2058+
dl_wait_for_event(DOWNLOADER_EVT_DEINITIALIZED, K_SECONDS(1));
2059+
}
2060+
19622061
void test_downloader_get_einval(void)
19632062
{
19642063
int err;

0 commit comments

Comments
 (0)