1111
1212#include "stubs.h"
1313
14- LOG_MODULE_REGISTER (coap_client_test );
14+ LOG_MODULE_REGISTER (coap_client_test , LOG_LEVEL_DBG );
1515
1616DEFINE_FFF_GLOBALS ;
1717#define FFF_FAKES_LIST (FAKE )
@@ -23,11 +23,14 @@ DEFINE_FFF_GLOBALS;
2323 (CONFIG_COAP_INIT_ACK_TIMEOUT_MS + CONFIG_COAP_INIT_ACK_TIMEOUT_MS / 2)
2424
2525#define VALID_MESSAGE_ID BIT(31)
26+ #define TOKEN_OFFSET 4
2627
2728static int16_t last_response_code ;
2829static const char * test_path = "test" ;
2930
3031static uint32_t messages_needing_response [2 ];
32+ static uint8_t last_token [2 ][COAP_TOKEN_MAX_LEN ];
33+ static const uint8_t empty_token [COAP_TOKEN_MAX_LEN ] = {0 };
3134
3235static struct coap_client client ;
3336
@@ -61,6 +64,27 @@ static void set_next_pending_message_id(uint16_t id)
6164 }
6265}
6366
67+ static void store_token (uint8_t * buf )
68+ {
69+ for (int i = 0 ; i < ARRAY_SIZE (last_token ); i ++ ) {
70+ if (memcmp (last_token [i ], empty_token , 8 ) == 0 ) {
71+ memcpy (last_token [i ], buf + TOKEN_OFFSET , COAP_TOKEN_MAX_LEN );
72+ return ;
73+ }
74+ }
75+ }
76+
77+ static void restore_token (uint8_t * buf )
78+ {
79+ for (int i = 0 ; i < ARRAY_SIZE (last_token ); i ++ ) {
80+ if (memcmp (last_token [i ], empty_token , 8 ) != 0 ) {
81+ memcpy (buf + TOKEN_OFFSET , last_token [i ], COAP_TOKEN_MAX_LEN );
82+ memset (last_token [i ], 0 , COAP_TOKEN_MAX_LEN );
83+ return ;
84+ }
85+ }
86+ }
87+
6488static ssize_t z_impl_zsock_recvfrom_custom_fake (int sock , void * buf , size_t max_len , int flags ,
6589 struct sockaddr * src_addr , socklen_t * addrlen )
6690{
@@ -74,10 +98,11 @@ static ssize_t z_impl_zsock_recvfrom_custom_fake(int sock, void *buf, size_t max
7498
7599 ack_data [2 ] = (uint8_t )(last_message_id >> 8 );
76100 ack_data [3 ] = (uint8_t )last_message_id ;
101+ restore_token (ack_data );
77102
78103 memcpy (buf , ack_data , sizeof (ack_data ));
79104
80- clear_socket_events (ZSOCK_POLLIN );
105+ clear_socket_events (sock , ZSOCK_POLLIN );
81106
82107 return sizeof (ack_data );
83108}
@@ -90,14 +115,14 @@ static ssize_t z_impl_zsock_sendto_custom_fake(int sock, void *buf, size_t len,
90115
91116 last_message_id |= ((uint8_t * )buf )[2 ] << 8 ;
92117 last_message_id |= ((uint8_t * )buf )[3 ];
93-
94118 type = (((uint8_t * )buf )[0 ] & 0x30 ) >> 4 ;
119+ store_token (buf );
95120
96121 set_next_pending_message_id (last_message_id );
97122 LOG_INF ("Latest message ID: %d" , last_message_id );
98123
99124 if (type == 0 ) {
100- set_socket_events (ZSOCK_POLLIN );
125+ set_socket_events (sock , ZSOCK_POLLIN );
101126 }
102127
103128 return 1 ;
@@ -111,6 +136,7 @@ static ssize_t z_impl_zsock_sendto_custom_fake_no_reply(int sock, void *buf, siz
111136
112137 last_message_id |= ((uint8_t * )buf )[2 ] << 8 ;
113138 last_message_id |= ((uint8_t * )buf )[3 ];
139+ store_token (buf );
114140
115141 set_next_pending_message_id (last_message_id );
116142 LOG_INF ("Latest message ID: %d" , last_message_id );
@@ -128,6 +154,7 @@ static ssize_t z_impl_zsock_sendto_custom_fake_echo(int sock, void *buf, size_t
128154
129155 last_message_id |= ((uint8_t * )buf )[2 ] << 8 ;
130156 last_message_id |= ((uint8_t * )buf )[3 ];
157+ store_token (buf );
131158
132159 set_next_pending_message_id (last_message_id );
133160 LOG_INF ("Latest message ID: %d" , last_message_id );
@@ -144,7 +171,7 @@ static ssize_t z_impl_zsock_sendto_custom_fake_echo(int sock, void *buf, size_t
144171
145172 z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake ;
146173
147- set_socket_events (ZSOCK_POLLIN );
174+ set_socket_events (sock , ZSOCK_POLLIN );
148175
149176 return 1 ;
150177}
@@ -160,6 +187,7 @@ static ssize_t z_impl_zsock_sendto_custom_fake_echo_next_req(int sock, void *buf
160187
161188 last_message_id |= ((uint8_t * )buf )[2 ] << 8 ;
162189 last_message_id |= ((uint8_t * )buf )[3 ];
190+ store_token (buf );
163191
164192 set_next_pending_message_id (last_message_id );
165193 LOG_INF ("Latest message ID: %d" , last_message_id );
@@ -184,7 +212,7 @@ static ssize_t z_impl_zsock_sendto_custom_fake_echo_next_req(int sock, void *buf
184212
185213 z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake ;
186214
187- set_socket_events (ZSOCK_POLLIN );
215+ set_socket_events (sock , ZSOCK_POLLIN );
188216
189217 return 1 ;
190218}
@@ -202,10 +230,11 @@ static ssize_t z_impl_zsock_recvfrom_custom_fake_response(int sock, void *buf, s
202230
203231 ack_data [2 ] = (uint8_t )(last_message_id >> 8 );
204232 ack_data [3 ] = (uint8_t )last_message_id ;
233+ restore_token (ack_data );
205234
206235 memcpy (buf , ack_data , sizeof (ack_data ));
207236
208- clear_socket_events (ZSOCK_POLLIN );
237+ clear_socket_events (sock , ZSOCK_POLLIN );
209238
210239 return sizeof (ack_data );
211240}
@@ -216,7 +245,7 @@ static ssize_t z_impl_zsock_recvfrom_custom_fake_empty_ack(int sock, void *buf,
216245{
217246 uint16_t last_message_id = 0 ;
218247
219- static uint8_t ack_data [] = {0x68 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
248+ static uint8_t ack_data [] = {0x60 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
220249 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 };
221250
222251 last_message_id = get_next_pending_message_id ();
@@ -247,7 +276,7 @@ static ssize_t z_impl_zsock_recvfrom_custom_fake_unmatching(int sock, void *buf,
247276
248277 memcpy (buf , ack_data , sizeof (ack_data ));
249278
250- clear_socket_events (ZSOCK_POLLIN );
279+ clear_socket_events (sock , ZSOCK_POLLIN );
251280
252281 return sizeof (ack_data );
253282}
@@ -267,13 +296,14 @@ static ssize_t z_impl_zsock_recvfrom_custom_fake_echo(int sock, void *buf, size_
267296
268297 ack_data [2 ] = (uint8_t )(last_message_id >> 8 );
269298 ack_data [3 ] = (uint8_t )last_message_id ;
299+ restore_token (ack_data );
270300
271301 memcpy (buf , ack_data , sizeof (ack_data ));
272302
273303 z_impl_zsock_recvfrom_fake .custom_fake = z_impl_zsock_recvfrom_custom_fake_response ;
274304 z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake_echo ;
275305
276- clear_socket_events (ZSOCK_POLLIN );
306+ clear_socket_events (sock , ZSOCK_POLLIN );
277307
278308 return sizeof (ack_data );
279309}
@@ -293,19 +323,23 @@ static ssize_t z_impl_zsock_recvfrom_custom_fake_echo_next_req(int sock, void *b
293323
294324 ack_data [2 ] = (uint8_t )(last_message_id >> 8 );
295325 ack_data [3 ] = (uint8_t )last_message_id ;
326+ restore_token (ack_data );
296327
297328 memcpy (buf , ack_data , sizeof (ack_data ));
298329
299330 z_impl_zsock_recvfrom_fake .custom_fake = z_impl_zsock_recvfrom_custom_fake_response ;
300331 z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake_echo_next_req ;
301332
302- clear_socket_events (ZSOCK_POLLIN );
333+ clear_socket_events (sock , ZSOCK_POLLIN );
303334
304335 return sizeof (ack_data );
305336}
306337
338+ extern void net_coap_init (void );
339+
307340static void * suite_setup (void )
308341{
342+ net_coap_init ();
309343 coap_client_init (& client , NULL );
310344
311345 return NULL ;
@@ -315,20 +349,28 @@ static void test_setup(void *data)
315349{
316350 int i ;
317351
352+ k_mutex_lock (& client .lock , K_FOREVER );
353+
318354 /* Register resets */
319355 DO_FOREACH_FAKE (RESET_FAKE );
320356 /* reset common FFF internal structures */
321357 FFF_RESET_HISTORY ();
322358
323359 z_impl_zsock_recvfrom_fake .custom_fake = z_impl_zsock_recvfrom_custom_fake ;
324360 z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake ;
325- clear_socket_events (ZSOCK_POLLIN | ZSOCK_POLLOUT | ZSOCK_POLLERR );
361+ clear_socket_events (0 , ZSOCK_POLLIN | ZSOCK_POLLOUT | ZSOCK_POLLERR );
362+ clear_socket_events (1 , ZSOCK_POLLIN | ZSOCK_POLLOUT | ZSOCK_POLLERR );
326363
327364 for (i = 0 ; i < ARRAY_SIZE (messages_needing_response ); i ++ ) {
328365 messages_needing_response [i ] = 0 ;
329366 }
330367
368+ memset (& client .requests , 0 , sizeof (client .requests ));
369+ memset (last_token , 0 , sizeof (last_token ));
370+
331371 last_response_code = 0 ;
372+
373+ k_mutex_unlock (& client .lock );
332374}
333375
334376void coap_callback (int16_t code , size_t offset , const uint8_t * payload , size_t len , bool last_block ,
@@ -396,7 +438,7 @@ ZTEST(coap_client, test_resend_request)
396438 ret = coap_client_req (& client , 0 , & address , & client_request , NULL );
397439 zassert_true (ret >= 0 , "Sending request failed, %d" , ret );
398440 k_sleep (K_MSEC (MORE_THAN_ACK_TIMEOUT_MS ));
399- set_socket_events (ZSOCK_POLLIN | ZSOCK_POLLOUT );
441+ set_socket_events (client . fd , ZSOCK_POLLIN | ZSOCK_POLLOUT );
400442
401443 k_sleep (K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS ));
402444 zassert_equal (last_response_code , COAP_RESPONSE_CODE_OK , "Unexpected response" );
@@ -551,7 +593,7 @@ ZTEST(coap_client, test_no_response)
551593 client_request .len = strlen (short_payload );
552594
553595 z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake_no_reply ;
554- set_socket_events (ZSOCK_POLLOUT );
596+ set_socket_events (client . fd , ZSOCK_POLLOUT );
555597
556598 k_sleep (K_MSEC (1 ));
557599
@@ -628,15 +670,15 @@ ZTEST(coap_client, test_multiple_requests)
628670 ret = coap_client_req (& client , 0 , & address , & req2 , NULL );
629671 zassert_true (ret >= 0 , "Sending request failed, %d" , ret );
630672
631- set_socket_events (ZSOCK_POLLIN );
673+ set_socket_events (client . fd , ZSOCK_POLLIN );
632674 while (last_response_code == 0 && retry > 0 ) {
633675 retry -- ;
634676 k_sleep (K_MSEC (1 ));
635677 }
636678 zassert_equal (last_response_code , COAP_RESPONSE_CODE_OK , "Unexpected response" );
637679
638680 last_response_code = 0 ;
639- set_socket_events (ZSOCK_POLLIN );
681+ set_socket_events (client . fd , ZSOCK_POLLIN );
640682 zassert_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
641683 zassert_ok (k_sem_take (& sem2 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
642684 zassert_equal (last_response_code , COAP_RESPONSE_CODE_OK , "Unexpected response" );
@@ -665,7 +707,7 @@ ZTEST(coap_client, test_unmatching_tokens)
665707 client_request .len = strlen (short_payload );
666708
667709 z_impl_zsock_recvfrom_fake .custom_fake = z_impl_zsock_recvfrom_custom_fake_unmatching ;
668- set_socket_events (ZSOCK_POLLIN | ZSOCK_POLLOUT );
710+ set_socket_events (client . fd , ZSOCK_POLLIN | ZSOCK_POLLOUT );
669711
670712 k_sleep (K_MSEC (1 ));
671713
@@ -681,9 +723,6 @@ ZTEST(coap_client, test_multiple_clients)
681723{
682724 int ret ;
683725 int retry = MORE_THAN_EXCHANGE_LIFETIME_MS ;
684- static struct coap_client client2 = {
685- .fd = 2 ,
686- };
687726 struct k_sem sem1 , sem2 ;
688727 struct sockaddr address = {0 };
689728 struct coap_client_request req1 = {
@@ -710,17 +749,17 @@ ZTEST(coap_client, test_multiple_clients)
710749 k_sleep (K_MSEC (1 ));
711750
712751 LOG_INF ("Sending requests" );
713- ret = coap_client_req (& client , 1 , & address , & req1 , NULL );
752+ ret = coap_client_req (& client , client . fd , & address , & req1 , NULL );
714753 zassert_true (ret >= 0 , "Sending request failed, %d" , ret );
715754
716- ret = coap_client_req (& client2 , 2 , & address , & req2 , NULL );
755+ ret = coap_client_req (& client2 , client2 . fd , & address , & req2 , NULL );
717756 zassert_true (ret >= 0 , "Sending request failed, %d" , ret );
718757
719758 while (last_response_code == 0 && retry > 0 ) {
720759 retry -- ;
721760 k_sleep (K_MSEC (1 ));
722761 }
723- set_socket_events (ZSOCK_POLLIN );
762+ set_socket_events (client2 . fd , ZSOCK_POLLIN );
724763
725764 k_sleep (K_SECONDS (1 ));
726765
@@ -746,7 +785,7 @@ ZTEST(coap_client, test_poll_err)
746785 };
747786
748787 z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake_no_reply ;
749- set_socket_events (ZSOCK_POLLERR );
788+ set_socket_events (client . fd , ZSOCK_POLLERR );
750789
751790 k_sleep (K_MSEC (1 ));
752791
@@ -776,7 +815,7 @@ ZTEST(coap_client, test_poll_err_after_response)
776815
777816 zassert_ok (k_sem_init (& sem1 , 0 , 1 ));
778817 z_impl_zsock_sendto_fake .custom_fake = z_impl_zsock_sendto_custom_fake_no_reply ;
779- set_socket_events (ZSOCK_POLLIN );
818+ set_socket_events (client . fd , ZSOCK_POLLIN );
780819
781820 k_sleep (K_MSEC (1 ));
782821
@@ -787,6 +826,6 @@ ZTEST(coap_client, test_poll_err_after_response)
787826 zassert_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
788827 zassert_equal (last_response_code , COAP_RESPONSE_CODE_OK , "Unexpected response" );
789828
790- set_socket_events (ZSOCK_POLLERR );
829+ set_socket_events (client . fd , ZSOCK_POLLERR );
791830 zassert_not_ok (k_sem_take (& sem1 , K_MSEC (MORE_THAN_EXCHANGE_LIFETIME_MS )));
792831}
0 commit comments