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 #include "mock_FreeRTOS_TCP_WIN.h"
52 #include "mock_FreeRTOS_Routing.h"
53 #include "mock_FreeRTOS_IPv6_Sockets.h"
54
55 #include "FreeRTOS_Sockets.h"
56
57
58 #include "FreeRTOS_Sockets_stubs.c"
59 #include "catch_assert.h"
60
61 #include "FreeRTOSIPConfig.h"
62
63 /* =========================== EXTERN VARIABLES =========================== */
64
65 void prvFindSelectedSocket( SocketSelect_t * pxSocketSet );
66
67 BaseType_t prvDetermineSocketSize( BaseType_t xDomain,
68 BaseType_t xType,
69 BaseType_t xProtocol,
70 size_t * pxSocketSize );
71
72 BaseType_t prvMakeSureSocketIsBound( FreeRTOS_Socket_t * pxSocket );
73
74 void prvTCPSetSocketCount( FreeRTOS_Socket_t const * pxSocketToDelete );
75
76 BaseType_t prvSockopt_so_buffer( FreeRTOS_Socket_t * pxSocket,
77 int32_t lOptionName,
78 const void * pvOptionValue );
79 uint16_t prvGetPrivatePortNumber( BaseType_t xProtocol );
80
81 const ListItem_t * pxListFindListItemWithValue( const List_t * pxList,
82 TickType_t xWantedItemValue );
83
84 BaseType_t prvTCPConnectStart( FreeRTOS_Socket_t * pxSocket,
85 struct freertos_sockaddr const * pxAddress );
86
87 int32_t prvTCPSendCheck( FreeRTOS_Socket_t * pxSocket,
88 size_t uxDataLength );
89
90 StreamBuffer_t * prvTCPCreateStream( FreeRTOS_Socket_t * pxSocket,
91 BaseType_t xIsInputStream );
92
93 BaseType_t prvValidSocket( const FreeRTOS_Socket_t * pxSocket,
94 BaseType_t xProtocol,
95 BaseType_t xIsBound );
96
97 BaseType_t bMayConnect( FreeRTOS_Socket_t const * pxSocket );
98
99 extern List_t xBoundUDPSocketsList;
100 extern List_t xBoundTCPSocketsList;
101
102 static IPv6_Address_t xIPv6Address = { { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } };
103
104 /* ============================== Test Cases ============================== */
105
106 /**
107 * @brief Sending to IP-task fails.
108 */
test_prvFindSelectedSocket_SendFail(void)109 void test_prvFindSelectedSocket_SendFail( void )
110 {
111 SocketSelect_t xSocketSet;
112
113 xEventGroupClearBits_ExpectAndReturn( xSocketSet.xSelectGroup, ( BaseType_t ) eSELECT_CALL_IP, pdFALSE );
114
115 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdFAIL );
116
117 prvFindSelectedSocket( &xSocketSet );
118 }
119
120 /**
121 * @brief Sending to IP-task is successful.
122 */
test_prvFindSelectedSocket_SendSuccess(void)123 void test_prvFindSelectedSocket_SendSuccess( void )
124 {
125 SocketSelect_t xSocketSet;
126
127 xEventGroupClearBits_ExpectAndReturn( xSocketSet.xSelectGroup, ( BaseType_t ) eSELECT_CALL_IP, pdFALSE );
128
129 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdPASS );
130
131 xEventGroupWaitBits_ExpectAndReturn( xSocketSet.xSelectGroup, ( BaseType_t ) eSELECT_CALL_IP, pdTRUE, pdFALSE, portMAX_DELAY, pdTRUE );
132
133 prvFindSelectedSocket( &xSocketSet );
134 }
135
136 /**
137 * @brief Invalid or NULL socket test.
138 */
test_prvValidSocket_InvalidOrNULLSocket(void)139 void test_prvValidSocket_InvalidOrNULLSocket( void )
140 {
141 BaseType_t xReturn;
142 FreeRTOS_Socket_t * pxSocket = ( FreeRTOS_Socket_t * ) FREERTOS_INVALID_SOCKET;
143 BaseType_t xProtocol = FREERTOS_IPPROTO_UDP, xIsBound = pdFALSE;
144
145 xReturn = prvValidSocket( NULL, xProtocol, xIsBound );
146
147 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
148
149 xReturn = prvValidSocket( pxSocket, xProtocol, xIsBound );
150
151 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
152 }
153
154 /**
155 * @brief Socket bound variable set, but the socket is not actually bound.
156 */
test_prvValidSocket_SocketBoundSetButNotBound(void)157 void test_prvValidSocket_SocketBoundSetButNotBound( void )
158 {
159 BaseType_t xReturn;
160 FreeRTOS_Socket_t xSocket;
161 BaseType_t xProtocol = FREERTOS_IPPROTO_UDP, xIsBound = pdTRUE;
162
163 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
164
165 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
166
167 xReturn = prvValidSocket( &xSocket, xProtocol, xIsBound );
168
169 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
170 }
171
172 /**
173 * @brief Socket bound variable reset, but the socket is actually bound.
174 */
test_prvValidSocket_SocketBoundResetButBound(void)175 void test_prvValidSocket_SocketBoundResetButBound( void )
176 {
177 BaseType_t xReturn;
178 FreeRTOS_Socket_t xSocket;
179 BaseType_t xProtocol = FREERTOS_IPPROTO_UDP, xIsBound = pdFALSE;
180
181 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
182
183 xSocket.ucProtocol = xProtocol;
184
185 xReturn = prvValidSocket( &xSocket, xProtocol, xIsBound );
186
187 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
188 }
189
190 /**
191 * @brief Invalid protocol present in the socket structure.
192 */
test_prvValidSocket_InvalidProtocol(void)193 void test_prvValidSocket_InvalidProtocol( void )
194 {
195 BaseType_t xReturn;
196 FreeRTOS_Socket_t xSocket;
197 BaseType_t xProtocol = FREERTOS_IPPROTO_UDP, xIsBound = pdTRUE;
198
199 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
200
201 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), ( struct xLIST * ) ( uintptr_t ) 0x11223344 );
202
203 xSocket.ucProtocol = xProtocol + 1;
204
205 xReturn = prvValidSocket( &xSocket, xProtocol, xIsBound );
206
207 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
208 }
209
210 /**
211 * @brief This function is a wrapper expected to call only the initialisation functions for the bound sockets lists.
212 */
test_vNetworkSocketsInit(void)213 void test_vNetworkSocketsInit( void )
214 {
215 vListInitialise_Expect( &xBoundUDPSocketsList );
216 vListInitialise_Expect( &xBoundTCPSocketsList );
217
218 vNetworkSocketsInit();
219 }
220
221 /**
222 * @brief Test case when IP-Task is not initialised.
223 */
test_prvDetermineSocketSize_IPTaskNotInit(void)224 void test_prvDetermineSocketSize_IPTaskNotInit( void )
225 {
226 BaseType_t xReturn;
227 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_DGRAM, xProtocol = FREERTOS_IPPROTO_UDP;
228 size_t xSocketSize;
229
230 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
231
232 xReturn = prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize );
233
234 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
235 }
236
237 /**
238 * @brief Assertion when the domain is anything except FREERTOS_AF_INET.
239 */
test_prvDetermineSocketSize_CatchAssert(void)240 void test_prvDetermineSocketSize_CatchAssert( void )
241 {
242 BaseType_t xDomain = FREERTOS_AF_INET + 1, xType = FREERTOS_SOCK_DGRAM, xProtocol = FREERTOS_IPPROTO_UDP;
243 size_t xSocketSize;
244
245 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
246
247 /* Assertion when the domain is anything except FREERTOS_AF_INET. */
248 catch_assert( prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize ) );
249 }
250
251 /**
252 * @brief Assertion that the UDP socket list must be initialized.
253 */
test_prvDetermineSocketSize_CatchAssert2(void)254 void test_prvDetermineSocketSize_CatchAssert2( void )
255 {
256 BaseType_t xReturn;
257 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_DGRAM, xProtocol = FREERTOS_IPPROTO_UDP;
258 size_t xSocketSize;
259
260 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
261
262 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdFALSE );
263
264 memset( &xBoundUDPSocketsList, 0, sizeof( xBoundUDPSocketsList ) );
265
266 /* Assertion that the UDP socket list must be initialized. */
267 catch_assert( prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize ) );
268 }
269
270 /**
271 * @brief Assertion that the TCP socket list must be initialized.
272 */
test_prvDetermineSocketSize_CatchAssert3(void)273 void test_prvDetermineSocketSize_CatchAssert3( void )
274 {
275 BaseType_t xReturn;
276 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_DGRAM, xProtocol = FREERTOS_IPPROTO_UDP;
277 size_t xSocketSize;
278
279 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
280
281 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
282
283 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdFALSE );
284
285 memset( &xBoundUDPSocketsList, 0, sizeof( xBoundUDPSocketsList ) );
286 memset( &xBoundTCPSocketsList, 0, sizeof( xBoundTCPSocketsList ) );
287
288 xBoundUDPSocketsList.xListEnd.xItemValue = portMAX_DELAY;
289
290 /* Assertion that the TCP socket list must be initialized. */
291 catch_assert( prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize ) );
292 }
293
294 /**
295 * @brief Assertion that the protocol must be either TCP or UDP.
296 */
test_prvDetermineSocketSize_CatchAssert4(void)297 void test_prvDetermineSocketSize_CatchAssert4( void )
298 {
299 BaseType_t xReturn;
300 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_DGRAM, xProtocol = ~( FREERTOS_IPPROTO_UDP | FREERTOS_IPPROTO_TCP );
301 size_t xSocketSize;
302
303 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
304
305 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
306
307 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
308
309 memset( &xBoundUDPSocketsList, 0, sizeof( xBoundUDPSocketsList ) );
310 memset( &xBoundTCPSocketsList, 0, sizeof( xBoundTCPSocketsList ) );
311
312 xBoundUDPSocketsList.xListEnd.xItemValue = portMAX_DELAY;
313 xBoundTCPSocketsList.xListEnd.xItemValue = portMAX_DELAY;
314
315 /* Assertion that the protocol must be either TCP or UDP. */
316 catch_assert( prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize ) );
317 }
318
319 /**
320 * @brief Assertion that the protocol type and the socket type must match.
321 */
test_prvDetermineSocketSize_CatchAssert5(void)322 void test_prvDetermineSocketSize_CatchAssert5( void )
323 {
324 BaseType_t xReturn;
325 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_DGRAM + 1, xProtocol = FREERTOS_IPPROTO_UDP;
326 size_t xSocketSize;
327
328 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
329
330 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
331
332 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
333
334 memset( &xBoundUDPSocketsList, 0, sizeof( xBoundUDPSocketsList ) );
335 memset( &xBoundTCPSocketsList, 0, sizeof( xBoundTCPSocketsList ) );
336
337 xBoundUDPSocketsList.xListEnd.xItemValue = portMAX_DELAY;
338 xBoundTCPSocketsList.xListEnd.xItemValue = portMAX_DELAY;
339
340 /* Assertion that the protocol type and the socket type must match. */
341 catch_assert( prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize ) );
342 }
343
344 /**
345 * @brief Happy path with UDP socket size being determined.
346 */
test_prvDetermineSocketSize_UDPSocket(void)347 void test_prvDetermineSocketSize_UDPSocket( void )
348 {
349 BaseType_t xReturn;
350 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_DGRAM, xProtocol = FREERTOS_IPPROTO_UDP;
351 size_t xSocketSize;
352 FreeRTOS_Socket_t const * pxSocket = NULL;
353
354 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
355
356 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
357 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
358
359 memset( &xBoundUDPSocketsList, 0, sizeof( xBoundUDPSocketsList ) );
360 memset( &xBoundTCPSocketsList, 0, sizeof( xBoundTCPSocketsList ) );
361
362 xBoundUDPSocketsList.xListEnd.xItemValue = portMAX_DELAY;
363 xBoundTCPSocketsList.xListEnd.xItemValue = portMAX_DELAY;
364
365 xReturn = prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize );
366
367 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
368 TEST_ASSERT_EQUAL( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xUDP ), xSocketSize );
369 }
370
371 /**
372 * @brief Assertion that the protocol type and the socket type must match.
373 */
test_prvDetermineSocketSize_CatchAssert6(void)374 void test_prvDetermineSocketSize_CatchAssert6( void )
375 {
376 BaseType_t xReturn;
377 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_DGRAM, xProtocol = FREERTOS_IPPROTO_TCP;
378 size_t xSocketSize;
379 FreeRTOS_Socket_t const * pxSocket = NULL;
380
381 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
382
383 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
384 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
385
386 memset( &xBoundUDPSocketsList, 0, sizeof( xBoundUDPSocketsList ) );
387 memset( &xBoundTCPSocketsList, 0, sizeof( xBoundTCPSocketsList ) );
388
389 xBoundUDPSocketsList.xListEnd.xItemValue = portMAX_DELAY;
390 xBoundTCPSocketsList.xListEnd.xItemValue = portMAX_DELAY;
391
392 /* Assertion that the protocol type and the socket type must match. */
393 catch_assert( prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize ) );
394 }
395
396 /**
397 * @brief Happy path with TCP socket size being determined.
398 */
test_prvDetermineSocketSize_TCPSocket(void)399 void test_prvDetermineSocketSize_TCPSocket( void )
400 {
401 BaseType_t xReturn;
402 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_STREAM, xProtocol = FREERTOS_IPPROTO_TCP;
403 size_t xSocketSize;
404 FreeRTOS_Socket_t const * pxSocket = NULL;
405
406 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
407
408 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
409 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
410
411 xReturn = prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize );
412
413 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
414 TEST_ASSERT_EQUAL( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ), xSocketSize );
415 }
416
417 /**
418 * @brief Happy path with TCPv6 socket size being determined.
419 */
test_prvDetermineSocketSize_TCPv6Socket(void)420 void test_prvDetermineSocketSize_TCPv6Socket( void )
421 {
422 BaseType_t xReturn;
423 BaseType_t xDomain = FREERTOS_AF_INET6, xType = FREERTOS_SOCK_STREAM, xProtocol = FREERTOS_IPPROTO_TCP;
424 size_t xSocketSize;
425 FreeRTOS_Socket_t const * pxSocket = NULL;
426
427 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
428
429 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
430 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
431
432 xReturn = prvDetermineSocketSize( xDomain, xType, xProtocol, &xSocketSize );
433
434 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
435 TEST_ASSERT_EQUAL( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ), xSocketSize );
436 }
437
438 /**
439 * @brief Test for NULL Socket.
440 */
test_prvMakeSureSocketIsBound_NULLSocket(void)441 void test_prvMakeSureSocketIsBound_NULLSocket( void )
442 {
443 BaseType_t xResult;
444
445 xResult = prvMakeSureSocketIsBound( NULL );
446
447 TEST_ASSERT_EQUAL( pdFALSE, xResult );
448 }
449
450 /**
451 * @brief Incompatible protocol.
452 */
test_prvMakeSureSocketIsBound_TCPProtocol(void)453 void test_prvMakeSureSocketIsBound_TCPProtocol( void )
454 {
455 BaseType_t xResult;
456 FreeRTOS_Socket_t xSocket;
457
458 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
459
460 xResult = prvMakeSureSocketIsBound( &xSocket );
461
462 TEST_ASSERT_EQUAL( pdFALSE, xResult );
463 }
464
465 /**
466 * @brief Socket is already bound.
467 */
test_prvMakeSureSocketIsBound_SocketAlreadyBound(void)468 void test_prvMakeSureSocketIsBound_SocketAlreadyBound( void )
469 {
470 BaseType_t xResult;
471 FreeRTOS_Socket_t xSocket;
472
473 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
474
475 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), ( struct xLIST * ) ( uintptr_t ) 0x11223344 );
476
477 xResult = prvMakeSureSocketIsBound( &xSocket );
478
479 TEST_ASSERT_EQUAL( pdTRUE, xResult );
480 }
481
482 /**
483 * @brief Socket is not bound but attempt of binding fails.
484 */
test_prvMakeSureSocketIsBound_SocketNotBound_BindingFails(void)485 void test_prvMakeSureSocketIsBound_SocketNotBound_BindingFails( void )
486 {
487 BaseType_t xResult;
488 FreeRTOS_Socket_t xSocket;
489
490 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
491
492 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
493
494 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
495
496 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
497
498 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdFAIL );
499
500 xResult = prvMakeSureSocketIsBound( &xSocket );
501
502 TEST_ASSERT_EQUAL( pdFALSE, xResult );
503 }
504
505 /**
506 * @brief Socket is not bound and binding is successful.
507 */
test_prvMakeSureSocketIsBound_SocketNotBound_BindingSuccess(void)508 void test_prvMakeSureSocketIsBound_SocketNotBound_BindingSuccess( void )
509 {
510 BaseType_t xResult;
511 FreeRTOS_Socket_t xSocket;
512
513 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
514
515 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
516
517 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
518
519 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
520
521 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdPASS );
522
523 xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, ( EventBits_t ) eSOCKET_BOUND, pdTRUE, pdFALSE, portMAX_DELAY, pdTRUE );
524
525 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), ( struct xLIST * ) ( uintptr_t ) 0x11223344 );
526
527 xResult = prvMakeSureSocketIsBound( &xSocket );
528
529 TEST_ASSERT_EQUAL( pdTRUE, xResult );
530 }
531
532 /**
533 * @brief Trying to bind a NULL socket.
534 */
test_vSocketBind_CatchAssert1(void)535 void test_vSocketBind_CatchAssert1( void )
536 {
537 BaseType_t xReturn;
538 struct freertos_sockaddr xBindAddress;
539 size_t uxAddressLength = 0;
540 BaseType_t xInternal = 0;
541
542 catch_assert( vSocketBind( NULL, &xBindAddress, uxAddressLength, xInternal ) );
543 }
544
545 /**
546 * @brief Trying to bind an invalid socket.
547 */
test_vSocketBind_CatchAssert2(void)548 void test_vSocketBind_CatchAssert2( void )
549 {
550 BaseType_t xReturn;
551 FreeRTOS_Socket_t xSocket;
552 struct freertos_sockaddr xBindAddress;
553 size_t uxAddressLength;
554 BaseType_t xInternal;
555
556 catch_assert( vSocketBind( FREERTOS_INVALID_SOCKET, &xBindAddress, uxAddressLength, xInternal ) );
557 }
558
559 /**
560 * @brief Binding successful.
561 */
test_vSocketBind_TCP(void)562 void test_vSocketBind_TCP( void )
563 {
564 BaseType_t xReturn;
565 FreeRTOS_Socket_t xSocket;
566 struct freertos_sockaddr xBindAddress;
567 size_t uxAddressLength;
568 BaseType_t xInternal = pdFALSE;
569
570 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
571 memset( &xSocket, 0, sizeof( xSocket ) );
572
573 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
574
575 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
576
577 listSET_LIST_ITEM_VALUE_Expect( &( xSocket.xBoundSocketListItem ), xBindAddress.sin_port );
578
579 FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
580
581 vListInsertEnd_Expect( NULL, &( xSocket.xBoundSocketListItem ) );
582 vListInsertEnd_IgnoreArg_pxList();
583
584
585
586 xReturn = vSocketBind( &xSocket, &xBindAddress, uxAddressLength, xInternal );
587
588 TEST_ASSERT_EQUAL( 0, xReturn );
589 }
590
591 /**
592 * @brief Address passed is NULL.
593 */
test_vSocketBind_TCPNULLAddress(void)594 void test_vSocketBind_TCPNULLAddress( void )
595 {
596 BaseType_t xReturn;
597 FreeRTOS_Socket_t xSocket;
598 struct freertos_sockaddr xBindAddress;
599 size_t uxAddressLength;
600 BaseType_t xInternal = pdFALSE;
601
602 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
603 memset( &xSocket, 0, sizeof( xSocket ) );
604
605 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
606
607 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdFALSE );
608 xReturn = vSocketBind( &xSocket, NULL, uxAddressLength, xInternal );
609
610 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EADDRNOTAVAIL, xReturn );
611 }
612
613 /**
614 * @brief Random number generator fails to get a random port number.
615 */
test_vSocketBind_RNGFails(void)616 void test_vSocketBind_RNGFails( void )
617 {
618 BaseType_t xReturn;
619 FreeRTOS_Socket_t xSocket;
620 struct freertos_sockaddr xBindAddress;
621 size_t uxAddressLength;
622 BaseType_t xInternal = pdFALSE;
623
624 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
625 memset( &xSocket, 0, sizeof( xSocket ) );
626
627 xBindAddress.sin_port = 0;
628
629 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
630
631 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdFALSE );
632
633 xReturn = vSocketBind( &xSocket, &xBindAddress, uxAddressLength, xInternal );
634
635 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EADDRNOTAVAIL, xReturn );
636 }
637
638 /**
639 * @brief Binding the socket to a given port number.
640 */
test_vSocketBind_NonZeroPortNumber(void)641 void test_vSocketBind_NonZeroPortNumber( void )
642 {
643 BaseType_t xReturn;
644 FreeRTOS_Socket_t xSocket;
645 struct freertos_sockaddr xBindAddress;
646 size_t uxAddressLength;
647 BaseType_t xInternal = pdFALSE;
648
649 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
650 memset( &xSocket, 0, sizeof( xSocket ) );
651
652 xBindAddress.sin_port = 0x12;
653
654 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_UDP;
655
656 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
657
658 listSET_LIST_ITEM_VALUE_Expect( &( xSocket.xBoundSocketListItem ), xBindAddress.sin_port );
659
660 FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
661
662 vListInsertEnd_Expect( NULL, &( xSocket.xBoundSocketListItem ) );
663 vListInsertEnd_IgnoreArg_pxList();
664
665 xReturn = vSocketBind( &xSocket, &xBindAddress, uxAddressLength, xInternal );
666
667 TEST_ASSERT_EQUAL( 0, xReturn );
668 }
669
670 /**
671 * @brief NULL item returned.
672 */
test_vSocketBind_GotNULLItem(void)673 void test_vSocketBind_GotNULLItem( void )
674 {
675 BaseType_t xReturn;
676 FreeRTOS_Socket_t xSocket;
677 struct freertos_sockaddr xBindAddress;
678 size_t uxAddressLength;
679 BaseType_t xInternal = pdTRUE;
680 ListItem_t xLocalList;
681 ListItem_t * xListStart = NULL;
682
683 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
684 memset( &xSocket, 0, sizeof( xSocket ) );
685
686 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_UDP;
687
688 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
689
690 listGET_NEXT_ExpectAnyArgsAndReturn( xListStart );
691
692 listGET_LIST_ITEM_VALUE_ExpectAndReturn( xListStart, 0 );
693
694 listGET_NEXT_ExpectAnyArgsAndReturn( xListStart );
695
696 listGET_LIST_ITEM_VALUE_ExpectAndReturn( xListStart, xBindAddress.sin_port );
697
698 listSET_LIST_ITEM_VALUE_Expect( &( xSocket.xBoundSocketListItem ), xBindAddress.sin_port );
699
700 FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
701
702 vListInsertEnd_Expect( NULL, &( xSocket.xBoundSocketListItem ) );
703 vListInsertEnd_IgnoreArg_pxList();
704
705 xReturn = vSocketBind( &xSocket, &xBindAddress, uxAddressLength, xInternal );
706
707 TEST_ASSERT_EQUAL( 0, xReturn );
708 TEST_ASSERT_EQUAL( FreeRTOS_ntohs( xBindAddress.sin_port ), xSocket.usLocalPort );
709 }
710
711 /**
712 * @brief Got a non-NULL list.
713 */
test_vSocketBind_GotANonNULLValue(void)714 void test_vSocketBind_GotANonNULLValue( void )
715 {
716 BaseType_t xReturn;
717 FreeRTOS_Socket_t xSocket;
718 struct freertos_sockaddr xBindAddress;
719 size_t uxAddressLength;
720 BaseType_t xInternal = pdTRUE;
721 ListItem_t xLocalList;
722 ListItem_t * xListStart = &xLocalList;
723
724 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
725 memset( &xSocket, 0, sizeof( xSocket ) );
726
727 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_UDP;
728
729 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
730
731 listGET_NEXT_ExpectAnyArgsAndReturn( xListStart );
732
733 listGET_LIST_ITEM_VALUE_ExpectAndReturn( xListStart, 0 );
734
735 listGET_NEXT_ExpectAnyArgsAndReturn( xListStart );
736
737 listGET_LIST_ITEM_VALUE_ExpectAndReturn( xListStart, xBindAddress.sin_port );
738
739 xReturn = vSocketBind( &xSocket, &xBindAddress, uxAddressLength, xInternal );
740
741 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EADDRINUSE, xReturn );
742 TEST_ASSERT_EQUAL( 0, xSocket.usLocalPort );
743 }
744
745 /**
746 * @brief TCP socket bind happy path.
747 */
test_vSocketBind_TCPGotAProperValue(void)748 void test_vSocketBind_TCPGotAProperValue( void )
749 {
750 BaseType_t xReturn;
751 FreeRTOS_Socket_t xSocket;
752 struct freertos_sockaddr xBindAddress;
753 size_t uxAddressLength;
754 BaseType_t xInternal = pdTRUE;
755 ListItem_t xLocalList;
756 ListItem_t * xListStart = &xLocalList;
757
758 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
759 memset( &xSocket, 0, sizeof( xSocket ) );
760
761 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
762
763 listSET_LIST_ITEM_VALUE_Expect( &( xSocket.xBoundSocketListItem ), xBindAddress.sin_port );
764
765 FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
766
767 vListInsertEnd_Expect( NULL, &( xSocket.xBoundSocketListItem ) );
768 vListInsertEnd_IgnoreArg_pxList();
769
770 xReturn = vSocketBind( &xSocket, &xBindAddress, uxAddressLength, xInternal );
771
772 TEST_ASSERT_EQUAL( 0, xReturn );
773 TEST_ASSERT_EQUAL( FreeRTOS_ntohs( xBindAddress.sin_port ), xSocket.usLocalPort );
774 }
775
776 /**
777 * @brief TCP trying to bind to port 0.
778 */
test_vSocketBind_TCPGotAProperValuePortZero(void)779 void test_vSocketBind_TCPGotAProperValuePortZero( void )
780 {
781 BaseType_t xReturn;
782 FreeRTOS_Socket_t xSocket;
783 struct freertos_sockaddr xBindAddress;
784 size_t uxAddressLength;
785 BaseType_t xInternal = pdTRUE;
786 MiniListItem_t xLocalList;
787
788 xBoundTCPSocketsList.xListEnd = xLocalList;
789
790 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
791 memset( &xSocket, 0, sizeof( xSocket ) );
792
793 xBindAddress.sin_port = 0;
794
795 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
796
797 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
798
799 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
800
801 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
802
803 listSET_LIST_ITEM_VALUE_Expect( &( xSocket.xBoundSocketListItem ), FreeRTOS_htons( 1024 ) );
804
805 FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
806
807 vListInsertEnd_Expect( NULL, &( xSocket.xBoundSocketListItem ) );
808 vListInsertEnd_IgnoreArg_pxList();
809
810 xReturn = vSocketBind( &xSocket, &xBindAddress, uxAddressLength, xInternal );
811
812 TEST_ASSERT_EQUAL( 0, xReturn );
813 TEST_ASSERT_EQUAL( FreeRTOS_ntohs( xBindAddress.sin_port ), xSocket.usLocalPort );
814 }
815
816 /**
817 * @brief TCPv6 socket bind happy path.
818 */
test_vSocketBind_TCPv6GotAProperValue(void)819 void test_vSocketBind_TCPv6GotAProperValue( void )
820 {
821 BaseType_t xReturn;
822 FreeRTOS_Socket_t xSocket;
823 struct freertos_sockaddr xBindAddress;
824 size_t uxAddressLength;
825 BaseType_t xInternal = pdTRUE;
826 ListItem_t xLocalList;
827 ListItem_t * xListStart = &xLocalList;
828 IPv6_Address_t xIPv6Address = { { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }; /* 2001::1 */
829 NetworkEndPoint_t xEndPoint;
830
831 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
832 memset( &xSocket, 0, sizeof( xSocket ) );
833 memset( &xEndPoint, 0, sizeof( xEndPoint ) );
834
835 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
836
837 xEndPoint.bits.bIPv6 = pdTRUE;
838 memcpy( xEndPoint.ipv6_settings.xIPAddress.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
839
840 xBindAddress.sin_family = FREERTOS_AF_INET6;
841 memcpy( xBindAddress.sin_address.xIP_IPv6.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
842
843 listSET_LIST_ITEM_VALUE_Expect( &( xSocket.xBoundSocketListItem ), xBindAddress.sin_port );
844
845 vListInsertEnd_Expect( NULL, &( xSocket.xBoundSocketListItem ) );
846 vListInsertEnd_IgnoreArg_pxList();
847
848 xReturn = vSocketBind( &xSocket, &xBindAddress, uxAddressLength, xInternal );
849
850 TEST_ASSERT_EQUAL( 0, xReturn );
851 TEST_ASSERT_EQUAL( FreeRTOS_ntohs( xBindAddress.sin_port ), xSocket.usLocalPort );
852 TEST_ASSERT_EQUAL_MEMORY( xIPv6Address.ucBytes, xSocket.xLocalAddress.xIP_IPv6.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
853 }
854
855 /**
856 * @brief TCP socket bind with FREERTOS_INADDR_ANY.
857 */
test_vSocketBind_TCPBindAnyAddress(void)858 void test_vSocketBind_TCPBindAnyAddress( void )
859 {
860 BaseType_t xReturn;
861 FreeRTOS_Socket_t xSocket;
862 struct freertos_sockaddr xBindAddress;
863 size_t uxAddressLength;
864 BaseType_t xInternal = pdTRUE;
865 ListItem_t xLocalList;
866 ListItem_t * xListStart = &xLocalList;
867 IPv6_Address_t xIPv6Address;
868
869 memset( &xBindAddress, 0xFC, sizeof( xBindAddress ) );
870 memset( &xSocket, 0, sizeof( xSocket ) );
871 memset( &xIPv6Address, 0, sizeof( xIPv6Address ) );
872
873 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
874
875 xBindAddress.sin_family = FREERTOS_AF_INET4;
876 xBindAddress.sin_address.ulIP_IPv4 = FREERTOS_INADDR_ANY;
877
878 listSET_LIST_ITEM_VALUE_Expect( &( xSocket.xBoundSocketListItem ), xBindAddress.sin_port );
879
880 vListInsertEnd_Expect( NULL, &( xSocket.xBoundSocketListItem ) );
881 vListInsertEnd_IgnoreArg_pxList();
882
883 xReturn = vSocketBind( &xSocket, &xBindAddress, uxAddressLength, xInternal );
884
885 TEST_ASSERT_EQUAL( 0, xReturn );
886 TEST_ASSERT_EQUAL( FreeRTOS_ntohs( xBindAddress.sin_port ), xSocket.usLocalPort );
887 TEST_ASSERT_EQUAL_MEMORY( xIPv6Address.ucBytes, xSocket.xLocalAddress.xIP_IPv6.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
888 }
889
890 /**
891 * @brief Closing unbound socket with unknown protocol.
892 */
test_vSocketClose_UnknownProtocol_NotBound(void)893 void test_vSocketClose_UnknownProtocol_NotBound( void )
894 {
895 FreeRTOS_Socket_t xSocket;
896 void * pvReturn;
897
898 memset( &xSocket, 0xAB, sizeof( xSocket ) );
899
900 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
901
902 vEventGroupDelete_Expect( xSocket.xEventGroup );
903
904 vPortFree_Expect( &xSocket );
905
906 pvReturn = vSocketClose( &xSocket );
907
908 TEST_ASSERT_EQUAL( NULL, pvReturn );
909 }
910
911 /**
912 * @brief Closing unbound socket having a NULL event group with unknown protocol.
913 */
test_vSocketClose_UnknownProtocol_NotBound_EventGroupNULL(void)914 void test_vSocketClose_UnknownProtocol_NotBound_EventGroupNULL( void )
915 {
916 FreeRTOS_Socket_t xSocket;
917 void * pvReturn;
918
919 memset( &xSocket, 0xAB, sizeof( xSocket ) );
920
921 xSocket.xEventGroup = NULL;
922
923 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
924
925 vPortFree_Expect( &xSocket );
926
927 pvReturn = vSocketClose( &xSocket );
928
929 TEST_ASSERT_EQUAL( NULL, pvReturn );
930 }
931
932 /**
933 * @brief Closing a TCP socket which has every object assigned.
934 */
test_vSocketClose_TCP_EverythingNonNULL(void)935 void test_vSocketClose_TCP_EverythingNonNULL( void )
936 {
937 FreeRTOS_Socket_t xSocket;
938 void * pvReturn;
939 ListItem_t xLocalList;
940
941 memset( &xSocket, 0xAB, sizeof( xSocket ) );
942
943 xSocket.xEventGroup = NULL;
944 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
945
946 vReleaseNetworkBufferAndDescriptor_Expect( xSocket.u.xTCP.pxAckMessage );
947
948 vTCPWindowDestroy_Expect( &( xSocket.u.xTCP.xTCPWindow ) );
949
950 vPortFree_Expect( xSocket.u.xTCP.rxStream );
951
952 vPortFree_Expect( xSocket.u.xTCP.txStream );
953
954 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
955
956 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
957
958 vPortFree_Expect( &xSocket );
959
960 pvReturn = vSocketClose( &xSocket );
961
962 TEST_ASSERT_EQUAL( NULL, pvReturn );
963 }
964
965 /**
966 * @brief TCP socket being closed where there is still a pointer to last acknowledged packet.
967 */
test_vSocketClose_TCP_LastAckMessageNonNULL(void)968 void test_vSocketClose_TCP_LastAckMessageNonNULL( void )
969 {
970 FreeRTOS_Socket_t xSocket;
971 void * pvReturn;
972 ListItem_t xLocalList;
973
974 memset( &xSocket, 0xAB, sizeof( xSocket ) );
975
976 xSocket.xEventGroup = NULL;
977 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
978
979 xSocket.u.xTCP.pxAckMessage = NULL;
980
981 vTCPWindowDestroy_Expect( &( xSocket.u.xTCP.xTCPWindow ) );
982
983 vPortFree_Expect( xSocket.u.xTCP.rxStream );
984
985 vPortFree_Expect( xSocket.u.xTCP.txStream );
986
987 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
988
989 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
990
991 vPortFree_Expect( &xSocket );
992
993 pvReturn = vSocketClose( &xSocket );
994
995 TEST_ASSERT_EQUAL( NULL, pvReturn );
996 }
997
998 /**
999 * @brief Closing a socket with streams non-NULL.
1000 */
test_vSocketClose_TCP_AllFieldsNonNULL(void)1001 void test_vSocketClose_TCP_AllFieldsNonNULL( void )
1002 {
1003 FreeRTOS_Socket_t xSocket;
1004 void * pvReturn;
1005 ListItem_t xLocalList;
1006
1007 memset( &xSocket, 0xAB, sizeof( xSocket ) );
1008
1009 xSocket.xEventGroup = NULL;
1010 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1011
1012 xSocket.u.xTCP.pxAckMessage = NULL;
1013 xSocket.u.xTCP.rxStream = NULL;
1014 xSocket.u.xTCP.txStream = NULL;
1015
1016 vTCPWindowDestroy_Expect( &( xSocket.u.xTCP.xTCPWindow ) );
1017
1018 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1019
1020 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), ( struct xLIST * ) 0x12345678 );
1021
1022 uxListRemove_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), 0 );
1023
1024 vPortFree_Expect( &xSocket );
1025
1026 pvReturn = vSocketClose( &xSocket );
1027
1028 TEST_ASSERT_EQUAL( NULL, pvReturn );
1029 }
1030
1031 /**
1032 * @brief Closing a UDP socket which doesn't have any waiting packets.
1033 */
test_vSocketClose_UDP_NoWaitingPackets(void)1034 void test_vSocketClose_UDP_NoWaitingPackets( void )
1035 {
1036 FreeRTOS_Socket_t xSocket;
1037 void * pvReturn;
1038 ListItem_t xLocalList;
1039
1040 memset( &xSocket, 0xAB, sizeof( xSocket ) );
1041
1042 xSocket.xEventGroup = NULL;
1043 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_UDP;
1044
1045 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
1046
1047 listCURRENT_LIST_LENGTH_ExpectAndReturn( &( xSocket.u.xUDP.xWaitingPacketsList ), 0 );
1048
1049 vPortFree_Expect( &xSocket );
1050
1051 pvReturn = vSocketClose( &xSocket );
1052
1053 TEST_ASSERT_EQUAL( NULL, pvReturn );
1054 }
1055
1056 /**
1057 * @brief Closing a UDP socket which has some waiting packets.
1058 */
test_vSocketClose_UDP_SomeWaitingPackets(void)1059 void test_vSocketClose_UDP_SomeWaitingPackets( void )
1060 {
1061 FreeRTOS_Socket_t xSocket;
1062 void * pvReturn;
1063 ListItem_t xLocalList;
1064 NetworkBufferDescriptor_t xNetworkBuffer;
1065
1066 memset( &xSocket, 0xAB, sizeof( xSocket ) );
1067
1068 xSocket.xEventGroup = NULL;
1069 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_UDP;
1070
1071 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
1072
1073 listCURRENT_LIST_LENGTH_ExpectAndReturn( &( xSocket.u.xUDP.xWaitingPacketsList ), 5 );
1074
1075 for( int i = 0; i < 5; i++ )
1076 {
1077 listGET_OWNER_OF_HEAD_ENTRY_ExpectAndReturn( &( xSocket.u.xUDP.xWaitingPacketsList ), &xNetworkBuffer );
1078
1079 uxListRemove_ExpectAndReturn( &( xNetworkBuffer.xBufferListItem ), pdPASS );
1080
1081 vReleaseNetworkBufferAndDescriptor_Expect( &xNetworkBuffer );
1082
1083 listCURRENT_LIST_LENGTH_ExpectAndReturn( &( xSocket.u.xUDP.xWaitingPacketsList ), 4 - i );
1084 }
1085
1086 vPortFree_Expect( &xSocket );
1087
1088 pvReturn = vSocketClose( &xSocket );
1089
1090 TEST_ASSERT_EQUAL( NULL, pvReturn );
1091 }
1092
1093 /**
1094 * @brief Set children count of a listening socket which does not have any.
1095 */
test_prvTCPSetSocketCount_ListeningSocketNoChildren(void)1096 void test_prvTCPSetSocketCount_ListeningSocketNoChildren( void )
1097 {
1098 FreeRTOS_Socket_t xSocketToDelete;
1099
1100 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1101
1102 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1103 xSocketToDelete.u.xTCP.eTCPState = eTCP_LISTEN;
1104
1105 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1106
1107 prvTCPSetSocketCount( &xSocketToDelete );
1108 }
1109
1110 /**
1111 * @brief Set children count of a listening socket which has non-zero children.
1112 */
test_prvTCPSetSocketCount_ListeningSocketNonZeroChildren1(void)1113 void test_prvTCPSetSocketCount_ListeningSocketNonZeroChildren1( void )
1114 {
1115 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1116 ListItem_t xIterator;
1117
1118 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1119 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1120
1121 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1122 xSocketToDelete.u.xTCP.eTCPState = eTCP_LISTEN;
1123
1124 xChildSocket.u.xTCP.eTCPState = eTCP_LISTEN;
1125
1126 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1127
1128 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1129
1130 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1131
1132 prvTCPSetSocketCount( &xSocketToDelete );
1133 }
1134
1135 /**
1136 * @brief Set children count of a listening socket which has non-zero children.
1137 */
test_prvTCPSetSocketCount_ListeningSocketNonZeroChildren2(void)1138 void test_prvTCPSetSocketCount_ListeningSocketNonZeroChildren2( void )
1139 {
1140 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1141 ListItem_t xIterator;
1142 uint16_t usLocalPort = 0x1234;
1143
1144 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1145 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1146
1147 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1148 xSocketToDelete.u.xTCP.eTCPState = eTCP_LISTEN;
1149 xSocketToDelete.usLocalPort = usLocalPort;
1150
1151 xChildSocket.u.xTCP.eTCPState = eCONNECT_SYN;
1152 xChildSocket.usLocalPort = usLocalPort + 1;
1153
1154 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1155
1156 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1157
1158 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1159
1160 prvTCPSetSocketCount( &xSocketToDelete );
1161 }
1162
1163 /**
1164 * @brief Set children count of a listening socket which has non-zero children.
1165 */
test_prvTCPSetSocketCount_ListeningSocketNonZeroChildren3(void)1166 void test_prvTCPSetSocketCount_ListeningSocketNonZeroChildren3( void )
1167 {
1168 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1169 ListItem_t xIterator;
1170 uint16_t usLocalPort = 0x1234;
1171
1172 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1173 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1174
1175 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1176 xSocketToDelete.u.xTCP.eTCPState = eTCP_LISTEN;
1177 xSocketToDelete.usLocalPort = usLocalPort;
1178
1179 xChildSocket.u.xTCP.eTCPState = eCONNECT_SYN;
1180 xChildSocket.usLocalPort = usLocalPort;
1181 xChildSocket.u.xTCP.bits.bPassQueued = pdFALSE_UNSIGNED;
1182 xChildSocket.u.xTCP.bits.bPassAccept = pdFALSE_UNSIGNED;
1183
1184 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1185
1186 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1187
1188 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1189
1190 prvTCPSetSocketCount( &xSocketToDelete );
1191 }
1192
1193 /**
1194 * @brief Set children count of a listening socket which has non-zero children.
1195 */
test_prvTCPSetSocketCount_ListeningSocketNonZeroChildren4(void)1196 void test_prvTCPSetSocketCount_ListeningSocketNonZeroChildren4( void )
1197 {
1198 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1199 ListItem_t xIterator;
1200 uint16_t usLocalPort = 0x1234;
1201
1202 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1203 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1204
1205 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1206 xSocketToDelete.u.xTCP.eTCPState = eTCP_LISTEN;
1207 xSocketToDelete.usLocalPort = usLocalPort;
1208
1209 xChildSocket.u.xTCP.eTCPState = eCONNECT_SYN;
1210 xChildSocket.usLocalPort = usLocalPort;
1211 xChildSocket.u.xTCP.bits.bPassQueued = pdFALSE_UNSIGNED;
1212 xChildSocket.u.xTCP.bits.bPassAccept = pdFALSE_UNSIGNED;
1213
1214 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1215
1216 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1217
1218 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1219
1220 prvTCPSetSocketCount( &xSocketToDelete );
1221 }
1222
1223 /**
1224 * @brief Setting the socket count happy path.
1225 */
test_prvTCPSetSocketCount_ListeningSock_HappyPath1(void)1226 void test_prvTCPSetSocketCount_ListeningSock_HappyPath1( void )
1227 {
1228 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1229 ListItem_t xIterator;
1230 uint16_t usLocalPort = 0x1234;
1231
1232 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1233 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1234
1235 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1236 xSocketToDelete.u.xTCP.eTCPState = eTCP_LISTEN;
1237 xSocketToDelete.usLocalPort = usLocalPort;
1238
1239 xChildSocket.u.xTCP.eTCPState = eCONNECT_SYN;
1240 xChildSocket.usLocalPort = usLocalPort;
1241 xChildSocket.u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
1242 xChildSocket.u.xTCP.bits.bPassAccept = pdFALSE_UNSIGNED;
1243 xChildSocket.xEventGroup = NULL;
1244 xChildSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1245 xChildSocket.u.xTCP.pxAckMessage = NULL;
1246
1247 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1248
1249 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1250
1251 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1252
1253 vTCPWindowDestroy_Expect( &( xChildSocket.u.xTCP.xTCPWindow ) );
1254
1255 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1256
1257 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xChildSocket.xBoundSocketListItem ), NULL );
1258
1259 vPortFree_Expect( &xChildSocket );
1260
1261 prvTCPSetSocketCount( &xSocketToDelete );
1262 }
1263
1264 /**
1265 * @brief Setting the socket count happy path.
1266 */
test_prvTCPSetSocketCount_ListeningSock_HappyPath2(void)1267 void test_prvTCPSetSocketCount_ListeningSock_HappyPath2( void )
1268 {
1269 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1270 ListItem_t xIterator;
1271 uint16_t usLocalPort = 0x1234;
1272
1273 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1274 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1275
1276 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1277 xSocketToDelete.u.xTCP.eTCPState = eTCP_LISTEN;
1278 xSocketToDelete.usLocalPort = usLocalPort;
1279
1280 xChildSocket.u.xTCP.eTCPState = eCONNECT_SYN;
1281 xChildSocket.usLocalPort = usLocalPort;
1282 xChildSocket.u.xTCP.bits.bPassQueued = pdFALSE_UNSIGNED;
1283 xChildSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
1284 xChildSocket.xEventGroup = NULL;
1285 xChildSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1286 xChildSocket.u.xTCP.pxAckMessage = NULL;
1287
1288 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1289
1290 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1291
1292 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1293
1294 vTCPWindowDestroy_Expect( &( xChildSocket.u.xTCP.xTCPWindow ) );
1295
1296 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1297
1298 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xChildSocket.xBoundSocketListItem ), NULL );
1299
1300 vPortFree_Expect( &xChildSocket );
1301
1302 prvTCPSetSocketCount( &xSocketToDelete );
1303 }
1304
1305 /**
1306 * @brief Setting the socket count happy path.
1307 */
test_prvTCPSetSocketCount_ListeningSock_HappyPath3(void)1308 void test_prvTCPSetSocketCount_ListeningSock_HappyPath3( void )
1309 {
1310 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1311 ListItem_t xIterator;
1312 uint16_t usLocalPort = 0x1234;
1313
1314 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1315 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1316
1317 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1318 xSocketToDelete.u.xTCP.eTCPState = eTCP_LISTEN;
1319 xSocketToDelete.usLocalPort = usLocalPort;
1320
1321 xChildSocket.u.xTCP.eTCPState = eCONNECT_SYN;
1322 xChildSocket.usLocalPort = usLocalPort;
1323 xChildSocket.u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
1324 xChildSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
1325 xChildSocket.xEventGroup = NULL;
1326 xChildSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1327 xChildSocket.u.xTCP.pxAckMessage = NULL;
1328
1329 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1330
1331 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1332
1333 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1334
1335 vTCPWindowDestroy_Expect( &( xChildSocket.u.xTCP.xTCPWindow ) );
1336
1337 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1338
1339 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xChildSocket.xBoundSocketListItem ), NULL );
1340
1341 vPortFree_Expect( &xChildSocket );
1342
1343 prvTCPSetSocketCount( &xSocketToDelete );
1344 }
1345
1346 /**
1347 * @brief Set the socket count of a non-listening socket.
1348 */
test_prvTCPSetSocketCount_NotListeningSock_1(void)1349 void test_prvTCPSetSocketCount_NotListeningSock_1( void )
1350 {
1351 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1352 ListItem_t xIterator;
1353 uint16_t usLocalPort = 0x1234;
1354
1355 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1356 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1357
1358 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1359 xSocketToDelete.u.xTCP.eTCPState = eCONNECT_SYN;
1360 xSocketToDelete.usLocalPort = usLocalPort;
1361
1362 xChildSocket.u.xTCP.eTCPState = eCONNECT_SYN;
1363 xChildSocket.u.xTCP.usChildCount = 100;
1364
1365 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1366
1367 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1368
1369 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1370
1371 prvTCPSetSocketCount( &xSocketToDelete );
1372
1373 TEST_ASSERT_EQUAL( 100, xChildSocket.u.xTCP.usChildCount );
1374 }
1375
1376 /**
1377 * @brief Set the socket count of a non-listening socket.
1378 */
test_prvTCPSetSocketCount_NotListeningSock_2(void)1379 void test_prvTCPSetSocketCount_NotListeningSock_2( void )
1380 {
1381 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1382 ListItem_t xIterator;
1383 uint16_t usLocalPort = 0x1234;
1384
1385 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1386 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1387
1388 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1389 xSocketToDelete.u.xTCP.eTCPState = eCONNECT_SYN;
1390 xSocketToDelete.usLocalPort = usLocalPort;
1391
1392 xChildSocket.u.xTCP.eTCPState = eTCP_LISTEN;
1393 xChildSocket.usLocalPort = usLocalPort + 1;
1394 xChildSocket.u.xTCP.usChildCount = 100;
1395
1396 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1397
1398 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1399
1400 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1401
1402 prvTCPSetSocketCount( &xSocketToDelete );
1403
1404 TEST_ASSERT_EQUAL( 100, xChildSocket.u.xTCP.usChildCount );
1405 }
1406
1407 /**
1408 * @brief Set the socket count of a non-listening socket.
1409 */
test_prvTCPSetSocketCount_NotListeningSock_3(void)1410 void test_prvTCPSetSocketCount_NotListeningSock_3( void )
1411 {
1412 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1413 ListItem_t xIterator;
1414 uint16_t usLocalPort = 0x1234;
1415
1416 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1417 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1418
1419 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1420 xSocketToDelete.u.xTCP.eTCPState = eCONNECT_SYN;
1421 xSocketToDelete.usLocalPort = usLocalPort;
1422
1423 xChildSocket.u.xTCP.eTCPState = eTCP_LISTEN;
1424 xChildSocket.usLocalPort = usLocalPort;
1425 xChildSocket.u.xTCP.usChildCount = 0;
1426
1427 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1428
1429 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1430
1431 listGET_NEXT_ExpectAndReturn( &( xIterator ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
1432
1433 prvTCPSetSocketCount( &xSocketToDelete );
1434
1435 TEST_ASSERT_EQUAL( 0, xChildSocket.u.xTCP.usChildCount );
1436 }
1437
1438 /**
1439 * @brief Happy path of setting socket count of a non-listening socket.
1440 */
test_prvTCPSetSocketCount_NotListeningSock_HappyPath(void)1441 void test_prvTCPSetSocketCount_NotListeningSock_HappyPath( void )
1442 {
1443 FreeRTOS_Socket_t xSocketToDelete, xChildSocket;
1444 ListItem_t xIterator;
1445 uint16_t usLocalPort = 0x1234;
1446
1447 memset( &xSocketToDelete, 0, sizeof( xSocketToDelete ) );
1448 memset( &xChildSocket, 0, sizeof( xChildSocket ) );
1449
1450 xSocketToDelete.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1451 xSocketToDelete.u.xTCP.eTCPState = eCONNECT_SYN;
1452 xSocketToDelete.usLocalPort = usLocalPort;
1453
1454 xChildSocket.u.xTCP.eTCPState = eTCP_LISTEN;
1455 xChildSocket.usLocalPort = usLocalPort;
1456 xChildSocket.u.xTCP.usChildCount = 100;
1457
1458 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &( xIterator ) );
1459
1460 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xChildSocket );
1461
1462 prvTCPSetSocketCount( &xSocketToDelete );
1463
1464 TEST_ASSERT_EQUAL( 99, xChildSocket.u.xTCP.usChildCount );
1465 }
1466
1467 /**
1468 * @brief Invalid protocol.
1469 */
test_prvSockopt_so_buffer_InvalidProtocol(void)1470 void test_prvSockopt_so_buffer_InvalidProtocol( void )
1471 {
1472 FreeRTOS_Socket_t xSocket;
1473 int32_t lOptionName;
1474 uint8_t vOptionValue[ sizeof( uintptr_t ) ];
1475 BaseType_t xReturn;
1476
1477 memset( &xSocket, 0, sizeof( xSocket ) );
1478
1479 xReturn = prvSockopt_so_buffer( &xSocket, lOptionName, vOptionValue );
1480
1481 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1482 }
1483
1484 /**
1485 * @brief Invalid option.
1486 */
test_prvSockopt_so_buffer_InvalidOption1(void)1487 void test_prvSockopt_so_buffer_InvalidOption1( void )
1488 {
1489 FreeRTOS_Socket_t xSocket;
1490 int32_t lOptionName;
1491 uint32_t vOptionValue = 0xABCD1234;
1492 BaseType_t xReturn;
1493
1494 memset( &xSocket, 0, sizeof( xSocket ) );
1495
1496 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1497
1498 lOptionName = FREERTOS_SO_SNDBUF;
1499 xSocket.u.xTCP.txStream = NULL;
1500 xSocket.u.xTCP.usMSS = 0x12;
1501
1502 FreeRTOS_round_up_ExpectAndReturn( vOptionValue, xSocket.u.xTCP.usMSS, 0xAB );
1503
1504 xReturn = prvSockopt_so_buffer( &xSocket, lOptionName, &vOptionValue );
1505
1506 TEST_ASSERT_EQUAL( 0, xReturn );
1507 TEST_ASSERT_EQUAL( 0xAB, xSocket.u.xTCP.uxTxStreamSize );
1508 }
1509
1510 /**
1511 * @brief Invalid option.
1512 */
test_prvSockopt_so_buffer_InvalidOption2(void)1513 void test_prvSockopt_so_buffer_InvalidOption2( void )
1514 {
1515 FreeRTOS_Socket_t xSocket;
1516 int32_t lOptionName;
1517 uint8_t vOptionValue[ sizeof( uintptr_t ) ];
1518 BaseType_t xReturn;
1519 StreamBuffer_t xBuffer;
1520
1521 memset( &xSocket, 0, sizeof( xSocket ) );
1522
1523 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1524
1525 lOptionName = FREERTOS_SO_SNDBUF;
1526 xSocket.u.xTCP.txStream = &xBuffer;
1527
1528 xReturn = prvSockopt_so_buffer( &xSocket, lOptionName, vOptionValue );
1529
1530 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1531 }
1532
1533 /**
1534 * @brief Invalid option.
1535 */
test_prvSockopt_so_buffer_InvalidOption3(void)1536 void test_prvSockopt_so_buffer_InvalidOption3( void )
1537 {
1538 FreeRTOS_Socket_t xSocket;
1539 int32_t lOptionName;
1540 uint32_t vOptionValue = 0xABCD1234;
1541 BaseType_t xReturn;
1542
1543 memset( &xSocket, 0, sizeof( xSocket ) );
1544
1545 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1546
1547 lOptionName = FREERTOS_SO_RCVBUF;
1548 xSocket.u.xTCP.rxStream = NULL;
1549
1550 xReturn = prvSockopt_so_buffer( &xSocket, lOptionName, &vOptionValue );
1551
1552 TEST_ASSERT_EQUAL( 0, xReturn );
1553 TEST_ASSERT_EQUAL( vOptionValue, xSocket.u.xTCP.uxRxStreamSize );
1554 }
1555
1556 /**
1557 * @brief Invalid option.
1558 */
test_prvSockopt_so_buffer_InvalidOption4(void)1559 void test_prvSockopt_so_buffer_InvalidOption4( void )
1560 {
1561 FreeRTOS_Socket_t xSocket;
1562 int32_t lOptionName;
1563 uint8_t vOptionValue[ sizeof( uintptr_t ) ];
1564 BaseType_t xReturn;
1565 StreamBuffer_t xBuffer;
1566
1567 memset( &xSocket, 0, sizeof( xSocket ) );
1568
1569 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1570
1571 lOptionName = FREERTOS_SO_RCVBUF;
1572 xSocket.u.xTCP.rxStream = &xBuffer;
1573
1574 xReturn = prvSockopt_so_buffer( &xSocket, lOptionName, vOptionValue );
1575
1576 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1577 }
1578
1579 /**
1580 * @brief Getting private port number fails as RNG fails.
1581 */
test_prvGetPrivatePortNumber_TCP_RNGFails(void)1582 void test_prvGetPrivatePortNumber_TCP_RNGFails( void )
1583 {
1584 uint16_t usReturn;
1585 BaseType_t xProtocol = FREERTOS_IPPROTO_TCP;
1586
1587 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdFALSE );
1588
1589 usReturn = prvGetPrivatePortNumber( xProtocol );
1590
1591 TEST_ASSERT_EQUAL( 0, usReturn );
1592 }
1593
1594 /**
1595 * @brief Port number not received as IP task is not ready.
1596 */
test_prvGetPrivatePortNumber_TCP_IPTaskNotReady(void)1597 void test_prvGetPrivatePortNumber_TCP_IPTaskNotReady( void )
1598 {
1599 uint16_t usReturn;
1600 BaseType_t xProtocol = FREERTOS_IPPROTO_TCP;
1601
1602 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1603
1604 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
1605
1606 usReturn = prvGetPrivatePortNumber( xProtocol );
1607
1608 TEST_ASSERT_EQUAL( 4, usReturn );
1609 }
1610
1611 /**
1612 * @brief Port number acquired success.
1613 */
test_prvGetPrivatePortNumber_TCP_Found(void)1614 void test_prvGetPrivatePortNumber_TCP_Found( void )
1615 {
1616 uint16_t usReturn;
1617 BaseType_t xProtocol = FREERTOS_IPPROTO_TCP;
1618 ListItem_t xLocalListEnd;
1619 ListItem_t xIterator;
1620
1621 xRNGStatus = pdTRUE;
1622 xRandomNumberToReturn = 1234;
1623 TickType_t xWantedItemValue = 53768;
1624
1625 xApplicationGetRandomNumber_Stub( xStubApplicationGetRandomNumber );
1626
1627 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
1628
1629 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &xIterator );
1630
1631 listGET_LIST_ITEM_VALUE_ExpectAndReturn( &xIterator, xWantedItemValue );
1632
1633 xApplicationGetRandomNumber_Stub( xStubApplicationGetRandomNumber );
1634
1635 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
1636
1637 usReturn = prvGetPrivatePortNumber( xProtocol );
1638
1639 TEST_ASSERT_EQUAL( xWantedItemValue, usReturn );
1640 }
1641
1642 /**
1643 * @brief Port number for UDP fails as RNG fails.
1644 */
test_prvGetPrivatePortNumber_UDP_RNGFails(void)1645 void test_prvGetPrivatePortNumber_UDP_RNGFails( void )
1646 {
1647 uint16_t usReturn;
1648 BaseType_t xProtocol = FREERTOS_IPPROTO_UDP;
1649
1650 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdFALSE );
1651
1652 usReturn = prvGetPrivatePortNumber( xProtocol );
1653
1654 TEST_ASSERT_EQUAL( 0, usReturn );
1655 }
1656
1657 /**
1658 * @brief Don't get a port number as IP task is not ready.
1659 */
test_prvGetPrivatePortNumber_UDP_IPTaskNotReady(void)1660 void test_prvGetPrivatePortNumber_UDP_IPTaskNotReady( void )
1661 {
1662 uint16_t usReturn;
1663 BaseType_t xProtocol = FREERTOS_IPPROTO_UDP;
1664
1665 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1666
1667 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
1668
1669 usReturn = prvGetPrivatePortNumber( xProtocol );
1670
1671 TEST_ASSERT_EQUAL( 4, usReturn );
1672 }
1673
1674 /**
1675 * @brief UDP port number found success.
1676 */
test_prvGetPrivatePortNumber_UDP_Found(void)1677 void test_prvGetPrivatePortNumber_UDP_Found( void )
1678 {
1679 uint16_t usReturn;
1680 BaseType_t xProtocol = FREERTOS_IPPROTO_UDP;
1681 ListItem_t xLocalListEnd;
1682 ListItem_t xIterator;
1683
1684 xRNGStatus = pdTRUE;
1685 xRandomNumberToReturn = 1234;
1686 TickType_t xWantedItemValue = 53768;
1687
1688 xApplicationGetRandomNumber_Stub( xStubApplicationGetRandomNumber );
1689
1690 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
1691
1692 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundUDPSocketsList.xListEnd ), &xIterator );
1693
1694 listGET_LIST_ITEM_VALUE_ExpectAndReturn( &xIterator, xWantedItemValue );
1695
1696 xApplicationGetRandomNumber_Stub( xStubApplicationGetRandomNumber );
1697
1698 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
1699
1700 usReturn = prvGetPrivatePortNumber( xProtocol );
1701
1702 TEST_ASSERT_EQUAL( xWantedItemValue, usReturn );
1703 }
1704
1705 /**
1706 * @brief UDP port number not found after all iterations.
1707 */
test_prvGetPrivatePortNumber_UDP_NotFoundAfterAllIterations(void)1708 void test_prvGetPrivatePortNumber_UDP_NotFoundAfterAllIterations( void )
1709 {
1710 uint16_t usReturn;
1711 BaseType_t xProtocol = FREERTOS_IPPROTO_UDP;
1712 ListItem_t xLocalListEnd;
1713 ListItem_t xIterator;
1714
1715 xRNGStatus = pdTRUE;
1716 xRandomNumberToReturn = 1234;
1717 TickType_t xWantedItemValue = 53768;
1718
1719 xApplicationGetRandomNumber_Stub( xStubApplicationGetRandomNumber );
1720
1721 xIPIsNetworkTaskReady_IgnoreAndReturn( pdTRUE );
1722
1723 listGET_NEXT_IgnoreAndReturn( &xIterator );
1724
1725 listGET_LIST_ITEM_VALUE_IgnoreAndReturn( xWantedItemValue );
1726
1727 usReturn = prvGetPrivatePortNumber( xProtocol );
1728
1729 TEST_ASSERT_EQUAL( 0, usReturn );
1730 }
1731
1732 /**
1733 * @brief Finding in a NULL list.
1734 */
test_pxListFindListItemWithValue_NULLList(void)1735 void test_pxListFindListItemWithValue_NULLList( void )
1736 {
1737 const ListItem_t * pxReturn;
1738 List_t xList;
1739 TickType_t xWantedItemValue;
1740
1741 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
1742
1743 pxReturn = pxListFindListItemWithValue( NULL, xWantedItemValue );
1744
1745 TEST_ASSERT_EQUAL( NULL, pxReturn );
1746 }
1747
1748 /**
1749 * @brief Finding in a list when IP task is not ready.
1750 */
test_pxListFindListItemWithValue_IPTaskNotReady(void)1751 void test_pxListFindListItemWithValue_IPTaskNotReady( void )
1752 {
1753 const ListItem_t * pxReturn;
1754 List_t xList;
1755 TickType_t xWantedItemValue;
1756
1757 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
1758
1759 pxReturn = pxListFindListItemWithValue( &xList, xWantedItemValue );
1760
1761 TEST_ASSERT_EQUAL( NULL, pxReturn );
1762 }
1763
1764 /**
1765 * @brief Finding in list when there is nothing in the list.
1766 */
test_pxListFindListItemWithValue_ListLengthZero(void)1767 void test_pxListFindListItemWithValue_ListLengthZero( void )
1768 {
1769 const ListItem_t * pxReturn;
1770 List_t xList;
1771 TickType_t xWantedItemValue;
1772
1773 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
1774
1775 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xList.xListEnd ), ( ListItem_t * ) &( xList.xListEnd ) );
1776
1777 pxReturn = pxListFindListItemWithValue( &xList, xWantedItemValue );
1778
1779 TEST_ASSERT_EQUAL( NULL, pxReturn );
1780 }
1781
1782 /**
1783 * @brief Value being searched for not found.
1784 */
test_pxListFindListItemWithValue_NotFound(void)1785 void test_pxListFindListItemWithValue_NotFound( void )
1786 {
1787 const ListItem_t * pxReturn;
1788 List_t xList;
1789 ListItem_t xLocalListItem;
1790 TickType_t xWantedItemValue = 0xABAB;
1791
1792 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
1793
1794 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xList.xListEnd ), ( ListItem_t * ) &( xLocalListItem ) );
1795
1796 listGET_LIST_ITEM_VALUE_ExpectAndReturn( &( xLocalListItem ), xWantedItemValue - 1 );
1797
1798 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xLocalListItem ), ( ListItem_t * ) &( xList.xListEnd ) );
1799
1800 pxReturn = pxListFindListItemWithValue( &xList, xWantedItemValue );
1801
1802 TEST_ASSERT_EQUAL( NULL, pxReturn );
1803 }
1804
1805 /**
1806 * @brief Value found.
1807 */
test_pxListFindListItemWithValue_Found(void)1808 void test_pxListFindListItemWithValue_Found( void )
1809 {
1810 const ListItem_t * pxReturn;
1811 List_t xList;
1812 ListItem_t xLocalListItem;
1813 TickType_t xWantedItemValue = 0xABAB;
1814
1815 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
1816
1817 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xList.xListEnd ), &( xLocalListItem ) );
1818
1819 listGET_LIST_ITEM_VALUE_ExpectAndReturn( &( xLocalListItem ), xWantedItemValue );
1820
1821 pxReturn = pxListFindListItemWithValue( &xList, xWantedItemValue );
1822
1823 TEST_ASSERT_EQUAL_PTR( &( xLocalListItem ), pxReturn );
1824 }
1825
1826 /**
1827 * @brief Could not find UDP socket.
1828 */
test_pxUDPSocketLookup_NotFound(void)1829 void test_pxUDPSocketLookup_NotFound( void )
1830 {
1831 FreeRTOS_Socket_t * pxReturn;
1832 UBaseType_t uxLocalPort;
1833
1834 vpxListFindListItemWithValue_NotFound();
1835
1836 pxReturn = pxUDPSocketLookup( uxLocalPort );
1837
1838 TEST_ASSERT_EQUAL( NULL, pxReturn );
1839 }
1840
1841 /**
1842 * @brief Found a NULL socket.
1843 */
test_pxUDPSocketLookup_FoundNULLSocket(void)1844 void test_pxUDPSocketLookup_FoundNULLSocket( void )
1845 {
1846 FreeRTOS_Socket_t * pxReturn;
1847 UBaseType_t uxLocalPort = 0xBCDEF;
1848 ListItem_t xListItem;
1849
1850 vpxListFindListItemWithValue_Found( &xBoundUDPSocketsList, uxLocalPort, &xListItem );
1851
1852 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xListItem, NULL );
1853
1854 catch_assert( pxUDPSocketLookup( uxLocalPort ) );
1855 }
1856
1857 /**
1858 * @brief Found a proper UDP socket.
1859 */
test_pxUDPSocketLookup_Found(void)1860 void test_pxUDPSocketLookup_Found( void )
1861 {
1862 FreeRTOS_Socket_t * pxReturn;
1863 UBaseType_t uxLocalPort = 0xBCDEF;
1864 ListItem_t xListItem;
1865 FreeRTOS_Socket_t xLocalSocket;
1866
1867 vpxListFindListItemWithValue_Found( &xBoundUDPSocketsList, uxLocalPort, &xListItem );
1868
1869 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xListItem, &xLocalSocket );
1870
1871 pxReturn = pxUDPSocketLookup( uxLocalPort );
1872
1873 TEST_ASSERT_EQUAL( &xLocalSocket, pxReturn );
1874 }
1875
1876 /**
1877 * @brief Convert ascii values to hexadecimal values.
1878 */
test_ucASCIIToHex(void)1879 void test_ucASCIIToHex( void )
1880 {
1881 uint8_t ucHex, IdealValue;
1882 char ucInput;
1883
1884 ucInput = '0';
1885 IdealValue = 0;
1886
1887 for( int i = 0; i <= 9; i++ )
1888 {
1889 ucHex = ucASCIIToHex( ucInput + i );
1890 TEST_ASSERT_EQUAL( IdealValue + i, ucHex );
1891 }
1892
1893 ucInput = 'a';
1894 IdealValue = 10;
1895
1896 for( int i = 0; i < 6; i++ )
1897 {
1898 ucHex = ucASCIIToHex( ucInput + i );
1899 TEST_ASSERT_EQUAL( IdealValue + i, ucHex );
1900 }
1901
1902 ucInput = 'A';
1903 IdealValue = 10;
1904
1905 for( int i = 0; i < 6; i++ )
1906 {
1907 ucHex = ucASCIIToHex( ucInput + i );
1908 TEST_ASSERT_EQUAL( IdealValue + i, ucHex );
1909 }
1910
1911 for( char i = 0; ; i++ )
1912 {
1913 if( !( ( ( i >= 'a' ) && ( i <= 'f' ) ) ||
1914 ( ( i >= 'A' ) && ( i <= 'F' ) ) ||
1915 ( ( i >= '0' ) && ( i <= '9' ) ) ) )
1916 {
1917 ucHex = ucASCIIToHex( i );
1918 TEST_ASSERT_EQUAL( 0xFF, ucHex );
1919 }
1920
1921 if( i == 125 )
1922 {
1923 break;
1924 }
1925 }
1926 }
1927
1928 /**
1929 * @brief All fields NULL of socket.
1930 */
test_vSocketWakeUpUser_AllNULL(void)1931 void test_vSocketWakeUpUser_AllNULL( void )
1932 {
1933 FreeRTOS_Socket_t xSocket;
1934
1935 memset( &xSocket, 0, sizeof( xSocket ) );
1936
1937 vSocketWakeUpUser( &xSocket );
1938
1939 TEST_ASSERT_EQUAL( 0, xSocket.xEventBits );
1940 }
1941
1942 /**
1943 * @brief All fields are assigned of the socket.
1944 */
test_vSocketWakeUpUser_AllNonNULL(void)1945 void test_vSocketWakeUpUser_AllNonNULL( void )
1946 {
1947 FreeRTOS_Socket_t xSocket;
1948 uint8_t xLocalSemaphore[ sizeof( xSocket.pxUserSemaphore ) ];
1949 uint8_t xLocalSocketSet[ sizeof( xSocket.pxSocketSet ) ];
1950 uint8_t xLocalEventGroup[ sizeof( xSocket.xEventGroup ) ];
1951
1952 uxGlobalCallbackCount = 0;
1953 memset( &xSocket, 0, sizeof( xSocket ) );
1954
1955 xSocket.pxUserSemaphore = ( SemaphoreHandle_t ) xLocalSemaphore;
1956 xSocket.pxUserWakeCallback = vUserCallbackLocal;
1957 xSocket.pxSocketSet = ( SocketSelect_t * ) xLocalSocketSet;
1958 xSocket.xEventGroup = ( EventGroupHandle_t ) xLocalEventGroup;
1959
1960 xQueueGenericSend_ExpectAndReturn( xSocket.pxUserSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK, pdPASS );
1961
1962 vSocketWakeUpUser( &xSocket );
1963
1964 TEST_ASSERT_EQUAL( 1, uxGlobalCallbackCount );
1965 TEST_ASSERT_EQUAL( 0, xSocket.xEventBits );
1966 }
1967
1968 /**
1969 * @brief Event bits are set for the socket.
1970 */
test_vSocketWakeUpUser_AllNonNULL_EventBitsSet(void)1971 void test_vSocketWakeUpUser_AllNonNULL_EventBitsSet( void )
1972 {
1973 FreeRTOS_Socket_t xSocket;
1974 uint8_t xLocalSemaphore[ sizeof( xSocket.pxUserSemaphore ) ];
1975 uint8_t xLocalSocketSet[ sizeof( xSocket.pxSocketSet ) ];
1976 uint8_t xLocalEventGroup[ sizeof( xSocket.xEventGroup ) ];
1977
1978 uxGlobalCallbackCount = 0;
1979 memset( &xSocket, 0, sizeof( xSocket ) );
1980
1981 xSocket.pxUserSemaphore = ( SemaphoreHandle_t ) xLocalSemaphore;
1982 xSocket.pxUserWakeCallback = vUserCallbackLocal;
1983 xSocket.pxSocketSet = ( SocketSelect_t * ) xLocalSocketSet;
1984 xSocket.xEventGroup = ( EventGroupHandle_t ) xLocalEventGroup;
1985
1986 xSocket.xEventBits = ( eSOCKET_ALL << SOCKET_EVENT_BIT_COUNT ) | eSOCKET_ALL;
1987
1988 xQueueGenericSend_ExpectAndReturn( xSocket.pxUserSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK, pdPASS );
1989
1990 xEventGroupSetBits_ExpectAndReturn( xSocket.pxSocketSet->xSelectGroup, eSOCKET_ALL & eSELECT_ALL, pdPASS );
1991 xEventGroupSetBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_ALL, pdPASS );
1992
1993 vSocketWakeUpUser( &xSocket );
1994
1995 TEST_ASSERT_EQUAL( 1, uxGlobalCallbackCount );
1996 TEST_ASSERT_EQUAL( 0, xSocket.xEventBits );
1997 }
1998
1999 /**
2000 * @brief Test all states of which may connect.
2001 */
test_bMayConnect(void)2002 void test_bMayConnect( void )
2003 {
2004 BaseType_t xReturn;
2005 FreeRTOS_Socket_t xSocket;
2006
2007 memset( &xSocket, 0, sizeof( xSocket ) );
2008
2009 xSocket.u.xTCP.eTCPState = eCLOSED;
2010 xReturn = bMayConnect( &xSocket );
2011 TEST_ASSERT_EQUAL( 0, xReturn );
2012
2013 xSocket.u.xTCP.eTCPState = eCLOSE_WAIT;
2014 xReturn = bMayConnect( &xSocket );
2015 TEST_ASSERT_EQUAL( 0, xReturn );
2016
2017 xSocket.u.xTCP.eTCPState = eCONNECT_SYN;
2018 xReturn = bMayConnect( &xSocket );
2019 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINPROGRESS, xReturn );
2020
2021 xSocket.u.xTCP.eTCPState = eTCP_LISTEN;
2022 xReturn = bMayConnect( &xSocket );
2023 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAGAIN, xReturn );
2024
2025 xSocket.u.xTCP.eTCPState = eSYN_FIRST;
2026 xReturn = bMayConnect( &xSocket );
2027 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAGAIN, xReturn );
2028
2029 xSocket.u.xTCP.eTCPState = eSYN_RECEIVED;
2030 xReturn = bMayConnect( &xSocket );
2031 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAGAIN, xReturn );
2032
2033 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2034 xReturn = bMayConnect( &xSocket );
2035 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAGAIN, xReturn );
2036
2037 xSocket.u.xTCP.eTCPState = eFIN_WAIT_1;
2038 xReturn = bMayConnect( &xSocket );
2039 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAGAIN, xReturn );
2040
2041 xSocket.u.xTCP.eTCPState = eFIN_WAIT_2;
2042 xReturn = bMayConnect( &xSocket );
2043 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAGAIN, xReturn );
2044
2045 xSocket.u.xTCP.eTCPState = eCLOSING;
2046 xReturn = bMayConnect( &xSocket );
2047 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAGAIN, xReturn );
2048
2049 xSocket.u.xTCP.eTCPState = eLAST_ACK;
2050 xReturn = bMayConnect( &xSocket );
2051 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAGAIN, xReturn );
2052
2053 xSocket.u.xTCP.eTCPState = eTIME_WAIT;
2054 xReturn = bMayConnect( &xSocket );
2055 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAGAIN, xReturn );
2056 }
2057
2058 /**
2059 * @brief Try to connect to NULL address.
2060 */
test_prvTCPConnectStart_AddressNULL(void)2061 void test_prvTCPConnectStart_AddressNULL( void )
2062 {
2063 BaseType_t xReturn;
2064 FreeRTOS_Socket_t xSocket;
2065 struct freertos_sockaddr xAddress;
2066
2067 memset( &xSocket, 0, sizeof( xSocket ) );
2068 memset( &xAddress, 0, sizeof( xAddress ) );
2069
2070 xReturn = prvTCPConnectStart( &xSocket, NULL );
2071
2072 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
2073 }
2074
2075 /**
2076 * @brief Trying to connect with a invalid socket.
2077 */
test_prvTCPConnectStart_InvalidSocket(void)2078 void test_prvTCPConnectStart_InvalidSocket( void )
2079 {
2080 BaseType_t xReturn;
2081 FreeRTOS_Socket_t xSocket;
2082 struct freertos_sockaddr xAddress;
2083
2084 memset( &xSocket, 0, sizeof( xSocket ) );
2085 memset( &xAddress, 0, sizeof( xAddress ) );
2086
2087 xReturn = prvTCPConnectStart( &xSocket, &xAddress );
2088
2089 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EBADF, xReturn );
2090 }
2091
2092 /**
2093 * @brief Trying to connect an already connected socket.
2094 */
test_prvTCPConnectStart_SocketAlreadyConnected(void)2095 void test_prvTCPConnectStart_SocketAlreadyConnected( void )
2096 {
2097 BaseType_t xReturn;
2098 FreeRTOS_Socket_t xSocket;
2099 struct freertos_sockaddr xAddress;
2100
2101 memset( &xSocket, 0, sizeof( xSocket ) );
2102 memset( &xAddress, 0, sizeof( xAddress ) );
2103
2104 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2105 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2106
2107 xReturn = prvTCPConnectStart( &xSocket, &xAddress );
2108
2109 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EISCONN, xReturn );
2110 }
2111
2112 /**
2113 * @brief Connecting with an unbound socket.
2114 */
test_prvTCPConnectStart_SocketNotBound_Success(void)2115 void test_prvTCPConnectStart_SocketNotBound_Success( void )
2116 {
2117 BaseType_t xReturn;
2118 FreeRTOS_Socket_t xSocket;
2119 struct freertos_sockaddr xAddress;
2120
2121 memset( &xSocket, 0, sizeof( xSocket ) );
2122 memset( &xAddress, 0, sizeof( xAddress ) );
2123
2124 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2125
2126 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
2127
2128 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
2129
2130 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
2131
2132 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdPASS );
2133
2134 xEventGroupWaitBits_ExpectAnyArgsAndReturn( pdPASS );
2135
2136 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), &xBoundTCPSocketsList );
2137
2138 vTCPStateChange_Expect( &xSocket, eCONNECT_SYN );
2139
2140 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2141
2142 xReturn = prvTCPConnectStart( &xSocket, &xAddress );
2143
2144 TEST_ASSERT_EQUAL( 0, xReturn );
2145 }
2146
2147 /**
2148 * @brief Connecting with an unbound IPv6 socket.
2149 */
test_prvTCPConnectStart_IPv6SocketNotBound_Success(void)2150 void test_prvTCPConnectStart_IPv6SocketNotBound_Success( void )
2151 {
2152 BaseType_t xReturn;
2153 FreeRTOS_Socket_t xSocket;
2154 struct freertos_sockaddr xAddress;
2155
2156 memset( &xSocket, 0, sizeof( xSocket ) );
2157 memset( &xAddress, 0, sizeof( xAddress ) );
2158
2159 xAddress.sin_family = FREERTOS_AF_INET6;
2160 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2161
2162 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
2163
2164 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
2165
2166 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
2167
2168 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdPASS );
2169
2170 xEventGroupWaitBits_ExpectAnyArgsAndReturn( pdPASS );
2171
2172 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), &xBoundTCPSocketsList );
2173
2174 vTCPStateChange_Expect( &xSocket, eCONNECT_SYN );
2175
2176 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2177
2178 xReturn = prvTCPConnectStart( &xSocket, &xAddress );
2179
2180 TEST_ASSERT_EQUAL( 0, xReturn );
2181 TEST_ASSERT_EQUAL( pdTRUE, xSocket.bits.bIsIPv6 );
2182 }
2183
2184 /**
2185 * @brief Connecting with an unbound socket. Sending to IP task fails.
2186 */
test_prvTCPConnectStart_SocketNotBound_Failure(void)2187 void test_prvTCPConnectStart_SocketNotBound_Failure( void )
2188 {
2189 BaseType_t xReturn;
2190 FreeRTOS_Socket_t xSocket;
2191 struct freertos_sockaddr xAddress;
2192
2193 memset( &xSocket, 0, sizeof( xSocket ) );
2194 memset( &xAddress, 0, sizeof( xAddress ) );
2195
2196 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2197
2198 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
2199
2200 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
2201
2202 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
2203
2204 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdPASS );
2205
2206 xEventGroupWaitBits_ExpectAnyArgsAndReturn( pdPASS );
2207
2208 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), &xBoundTCPSocketsList );
2209
2210 vTCPStateChange_Expect( &xSocket, eCONNECT_SYN );
2211
2212 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdFAIL );
2213
2214 xReturn = prvTCPConnectStart( &xSocket, &xAddress );
2215
2216 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ECANCELED, xReturn );
2217 }
2218
2219 /**
2220 * @brief Connecting with an unbound socket. Connection is in progress.
2221 */
test_prvTCPConnectStart_SocketNotBound_Failure2(void)2222 void test_prvTCPConnectStart_SocketNotBound_Failure2( void )
2223 {
2224 BaseType_t xReturn;
2225 FreeRTOS_Socket_t xSocket;
2226 struct freertos_sockaddr xAddress;
2227
2228 memset( &xSocket, 0, sizeof( xSocket ) );
2229 memset( &xAddress, 0, sizeof( xAddress ) );
2230
2231 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2232 xSocket.u.xTCP.eTCPState = eCONNECT_SYN;
2233
2234 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
2235
2236 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
2237
2238 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
2239
2240 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdPASS );
2241
2242 xEventGroupWaitBits_ExpectAnyArgsAndReturn( pdPASS );
2243
2244 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), &xBoundTCPSocketsList );
2245
2246 xReturn = prvTCPConnectStart( &xSocket, &xAddress );
2247
2248 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINPROGRESS, xReturn );
2249 }
2250
2251 /**
2252 * @brief Socket is already bound and is trying to connect.
2253 */
test_prvTCPConnectStart_SocketBound_Failure(void)2254 void test_prvTCPConnectStart_SocketBound_Failure( void )
2255 {
2256 BaseType_t xReturn;
2257 FreeRTOS_Socket_t xSocket;
2258 struct freertos_sockaddr xAddress;
2259
2260 memset( &xSocket, 0, sizeof( xSocket ) );
2261 memset( &xAddress, 0, sizeof( xAddress ) );
2262
2263 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2264 xSocket.u.xTCP.eTCPState = eCONNECT_SYN;
2265
2266 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), &xBoundTCPSocketsList );
2267
2268 xReturn = prvTCPConnectStart( &xSocket, &xAddress );
2269
2270 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINPROGRESS, xReturn );
2271 }
2272
2273 /**
2274 * @brief invalid values.
2275 */
test_prvTCPSendCheck_InvalidValues(void)2276 void test_prvTCPSendCheck_InvalidValues( void )
2277 {
2278 int32_t lReturn;
2279 FreeRTOS_Socket_t xSocket;
2280 size_t uxDataLength;
2281 uint8_t ucStream[ 1500 ];
2282 eIPTCPState_t array[] = { eCLOSED, eCLOSE_WAIT, eCLOSING };
2283 StreamBuffer_t xLocalStreamBuffer;
2284
2285 memset( &xSocket, 0, sizeof( xSocket ) );
2286
2287 /* Invalid protocol. */
2288 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2289 lReturn = prvTCPSendCheck( &xSocket, uxDataLength );
2290 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, lReturn );
2291
2292 /* Unbound socket. */
2293 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( NULL );
2294 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2295 lReturn = prvTCPSendCheck( &xSocket, uxDataLength );
2296 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, lReturn );
2297
2298 /* No memory. */
2299 xSocket.u.xTCP.bits.bMallocError = pdTRUE;
2300 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2301 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2302 lReturn = prvTCPSendCheck( &xSocket, uxDataLength );
2303 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOMEM, lReturn );
2304
2305 /* Invalid states. */
2306 xSocket.u.xTCP.bits.bMallocError = pdFALSE;
2307 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2308
2309 for( unsigned int i = 0; i < sizeof( array ) / sizeof( eIPTCPState_t ); i++ )
2310 {
2311 xSocket.u.xTCP.eTCPState = array[ i ];
2312 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2313 lReturn = prvTCPSendCheck( &xSocket, uxDataLength );
2314 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOTCONN, lReturn );
2315 }
2316
2317 /* Closing connection. */
2318 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2319 xSocket.u.xTCP.bits.bFinSent = pdTRUE_UNSIGNED;
2320 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2321 lReturn = prvTCPSendCheck( &xSocket, uxDataLength );
2322 TEST_ASSERT_EQUAL( 0, lReturn );
2323
2324 /* 0 data length. */
2325 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2326 xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
2327 uxDataLength = 0;
2328 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2329 lReturn = prvTCPSendCheck( &xSocket, uxDataLength );
2330 TEST_ASSERT_EQUAL( 0, lReturn );
2331
2332 /* Could not allocate a stream. */
2333 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2334 xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
2335 uxDataLength = 10;
2336 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2337 pvPortMalloc_ExpectAnyArgsAndReturn( NULL );
2338 vTCPStateChange_ExpectAnyArgs();
2339 lReturn = prvTCPSendCheck( &xSocket, uxDataLength );
2340 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOMEM, lReturn );
2341
2342 /* Allocate a stream. */
2343 memset( &xSocket, 0, sizeof( xSocket ) );
2344 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2345 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2346 xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
2347 uxDataLength = 10;
2348 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2349 size_t xSizeOfBufferRequested = ( ( sizeof( size_t ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( xLocalStreamBuffer ) ) - sizeof( xLocalStreamBuffer.ucArray );
2350 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ucStream );
2351 lReturn = prvTCPSendCheck( &xSocket, uxDataLength );
2352 TEST_ASSERT_EQUAL( 1, lReturn );
2353 TEST_ASSERT_EQUAL( ( sizeof( size_t ) & ( ~( sizeof( size_t ) - 1U ) ) ), ( ( StreamBuffer_t * ) ucStream )->LENGTH );
2354 TEST_ASSERT_EQUAL( ucStream, xSocket.u.xTCP.txStream );
2355
2356 /* Already allocated a stream. */
2357 memset( &xSocket, 0, sizeof( xSocket ) );
2358 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2359 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2360 xSocket.u.xTCP.bits.bFinSent = pdFALSE_UNSIGNED;
2361 xSocket.u.xTCP.txStream = &xLocalStreamBuffer;
2362 uxDataLength = 10;
2363 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2364 lReturn = prvTCPSendCheck( &xSocket, uxDataLength );
2365 TEST_ASSERT_EQUAL( 1, lReturn );
2366 }
2367
2368 /**
2369 * @brief Bound TCP socket list is empty.
2370 */
test_xTCPTimerCheck_EmptyList(void)2371 void test_xTCPTimerCheck_EmptyList( void )
2372 {
2373 TickType_t xReturn;
2374 BaseType_t xWillSleep = pdFALSE;
2375
2376 xTaskGetTickCount_ExpectAndReturn( 0 );
2377
2378 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2379
2380 xReturn = xTCPTimerCheck( xWillSleep );
2381
2382 TEST_ASSERT_EQUAL( pdMS_TO_TICKS( ( TickType_t ) 1000 ), xReturn );
2383 }
2384
2385 /**
2386 * @brief Socket checking results in an error.
2387 */
test_xTCPTimerCheck_NonEmptyList_SocketCheckError(void)2388 void test_xTCPTimerCheck_NonEmptyList_SocketCheckError( void )
2389 {
2390 TickType_t xReturn;
2391 BaseType_t xWillSleep = pdFALSE;
2392 ListItem_t xLocalListItem;
2393 FreeRTOS_Socket_t xSocket;
2394
2395 memset( &xSocket, 0, sizeof( xSocket ) );
2396 xSocket.u.xTCP.usTimeout = 10;
2397
2398 xTaskGetTickCount_ExpectAndReturn( 100 );
2399
2400 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, &xLocalListItem );
2401
2402 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2403
2404 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2405
2406 xTCPSocketCheck_ExpectAndReturn( &xSocket, -1 );
2407
2408 xReturn = xTCPTimerCheck( xWillSleep );
2409
2410 TEST_ASSERT_EQUAL( pdMS_TO_TICKS( ( TickType_t ) 1000 ), xReturn );
2411 }
2412
2413 /**
2414 * @brief Socket checking successful.
2415 */
test_xTCPTimerCheck_NonEmptyList_NoError(void)2416 void test_xTCPTimerCheck_NonEmptyList_NoError( void )
2417 {
2418 TickType_t xReturn;
2419 BaseType_t xWillSleep = pdFALSE;
2420 ListItem_t xLocalListItem;
2421 FreeRTOS_Socket_t xSocket;
2422
2423 memset( &xSocket, 0, sizeof( xSocket ) );
2424
2425 xSocket.u.xTCP.usTimeout = 10;
2426
2427 xTaskGetTickCount_ExpectAndReturn( 100 );
2428
2429 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, &xLocalListItem );
2430
2431 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2432
2433 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2434
2435 xTCPSocketCheck_ExpectAndReturn( &xSocket, 0 );
2436
2437 xReturn = xTCPTimerCheck( xWillSleep );
2438
2439 TEST_ASSERT_EQUAL( pdMS_TO_TICKS( ( TickType_t ) 1000 ), xReturn );
2440 }
2441
2442 /**
2443 * @brief Delta of times is less than the timeout value.
2444 */
test_xTCPTimerCheck_NonEmptyList_DeltaLessThanTimeout(void)2445 void test_xTCPTimerCheck_NonEmptyList_DeltaLessThanTimeout( void )
2446 {
2447 TickType_t xReturn;
2448 BaseType_t xWillSleep;
2449 ListItem_t xLocalListItem;
2450 FreeRTOS_Socket_t xSocket, xTimeOutZeroSocket;
2451
2452 memset( &xSocket, 0, sizeof( xSocket ) );
2453 memset( &xTimeOutZeroSocket, 0, sizeof( xTimeOutZeroSocket ) );
2454
2455 xSocket.u.xTCP.usTimeout = 10;
2456
2457 xTaskGetTickCount_ExpectAndReturn( 0 );
2458
2459 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, &xLocalListItem );
2460
2461 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xTimeOutZeroSocket );
2462
2463 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
2464
2465 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2466
2467 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2468
2469 xReturn = xTCPTimerCheck( xWillSleep );
2470
2471 TEST_ASSERT_EQUAL( pdMS_TO_TICKS( ( TickType_t ) 9 ), xReturn );
2472 TEST_ASSERT_EQUAL( 9, xSocket.u.xTCP.usTimeout );
2473 }
2474
2475 /**
2476 * @brief Delta of times is less than the timeout value.
2477 */
test_xTCPTimerCheck_NonEmptyList_DeltaLessThanTimeout1(void)2478 void test_xTCPTimerCheck_NonEmptyList_DeltaLessThanTimeout1( void )
2479 {
2480 TickType_t xReturn;
2481 BaseType_t xWillSleep;
2482 ListItem_t xLocalListItem;
2483 FreeRTOS_Socket_t xSocket, xTimeOutZeroSocket;
2484
2485 memset( &xSocket, 0, sizeof( xSocket ) );
2486 memset( &xTimeOutZeroSocket, 0, sizeof( xTimeOutZeroSocket ) );
2487
2488 xSocket.u.xTCP.usTimeout = 1008;
2489
2490 xTaskGetTickCount_ExpectAndReturn( 0 );
2491
2492 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, &xLocalListItem );
2493
2494 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xTimeOutZeroSocket );
2495
2496 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
2497
2498 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2499
2500 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2501
2502 xReturn = xTCPTimerCheck( xWillSleep );
2503
2504 TEST_ASSERT_EQUAL( pdMS_TO_TICKS( ( TickType_t ) 1000 ), xReturn );
2505 TEST_ASSERT_EQUAL( 1007, xSocket.u.xTCP.usTimeout );
2506 }
2507
2508 /**
2509 * @brief Event bits are non-zero and will sleep flag is reset.
2510 */
test_xTCPTimerCheck_EventBitsNonZeroWontSleep(void)2511 void test_xTCPTimerCheck_EventBitsNonZeroWontSleep( void )
2512 {
2513 TickType_t xReturn;
2514 BaseType_t xWillSleep = 0;
2515 ListItem_t xLocalListItem;
2516 FreeRTOS_Socket_t xSocket, xTimeOutZeroSocket;
2517
2518 memset( &xSocket, 0, sizeof( xSocket ) );
2519 memset( &xTimeOutZeroSocket, 0, sizeof( xTimeOutZeroSocket ) );
2520
2521 xSocket.u.xTCP.usTimeout = 1008;
2522 xSocket.xEventBits = 12;
2523
2524 xTaskGetTickCount_ExpectAndReturn( 0 );
2525
2526 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, &xLocalListItem );
2527
2528 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xTimeOutZeroSocket );
2529
2530 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
2531
2532 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2533
2534 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2535
2536 xReturn = xTCPTimerCheck( xWillSleep );
2537
2538 TEST_ASSERT_EQUAL( pdMS_TO_TICKS( ( TickType_t ) 0 ), xReturn );
2539 TEST_ASSERT_EQUAL( 1007, xSocket.u.xTCP.usTimeout );
2540 }
2541
2542 /**
2543 * @brief Event bits are non-zero and will sleep flag is set.
2544 */
test_xTCPTimerCheck_EventBitsNonZeroWillSleep(void)2545 void test_xTCPTimerCheck_EventBitsNonZeroWillSleep( void )
2546 {
2547 TickType_t xReturn;
2548 BaseType_t xWillSleep = pdTRUE;
2549 ListItem_t xLocalListItem;
2550 FreeRTOS_Socket_t xSocket, xTimeOutZeroSocket;
2551
2552 memset( &xSocket, 0, sizeof( xSocket ) );
2553 memset( &xTimeOutZeroSocket, 0, sizeof( xTimeOutZeroSocket ) );
2554
2555 xSocket.u.xTCP.usTimeout = 1008;
2556 xSocket.xEventBits = 12;
2557
2558 xTaskGetTickCount_ExpectAndReturn( 0 );
2559
2560 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, &xLocalListItem );
2561
2562 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xTimeOutZeroSocket );
2563
2564 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
2565
2566 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2567
2568 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2569
2570 xReturn = xTCPTimerCheck( xWillSleep );
2571
2572 TEST_ASSERT_EQUAL( pdMS_TO_TICKS( ( TickType_t ) 1000 ), xReturn );
2573 TEST_ASSERT_EQUAL( 1007, xSocket.u.xTCP.usTimeout );
2574 }
2575
2576 /**
2577 * @brief Found a matching socket in lookup.
2578 */
test_pxTCPSocketLookup_FoundAMatch(void)2579 void test_pxTCPSocketLookup_FoundAMatch( void )
2580 {
2581 FreeRTOS_Socket_t * pxReturn, xSocket, xMatchingSocket;
2582 uint32_t ulLocalIP = 0xAABBCCDD;
2583 UBaseType_t uxLocalPort = 0x1234;
2584 IPv46_Address_t xRemoteIP;
2585
2586 xRemoteIP.xIs_IPv6 = pdFALSE;
2587 xRemoteIP.xIPAddress.ulIP_IPv4 = 0xBCBCDCDC;
2588 UBaseType_t uxRemotePort = 0x4567;
2589 ListItem_t xLocalListItem;
2590
2591 memset( &xSocket, 0, sizeof( xSocket ) );
2592 memset( &xMatchingSocket, 0, sizeof( xMatchingSocket ) );
2593
2594 xMatchingSocket.usLocalPort = uxLocalPort;
2595 xMatchingSocket.u.xTCP.usRemotePort = uxRemotePort;
2596 xMatchingSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = xRemoteIP.xIPAddress.ulIP_IPv4;
2597
2598 /* First iteration, no match. */
2599 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &xLocalListItem );
2600 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2601
2602 /* Second iteration and we have a match. */
2603 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
2604 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xMatchingSocket );
2605
2606 pxReturn = pxTCPSocketLookup( ulLocalIP, uxLocalPort, xRemoteIP, uxRemotePort );
2607
2608 TEST_ASSERT_EQUAL_PTR( &xMatchingSocket, pxReturn );
2609 }
2610
2611 /**
2612 * @brief No match found while looking up a socket. IP doesn't match.
2613 */
test_pxTCPSocketLookup_NoMatch(void)2614 void test_pxTCPSocketLookup_NoMatch( void )
2615 {
2616 FreeRTOS_Socket_t * pxReturn, xSocket, xMatchingSocket;
2617 uint32_t ulLocalIP = 0xAABBCCDD;
2618 UBaseType_t uxLocalPort = 0x1234;
2619 IPv46_Address_t xRemoteIP;
2620
2621 xRemoteIP.xIs_IPv6 = pdFALSE;
2622 xRemoteIP.xIPAddress.ulIP_IPv4 = 0xBCBCDCDC;
2623 UBaseType_t uxRemotePort = 0x4567;
2624 ListItem_t xLocalListItem;
2625
2626 memset( &xSocket, 0, sizeof( xSocket ) );
2627 memset( &xMatchingSocket, 0, sizeof( xMatchingSocket ) );
2628
2629 xMatchingSocket.usLocalPort = uxLocalPort;
2630 xMatchingSocket.u.xTCP.usRemotePort = uxRemotePort;
2631 xMatchingSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = xRemoteIP.xIPAddress.ulIP_IPv4 + 1;
2632
2633 /* First iteration, no match. */
2634 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &xLocalListItem );
2635 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2636
2637 /* Second iteration and we have a match. */
2638 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
2639 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xMatchingSocket );
2640
2641 /* Third iteration. */
2642 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2643
2644 pxReturn = pxTCPSocketLookup( ulLocalIP, uxLocalPort, xRemoteIP, uxRemotePort );
2645
2646 TEST_ASSERT_EQUAL_PTR( NULL, pxReturn );
2647 }
2648
2649 /**
2650 * @brief No match found while looking up a socket. IP and port number doesn't match.
2651 */
test_pxTCPSocketLookup_NoMatch2(void)2652 void test_pxTCPSocketLookup_NoMatch2( void )
2653 {
2654 FreeRTOS_Socket_t * pxReturn, xSocket, xMatchingSocket;
2655 uint32_t ulLocalIP = 0xAABBCCDD;
2656 UBaseType_t uxLocalPort = 0x1234;
2657 IPv46_Address_t xRemoteIP;
2658
2659 xRemoteIP.xIs_IPv6 = pdFALSE;
2660 xRemoteIP.xIPAddress.ulIP_IPv4 = 0xBCBCDCDC;
2661 UBaseType_t uxRemotePort = 0x4567;
2662 ListItem_t xLocalListItem;
2663
2664 memset( &xSocket, 0, sizeof( xSocket ) );
2665 memset( &xMatchingSocket, 0, sizeof( xMatchingSocket ) );
2666
2667 xMatchingSocket.usLocalPort = uxLocalPort;
2668 xMatchingSocket.u.xTCP.usRemotePort = uxRemotePort + 1;
2669 xMatchingSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = xRemoteIP.xIPAddress.ulIP_IPv4 + 1;
2670
2671 /* First iteration, no match. */
2672 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &xLocalListItem );
2673 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2674
2675 /* Second iteration and we have a match. */
2676 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
2677 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xMatchingSocket );
2678
2679 /* Third iteration. */
2680 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2681
2682 pxReturn = pxTCPSocketLookup( ulLocalIP, uxLocalPort, xRemoteIP, uxRemotePort );
2683
2684 TEST_ASSERT_EQUAL_PTR( NULL, pxReturn );
2685 }
2686
2687 /**
2688 * @brief Found a partial match based on IP.
2689 */
test_pxTCPSocketLookup_FoundAPartialMatch(void)2690 void test_pxTCPSocketLookup_FoundAPartialMatch( void )
2691 {
2692 FreeRTOS_Socket_t * pxReturn, xSocket, xMatchingSocket;
2693 uint32_t ulLocalIP = 0xAABBCCDD;
2694 UBaseType_t uxLocalPort = 0x1234;
2695 IPv46_Address_t xRemoteIP;
2696
2697 xRemoteIP.xIs_IPv6 = pdFALSE;
2698 xRemoteIP.xIPAddress.ulIP_IPv4 = 0xBCBCDCDC;
2699 UBaseType_t uxRemotePort = 0x4567;
2700 ListItem_t xLocalListItem;
2701
2702 memset( &xSocket, 0, sizeof( xSocket ) );
2703 memset( &xMatchingSocket, 0, sizeof( xMatchingSocket ) );
2704
2705 xMatchingSocket.usLocalPort = uxLocalPort;
2706 xMatchingSocket.u.xTCP.usRemotePort = uxRemotePort + 1;
2707 xMatchingSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = xRemoteIP.xIPAddress.ulIP_IPv4;
2708 xMatchingSocket.u.xTCP.eTCPState = eTCP_LISTEN;
2709
2710 /* First iteration, no match. */
2711 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &xLocalListItem );
2712 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2713
2714 /* Second iteration and we have a partial match. */
2715 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
2716 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xMatchingSocket );
2717
2718 /* Third iteration. */
2719 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
2720
2721 pxReturn = pxTCPSocketLookup( ulLocalIP, uxLocalPort, xRemoteIP, uxRemotePort );
2722
2723 TEST_ASSERT_EQUAL_PTR( &xMatchingSocket, pxReturn );
2724 }
2725
2726 /**
2727 * @brief Found a match socket based on IPv6.
2728 */
test_pxTCPSocketLookup_IPv6Match(void)2729 void test_pxTCPSocketLookup_IPv6Match( void )
2730 {
2731 FreeRTOS_Socket_t * pxReturn, xSocket, xMatchingSocket;
2732 uint32_t ulLocalIP = 0xAABBCCDD;
2733 UBaseType_t uxLocalPort = 0x1234;
2734 IPv46_Address_t xRemoteIP;
2735 UBaseType_t uxRemotePort = 0x4567;
2736 ListItem_t xLocalListItem;
2737
2738 memset( &xSocket, 0, sizeof( xSocket ) );
2739 memset( &xRemoteIP, 0, sizeof( xRemoteIP ) );
2740 memset( &xMatchingSocket, 0, sizeof( xMatchingSocket ) );
2741
2742 xRemoteIP.xIs_IPv6 = pdTRUE;
2743 memcpy( xRemoteIP.xIPAddress.xIP_IPv6.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2744
2745 xMatchingSocket.usLocalPort = uxLocalPort;
2746 xMatchingSocket.u.xTCP.usRemotePort = uxRemotePort;
2747 memcpy( xMatchingSocket.u.xTCP.xRemoteIP.xIP_IPv6.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2748
2749 /* First iteration, no match. */
2750 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &xLocalListItem );
2751 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
2752
2753 /* Second iteration and we have a match. */
2754 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
2755 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xMatchingSocket );
2756 pxTCPSocketLookup_IPv6_ExpectAndReturn( &xMatchingSocket, NULL, &xMatchingSocket );
2757 pxTCPSocketLookup_IPv6_IgnoreArg_pxAddress();
2758
2759 pxReturn = pxTCPSocketLookup( ulLocalIP, uxLocalPort, xRemoteIP, uxRemotePort );
2760
2761 TEST_ASSERT_EQUAL_PTR( &xMatchingSocket, pxReturn );
2762 }
2763
2764 /**
2765 * @brief Low and high space fields zero.
2766 */
test_prvTCPCreateStream(void)2767 void test_prvTCPCreateStream( void )
2768 {
2769 StreamBuffer_t * pxReturn;
2770 FreeRTOS_Socket_t xSocket;
2771 BaseType_t xIsInputStream = pdTRUE;
2772 uint8_t ucStream[ ipconfigTCP_MSS ];
2773
2774 memset( &xSocket, 0, sizeof( xSocket ) );
2775
2776 xSocket.u.xTCP.uxRxStreamSize = 20;
2777 xSocket.u.xTCP.usMSS = 2;
2778 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( *pxReturn ) ) - sizeof( pxReturn->ucArray );
2779
2780 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ( StreamBuffer_t * ) ucStream );
2781
2782 pxReturn = prvTCPCreateStream( &xSocket, xIsInputStream );
2783
2784 TEST_ASSERT_EQUAL( 4, xSocket.u.xTCP.uxLittleSpace );
2785 TEST_ASSERT_EQUAL( 16, xSocket.u.xTCP.uxEnoughSpace );
2786 TEST_ASSERT_EQUAL( ucStream, xSocket.u.xTCP.rxStream );
2787 }
2788
2789 /**
2790 * @brief Low and high space fields zero.
2791 */
test_prvTCPCreateStream1(void)2792 void test_prvTCPCreateStream1( void )
2793 {
2794 StreamBuffer_t * pxReturn;
2795 FreeRTOS_Socket_t xSocket;
2796 BaseType_t xIsInputStream = pdTRUE;
2797 uint8_t ucStream[ ipconfigTCP_MSS ];
2798
2799 memset( &xSocket, 0, sizeof( xSocket ) );
2800
2801 xSocket.u.xTCP.uxRxStreamSize = 0;
2802 xSocket.u.xTCP.usMSS = 2;
2803 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( *pxReturn ) ) - sizeof( pxReturn->ucArray );
2804
2805 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ( StreamBuffer_t * ) ucStream );
2806
2807 pxReturn = prvTCPCreateStream( &xSocket, xIsInputStream );
2808
2809 TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.uxLittleSpace );
2810 TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.uxEnoughSpace );
2811 TEST_ASSERT_EQUAL( ucStream, xSocket.u.xTCP.rxStream );
2812 }
2813
2814 /**
2815 * @brief Low and high space fields non-zero.
2816 */
test_prvTCPCreateStream_LowAndHighFieldsDefined(void)2817 void test_prvTCPCreateStream_LowAndHighFieldsDefined( void )
2818 {
2819 StreamBuffer_t * pxReturn;
2820 FreeRTOS_Socket_t xSocket;
2821 BaseType_t xIsInputStream = pdTRUE;
2822 uint8_t ucStream[ ipconfigTCP_MSS ];
2823
2824 memset( &xSocket, 0, sizeof( xSocket ) );
2825
2826 xSocket.u.xTCP.uxRxStreamSize = 20;
2827 xSocket.u.xTCP.uxLittleSpace = 3;
2828 xSocket.u.xTCP.uxEnoughSpace = 17;
2829 xSocket.u.xTCP.usMSS = 10;
2830
2831 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( *pxReturn ) ) - sizeof( pxReturn->ucArray );
2832
2833 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ( StreamBuffer_t * ) ucStream );
2834
2835 pxReturn = prvTCPCreateStream( &xSocket, xIsInputStream );
2836
2837 TEST_ASSERT_EQUAL( 3, xSocket.u.xTCP.uxLittleSpace );
2838 TEST_ASSERT_EQUAL( 17, xSocket.u.xTCP.uxEnoughSpace );
2839 TEST_ASSERT_EQUAL( ucStream, xSocket.u.xTCP.rxStream );
2840 }
2841
2842 /**
2843 * @brief Failed to allocate the stream.
2844 */
test_lTCPAddRxdata_StreamCannotBeAllocated(void)2845 void test_lTCPAddRxdata_StreamCannotBeAllocated( void )
2846 {
2847 int32_t lReturn;
2848 FreeRTOS_Socket_t xSocket;
2849 size_t uxOffset;
2850 uint8_t pcData[ 20 ];
2851 uint32_t ulByteCount;
2852 StreamBuffer_t xStreamBuffer;
2853
2854 memset( &xSocket, 0, sizeof( xSocket ) );
2855
2856 xSocket.u.xTCP.uxRxStreamSize = 20;
2857 xSocket.u.xTCP.uxLittleSpace = 3;
2858 xSocket.u.xTCP.uxEnoughSpace = 17;
2859 xSocket.u.xTCP.usMSS = 10;
2860
2861 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( xStreamBuffer ) ) - sizeof( xStreamBuffer.ucArray );
2862
2863 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, NULL );
2864
2865 vTCPStateChange_Expect( &xSocket, eCLOSE_WAIT );
2866
2867 lReturn = lTCPAddRxdata( &xSocket, uxOffset, pcData, ulByteCount );
2868
2869 TEST_ASSERT_EQUAL( -1, lReturn );
2870 TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bMallocError );
2871 }
2872
2873 /**
2874 * @brief Successfully added all bytes in the stream.
2875 */
test_lTCPAddRxdata_SteamCreationSuccessful_AllBytesAdded(void)2876 void test_lTCPAddRxdata_SteamCreationSuccessful_AllBytesAdded( void )
2877 {
2878 int32_t lReturn;
2879 FreeRTOS_Socket_t xSocket;
2880 size_t uxOffset = 0;
2881 uint8_t pcData[ 20 ];
2882 uint32_t ulByteCount = 120;
2883 uint8_t ucStream[ ipconfigTCP_MSS ];
2884 StreamBuffer_t xStreamBuffer;
2885
2886 memset( &xSocket, 0, sizeof( xSocket ) );
2887
2888 xSocket.u.xTCP.uxRxStreamSize = 20;
2889 xSocket.u.xTCP.uxLittleSpace = 3;
2890 xSocket.u.xTCP.uxEnoughSpace = 17;
2891 xSocket.u.xTCP.usMSS = 10;
2892
2893 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( xStreamBuffer ) ) - sizeof( xStreamBuffer.ucArray );
2894
2895 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ( StreamBuffer_t * ) ucStream );
2896
2897 uxStreamBufferAdd_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, uxOffset, pcData, ulByteCount, ulByteCount );
2898
2899 uxStreamBufferFrontSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 10 );
2900
2901 lReturn = lTCPAddRxdata( &xSocket, uxOffset, pcData, ulByteCount );
2902
2903 TEST_ASSERT_EQUAL( ulByteCount, lReturn );
2904 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bMallocError );
2905 TEST_ASSERT_EQUAL( eSOCKET_RECEIVE, xSocket.xEventBits );
2906 }
2907
2908 /**
2909 * @brief Only able to add few bytes.
2910 */
test_lTCPAddRxdata_SteamCreationSuccessful_AllBytesNotAdded(void)2911 void test_lTCPAddRxdata_SteamCreationSuccessful_AllBytesNotAdded( void )
2912 {
2913 int32_t lReturn;
2914 FreeRTOS_Socket_t xSocket;
2915 size_t uxOffset = 0;
2916 uint8_t pcData[ 20 ];
2917 uint32_t ulByteCount = 120;
2918 uint8_t ucStream[ ipconfigTCP_MSS ];
2919 StreamBuffer_t xStreamBuffer;
2920
2921 memset( &xSocket, 0, sizeof( xSocket ) );
2922
2923 xSocket.u.xTCP.uxRxStreamSize = 20;
2924 xSocket.u.xTCP.uxLittleSpace = 3;
2925 xSocket.u.xTCP.uxEnoughSpace = 17;
2926 xSocket.u.xTCP.usMSS = 10;
2927
2928 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( xStreamBuffer ) ) - sizeof( xStreamBuffer.ucArray );
2929
2930 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ucStream );
2931
2932 uxStreamBufferAdd_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, uxOffset, pcData, ulByteCount, ulByteCount - 10 );
2933
2934 uxStreamBufferFrontSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 10 );
2935
2936 lReturn = lTCPAddRxdata( &xSocket, uxOffset, pcData, ulByteCount );
2937
2938 TEST_ASSERT_EQUAL( ulByteCount - 10, lReturn );
2939 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bMallocError );
2940 TEST_ASSERT_EQUAL( eSOCKET_RECEIVE, xSocket.xEventBits );
2941 }
2942
2943 /**
2944 * @brief Space in the front of the stream buffer is less than the low space value.
2945 */
test_lTCPAddRxdata_FrontSpaceLessThanLowMark(void)2946 void test_lTCPAddRxdata_FrontSpaceLessThanLowMark( void )
2947 {
2948 int32_t lReturn;
2949 FreeRTOS_Socket_t xSocket;
2950 size_t uxOffset = 0;
2951 uint8_t pcData[ 20 ];
2952 uint32_t ulByteCount = 120;
2953 uint8_t ucStream[ ipconfigTCP_MSS ];
2954 StreamBuffer_t xStreamBuffer;
2955
2956 memset( &xSocket, 0, sizeof( xSocket ) );
2957
2958 xSocket.u.xTCP.uxRxStreamSize = 200;
2959 xSocket.u.xTCP.uxLittleSpace = 120;
2960 xSocket.u.xTCP.uxEnoughSpace = 200;
2961 xSocket.xSelectBits = eSELECT_READ;
2962 xSocket.u.xTCP.usMSS = 10;
2963
2964 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( xStreamBuffer ) ) - sizeof( xStreamBuffer.ucArray );
2965
2966 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ucStream );
2967
2968 uxStreamBufferAdd_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, uxOffset, pcData, ulByteCount, ulByteCount - 10 );
2969
2970 uxStreamBufferFrontSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 10 );
2971
2972 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2973
2974 lReturn = lTCPAddRxdata( &xSocket, uxOffset, pcData, ulByteCount );
2975
2976 TEST_ASSERT_EQUAL( ulByteCount - 10, lReturn );
2977 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bMallocError );
2978 TEST_ASSERT_EQUAL( eSOCKET_RECEIVE | ( eSELECT_READ << SOCKET_EVENT_BIT_COUNT ), xSocket.xEventBits );
2979 TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bLowWater );
2980 TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bWinChange );
2981 TEST_ASSERT_EQUAL( 1U, xSocket.u.xTCP.usTimeout );
2982 }
2983
2984 /**
2985 * @brief the low water bit is set.
2986 */
test_lTCPAddRxdata_LowWaterTrue(void)2987 void test_lTCPAddRxdata_LowWaterTrue( void )
2988 {
2989 int32_t lReturn;
2990 FreeRTOS_Socket_t xSocket;
2991 size_t uxOffset = 0;
2992 uint8_t pcData[ 20 ];
2993 uint32_t ulByteCount = 120;
2994 uint8_t ucStream[ ipconfigTCP_MSS ];
2995 StreamBuffer_t xStreamBuffer;
2996
2997 memset( &xSocket, 0, sizeof( xSocket ) );
2998
2999 xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) ucStream;
3000 xSocket.u.xTCP.uxRxStreamSize = 200;
3001 xSocket.u.xTCP.uxLittleSpace = 120;
3002 xSocket.u.xTCP.uxEnoughSpace = 200;
3003 xSocket.xSelectBits = eSELECT_READ;
3004 xSocket.u.xTCP.bits.bLowWater = pdTRUE;
3005 xSocket.u.xTCP.usMSS = 10;
3006
3007 uxStreamBufferAdd_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, uxOffset, pcData, ulByteCount, ulByteCount - 10 );
3008
3009 lReturn = lTCPAddRxdata( &xSocket, uxOffset, pcData, ulByteCount );
3010
3011 TEST_ASSERT_EQUAL( ulByteCount - 10, lReturn );
3012 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bMallocError );
3013 TEST_ASSERT_EQUAL( eSOCKET_RECEIVE | ( eSELECT_READ << SOCKET_EVENT_BIT_COUNT ), xSocket.xEventBits );
3014 }
3015
3016 /**
3017 * @brief Receive callback is added.
3018 */
test_lTCPAddRxdata_HasValidHandler(void)3019 void test_lTCPAddRxdata_HasValidHandler( void )
3020 {
3021 int32_t lReturn;
3022 FreeRTOS_Socket_t xSocket;
3023 size_t uxOffset = 0;
3024 uint8_t pcData[ 20 ];
3025 uint32_t ulByteCount = 120;
3026 uint8_t ucStream[ ipconfigTCP_MSS ];
3027 StreamBuffer_t xStreamBuffer;
3028
3029 xLocalReceiveCallback_Called = 0;
3030
3031 memset( &xSocket, 0, sizeof( xSocket ) );
3032
3033 xSocket.u.xTCP.uxRxStreamSize = 200;
3034 xSocket.u.xTCP.uxLittleSpace = 120;
3035 xSocket.u.xTCP.uxEnoughSpace = 200;
3036 xSocket.xSelectBits = eSELECT_READ;
3037 xSocket.u.xTCP.pxHandleReceive = xLocalReceiveCallback;
3038 xSocket.u.xTCP.usMSS = 10;
3039
3040 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( xStreamBuffer ) ) - sizeof( xStreamBuffer.ucArray );
3041
3042 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ucStream );
3043
3044 uxStreamBufferGetSize_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0U );
3045
3046 uxStreamBufferAdd_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, uxOffset, NULL, ulByteCount, ulByteCount - 10 );
3047
3048 uxStreamBufferGet_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0U, NULL, ulByteCount, pdFALSE, pdTRUE );
3049
3050 uxStreamBufferGetPtr_ExpectAnyArgsAndReturn( 0U );
3051
3052 lReturn = lTCPAddRxdata( &xSocket, uxOffset, pcData, ulByteCount );
3053
3054 TEST_ASSERT_EQUAL( ulByteCount - 10, lReturn );
3055 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bMallocError );
3056 TEST_ASSERT_EQUAL( 0, xSocket.xEventBits );
3057 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bLowWater );
3058 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bWinChange );
3059 TEST_ASSERT_EQUAL( 0U, xSocket.u.xTCP.usTimeout );
3060 TEST_ASSERT_EQUAL( 1U, xLocalReceiveCallback_Called );
3061 }
3062
3063 /**
3064 * @brief Call back added but the data to be added is NULL meaning peeking mode.
3065 */
test_lTCPAddRxdata_HasValidHandler_DataNULL(void)3066 void test_lTCPAddRxdata_HasValidHandler_DataNULL( void )
3067 {
3068 int32_t lReturn;
3069 FreeRTOS_Socket_t xSocket;
3070 size_t uxOffset = 0;
3071 uint32_t ulByteCount = 120;
3072 uint8_t ucStream[ ipconfigTCP_MSS ];
3073 StreamBuffer_t xStreamBuffer;
3074
3075 xLocalReceiveCallback_Called = 0;
3076
3077 memset( &xSocket, 0, sizeof( xSocket ) );
3078
3079 xSocket.u.xTCP.uxRxStreamSize = 200;
3080 xSocket.u.xTCP.uxLittleSpace = 120;
3081 xSocket.u.xTCP.uxEnoughSpace = 200;
3082 xSocket.xSelectBits = eSELECT_READ;
3083 xSocket.u.xTCP.pxHandleReceive = xLocalReceiveCallback;
3084 xSocket.u.xTCP.usMSS = 10;
3085
3086 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( xStreamBuffer ) ) - sizeof( xStreamBuffer.ucArray );
3087
3088 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ucStream );
3089
3090 uxStreamBufferGetSize_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0U );
3091
3092 uxStreamBufferAdd_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, uxOffset, NULL, ulByteCount, ulByteCount - 10 );
3093
3094 uxStreamBufferGetPtr_ExpectAnyArgsAndReturn( 0U );
3095
3096 lReturn = lTCPAddRxdata( &xSocket, uxOffset, NULL, ulByteCount );
3097
3098 TEST_ASSERT_EQUAL( ulByteCount - 10, lReturn );
3099 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bMallocError );
3100 TEST_ASSERT_EQUAL( 0, xSocket.xEventBits );
3101 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bLowWater );
3102 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bWinChange );
3103 TEST_ASSERT_EQUAL( 0U, xSocket.u.xTCP.usTimeout );
3104 TEST_ASSERT_EQUAL( 0U, xLocalReceiveCallback_Called );
3105 }
3106
3107 /**
3108 * @brief Has a callback and the offset is non-zero unlike previous cases.
3109 */
test_lTCPAddRxdata_HasValidHandler_NonZeroOffset(void)3110 void test_lTCPAddRxdata_HasValidHandler_NonZeroOffset( void )
3111 {
3112 int32_t lReturn;
3113 FreeRTOS_Socket_t xSocket;
3114 size_t uxOffset = 10;
3115 uint8_t pcData[ 20 ];
3116 uint32_t ulByteCount = 120;
3117 uint8_t ucStream[ ipconfigTCP_MSS ];
3118 StreamBuffer_t xStreamBuffer;
3119
3120 xLocalReceiveCallback_Called = 0;
3121
3122 memset( &xSocket, 0, sizeof( xSocket ) );
3123
3124 xSocket.u.xTCP.uxRxStreamSize = 200;
3125 xSocket.u.xTCP.uxLittleSpace = 120;
3126 xSocket.u.xTCP.uxEnoughSpace = 200;
3127 xSocket.xSelectBits = eSELECT_READ;
3128 xSocket.u.xTCP.pxHandleReceive = xLocalReceiveCallback;
3129 xSocket.u.xTCP.usMSS = 10;
3130
3131 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( xStreamBuffer ) ) - sizeof( xStreamBuffer.ucArray );
3132
3133 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ucStream );
3134
3135 uxStreamBufferGetSize_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0U );
3136
3137 uxStreamBufferAdd_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, uxOffset, pcData, ulByteCount, ulByteCount - 10 );
3138
3139 lReturn = lTCPAddRxdata( &xSocket, uxOffset, pcData, ulByteCount );
3140
3141 TEST_ASSERT_EQUAL( ulByteCount - 10, lReturn );
3142 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bMallocError );
3143 TEST_ASSERT_EQUAL( 0, xSocket.xEventBits );
3144 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bLowWater );
3145 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bWinChange );
3146 TEST_ASSERT_EQUAL( 0U, xSocket.u.xTCP.usTimeout );
3147 TEST_ASSERT_EQUAL( 0U, xLocalReceiveCallback_Called );
3148 }
3149
3150 /**
3151 * @brief Buffer size is non-zero.
3152 */
test_lTCPAddRxdata_HasValidHandlerWithNonZeroSize(void)3153 void test_lTCPAddRxdata_HasValidHandlerWithNonZeroSize( void )
3154 {
3155 int32_t lReturn;
3156 FreeRTOS_Socket_t xSocket;
3157 size_t uxOffset = 0;
3158 uint8_t pcData[ 20 ];
3159 uint32_t ulByteCount = 120;
3160 uint8_t ucStream[ ipconfigTCP_MSS ];
3161 StreamBuffer_t xStreamBuffer;
3162
3163 xLocalReceiveCallback_Called = 0;
3164
3165 memset( &xSocket, 0, sizeof( xSocket ) );
3166
3167 xSocket.u.xTCP.uxRxStreamSize = 200;
3168 xSocket.u.xTCP.uxLittleSpace = 120;
3169 xSocket.u.xTCP.uxEnoughSpace = 200;
3170 xSocket.xSelectBits = eSELECT_READ;
3171 xSocket.u.xTCP.pxHandleReceive = xLocalReceiveCallback;
3172 xSocket.u.xTCP.usMSS = 10;
3173
3174 size_t xSizeOfBufferRequested = ( ( ( sizeof( size_t ) + xSocket.u.xTCP.uxRxStreamSize ) & ( ~( sizeof( size_t ) - 1U ) ) ) + sizeof( xStreamBuffer ) ) - sizeof( xStreamBuffer.ucArray );
3175
3176 pvPortMalloc_ExpectAndReturn( xSizeOfBufferRequested, ucStream );
3177
3178 uxStreamBufferGetSize_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 10U );
3179
3180 uxStreamBufferAdd_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, uxOffset, pcData, ulByteCount, ulByteCount - 10 );
3181
3182 uxStreamBufferGetPtr_ExpectAnyArgsAndReturn( 0U );
3183
3184 lReturn = lTCPAddRxdata( &xSocket, uxOffset, pcData, ulByteCount );
3185
3186 TEST_ASSERT_EQUAL( ulByteCount - 10, lReturn );
3187 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bMallocError );
3188 TEST_ASSERT_EQUAL( 0, xSocket.xEventBits );
3189 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bLowWater );
3190 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bWinChange );
3191 TEST_ASSERT_EQUAL( 0U, xSocket.u.xTCP.usTimeout );
3192 TEST_ASSERT_EQUAL( 0U, xLocalReceiveCallback_Called );
3193 }
3194
3195 /**
3196 * @brief All combination of inputs. See below comments.
3197 */
test_xSocketValid(void)3198 void test_xSocketValid( void )
3199 {
3200 BaseType_t xReturn;
3201 FreeRTOS_Socket_t xSocket;
3202
3203 /* NULL Socket. */
3204 xReturn = xSocketValid( NULL );
3205 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
3206
3207 /* Invalid Socket. */
3208 xReturn = xSocketValid( ( FreeRTOS_Socket_t * ) FREERTOS_INVALID_SOCKET );
3209 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
3210
3211 /* Valid Socket. */
3212 xReturn = xSocketValid( &xSocket );
3213 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
3214 }
3215
3216 /**
3217 * @brief This function just prints out some data. It is expected to make call to the
3218 * below function. Nothing more.
3219 */
test_FreeRTOS_netstat(void)3220 void test_FreeRTOS_netstat( void )
3221 {
3222 xSendEventStructToIPTask_ExpectAndReturn( NULL, pdMS_TO_TICKS( 1000U ), pdPASS );
3223 xSendEventStructToIPTask_IgnoreArg_pxEvent();
3224 FreeRTOS_netstat();
3225 }
3226