1 /*
2  * FreeRTOS+TCP <DEVELOPMENT BRANCH>
3  * Copyright (C) 2022 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
4  *
5  * SPDX-License-Identifier: MIT
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy of
8  * this software and associated documentation files (the "Software"), to deal in
9  * the Software without restriction, including without limitation the rights to
10  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11  * the Software, and to permit persons to whom the Software is furnished to do so,
12  * subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in all
15  * copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * http://aws.amazon.com/freertos
25  * http://www.FreeRTOS.org
26  */
27 
28 
29 /* Include Unity header */
30 #include "unity.h"
31 
32 /* Include standard libraries */
33 #include <stdlib.h>
34 #include <string.h>
35 #include <stdint.h>
36 
37 #include "mock_task.h"
38 #include "mock_list.h"
39 
40 /* This must come after list.h is included (in this case, indirectly
41  * by mock_list.h). */
42 #include "mock_Sockets_list_macros.h"
43 #include "mock_queue.h"
44 #include "mock_event_groups.h"
45 #include "mock_portable.h"
46 
47 #include "mock_FreeRTOS_IP.h"
48 #include "mock_FreeRTOS_IP_Private.h"
49 #include "mock_NetworkBufferManagement.h"
50 #include "mock_FreeRTOS_Stream_Buffer.h"
51 
52 #include "FreeRTOS_Sockets.h"
53 
54 #include "FreeRTOS_Sockets_stubs.c"
55 #include "catch_assert.h"
56 
57 #include "FreeRTOSIPConfig.h"
58 
59 /* =========================== EXTERN VARIABLES =========================== */
60 
61 BaseType_t prvTCPSendLoop( FreeRTOS_Socket_t * pxSocket,
62                            const void * pvBuffer,
63                            size_t uxDataLength,
64                            BaseType_t xFlags );
65 
66 extern List_t xBoundTCPSocketsList;
67 
68 /* 2001::1 */
69 static IPv6_Address_t xIPv6Address = { { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } };
70 
71 /* ============================== Test Cases ============================== */
72 
73 /**
74  * @brief Invalid parameters.
75  */
test_FreeRTOS_accept_InvalidParams(void)76 void test_FreeRTOS_accept_InvalidParams( void )
77 {
78     FreeRTOS_Socket_t xServerSocket, * pxReturn;
79     struct freertos_sockaddr xAddress;
80     socklen_t xAddressLength;
81 
82     memset( &xServerSocket, 0, sizeof( xServerSocket ) );
83 
84     /* Invalid Protocol */
85     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
86     pxReturn = FreeRTOS_accept( &xServerSocket, &xAddress, &xAddressLength );
87     TEST_ASSERT_EQUAL( FREERTOS_INVALID_SOCKET, pxReturn );
88 
89     /* NULL socket. */
90     pxReturn = FreeRTOS_accept( NULL, &xAddress, &xAddressLength );
91     TEST_ASSERT_EQUAL( FREERTOS_INVALID_SOCKET, pxReturn );
92 
93     /* Unbound Socket */
94     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( NULL );
95     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
96     pxReturn = FreeRTOS_accept( &xServerSocket, &xAddress, &xAddressLength );
97     TEST_ASSERT_EQUAL( FREERTOS_INVALID_SOCKET, pxReturn );
98 
99     /* Socket is not in listen mode. */
100     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
101     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
102     xServerSocket.u.xTCP.eTCPState = eTCP_LISTEN + 1;
103     pxReturn = FreeRTOS_accept( &xServerSocket, &xAddress, &xAddressLength );
104     TEST_ASSERT_EQUAL( FREERTOS_INVALID_SOCKET, pxReturn );
105 }
106 
107 /**
108  * @brief Client socket is already taken.
109  */
test_FreeRTOS_accept_ClientSocketTaken(void)110 void test_FreeRTOS_accept_ClientSocketTaken( void )
111 {
112     FreeRTOS_Socket_t xServerSocket, * pxReturn, xPeerSocket;
113     struct freertos_sockaddr xAddress;
114     socklen_t xAddressLength;
115 
116     memset( &xServerSocket, 0, sizeof( xServerSocket ) );
117     memset( &xPeerSocket, 0, sizeof( xPeerSocket ) );
118 
119     /* Invalid Protocol */
120     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
121     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
122     xServerSocket.u.xTCP.eTCPState = eTCP_LISTEN;
123 
124     xServerSocket.u.xTCP.pxPeerSocket = &xPeerSocket;
125 
126     vTaskSuspendAll_Expect();
127     xTaskResumeAll_ExpectAndReturn( pdFALSE );
128 
129     pxReturn = FreeRTOS_accept( &xServerSocket, &xAddress, &xAddressLength );
130     TEST_ASSERT_EQUAL( NULL, pxReturn );
131     TEST_ASSERT_EQUAL( NULL, xServerSocket.u.xTCP.pxPeerSocket );
132 }
133 
134 /**
135  * @brief Peer socket is NULL.
136  */
test_FreeRTOS_accept_PeerSocketNULL(void)137 void test_FreeRTOS_accept_PeerSocketNULL( void )
138 {
139     FreeRTOS_Socket_t xServerSocket, * pxReturn, xPeerSocket;
140     struct freertos_sockaddr xAddress;
141     socklen_t xAddressLength;
142 
143     memset( &xServerSocket, 0, sizeof( xServerSocket ) );
144     memset( &xPeerSocket, 0, sizeof( xPeerSocket ) );
145 
146     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
147     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
148     xServerSocket.u.xTCP.eTCPState = eTCP_LISTEN;
149 
150     xServerSocket.u.xTCP.pxPeerSocket = NULL;
151 
152     vTaskSuspendAll_Expect();
153     xTaskResumeAll_ExpectAndReturn( pdFALSE );
154 
155     pxReturn = FreeRTOS_accept( &xServerSocket, &xAddress, &xAddressLength );
156     TEST_ASSERT_EQUAL( NULL, pxReturn );
157     TEST_ASSERT_EQUAL( NULL, xServerSocket.u.xTCP.pxPeerSocket );
158 }
159 
160 /**
161  * @brief Cannot reuse the socket.
162  */
test_FreeRTOS_accept_NotReuseSocket(void)163 void test_FreeRTOS_accept_NotReuseSocket( void )
164 {
165     FreeRTOS_Socket_t xServerSocket, * pxReturn, xPeerSocket;
166     struct freertos_sockaddr xAddress;
167     socklen_t xAddressLength = 0;
168 
169     memset( &xServerSocket, 0, sizeof( xServerSocket ) );
170     memset( &xPeerSocket, 0, sizeof( xPeerSocket ) );
171     memset( &xAddress, 0, sizeof( xAddress ) );
172 
173     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
174     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
175     xServerSocket.u.xTCP.eTCPState = eTCP_LISTEN;
176 
177     xServerSocket.u.xTCP.pxPeerSocket = &xPeerSocket;
178     xPeerSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
179     xPeerSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = 0xAABBCCDD;
180     xPeerSocket.u.xTCP.usRemotePort = 0x1234;
181 
182     vTaskSuspendAll_Expect();
183     xTaskResumeAll_ExpectAndReturn( pdFALSE );
184 
185     xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdPASS );
186 
187     pxReturn = FreeRTOS_accept( &xServerSocket, &xAddress, &xAddressLength );
188     TEST_ASSERT_EQUAL( &xPeerSocket, pxReturn );
189     TEST_ASSERT_EQUAL( NULL, xServerSocket.u.xTCP.pxPeerSocket );
190     TEST_ASSERT_EQUAL( pdFALSE, xPeerSocket.u.xTCP.bits.bPassAccept );
191     TEST_ASSERT_EQUAL( FreeRTOS_ntohl( xPeerSocket.u.xTCP.xRemoteIP.ulIP_IPv4 ), xAddress.sin_address.ulIP_IPv4 );
192     TEST_ASSERT_EQUAL( FreeRTOS_ntohs( xPeerSocket.u.xTCP.usRemotePort ), xAddress.sin_port );
193     TEST_ASSERT_EQUAL( sizeof( xAddress ), xAddressLength );
194 }
195 
196 /**
197  * @brief Can reuse socket.
198  */
test_FreeRTOS_accept_ReuseSocket(void)199 void test_FreeRTOS_accept_ReuseSocket( void )
200 {
201     FreeRTOS_Socket_t xServerSocket, * pxReturn, xPeerSocket;
202     struct freertos_sockaddr xAddress;
203     socklen_t xAddressLength = 0;
204 
205     memset( &xServerSocket, 0, sizeof( xServerSocket ) );
206     memset( &xPeerSocket, 0, sizeof( xPeerSocket ) );
207     memset( &xAddress, 0, sizeof( xAddress ) );
208 
209     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
210     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
211     xServerSocket.u.xTCP.eTCPState = eTCP_LISTEN;
212     xServerSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
213     xServerSocket.u.xTCP.pxPeerSocket = &xPeerSocket;
214     xServerSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
215     xServerSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = 0xAABBCCDD;
216     xServerSocket.u.xTCP.usRemotePort = 0x1234;
217 
218     vTaskSuspendAll_Expect();
219     xTaskResumeAll_ExpectAndReturn( pdFALSE );
220 
221     pxReturn = FreeRTOS_accept( &xServerSocket, &xAddress, &xAddressLength );
222     TEST_ASSERT_EQUAL( &xServerSocket, pxReturn );
223     TEST_ASSERT_EQUAL( pdFALSE, xServerSocket.u.xTCP.bits.bPassAccept );
224     TEST_ASSERT_EQUAL( FreeRTOS_ntohl( xServerSocket.u.xTCP.xRemoteIP.ulIP_IPv4 ), xAddress.sin_address.ulIP_IPv4 );
225     TEST_ASSERT_EQUAL( FreeRTOS_ntohs( xServerSocket.u.xTCP.usRemotePort ), xAddress.sin_port );
226     TEST_ASSERT_EQUAL( sizeof( xAddress ), xAddressLength );
227 }
228 
229 /**
230  * @brief Accept while passing NULL in address.
231  */
test_FreeRTOS_accept_ReuseSocket_NULLAddress(void)232 void test_FreeRTOS_accept_ReuseSocket_NULLAddress( void )
233 {
234     FreeRTOS_Socket_t xServerSocket, * pxReturn, xPeerSocket;
235     struct freertos_sockaddr xAddress;
236     socklen_t xAddressLength = 0;
237 
238     memset( &xServerSocket, 0, sizeof( xServerSocket ) );
239     memset( &xPeerSocket, 0, sizeof( xPeerSocket ) );
240     memset( &xAddress, 0, sizeof( xAddress ) );
241 
242     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
243     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
244     xServerSocket.u.xTCP.eTCPState = eTCP_LISTEN;
245     xServerSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
246     xServerSocket.u.xTCP.pxPeerSocket = &xPeerSocket;
247     xServerSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
248     xServerSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = 0xAABBCCDD;
249     xServerSocket.u.xTCP.usRemotePort = 0x1234;
250 
251     vTaskSuspendAll_Expect();
252     xTaskResumeAll_ExpectAndReturn( pdFALSE );
253 
254     pxReturn = FreeRTOS_accept( &xServerSocket, NULL, NULL );
255     TEST_ASSERT_EQUAL( &xServerSocket, pxReturn );
256     TEST_ASSERT_EQUAL( pdFALSE, xServerSocket.u.xTCP.bits.bPassAccept );
257 }
258 
259 /**
260  * @brief Can reuse socket. Timeout happens.
261  */
test_FreeRTOS_accept_ReuseSocket_Timeout(void)262 void test_FreeRTOS_accept_ReuseSocket_Timeout( void )
263 {
264     FreeRTOS_Socket_t xServerSocket, * pxReturn, xPeerSocket;
265     struct freertos_sockaddr xAddress;
266     socklen_t xAddressLength = 0;
267 
268     memset( &xServerSocket, 0, sizeof( xServerSocket ) );
269     memset( &xPeerSocket, 0, sizeof( xPeerSocket ) );
270     memset( &xAddress, 0, sizeof( xAddress ) );
271 
272     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
273 
274     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
275     xServerSocket.u.xTCP.eTCPState = eTCP_LISTEN;
276     xServerSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
277     xServerSocket.u.xTCP.pxPeerSocket = &xPeerSocket;
278     xServerSocket.u.xTCP.bits.bPassAccept = pdFALSE_UNSIGNED;
279     xServerSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = 0xAABBCCDD;
280     xServerSocket.u.xTCP.usRemotePort = 0x1234;
281     xServerSocket.xReceiveBlockTime = 0xAA;
282 
283     vTaskSuspendAll_Expect();
284     xTaskResumeAll_ExpectAndReturn( pdFALSE );
285 
286     vTaskSetTimeOutState_ExpectAnyArgs();
287 
288     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
289 
290     xEventGroupWaitBits_ExpectAndReturn( xServerSocket.xEventGroup, eSOCKET_ACCEPT, pdTRUE, pdFALSE, 0xAA, pdFALSE );
291 
292     vTaskSuspendAll_Expect();
293     xTaskResumeAll_ExpectAndReturn( pdFALSE );
294 
295     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
296 
297     pxReturn = FreeRTOS_accept( &xServerSocket, &xAddress, &xAddressLength );
298     TEST_ASSERT_EQUAL( NULL, pxReturn );
299     TEST_ASSERT_EQUAL( pdFALSE, xServerSocket.u.xTCP.bits.bPassAccept );
300 }
301 
302 /**
303  * @brief Can reuse IPv6 socket.
304  */
test_FreeRTOS_accept_ReuseIPv6Socket(void)305 void test_FreeRTOS_accept_ReuseIPv6Socket( void )
306 {
307     FreeRTOS_Socket_t xServerSocket, * pxReturn, xPeerSocket;
308     struct freertos_sockaddr xAddress;
309     socklen_t xAddressLength = 0;
310 
311     memset( &xServerSocket, 0, sizeof( xServerSocket ) );
312     memset( &xPeerSocket, 0, sizeof( xPeerSocket ) );
313     memset( &xAddress, 0, sizeof( xAddress ) );
314 
315     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
316     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
317     xServerSocket.u.xTCP.eTCPState = eTCP_LISTEN;
318     xServerSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
319     xServerSocket.u.xTCP.pxPeerSocket = &xPeerSocket;
320     xServerSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
321     xServerSocket.u.xTCP.usRemotePort = 0x1234;
322     xServerSocket.bits.bIsIPv6 = pdTRUE;
323     memcpy( xServerSocket.u.xTCP.xRemoteIP.xIP_IPv6.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
324 
325     vTaskSuspendAll_Expect();
326     xTaskResumeAll_ExpectAndReturn( pdFALSE );
327 
328     pxReturn = FreeRTOS_accept( &xServerSocket, &xAddress, &xAddressLength );
329     TEST_ASSERT_EQUAL( &xServerSocket, pxReturn );
330     TEST_ASSERT_EQUAL( pdFALSE, xServerSocket.u.xTCP.bits.bPassAccept );
331     TEST_ASSERT_EQUAL_MEMORY( xAddress.sin_address.xIP_IPv6.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
332     TEST_ASSERT_EQUAL( FreeRTOS_ntohs( xServerSocket.u.xTCP.usRemotePort ), xAddress.sin_port );
333     TEST_ASSERT_EQUAL( sizeof( xAddress ), xAddressLength );
334 }
335 
336 /**
337  * @brief Can reuse IPv6 socket.
338  */
test_FreeRTOS_accept_ReuseIPv6Socket_NullAddress(void)339 void test_FreeRTOS_accept_ReuseIPv6Socket_NullAddress( void )
340 {
341     FreeRTOS_Socket_t xServerSocket, * pxReturn, xPeerSocket;
342     socklen_t xAddressLength = 0;
343 
344     memset( &xServerSocket, 0, sizeof( xServerSocket ) );
345     memset( &xPeerSocket, 0, sizeof( xPeerSocket ) );
346 
347     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
348     xServerSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
349     xServerSocket.u.xTCP.eTCPState = eTCP_LISTEN;
350     xServerSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
351     xServerSocket.u.xTCP.pxPeerSocket = &xPeerSocket;
352     xServerSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
353     xServerSocket.u.xTCP.usRemotePort = 0x1234;
354     xServerSocket.bits.bIsIPv6 = pdTRUE;
355     memcpy( xServerSocket.u.xTCP.xRemoteIP.xIP_IPv6.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
356 
357     vTaskSuspendAll_Expect();
358     xTaskResumeAll_ExpectAndReturn( pdFALSE );
359 
360     pxReturn = FreeRTOS_accept( &xServerSocket, NULL, &xAddressLength );
361     TEST_ASSERT_EQUAL( &xServerSocket, pxReturn );
362     TEST_ASSERT_EQUAL( pdFALSE, xServerSocket.u.xTCP.bits.bPassAccept );
363 }
364 
365 /**
366  * @brief Invalid values.
367  */
test_FreeRTOS_recv_InvalidValues(void)368 void test_FreeRTOS_recv_InvalidValues( void )
369 {
370     BaseType_t xReturn;
371     FreeRTOS_Socket_t xSocket;
372     uint8_t pvBuffer[ 1500 ];
373     size_t uxBufferLength = 1500;
374     BaseType_t xFlags = 0;
375 
376     memset( &xSocket, 0, sizeof( xSocket ) );
377 
378     /* Invalid Protocol */
379     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
380     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
381     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
382 
383     /* NULL socket. */
384     xReturn = FreeRTOS_recv( NULL, pvBuffer, uxBufferLength, xFlags );
385     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
386 
387     /* Unbound Socket */
388     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( NULL );
389     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
390     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
391     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
392 
393     xFlags = FREERTOS_ZERO_COPY;
394     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
395     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
396     xReturn = FreeRTOS_recv( &xSocket, NULL, uxBufferLength, xFlags );
397     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
398 }
399 
400 /**
401  * @brief Not connected socket and there is no memory in the system.
402  */
test_FreeRTOS_recv_NotConnectedAndNoMemory(void)403 void test_FreeRTOS_recv_NotConnectedAndNoMemory( void )
404 {
405     BaseType_t xReturn;
406     FreeRTOS_Socket_t xSocket;
407     uint8_t pvBuffer[ 1500 ];
408     size_t uxBufferLength = 1500;
409     BaseType_t xFlags = 0;
410 
411     memset( &xSocket, 0, sizeof( xSocket ) );
412 
413     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
414     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
415     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
416     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOTCONN, xReturn );
417 
418     memset( &xSocket, 0, sizeof( xSocket ) );
419 
420     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
421     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
422     xSocket.u.xTCP.bits.bMallocError = pdTRUE_UNSIGNED;
423     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
424     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOMEM, xReturn );
425 }
426 
427 /**
428  * @brief No wait in an established connection.
429  */
test_FreeRTOS_recv_EstablishedConnection_NoWait(void)430 void test_FreeRTOS_recv_EstablishedConnection_NoWait( void )
431 {
432     BaseType_t xReturn;
433     FreeRTOS_Socket_t xSocket;
434     uint8_t pvBuffer[ 1500 ];
435     size_t uxBufferLength = 1500;
436     BaseType_t xFlags = 0;
437 
438     memset( &xSocket, 0, sizeof( xSocket ) );
439 
440     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
441     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
442     xSocket.u.xTCP.eTCPState = eESTABLISHED;
443 
444     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_INTR, pdTRUE, pdFALSE, 0, 0 );
445 
446     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
447 
448     TEST_ASSERT_EQUAL( 0, xReturn );
449 }
450 
451 /**
452  * @brief Timeout occurs.
453  */
test_FreeRTOS_recv_TimeOut(void)454 void test_FreeRTOS_recv_TimeOut( void )
455 {
456     BaseType_t xReturn;
457     FreeRTOS_Socket_t xSocket;
458     uint8_t pvBuffer[ 1500 ];
459     size_t uxBufferLength = 1500;
460     BaseType_t xFlags = 0;
461 
462     memset( &xSocket, 0, sizeof( xSocket ) );
463 
464     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
465     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
466     xSocket.u.xTCP.eTCPState = eESTABLISHED;
467     xSocket.xReceiveBlockTime = 0xAA;
468 
469     vTaskSetTimeOutState_ExpectAnyArgs();
470 
471     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
472 
473     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
474 
475     TEST_ASSERT_EQUAL( 0, xReturn );
476 }
477 
478 /**
479  * @brief Receive interrupted.
480  */
test_FreeRTOS_recv_Interrupted(void)481 void test_FreeRTOS_recv_Interrupted( void )
482 {
483     BaseType_t xReturn;
484     FreeRTOS_Socket_t xSocket;
485     uint8_t pvBuffer[ 1500 ];
486     size_t uxBufferLength = 1500;
487     BaseType_t xFlags = 0;
488 
489     memset( &xSocket, 0, sizeof( xSocket ) );
490 
491     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
492     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
493     xSocket.u.xTCP.eTCPState = eESTABLISHED;
494     xSocket.xReceiveBlockTime = 0xAA;
495 
496     vTaskSetTimeOutState_ExpectAnyArgs();
497 
498     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
499 
500     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE | ( EventBits_t ) eSOCKET_CLOSED | ( EventBits_t ) eSOCKET_INTR, pdTRUE, pdFALSE, 0xAA, eSOCKET_INTR );
501 
502     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
503 
504     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINTR, xReturn );
505 }
506 
507 /**
508  * @brief Receive interrupted.
509  */
test_FreeRTOS_recv_Interrupted1(void)510 void test_FreeRTOS_recv_Interrupted1( void )
511 {
512     BaseType_t xReturn;
513     FreeRTOS_Socket_t xSocket;
514     uint8_t pvBuffer[ 1500 ];
515     size_t uxBufferLength = 1500;
516     BaseType_t xFlags = 0;
517 
518     memset( &xSocket, 0, sizeof( xSocket ) );
519 
520     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
521     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
522     xSocket.u.xTCP.eTCPState = eESTABLISHED;
523     xSocket.xReceiveBlockTime = 0xAA;
524 
525     vTaskSetTimeOutState_ExpectAnyArgs();
526 
527     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
528 
529     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE | ( EventBits_t ) eSOCKET_CLOSED | ( EventBits_t ) eSOCKET_INTR, pdTRUE, pdFALSE, 0xAA, eSOCKET_RECEIVE | eSOCKET_CLOSED | eSOCKET_INTR );
530 
531     xEventGroupSetBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE | eSOCKET_CLOSED, 0 );
532 
533     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
534 
535     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINTR, xReturn );
536 }
537 
538 /**
539  * @brief Receive stream is NULl for the socket.
540  */
test_FreeRTOS_recv_RxStreamNULL(void)541 void test_FreeRTOS_recv_RxStreamNULL( void )
542 {
543     BaseType_t xReturn;
544     FreeRTOS_Socket_t xSocket;
545     uint8_t pvBuffer[ 1500 ];
546     size_t uxBufferLength = 1500;
547     BaseType_t xFlags = 0;
548 
549     memset( &xSocket, 0, sizeof( xSocket ) );
550 
551     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
552     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
553     xSocket.u.xTCP.eTCPState = eESTABLISHED;
554     xSocket.xReceiveBlockTime = 0xAA;
555 
556     vTaskSetTimeOutState_ExpectAnyArgs();
557 
558     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
559 
560     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE | ( EventBits_t ) eSOCKET_CLOSED | ( EventBits_t ) eSOCKET_INTR, pdTRUE, pdFALSE, 0xAA, 0 );
561 
562     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
563 
564     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
565 
566     TEST_ASSERT_EQUAL( 0, xReturn );
567 }
568 
569 /**
570  * @brief 12 bytes are present in the Buffer when receive is called.
571  */
test_FreeRTOS_recv_12BytesAlreadyInBuffer(void)572 void test_FreeRTOS_recv_12BytesAlreadyInBuffer( void )
573 {
574     BaseType_t xReturn;
575     FreeRTOS_Socket_t xSocket;
576     uint8_t pvBuffer[ 1500 ];
577     size_t uxBufferLength = 1500;
578     BaseType_t xFlags = 0;
579 
580     memset( &xSocket, 0, sizeof( xSocket ) );
581 
582     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
583     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
584     xSocket.u.xTCP.eTCPState = eESTABLISHED;
585     xSocket.xReceiveBlockTime = 0xAA;
586     xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) pvBuffer;
587 
588     uxStreamBufferGetSize_ExpectAndReturn( xSocket.u.xTCP.rxStream, 12 );
589 
590     uxStreamBufferGet_ExpectAndReturn( xSocket.u.xTCP.rxStream, 0U, pvBuffer, ( size_t ) uxBufferLength, 0, 12 );
591 
592     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
593 
594     TEST_ASSERT_EQUAL( 12, xReturn );
595 }
596 
597 /**
598  * @brief Low water mark reached when receive is called.
599  */
test_FreeRTOS_recv_LowWaterReached(void)600 void test_FreeRTOS_recv_LowWaterReached( void )
601 {
602     BaseType_t xReturn;
603     FreeRTOS_Socket_t xSocket;
604     uint8_t pvBuffer[ 1500 ];
605     size_t uxBufferLength = 1500;
606     BaseType_t xFlags = 0;
607 
608     memset( &xSocket, 0, sizeof( xSocket ) );
609 
610     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
611     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
612     xSocket.u.xTCP.eTCPState = eESTABLISHED;
613     xSocket.xReceiveBlockTime = 0xAA;
614     xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) pvBuffer;
615     xSocket.u.xTCP.bits.bLowWater = pdTRUE_UNSIGNED;
616 
617     uxStreamBufferGetSize_ExpectAndReturn( xSocket.u.xTCP.rxStream, 12 );
618 
619     uxStreamBufferGet_ExpectAndReturn( xSocket.u.xTCP.rxStream, 0U, pvBuffer, ( size_t ) uxBufferLength, 0, 12 );
620 
621     uxStreamBufferFrontSpace_ExpectAndReturn( xSocket.u.xTCP.rxStream, 12 );
622 
623     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdTRUE );
624 
625     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
626 
627     TEST_ASSERT_EQUAL( 12, xReturn );
628     TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bLowWater );
629     TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bWinChange );
630     TEST_ASSERT_EQUAL( 1U, xSocket.u.xTCP.usTimeout );
631 }
632 
633 /**
634  * @brief Low water mark reached when receive is called.
635  */
test_FreeRTOS_recv_LowWaterReached2(void)636 void test_FreeRTOS_recv_LowWaterReached2( void )
637 {
638     BaseType_t xReturn;
639     FreeRTOS_Socket_t xSocket;
640     uint8_t pvBuffer[ 1500 ];
641     size_t uxBufferLength = 1500;
642     BaseType_t xFlags = 0;
643 
644     memset( &xSocket, 0, sizeof( xSocket ) );
645 
646     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
647     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
648     xSocket.u.xTCP.eTCPState = eESTABLISHED;
649     xSocket.xReceiveBlockTime = 0xAA;
650     xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) pvBuffer;
651     xSocket.u.xTCP.bits.bLowWater = pdTRUE_UNSIGNED;
652     xSocket.u.xTCP.uxEnoughSpace = 13;
653 
654     uxStreamBufferGetSize_ExpectAndReturn( xSocket.u.xTCP.rxStream, 12 );
655 
656     uxStreamBufferGet_ExpectAndReturn( xSocket.u.xTCP.rxStream, 0U, pvBuffer, ( size_t ) uxBufferLength, 0, 12 );
657 
658     uxStreamBufferFrontSpace_ExpectAndReturn( xSocket.u.xTCP.rxStream, 12 );
659 
660     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
661 
662     TEST_ASSERT_EQUAL( 12, xReturn );
663 }
664 
665 /**
666  * @brief 12 bytes arrive to the socket after a call to receive is made.
667  */
test_FreeRTOS_recv_12BytesArriveLater(void)668 void test_FreeRTOS_recv_12BytesArriveLater( void )
669 {
670     BaseType_t xReturn;
671     FreeRTOS_Socket_t xSocket;
672     uint8_t pvBuffer[ 1500 ];
673     size_t uxBufferLength = 1500;
674     BaseType_t xFlags = FREERTOS_ZERO_COPY;
675 
676     memset( &xSocket, 0, sizeof( xSocket ) );
677 
678     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
679     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
680     xSocket.u.xTCP.eTCPState = eESTABLISHED;
681     xSocket.xReceiveBlockTime = 0xAA;
682     xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) pvBuffer;
683 
684     uxStreamBufferGetSize_ExpectAndReturn( xSocket.u.xTCP.rxStream, 0 );
685 
686     vTaskSetTimeOutState_ExpectAnyArgs();
687 
688     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
689 
690     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE | ( EventBits_t ) eSOCKET_CLOSED | ( EventBits_t ) eSOCKET_INTR, pdTRUE, pdFALSE, 0xAA, 0 );
691 
692     uxStreamBufferGetSize_ExpectAndReturn( xSocket.u.xTCP.rxStream, 12 );
693 
694     uxStreamBufferGetPtr_ExpectAndReturn( xSocket.u.xTCP.rxStream, ( uint8_t ** ) pvBuffer, 12 );
695 
696     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
697 
698     TEST_ASSERT_EQUAL( 12, xReturn );
699 }
700 
701 /**
702  * @brief 12 bytes arrive to the socket after a call to receive is made and a timeout occurs.
703  */
test_FreeRTOS_recv_12BytesArriveLater_Timeout(void)704 void test_FreeRTOS_recv_12BytesArriveLater_Timeout( void )
705 {
706     BaseType_t xReturn;
707     FreeRTOS_Socket_t xSocket;
708     uint8_t pvBuffer[ 1500 ];
709     size_t uxBufferLength = 1500;
710     BaseType_t xFlags = FREERTOS_ZERO_COPY | FREERTOS_MSG_DONTWAIT;
711 
712     memset( &xSocket, 0, sizeof( xSocket ) );
713 
714     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
715     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
716     xSocket.u.xTCP.eTCPState = eESTABLISHED;
717     xSocket.xReceiveBlockTime = 0xAA;
718     xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) pvBuffer;
719 
720     uxStreamBufferGetSize_ExpectAndReturn( xSocket.u.xTCP.rxStream, 0 );
721 
722     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
723 
724     TEST_ASSERT_EQUAL( 0, xReturn );
725 }
726 
727 /**
728  * @brief Socket is closing in receive procedure.
729  */
test_FreeRTOS_recv_SocketClosing(void)730 void test_FreeRTOS_recv_SocketClosing( void )
731 {
732     BaseType_t xReturn;
733     FreeRTOS_Socket_t xSocket;
734     uint8_t pvBuffer[ 1500 ];
735     size_t uxBufferLength = 1500;
736     BaseType_t xFlags = FREERTOS_ZERO_COPY;
737 
738     memset( &xSocket, 0, sizeof( xSocket ) );
739 
740     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
741     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
742     xSocket.u.xTCP.eTCPState = eCLOSING;
743     xSocket.xReceiveBlockTime = 0xAA;
744     xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) pvBuffer;
745 
746     uxStreamBufferGetSize_ExpectAndReturn( xSocket.u.xTCP.rxStream, 0 );
747 
748     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
749 
750     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOTCONN, xReturn );
751 }
752 
753 /**
754  * @brief Socket is in eClise_Wait in receive procedure.
755  */
test_FreeRTOS_recv_SocketCloseWait(void)756 void test_FreeRTOS_recv_SocketCloseWait( void )
757 {
758     BaseType_t xReturn;
759     FreeRTOS_Socket_t xSocket;
760     uint8_t pvBuffer[ 1500 ];
761     size_t uxBufferLength = 1500;
762     BaseType_t xFlags = FREERTOS_ZERO_COPY;
763 
764     memset( &xSocket, 0, sizeof( xSocket ) );
765 
766     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
767     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
768     xSocket.u.xTCP.eTCPState = eCLOSE_WAIT;
769     xSocket.xReceiveBlockTime = 0xAA;
770     xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) pvBuffer;
771 
772     uxStreamBufferGetSize_ExpectAndReturn( xSocket.u.xTCP.rxStream, 0 );
773 
774     xReturn = FreeRTOS_recv( &xSocket, pvBuffer, uxBufferLength, xFlags );
775 
776     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOTCONN, xReturn );
777 }
778 
779 /**
780  * @brief Invalid parameters passed to the function.
781  */
test_FreeRTOS_get_tx_head_InvalidParams(void)782 void test_FreeRTOS_get_tx_head_InvalidParams( void )
783 {
784     uint8_t * pucReturn;
785     FreeRTOS_Socket_t xSocket;
786     BaseType_t xLength;
787 
788     memset( &xSocket, 0, sizeof( xSocket ) );
789 
790     /* Invalid Protocol. */
791     pucReturn = FreeRTOS_get_tx_head( &xSocket, &xLength );
792     TEST_ASSERT_EQUAL( NULL, pucReturn );
793 
794     /* NULL socket. */
795     pucReturn = FreeRTOS_get_tx_head( NULL, &xLength );
796     TEST_ASSERT_EQUAL( NULL, pucReturn );
797 
798     /* NULL stream. */
799     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
800     pucReturn = FreeRTOS_get_tx_head( &xSocket, &xLength );
801     TEST_ASSERT_EQUAL( NULL, pucReturn );
802 }
803 
804 /**
805  * @brief All fields of the socket are NULL.
806  */
test_FreeRTOS_get_tx_head_AllNULL(void)807 void test_FreeRTOS_get_tx_head_AllNULL( void )
808 {
809     uint8_t * pucReturn;
810     FreeRTOS_Socket_t xSocket;
811     BaseType_t xLength;
812     uint8_t ucStream[ ipconfigTCP_MSS ];
813 
814     memset( &xSocket, 0, sizeof( xSocket ) );
815     memset( ucStream, 0, ipconfigTCP_MSS );
816 
817     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
818     xSocket.u.xTCP.txStream = ( StreamBuffer_t * ) ucStream;
819 
820     uxStreamBufferGetSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0 );
821 
822     pucReturn = FreeRTOS_get_tx_head( &xSocket, &xLength );
823     TEST_ASSERT_EQUAL_PTR( ( ( StreamBuffer_t * ) ucStream )->ucArray, pucReturn );
824     TEST_ASSERT_EQUAL( 0, xLength );
825 }
826 
827 /**
828  * @brief Less space in the head than total length.
829  */
test_FreeRTOS_get_tx_head_LessSpace(void)830 void test_FreeRTOS_get_tx_head_LessSpace( void )
831 {
832     uint8_t * pucReturn;
833     FreeRTOS_Socket_t xSocket;
834     BaseType_t xLength;
835     uint8_t ucStream[ ipconfigTCP_MSS ];
836 
837     memset( &xSocket, 0, sizeof( xSocket ) );
838     memset( ucStream, 0, ipconfigTCP_MSS );
839 
840     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
841     xSocket.u.xTCP.txStream = ( StreamBuffer_t * ) ucStream;
842 
843     ( ( StreamBuffer_t * ) ucStream )->LENGTH = 20;
844     ( ( StreamBuffer_t * ) ucStream )->uxHead = 10;
845 
846     uxStreamBufferGetSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 10 );
847 
848     pucReturn = FreeRTOS_get_tx_head( &xSocket, &xLength );
849     TEST_ASSERT_EQUAL_PTR( &( ( ( StreamBuffer_t * ) ucStream )->ucArray[ 10 ] ), pucReturn );
850     TEST_ASSERT_EQUAL( 10, xLength );
851 }
852 
853 /**
854  * @brief More space in the head than total length.
855  */
test_FreeRTOS_get_tx_head_MoreSpace(void)856 void test_FreeRTOS_get_tx_head_MoreSpace( void )
857 {
858     uint8_t * pucReturn;
859     FreeRTOS_Socket_t xSocket;
860     BaseType_t xLength;
861     uint8_t ucStream[ ipconfigTCP_MSS ];
862 
863     memset( &xSocket, 0, sizeof( xSocket ) );
864     memset( ucStream, 0, ipconfigTCP_MSS );
865 
866     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
867     xSocket.u.xTCP.txStream = ( StreamBuffer_t * ) ucStream;
868 
869     ( ( StreamBuffer_t * ) ucStream )->LENGTH = 200;
870     ( ( StreamBuffer_t * ) ucStream )->uxHead = 10;
871 
872     uxStreamBufferGetSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 10 );
873 
874     pucReturn = FreeRTOS_get_tx_head( &xSocket, &xLength );
875     TEST_ASSERT_EQUAL_PTR( &( ( ( StreamBuffer_t * ) ucStream )->ucArray[ 10 ] ), pucReturn );
876     TEST_ASSERT_EQUAL( 10, xLength );
877 }
878 
879 /**
880  * @brief Invalid inputs to the function.
881  */
test_FreeRTOS_send_InvalidInput(void)882 void test_FreeRTOS_send_InvalidInput( void )
883 {
884     BaseType_t xReturn;
885     FreeRTOS_Socket_t xSocket;
886     uint8_t pvBuffer[ ipconfigTCP_MSS ];
887     size_t uxDataLength;
888     BaseType_t xFlags;
889     StreamBuffer_t xLocalStreamBuffer;
890 
891     memset( &xSocket, 0, sizeof( xSocket ) );
892     memset( pvBuffer, 0, ipconfigTCP_MSS );
893 
894     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
895     xSocket.u.xTCP.eTCPState = eESTABLISHED;
896     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
897     uxDataLength = 0;
898     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
899     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
900     TEST_ASSERT_EQUAL( 0, xReturn );
901 
902     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
903     xSocket.u.xTCP.eTCPState = eESTABLISHED;
904     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
905     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
906     uxDataLength = 100;
907     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
908     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, 0 );
909     xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
910     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
911     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOSPC, xReturn );
912 
913     /* Socket is not connected any more. */
914     xSocket.u.xTCP.eTCPState = eESTABLISHED + 1;
915     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
916     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
917 
918     uxDataLength = 100;
919     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
920     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, 0 );
921     xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
922     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
923     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOTCONN, xReturn );
924 }
925 
926 /**
927  * @brief There is exact amount of space in stream buffer as the length of data we want to send.
928  */
test_FreeRTOS_send_ExactSpaceInStreamBuffer(void)929 void test_FreeRTOS_send_ExactSpaceInStreamBuffer( void )
930 {
931     BaseType_t xReturn;
932     FreeRTOS_Socket_t xSocket;
933     uint8_t pvBuffer[ ipconfigTCP_MSS ];
934     size_t uxDataLength;
935     BaseType_t xFlags;
936     StreamBuffer_t xLocalStreamBuffer;
937 
938     /* 1. Last set of bytes. */
939     memset( &xSocket, 0, sizeof( xSocket ) );
940     memset( pvBuffer, 0, ipconfigTCP_MSS );
941 
942     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
943     xSocket.u.xTCP.eTCPState = eESTABLISHED;
944     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
945     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
946     xSocket.u.xTCP.bits.bCloseAfterSend = pdTRUE_UNSIGNED;
947 
948     uxDataLength = 100;
949     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
950     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, uxDataLength );
951     vTaskSuspendAll_Expect();
952     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, pvBuffer, uxDataLength, uxDataLength );
953     xTaskResumeAll_ExpectAndReturn( pdFALSE );
954     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
955     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
956     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
957 
958     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
959 
960     TEST_ASSERT_EQUAL( uxDataLength, xReturn );
961     TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bCloseRequested );
962 
963 
964     /* 2. Not last set of bytes. */
965     xSocket.u.xTCP.bits.bCloseAfterSend = pdFALSE_UNSIGNED;
966     xSocket.u.xTCP.bits.bCloseRequested = pdFALSE;
967 
968     uxDataLength = 100;
969     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
970     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, uxDataLength );
971     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, pvBuffer, uxDataLength, uxDataLength );
972     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
973     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
974     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
975     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
976 
977     TEST_ASSERT_EQUAL( uxDataLength, xReturn );
978     TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bCloseRequested );
979 }
980 
981 /**
982  * @brief There is more space in stream buffer than the length of data we want to send.
983  */
test_FreeRTOS_send_MoreSpaceInStreamBuffer(void)984 void test_FreeRTOS_send_MoreSpaceInStreamBuffer( void )
985 {
986     BaseType_t xReturn;
987     FreeRTOS_Socket_t xSocket;
988     uint8_t pvBuffer[ ipconfigTCP_MSS ];
989     size_t uxDataLength;
990     BaseType_t xFlags;
991     StreamBuffer_t xLocalStreamBuffer;
992 
993     memset( &xSocket, 0, sizeof( xSocket ) );
994     memset( pvBuffer, 0, ipconfigTCP_MSS );
995 
996     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
997     xSocket.u.xTCP.eTCPState = eESTABLISHED;
998     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
999     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
1000     xSocket.u.xTCP.bits.bCloseAfterSend = pdTRUE_UNSIGNED;
1001 
1002     uxDataLength = 100;
1003     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1004     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, uxDataLength + 20 );
1005     vTaskSuspendAll_Expect();
1006     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, pvBuffer, uxDataLength, uxDataLength );
1007     xTaskResumeAll_ExpectAndReturn( pdFALSE );
1008     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1009     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
1010     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1011     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
1012 
1013     TEST_ASSERT_EQUAL( uxDataLength, xReturn );
1014     TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bCloseRequested );
1015 }
1016 
1017 /**
1018  * @brief There is less space in stream buffer than the length of data we want to send, also a timeout happens.
1019  */
test_FreeRTOS_send_LessSpaceInStreamBuffer_Timeout(void)1020 void test_FreeRTOS_send_LessSpaceInStreamBuffer_Timeout( void )
1021 {
1022     BaseType_t xReturn;
1023     FreeRTOS_Socket_t xSocket;
1024     uint8_t pvBuffer[ ipconfigTCP_MSS ];
1025     size_t uxDataLength;
1026     BaseType_t xFlags = 0;
1027     StreamBuffer_t xLocalStreamBuffer;
1028 
1029     memset( &xSocket, 0, sizeof( xSocket ) );
1030     memset( pvBuffer, 0, ipconfigTCP_MSS );
1031 
1032     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1033     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1034     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
1035     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
1036     xSocket.u.xTCP.bits.bCloseAfterSend = pdTRUE_UNSIGNED;
1037     xSocket.xSendBlockTime = 100;
1038 
1039     uxDataLength = 100;
1040     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1041     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, uxDataLength - 20 );
1042     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, pvBuffer, uxDataLength - 20, uxDataLength - 20 );
1043     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1044     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdFALSE );
1045     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1046     vTaskSetTimeOutState_ExpectAnyArgs();
1047     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_SEND | eSOCKET_CLOSED, pdTRUE, pdFALSE, 100, pdFALSE );
1048     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1049 
1050     /* Second Iteration. No space still. */
1051     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, 0 );
1052 
1053     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
1054 
1055     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
1056 
1057     TEST_ASSERT_EQUAL( uxDataLength - 20, xReturn );
1058 }
1059 
1060 /**
1061  * @brief There is less space in stream buffer than the length of data we want to send. However,
1062  *        over time, space becomes available.
1063  */
test_FreeRTOS_send_LessSpaceInStreamBuffer_EventuallySpaceAvailable(void)1064 void test_FreeRTOS_send_LessSpaceInStreamBuffer_EventuallySpaceAvailable( void )
1065 {
1066     BaseType_t xReturn;
1067     FreeRTOS_Socket_t xSocket;
1068     uint8_t pvBuffer[ ipconfigTCP_MSS ];
1069     size_t uxDataLength;
1070     BaseType_t xFlags = 0;
1071     StreamBuffer_t xLocalStreamBuffer;
1072 
1073     memset( &xSocket, 0, sizeof( xSocket ) );
1074     memset( pvBuffer, 0, ipconfigTCP_MSS );
1075 
1076     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1077     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1078     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
1079     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
1080     xSocket.xSendBlockTime = 100;
1081 
1082     uxDataLength = 100;
1083     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1084     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, uxDataLength - 20 );
1085     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, pvBuffer, uxDataLength - 20, uxDataLength - 20 );
1086     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1087     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdFALSE );
1088     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1089     vTaskSetTimeOutState_ExpectAnyArgs();
1090     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_SEND | eSOCKET_CLOSED, pdTRUE, pdFALSE, 100, pdFALSE );
1091     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1092 
1093     /* Second Iteration. */
1094     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, 20 );
1095     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, &pvBuffer[ 80 ], 20, 20 );
1096     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1097     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdFALSE );
1098     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
1099 
1100     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
1101 
1102     TEST_ASSERT_EQUAL( uxDataLength, xReturn );
1103 }
1104 
1105 /**
1106  * @brief There is no space in stream buffer for multiple iterations.
1107  */
test_FreeRTOS_send_MultipleIterationsAndNoSuccess(void)1108 void test_FreeRTOS_send_MultipleIterationsAndNoSuccess( void )
1109 {
1110     BaseType_t xReturn;
1111     FreeRTOS_Socket_t xSocket;
1112     uint8_t pvBuffer[ ipconfigTCP_MSS ];
1113     size_t uxDataLength;
1114     BaseType_t xFlags = 0;
1115     StreamBuffer_t xLocalStreamBuffer;
1116 
1117     memset( &xSocket, 0, sizeof( xSocket ) );
1118     memset( pvBuffer, 0, ipconfigTCP_MSS );
1119 
1120     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1121     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1122     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
1123     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
1124     xSocket.xSendBlockTime = 100;
1125 
1126     uxDataLength = 100;
1127     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1128     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, uxDataLength - 20 );
1129     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, pvBuffer, uxDataLength - 20, uxDataLength - 20 );
1130     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1131     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdFALSE );
1132     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1133     vTaskSetTimeOutState_ExpectAnyArgs();
1134     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_SEND | eSOCKET_CLOSED, pdTRUE, pdFALSE, 100, pdFALSE );
1135     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1136 
1137     /* Second Iteration. */
1138     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, 10 );
1139     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, &pvBuffer[ 80 ], 10, 10 );
1140     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1141     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdFALSE );
1142 
1143     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
1144 
1145     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_SEND | eSOCKET_CLOSED, pdTRUE, pdFALSE, 100, pdFALSE );
1146     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1147 
1148     /* Third iteration. No space still. */
1149     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, 0 );
1150 
1151     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
1152 
1153     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
1154 
1155     TEST_ASSERT_EQUAL( uxDataLength - 10, xReturn );
1156 }
1157 
1158 /*
1159  * @brief While waiting for space, the socket gets disconnected.
1160  */
test_FreeRTOS_send_DisconnectionOccursDuringWait(void)1161 void test_FreeRTOS_send_DisconnectionOccursDuringWait( void )
1162 {
1163     BaseType_t xReturn;
1164     FreeRTOS_Socket_t xSocket;
1165     uint8_t pvBuffer[ ipconfigTCP_MSS ];
1166     size_t uxDataLength;
1167     BaseType_t xFlags = 0;
1168     StreamBuffer_t xLocalStreamBuffer;
1169 
1170     memset( &xSocket, 0, sizeof( xSocket ) );
1171     memset( pvBuffer, 0, ipconfigTCP_MSS );
1172 
1173     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1174     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1175     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
1176     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
1177     xSocket.xSendBlockTime = 100;
1178 
1179     uxDataLength = 100;
1180     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1181     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, uxDataLength - 20 );
1182     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, pvBuffer, uxDataLength - 20, uxDataLength - 20 );
1183     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1184     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdFALSE );
1185     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1186     vTaskSetTimeOutState_ExpectAnyArgs();
1187     xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_SEND | eSOCKET_CLOSED, pdTRUE, pdFALSE, 100, pdFALSE );
1188 
1189     /* Let `socketSOCKET_IS_BOUND()` return false, so that prvTCPSendCheck()
1190      * returns en error, so that the loop is stopped. */
1191     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( NULL );
1192 
1193     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
1194 
1195     TEST_ASSERT_EQUAL( uxDataLength - 20, xReturn );
1196 }
1197 
1198 /*
1199  * @brief IP task is calling send function with a NULL buffer. Also there are 20 bytes worth of space
1200  *        less in the stream buffer as the data length.
1201  */
test_FreeRTOS_send_IPTaskWithNULLBuffer(void)1202 void test_FreeRTOS_send_IPTaskWithNULLBuffer( void )
1203 {
1204     BaseType_t xReturn;
1205     FreeRTOS_Socket_t xSocket;
1206     uint8_t pvBuffer[ ipconfigTCP_MSS ];
1207     size_t uxDataLength;
1208     BaseType_t xFlags = 0;
1209     StreamBuffer_t xLocalStreamBuffer;
1210 
1211     memset( &xSocket, 0, sizeof( xSocket ) );
1212     memset( pvBuffer, 0, ipconfigTCP_MSS );
1213 
1214     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1215     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1216     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
1217     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
1218     xSocket.xSendBlockTime = 100;
1219 
1220     uxDataLength = 100;
1221 
1222     xReturn = FreeRTOS_send( &xSocket, NULL, uxDataLength, xFlags );
1223 
1224     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1225 }
1226 
1227 /**
1228  * @brief Send called with a don't wait flag when there is space in buffer.
1229  */
test_FreeRTOS_send_DontWaitFlag(void)1230 void test_FreeRTOS_send_DontWaitFlag( void )
1231 {
1232     BaseType_t xReturn;
1233     FreeRTOS_Socket_t xSocket;
1234     uint8_t pvBuffer[ ipconfigTCP_MSS ];
1235     size_t uxDataLength;
1236     BaseType_t xFlags = FREERTOS_MSG_DONTWAIT;
1237     StreamBuffer_t xLocalStreamBuffer;
1238 
1239     memset( &xSocket, 0, sizeof( xSocket ) );
1240     memset( pvBuffer, 0, ipconfigTCP_MSS );
1241 
1242     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1243     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1244     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
1245     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
1246     xSocket.xSendBlockTime = 100;
1247 
1248     uxDataLength = 100;
1249     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1250     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, uxDataLength - 20 );
1251     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, pvBuffer, uxDataLength - 20, uxDataLength - 20 );
1252     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1253     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdFALSE );
1254     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1255 
1256     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
1257 
1258     TEST_ASSERT_EQUAL( uxDataLength - 20, xReturn );
1259 }
1260 
1261 /**
1262  * @brief FreeRTOS_send is called from IP task.
1263  */
test_FreeRTOS_send_ExactSpaceInStreamBufferInIPTask(void)1264 void test_FreeRTOS_send_ExactSpaceInStreamBufferInIPTask( void )
1265 {
1266     BaseType_t xReturn;
1267     FreeRTOS_Socket_t xSocket;
1268     uint8_t pvBuffer[ ipconfigTCP_MSS ];
1269     size_t uxDataLength;
1270     BaseType_t xFlags;
1271     StreamBuffer_t xLocalStreamBuffer;
1272 
1273     /* 1. Last set of bytes. */
1274     memset( &xSocket, 0, sizeof( xSocket ) );
1275     memset( pvBuffer, 0, ipconfigTCP_MSS );
1276 
1277     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1278     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1279     xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
1280     xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
1281     xSocket.u.xTCP.bits.bCloseAfterSend = pdTRUE_UNSIGNED;
1282 
1283     uxDataLength = 100;
1284     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1285     uxStreamBufferGetSpace_ExpectAndReturn( xSocket.u.xTCP.txStream, uxDataLength );
1286     vTaskSuspendAll_Expect();
1287     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, pvBuffer, uxDataLength, uxDataLength );
1288     xTaskResumeAll_ExpectAndReturn( pdFALSE );
1289     xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
1290     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1291 
1292     xReturn = FreeRTOS_send( &xSocket, pvBuffer, uxDataLength, xFlags );
1293 
1294     TEST_ASSERT_EQUAL( uxDataLength, xReturn );
1295 }
1296 
1297 /**
1298  * @brief Invalid values passed to listen.
1299  */
test_FreeRTOS_listen_InvalidValues(void)1300 void test_FreeRTOS_listen_InvalidValues( void )
1301 {
1302     BaseType_t xReturn;
1303     FreeRTOS_Socket_t xSocket;
1304     BaseType_t xBacklog;
1305 
1306     memset( &xSocket, 0, sizeof( xSocket ) );
1307 
1308     /* Invalid Protocol. */
1309     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1310     xReturn = FreeRTOS_listen( &xSocket, xBacklog );
1311     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EOPNOTSUPP, xReturn );
1312 
1313     /* Unbound. */
1314     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( NULL );
1315     xReturn = FreeRTOS_listen( &xSocket, xBacklog );
1316     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EOPNOTSUPP, xReturn );
1317 
1318     /* NULL socket. */
1319     xReturn = FreeRTOS_listen( NULL, xBacklog );
1320     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EOPNOTSUPP, xReturn );
1321 
1322     /* Invalid state. */
1323     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1324     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1325     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1326     xReturn = FreeRTOS_listen( &xSocket, xBacklog );
1327     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EOPNOTSUPP, xReturn );
1328 }
1329 
1330 /**
1331  * @brief Listen call successful.
1332  */
test_FreeRTOS_listen_Success(void)1333 void test_FreeRTOS_listen_Success( void )
1334 {
1335     BaseType_t xReturn;
1336     FreeRTOS_Socket_t xSocket;
1337     BaseType_t xBacklog = 0;
1338 
1339     memset( &xSocket, 0, sizeof( xSocket ) );
1340     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1341     xSocket.u.xTCP.eTCPState = eCLOSED;
1342     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1343 
1344     FreeRTOS_min_int32_ExpectAndReturn( ( int32_t ) 0xffff, ( int32_t ) xBacklog, xBacklog );
1345 
1346     vTCPStateChange_Expect( &xSocket, eTCP_LISTEN );
1347 
1348     xReturn = FreeRTOS_listen( &xSocket, xBacklog );
1349     TEST_ASSERT_EQUAL( 0, xReturn );
1350 
1351     memset( &xSocket, 0, sizeof( xSocket ) );
1352     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1353     xSocket.u.xTCP.eTCPState = eCLOSE_WAIT;
1354     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1355 
1356     FreeRTOS_min_int32_ExpectAndReturn( ( int32_t ) 0xffff, ( int32_t ) xBacklog, xBacklog );
1357 
1358     vTCPStateChange_Expect( &xSocket, eTCP_LISTEN );
1359 
1360     xReturn = FreeRTOS_listen( &xSocket, xBacklog );
1361     TEST_ASSERT_EQUAL( 0, xReturn );
1362 }
1363 
1364 /**
1365  * @brief Listen call successful when socket is set to be reused.
1366  */
test_FreeRTOS_listen_Success_WithReuseSocket(void)1367 void test_FreeRTOS_listen_Success_WithReuseSocket( void )
1368 {
1369     BaseType_t xReturn;
1370     FreeRTOS_Socket_t xSocket;
1371     BaseType_t xBacklog = 0;
1372 
1373     memset( &xSocket, 0, sizeof( xSocket ) );
1374     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1375     xSocket.u.xTCP.eTCPState = eCLOSED;
1376     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1377 
1378     memset( xSocket.u.xTCP.xPacket.u.ucLastPacket, 0xFF, sizeof( xSocket.u.xTCP.xPacket.u.ucLastPacket ) );
1379     memset( &xSocket.u.xTCP.xTCPWindow, 0xFF, sizeof( xSocket.u.xTCP.xTCPWindow ) );
1380     memset( &xSocket.u.xTCP.bits, 0xFF, sizeof( xSocket.u.xTCP.bits ) );
1381 
1382     xSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
1383 
1384     FreeRTOS_min_int32_ExpectAndReturn( ( int32_t ) 0xffff, ( int32_t ) xBacklog, xBacklog );
1385 
1386     vTCPStateChange_Expect( &xSocket, eTCP_LISTEN );
1387 
1388     xReturn = FreeRTOS_listen( &xSocket, xBacklog );
1389     TEST_ASSERT_EQUAL( 0, xReturn );
1390     TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bReuseSocket );
1391     TEST_ASSERT_EACH_EQUAL_UINT8( 0, xSocket.u.xTCP.xPacket.u.ucLastPacket, sizeof( xSocket.u.xTCP.xPacket.u.ucLastPacket ) );
1392     TEST_ASSERT_EACH_EQUAL_UINT8( 0, &xSocket.u.xTCP.xTCPWindow, sizeof( xSocket.u.xTCP.xTCPWindow ) );
1393 }
1394 
1395 /**
1396  * @brief Listen call successful when socket is set to be reused and the streams are non NULL.
1397  */
test_FreeRTOS_listen_Success_WithReuseSocket_StreamsNonNULL(void)1398 void test_FreeRTOS_listen_Success_WithReuseSocket_StreamsNonNULL( void )
1399 {
1400     BaseType_t xReturn;
1401     FreeRTOS_Socket_t xSocket;
1402     BaseType_t xBacklog = 0;
1403 
1404     memset( &xSocket, 0, sizeof( xSocket ) );
1405     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1406     xSocket.u.xTCP.eTCPState = eCLOSED;
1407     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1408 
1409     memset( xSocket.u.xTCP.xPacket.u.ucLastPacket, 0xFF, sizeof( xSocket.u.xTCP.xPacket.u.ucLastPacket ) );
1410     memset( &xSocket.u.xTCP.xTCPWindow, 0xFF, sizeof( xSocket.u.xTCP.xTCPWindow ) );
1411     memset( &xSocket.u.xTCP.bits, 0xFF, sizeof( xSocket.u.xTCP.bits ) );
1412 
1413     xSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
1414     xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) &xReturn;
1415     xSocket.u.xTCP.txStream = ( StreamBuffer_t * ) &xReturn;
1416 
1417     FreeRTOS_min_int32_ExpectAndReturn( ( int32_t ) 0xffff, ( int32_t ) xBacklog, xBacklog );
1418 
1419     vStreamBufferClear_Expect( xSocket.u.xTCP.rxStream );
1420     vStreamBufferClear_Expect( xSocket.u.xTCP.txStream );
1421 
1422     vTCPStateChange_Expect( &xSocket, eTCP_LISTEN );
1423 
1424     xReturn = FreeRTOS_listen( &xSocket, xBacklog );
1425     TEST_ASSERT_EQUAL( 0, xReturn );
1426     TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bReuseSocket );
1427     TEST_ASSERT_EACH_EQUAL_UINT8( 0, xSocket.u.xTCP.xPacket.u.ucLastPacket, sizeof( xSocket.u.xTCP.xPacket.u.ucLastPacket ) );
1428     TEST_ASSERT_EACH_EQUAL_UINT8( 0, &xSocket.u.xTCP.xTCPWindow, sizeof( xSocket.u.xTCP.xTCPWindow ) );
1429 }
1430 
1431 /**
1432  * @brief Invalid values passed to shutdown.
1433  */
test_FreeRTOS_shutdown_Invalid(void)1434 void test_FreeRTOS_shutdown_Invalid( void )
1435 {
1436     BaseType_t xReturn;
1437     FreeRTOS_Socket_t xSocket;
1438     BaseType_t xHow;
1439 
1440     memset( &xSocket, 0, sizeof( xSocket ) );
1441 
1442     /* Invalid Protocol. */
1443     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1444     xReturn = FreeRTOS_shutdown( &xSocket, xHow );
1445     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EOPNOTSUPP, xReturn );
1446 
1447     /* Unbound. */
1448     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( NULL );
1449     xReturn = FreeRTOS_shutdown( &xSocket, xHow );
1450     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EOPNOTSUPP, xReturn );
1451 
1452     /* NULL socket. */
1453     xReturn = FreeRTOS_shutdown( NULL, xHow );
1454     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EOPNOTSUPP, xReturn );
1455 
1456     /* Invalid state. */
1457     for( int i = 0; i < 255; i++ )
1458     {
1459         if( i != eESTABLISHED )
1460         {
1461             xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1462             xSocket.u.xTCP.eTCPState = i;
1463             listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1464             xReturn = FreeRTOS_shutdown( &xSocket, xHow );
1465             TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOTCONN, xReturn );
1466         }
1467     }
1468 }
1469 
1470 /**
1471  * @brief Call to shutdown successful.
1472  */
test_FreeRTOS_shutdown_Success(void)1473 void test_FreeRTOS_shutdown_Success( void )
1474 {
1475     BaseType_t xReturn;
1476     FreeRTOS_Socket_t xSocket;
1477     BaseType_t xHow;
1478 
1479     memset( &xSocket, 0, sizeof( xSocket ) );
1480 
1481     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1482     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1483     listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
1484     xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdFALSE );
1485 
1486     xReturn = FreeRTOS_shutdown( &xSocket, xHow );
1487 
1488     TEST_ASSERT_EQUAL( 0, xReturn );
1489     TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bUserShutdown );
1490     TEST_ASSERT_EQUAL( 1U, xSocket.u.xTCP.usTimeout );
1491 }
1492 
1493 /**
1494  * @brief Invalid inputs.
1495  */
test_FreeRTOS_get_rx_buf_InvalidInput(void)1496 void test_FreeRTOS_get_rx_buf_InvalidInput( void )
1497 {
1498     const struct xSTREAM_BUFFER * pxReturn;
1499     FreeRTOS_Socket_t xSocket;
1500 
1501     memset( &xSocket, 0, sizeof( xSocket ) );
1502 
1503     /* Invalid Protocol. */
1504     pxReturn = FreeRTOS_get_rx_buf( &xSocket );
1505     TEST_ASSERT_EQUAL( NULL, pxReturn );
1506 
1507     /* NULL socket. */
1508     pxReturn = FreeRTOS_get_rx_buf( NULL );
1509     TEST_ASSERT_EQUAL( NULL, pxReturn );
1510 }
1511 
1512 /**
1513  * @brief Happy path.
1514  */
test_FreeRTOS_get_rx_buf_ValidInput(void)1515 void test_FreeRTOS_get_rx_buf_ValidInput( void )
1516 {
1517     const struct xSTREAM_BUFFER * pxReturn;
1518     struct xSTREAM_BUFFER xStream;
1519     FreeRTOS_Socket_t xSocket;
1520 
1521     memset( &xSocket, 0, sizeof( xSocket ) );
1522 
1523     /* NULL socket. */
1524     xSocket.u.xTCP.rxStream = &xStream;
1525     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1526 
1527     pxReturn = FreeRTOS_get_rx_buf( &xSocket );
1528     TEST_ASSERT_EQUAL( &xStream, pxReturn );
1529 }
1530 
1531 
1532 /**
1533  * @brief Invalid protocol passed to the function.
1534  */
test_FreeRTOS_tx_space_InvalidProtocol(void)1535 void test_FreeRTOS_tx_space_InvalidProtocol( void )
1536 {
1537     BaseType_t xReturn;
1538     FreeRTOS_Socket_t xSocket;
1539 
1540     memset( &xSocket, 0, sizeof( xSocket ) );
1541 
1542     xReturn = FreeRTOS_tx_space( &xSocket );
1543     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1544 }
1545 
1546 /**
1547  * @brief The stream is NULL in this case.
1548  */
test_FreeRTOS_tx_space_NULLStream(void)1549 void test_FreeRTOS_tx_space_NULLStream( void )
1550 {
1551     BaseType_t xReturn;
1552     FreeRTOS_Socket_t xSocket;
1553 
1554     memset( &xSocket, 0, sizeof( xSocket ) );
1555 
1556     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1557     xSocket.u.xTCP.uxTxStreamSize = 0xBB;
1558     xReturn = FreeRTOS_tx_space( &xSocket );
1559     TEST_ASSERT_EQUAL( 0xBB, xReturn );
1560 }
1561 
1562 /**
1563  * @brief Stream is valid. Happy path.
1564  */
test_FreeRTOS_tx_space_ValidStream(void)1565 void test_FreeRTOS_tx_space_ValidStream( void )
1566 {
1567     BaseType_t xReturn;
1568     FreeRTOS_Socket_t xSocket;
1569     uint8_t ucStream[ 20 ];
1570 
1571     memset( &xSocket, 0, sizeof( xSocket ) );
1572 
1573     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1574     xSocket.u.xTCP.txStream = ( StreamBuffer_t * ) ucStream;
1575 
1576     uxStreamBufferGetSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0xABCD );
1577 
1578     xReturn = FreeRTOS_tx_space( &xSocket );
1579     TEST_ASSERT_EQUAL( 0xABCD, xReturn );
1580 }
1581 
1582 /**
1583  * @brief All combination of inputs. See below comments.
1584  */
test_FreeRTOS_tx_size(void)1585 void test_FreeRTOS_tx_size( void )
1586 {
1587     BaseType_t xReturn;
1588     FreeRTOS_Socket_t xSocket;
1589     uint8_t ucStream[ 20 ];
1590 
1591     memset( &xSocket, 0, sizeof( xSocket ) );
1592 
1593     /* Invalid Protocol. */
1594     xReturn = FreeRTOS_tx_size( &xSocket );
1595     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1596 
1597     /* Valid Protocol. Stream NULL. */
1598     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1599     xReturn = FreeRTOS_tx_size( &xSocket );
1600     TEST_ASSERT_EQUAL( 0, xReturn );
1601 
1602     /* Valid Protocol. Stream non-NULL. */
1603     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1604     xSocket.u.xTCP.txStream = ( StreamBuffer_t * ) ucStream;
1605     uxStreamBufferGetSize_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0x345 );
1606     xReturn = FreeRTOS_tx_size( &xSocket );
1607     TEST_ASSERT_EQUAL( 0x345, xReturn );
1608 }
1609 
1610 /**
1611  * @brief All combination of inputs. See below comments.
1612  */
test_FreeRTOS_issocketconnected(void)1613 void test_FreeRTOS_issocketconnected( void )
1614 {
1615     BaseType_t xReturn;
1616     FreeRTOS_Socket_t xSocket;
1617 
1618     memset( &xSocket, 0, sizeof( xSocket ) );
1619 
1620     /* Invalid Protocol. */
1621     xReturn = FreeRTOS_issocketconnected( &xSocket );
1622     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1623 
1624     /* Valid Protocol. Invalid State. */
1625     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1626     xSocket.u.xTCP.eTCPState = eESTABLISHED - 1;
1627     xReturn = FreeRTOS_issocketconnected( &xSocket );
1628     TEST_ASSERT_EQUAL( pdFALSE, xReturn );
1629 
1630     /* Valid Protocol. Invalid State. */
1631     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1632     xSocket.u.xTCP.eTCPState = eCLOSE_WAIT;
1633     xReturn = FreeRTOS_issocketconnected( &xSocket );
1634     TEST_ASSERT_EQUAL( pdFALSE, xReturn );
1635 
1636     /* Valid Protocol. Valid State. */
1637     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1638     xSocket.u.xTCP.eTCPState = eCLOSE_WAIT - 1;
1639     xReturn = FreeRTOS_issocketconnected( &xSocket );
1640     TEST_ASSERT_EQUAL( pdTRUE, xReturn );
1641 }
1642 
1643 
1644 /**
1645  * @brief All combination of inputs. See below comments.
1646  */
test_FreeRTOS_mss(void)1647 void test_FreeRTOS_mss( void )
1648 {
1649     BaseType_t xReturn;
1650     FreeRTOS_Socket_t xSocket;
1651 
1652     memset( &xSocket, 0, sizeof( xSocket ) );
1653 
1654     /* Invalid Protocol. */
1655     xReturn = FreeRTOS_mss( &xSocket );
1656     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1657 
1658     /* Valid Protocol. Invalid State. */
1659     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1660     xSocket.u.xTCP.usMSS = 0xFD;
1661     xReturn = FreeRTOS_mss( &xSocket );
1662     TEST_ASSERT_EQUAL( 0xFD, xReturn );
1663 }
1664 
1665 /**
1666  * @brief All combination of inputs. See below comments.
1667  */
test_FreeRTOS_connstatus(void)1668 void test_FreeRTOS_connstatus( void )
1669 {
1670     BaseType_t xReturn;
1671     FreeRTOS_Socket_t xSocket;
1672 
1673     memset( &xSocket, 0, sizeof( xSocket ) );
1674 
1675     /* Invalid Protocol. */
1676     xReturn = FreeRTOS_connstatus( &xSocket );
1677     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1678 
1679     /* Valid Protocol. Invalid State. */
1680     for( uint8_t i = 0; i < 125; i++ )
1681     {
1682         xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1683         xSocket.u.xTCP.eTCPState = i;
1684         xReturn = FreeRTOS_connstatus( &xSocket );
1685         TEST_ASSERT_EQUAL( i, xReturn );
1686     }
1687 }
1688 
1689 /**
1690  * @brief All combination of inputs. See below comments.
1691  */
test_FreeRTOS_rx_size(void)1692 void test_FreeRTOS_rx_size( void )
1693 {
1694     BaseType_t xReturn;
1695     FreeRTOS_Socket_t xSocket;
1696     uint8_t ucStream[ 20 ];
1697 
1698     memset( &xSocket, 0, sizeof( xSocket ) );
1699 
1700     /* Invalid Protocol. */
1701     xReturn = FreeRTOS_rx_size( &xSocket );
1702     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1703 
1704     /* Valid Protocol. Stream NULL. */
1705     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1706     xReturn = FreeRTOS_rx_size( &xSocket );
1707     TEST_ASSERT_EQUAL( 0, xReturn );
1708 
1709     /* Valid Protocol. Stream non-NULL. */
1710     xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1711     xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) ucStream;
1712     uxStreamBufferGetSize_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0xAB );
1713     xReturn = FreeRTOS_rx_size( &xSocket );
1714     TEST_ASSERT_EQUAL( 0xAB, xReturn );
1715 }
1716 
1717 /**
1718  * @brief Send zero byte via prvTCPSendLoop.
1719  */
test_prvTCPSendLoop_ZeroByte()1720 void test_prvTCPSendLoop_ZeroByte()
1721 {
1722     BaseType_t xReturn;
1723     FreeRTOS_Socket_t xSocket;
1724     uint8_t pvBuffer[ 10 ];
1725     BaseType_t xFlags = 0;
1726 
1727     memset( &xSocket, 0, sizeof( xSocket ) );
1728 
1729     uxStreamBufferGetSpace_IgnoreAndReturn( 0 );
1730 
1731     xReturn = prvTCPSendLoop( &xSocket, pvBuffer, 0, xFlags );
1732 
1733     TEST_ASSERT_EQUAL( 0, xReturn );
1734 }
1735 
1736 /**
1737  * @brief Send NULL buffer via prvTCPSendLoop.
1738  */
test_prvTCPSendLoop_NullBuffer()1739 void test_prvTCPSendLoop_NullBuffer()
1740 {
1741     BaseType_t xReturn;
1742     FreeRTOS_Socket_t xSocket;
1743     BaseType_t xFlags = 0;
1744     size_t uxDataLength = 100;
1745 
1746     memset( &xSocket, 0, sizeof( xSocket ) );
1747 
1748     uxStreamBufferGetSpace_IgnoreAndReturn( 100 );
1749     uxStreamBufferAdd_ExpectAndReturn( xSocket.u.xTCP.txStream, 0U, NULL, uxDataLength, uxDataLength );
1750     xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
1751 
1752     xReturn = prvTCPSendLoop( &xSocket, NULL, uxDataLength, xFlags );
1753 
1754     TEST_ASSERT_EQUAL( uxDataLength, xReturn );
1755 }
1756