38
38
#define FILE_PATH_LONG "this/path/is/too/long/to/fit/in/the/buffer/provided/to/the/downloader/" \
39
39
"for/download_get_with_file_and_hostname"
40
40
41
+ #define TEST_COAP_RETRIES 5
42
+ #define TEST_EXPECTED_RECVFROM_CALLS (TEST_COAP_RETRIES - 2)
43
+
41
44
#define HTTP_HDR_OK "HTTP/1.1 200 OK\r\n" \
42
45
"Accept-Ranges: bytes\r\n" \
43
46
"Age: 497805\r\n" \
@@ -1005,6 +1008,29 @@ static ssize_t z_impl_zsock_recvfrom_coap(
1005
1008
return 32 ;
1006
1009
}
1007
1010
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
+
1008
1034
int coap_get_option_int_ok (const struct coap_packet * cpkt , uint16_t code )
1009
1035
{
1010
1036
return 0 ;
@@ -1028,16 +1054,15 @@ bool coap_pending_cycle_ok(struct coap_pending *pending)
1028
1054
return true;
1029
1055
}
1030
1056
1031
- bool coap_pending_cycle_5 (struct coap_pending * pending )
1057
+ bool coap_pending_cycles (struct coap_pending * pending )
1032
1058
{
1033
- pending -> timeout = 1000 * (5 - coap_pending_cycle_fake .call_count );
1059
+ pending -> timeout = 1000 * (TEST_COAP_RETRIES - coap_pending_cycle_fake .call_count );
1034
1060
1035
1061
if (pending -> timeout ) {
1036
1062
return true;
1037
1063
}
1038
1064
1039
1065
return false;
1040
-
1041
1066
}
1042
1067
1043
1068
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)
1945
1970
z_impl_zsock_recvfrom_fake .custom_fake = z_impl_zsock_recvfrom_coap ;
1946
1971
1947
1972
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 ;
1949
1974
coap_header_get_type_fake .custom_fake = coap_header_get_type_ack ;
1950
1975
coap_header_get_code_fake .custom_fake = coap_header_get_code_bad ;
1951
1976
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)
1959
1984
dl_wait_for_event (DOWNLOADER_EVT_DEINITIALIZED , K_SECONDS (1 ));
1960
1985
}
1961
1986
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
+
1962
2061
void test_downloader_get_einval (void )
1963
2062
{
1964
2063
int err ;
0 commit comments