1 /*
2  * FreeRTOS+TCP V3.1.0
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_TCP_IP_list_macros.h"
39 
40 /* This must come after list.h is included (in this case, indirectly
41  * by mock_list.h). */
42 #include "mock_queue.h"
43 #include "mock_task.h"
44 #include "mock_event_groups.h"
45 #include "mock_list.h"
46 
47 #include "mock_FreeRTOS_IP.h"
48 #include "mock_FreeRTOS_IP_Utils.h"
49 #include "mock_NetworkBufferManagement.h"
50 #include "mock_NetworkInterface.h"
51 #include "mock_FreeRTOS_Sockets.h"
52 #include "mock_FreeRTOS_Stream_Buffer.h"
53 #include "mock_FreeRTOS_TCP_WIN.h"
54 #include "mock_FreeRTOS_TCP_State_Handling.h"
55 #include "mock_FreeRTOS_UDP_IP.h"
56 #include "mock_FreeRTOS_TCP_Transmission.h"
57 #include "mock_FreeRTOS_TCP_Reception.h"
58 
59 #include "catch_assert.h"
60 
61 #include "FreeRTOSIPConfig.h"
62 
63 #include "FreeRTOS_TCP_IP_stubs.c"
64 #include "FreeRTOS_TCP_IP.h"
65 
66 FreeRTOS_Socket_t xSocket, * pxSocket;
67 NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer;
68 
69 extern BaseType_t xTCPWindowLoggingLevel;
70 extern FreeRTOS_Socket_t * xSocketToClose;
71 extern FreeRTOS_Socket_t * xSocketToListen;
72 
73 uint8_t ucEthernetBuffer[ ipconfigNETWORK_MTU ] =
74 {
75     0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08, 0x00, 0x45, 0x00,
76     0x00, 0x34, 0x15, 0xc2, 0x40, 0x00, 0x40, 0x06, 0xa8, 0x8e, 0xc0, 0xa8, 0x00, 0x08, 0xac, 0xd9,
77     0x0e, 0xea, 0xea, 0xfe, 0x01, 0xbb, 0x8b, 0xaf, 0x8a, 0x24, 0xdc, 0x96, 0x95, 0x7a, 0x80, 0x10,
78     0x01, 0xf5, 0x7c, 0x9a, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xb8, 0x53, 0x57, 0x27, 0xb2, 0xce,
79     0xc3, 0x17
80 };
81 
82 static Socket_t xHandleConnectedSocket;
83 static size_t xHandleConnectedLength;
HandleConnected(Socket_t xSocket,size_t xLength)84 static void HandleConnected( Socket_t xSocket,
85                              size_t xLength )
86 {
87     TEST_ASSERT_EQUAL( xHandleConnectedSocket, xSocket );
88     TEST_ASSERT_EQUAL( xHandleConnectedLength, xLength );
89 }
90 
91 /* Set the ACK message to NULL. */
prvTCPReturnPacket_StubReturnNULL(FreeRTOS_Socket_t * pxSocket,NetworkBufferDescriptor_t * pxDescriptor,uint32_t ulLen,BaseType_t xReleaseAfterSend,int timesCalled)92 static void prvTCPReturnPacket_StubReturnNULL( FreeRTOS_Socket_t * pxSocket,
93                                                NetworkBufferDescriptor_t * pxDescriptor,
94                                                uint32_t ulLen,
95                                                BaseType_t xReleaseAfterSend,
96                                                int timesCalled )
97 {
98     ( void ) pxDescriptor;
99     ( void ) ulLen;
100     ( void ) xReleaseAfterSend;
101     ( void ) timesCalled;
102     pxSocket->u.xTCP.pxAckMessage = NULL;
103 }
104 
105 /* test vSocketCloseNextTime function */
test_vSocketCloseNextTime_Null_Socket(void)106 void test_vSocketCloseNextTime_Null_Socket( void )
107 {
108     vSocketCloseNextTime( NULL );
109 }
110 
111 /* test vSocketCloseNextTime function */
test_vSocketCloseNextTime_Not_Close_Socket(void)112 void test_vSocketCloseNextTime_Not_Close_Socket( void )
113 {
114     memset( &xSocket, 0, sizeof( xSocket ) );
115 
116     vSocketCloseNextTime( &xSocket );
117 }
118 
119 /* test vSocketCloseNextTime function */
test_vSocketCloseNextTime_Not_Close_Same_Socket(void)120 void test_vSocketCloseNextTime_Not_Close_Same_Socket( void )
121 {
122     memset( &xSocket, 0, sizeof( xSocket ) );
123 
124     vSocketCloseNextTime( &xSocket );
125 }
126 
127 
128 /* test vSocketCloseNextTime function */
test_vSocketCloseNextTime_Close_Previous_Socket(void)129 void test_vSocketCloseNextTime_Close_Previous_Socket( void )
130 {
131     FreeRTOS_Socket_t NewSocket;
132 
133     vSocketClose_ExpectAnyArgsAndReturn( NULL );
134     vSocketCloseNextTime( &NewSocket );
135 }
136 
test_vSocketListenNextTime(void)137 void test_vSocketListenNextTime( void )
138 {
139     FreeRTOS_Socket_t xSocket;
140 
141     xSocketToListen = NULL;
142 
143     vSocketListenNextTime( &xSocket );
144 
145     TEST_ASSERT_EQUAL( &xSocket, xSocketToListen );
146 }
147 
test_vSocketListenNextTime1(void)148 void test_vSocketListenNextTime1( void )
149 {
150     FreeRTOS_Socket_t xSocket;
151 
152     xSocketToListen = &xSocket;
153 
154     FreeRTOS_listen_ExpectAndReturn( ( Socket_t ) xSocketToListen, xSocketToListen->u.xTCP.usBacklog, 0 );
155     vSocketListenNextTime( NULL );
156 
157     TEST_ASSERT_EQUAL( NULL, xSocketToListen );
158 }
159 
test_vSocketListenNextTime2(void)160 void test_vSocketListenNextTime2( void )
161 {
162     FreeRTOS_Socket_t xSocket;
163 
164     xSocketToListen = &xSocket;
165 
166     vSocketListenNextTime( xSocketToListen );
167 
168     TEST_ASSERT_EQUAL( &xSocket, xSocketToListen );
169 }
170 
171 /* test xTCPSocketCheck function */
test_xTCPSocketCheck_AllInputsZero1(void)172 void test_xTCPSocketCheck_AllInputsZero1( void )
173 {
174     BaseType_t xReturn, xToReturn = 0xAABBCCDD;
175     TickType_t xDelayReturn = 0;
176 
177     memset( &xSocket, 0, sizeof( xSocket ) );
178 
179     xTCPWindowTxHasData_ExpectAnyArgsAndReturn( pdTRUE );
180     xTCPWindowTxHasData_ReturnThruPtr_pulDelay( &xDelayReturn );
181 
182     prvTCPStatusAgeCheck_ExpectAnyArgsAndReturn( xToReturn );
183 
184     xReturn = xTCPSocketCheck( &xSocket );
185 
186     TEST_ASSERT_EQUAL( xToReturn, xReturn );
187 }
188 
189 /* test xTCPSocketCheck function */
test_xTCPSocketCheck_StateEstablished(void)190 void test_xTCPSocketCheck_StateEstablished( void )
191 {
192     BaseType_t xReturn, xToReturn = 0xAABBCCDD;
193     FreeRTOS_Socket_t xSocket;
194     TickType_t xDelayReturn = 0;
195 
196     memset( &xSocket, 0, sizeof( xSocket ) );
197 
198     xSocket.u.xTCP.eTCPState = eESTABLISHED;
199 
200     prvTCPSendPacket_ExpectAndReturn( &xSocket, 0 );
201 
202     xTCPWindowTxHasData_ExpectAnyArgsAndReturn( pdTRUE );
203     xTCPWindowTxHasData_ReturnThruPtr_pulDelay( &xDelayReturn );
204 
205     prvTCPStatusAgeCheck_ExpectAnyArgsAndReturn( xToReturn );
206 
207     xReturn = xTCPSocketCheck( &xSocket );
208 
209     TEST_ASSERT_EQUAL( xToReturn, xReturn );
210 }
211 
212 /* test xTCPSocketCheck function */
test_xTCPSocketCheck_StateEstablished_TxStreamNonNull(void)213 void test_xTCPSocketCheck_StateEstablished_TxStreamNonNull( void )
214 {
215     BaseType_t xReturn, xToReturn = 0xAABBCCDD;
216     FreeRTOS_Socket_t xSocket;
217     TickType_t xDelayReturn = 0;
218 
219     memset( &xSocket, 0, sizeof( xSocket ) );
220 
221     xSocket.u.xTCP.eTCPState = eESTABLISHED;
222     xSocket.u.xTCP.txStream = ( void * ) &xSocket;
223 
224     prvTCPAddTxData_Expect( &xSocket );
225 
226     prvTCPSendPacket_ExpectAndReturn( &xSocket, 0 );
227 
228     xTCPWindowTxHasData_ExpectAnyArgsAndReturn( pdTRUE );
229     xTCPWindowTxHasData_ReturnThruPtr_pulDelay( &xDelayReturn );
230 
231     prvTCPStatusAgeCheck_ExpectAnyArgsAndReturn( xToReturn );
232 
233     xReturn = xTCPSocketCheck( &xSocket );
234 
235     TEST_ASSERT_EQUAL( xToReturn, xReturn );
236 }
237 
238 /* test xTCPSocketCheck function */
test_xTCPSocketCheck_StateEstablished_TxStreamNonNull1(void)239 void test_xTCPSocketCheck_StateEstablished_TxStreamNonNull1( void )
240 {
241     BaseType_t xReturn, xToReturn = 0xAABBCCDD;
242     FreeRTOS_Socket_t xSocket;
243     TickType_t xDelayReturn = 0;
244 
245     memset( &xSocket, 0, sizeof( xSocket ) );
246 
247     xSocket.u.xTCP.eTCPState = eESTABLISHED;
248     xSocket.u.xTCP.txStream = ( void * ) &xSocket;
249     xSocket.u.xTCP.pxAckMessage = ( void * ) &xSocket;
250 
251     prvTCPAddTxData_Expect( &xSocket );
252 
253     prvTCPReturnPacket_Expect( &xSocket, xSocket.u.xTCP.pxAckMessage, ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_TCP_HEADER, ipconfigZERO_COPY_TX_DRIVER );
254 
255     xTCPWindowTxHasData_ExpectAnyArgsAndReturn( pdTRUE );
256     xTCPWindowTxHasData_ReturnThruPtr_pulDelay( &xDelayReturn );
257 
258     vReleaseNetworkBufferAndDescriptor_Expect( xSocket.u.xTCP.pxAckMessage );
259 
260     prvTCPSendPacket_ExpectAndReturn( &xSocket, 0 );
261 
262     prvTCPStatusAgeCheck_ExpectAndReturn( &xSocket, xToReturn );
263 
264     xReturn = xTCPSocketCheck( &xSocket );
265 
266     TEST_ASSERT_EQUAL( xToReturn, xReturn );
267     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxAckMessage );
268     TEST_ASSERT_EQUAL( 1U, xSocket.u.xTCP.usTimeout );
269 }
270 
271 /* test xTCPSocketCheck function */
test_xTCPSocketCheck_StateEstablished_TxStreamNonNull_BufferFreed(void)272 void test_xTCPSocketCheck_StateEstablished_TxStreamNonNull_BufferFreed( void )
273 {
274     BaseType_t xReturn, xToReturn = 0xAABBCCDD;
275     FreeRTOS_Socket_t xSocket;
276     TickType_t xDelayReturn = 0;
277 
278     memset( &xSocket, 0, sizeof( xSocket ) );
279 
280     xSocket.u.xTCP.eTCPState = eESTABLISHED;
281     xSocket.u.xTCP.txStream = ( void * ) &xSocket;
282     xSocket.u.xTCP.pxAckMessage = ( void * ) &xSocket;
283 
284     prvTCPAddTxData_Expect( &xSocket );
285 
286     prvTCPReturnPacket_Stub( prvTCPReturnPacket_StubReturnNULL );
287 
288     xTCPWindowTxHasData_ExpectAnyArgsAndReturn( pdTRUE );
289     xTCPWindowTxHasData_ReturnThruPtr_pulDelay( &xDelayReturn );
290 
291     prvTCPSendPacket_ExpectAndReturn( &xSocket, 0 );
292 
293     prvTCPStatusAgeCheck_ExpectAndReturn( &xSocket, xToReturn );
294 
295     xReturn = xTCPSocketCheck( &xSocket );
296 
297     TEST_ASSERT_EQUAL( xToReturn, xReturn );
298     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxAckMessage );
299     TEST_ASSERT_EQUAL( 1U, xSocket.u.xTCP.usTimeout );
300 }
301 
302 /* @brief Test xTCPSocketCheck function when the stream is non-NULL and the
303  *        time out is non-zero. */
test_xTCPSocketCheck_StateEstablished_TxStreamNonNull1_NonZeroTimeout(void)304 void test_xTCPSocketCheck_StateEstablished_TxStreamNonNull1_NonZeroTimeout( void )
305 {
306     BaseType_t xReturn, xToReturn = 0;
307     FreeRTOS_Socket_t xSocket;
308     TickType_t xDelayReturn = 0;
309 
310     memset( &xSocket, 0, sizeof( xSocket ) );
311 
312     xSocket.u.xTCP.eTCPState = eESTABLISHED;
313     xSocket.u.xTCP.txStream = ( void * ) &xSocket;
314     xSocket.u.xTCP.pxAckMessage = ( void * ) &xSocket;
315     xSocket.u.xTCP.usTimeout = 100;
316 
317     prvTCPAddTxData_Expect( &xSocket );
318 
319     prvTCPReturnPacket_Expect( &xSocket, xSocket.u.xTCP.pxAckMessage, ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_TCP_HEADER, ipconfigZERO_COPY_TX_DRIVER );
320 
321     vReleaseNetworkBufferAndDescriptor_Expect( xSocket.u.xTCP.pxAckMessage );
322 
323     xReturn = xTCPSocketCheck( &xSocket );
324 
325     TEST_ASSERT_EQUAL( xToReturn, xReturn );
326     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxAckMessage );
327     TEST_ASSERT_EQUAL( 100U, xSocket.u.xTCP.usTimeout );
328 }
329 
330 /* @brief Test xTCPSocketCheck function when the stream is non-NULL and the
331  *        time out is non-zero. The port number cannot be allowed to issue log
332  *        messages. */
test_xTCPSocketCheck_StateEstablished_TxStreamNonNull1_NonZeroTimeout_NoLogPort(void)333 void test_xTCPSocketCheck_StateEstablished_TxStreamNonNull1_NonZeroTimeout_NoLogPort( void )
334 {
335     BaseType_t xReturn, xToReturn = 0, xBackup;
336     FreeRTOS_Socket_t xSocket;
337     TickType_t xDelayReturn = 0;
338 
339     memset( &xSocket, 0, sizeof( xSocket ) );
340 
341     xSocket.u.xTCP.eTCPState = eESTABLISHED;
342     xSocket.u.xTCP.txStream = ( void * ) &xSocket;
343     xSocket.u.xTCP.pxAckMessage = ( void * ) &xSocket;
344     xSocket.u.xTCP.usTimeout = 100;
345     xSocket.usLocalPort = 23U;
346 
347     xBackup = xTCPWindowLoggingLevel;
348     xTCPWindowLoggingLevel = 2;
349 
350     prvTCPAddTxData_Expect( &xSocket );
351 
352     prvTCPReturnPacket_Expect( &xSocket, xSocket.u.xTCP.pxAckMessage, ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_TCP_HEADER, ipconfigZERO_COPY_TX_DRIVER );
353 
354     vReleaseNetworkBufferAndDescriptor_Expect( xSocket.u.xTCP.pxAckMessage );
355 
356     xReturn = xTCPSocketCheck( &xSocket );
357 
358     TEST_ASSERT_EQUAL( xToReturn, xReturn );
359     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxAckMessage );
360     TEST_ASSERT_EQUAL( 100U, xSocket.u.xTCP.usTimeout );
361 
362     xTCPWindowLoggingLevel = xBackup;
363 }
364 
365 /* @brief Test xTCPSocketCheck function when the stream is non-NULL and the
366  *        time out is non-zero. The port number cannot be allowed to issue log
367  *        messages. */
test_xTCPSocketCheck_StateCLOSED_TxStreamNonNull1_NonZeroTimeout(void)368 void test_xTCPSocketCheck_StateCLOSED_TxStreamNonNull1_NonZeroTimeout( void )
369 {
370     BaseType_t xReturn, xToReturn = 0;
371     FreeRTOS_Socket_t xSocket;
372     TickType_t xDelayReturn = 0;
373 
374     memset( &xSocket, 0, sizeof( xSocket ) );
375 
376     xSocket.u.xTCP.eTCPState = eCLOSED;
377     xSocket.u.xTCP.txStream = ( void * ) &xSocket;
378     xSocket.u.xTCP.pxAckMessage = ( void * ) &xSocket;
379     xSocket.u.xTCP.usTimeout = 100;
380     xSocket.usLocalPort = 23U;
381 
382     xTCPWindowLoggingLevel = 2;
383 
384     vReleaseNetworkBufferAndDescriptor_Expect( xSocket.u.xTCP.pxAckMessage );
385 
386     xReturn = xTCPSocketCheck( &xSocket );
387 
388     TEST_ASSERT_EQUAL( xToReturn, xReturn );
389     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxAckMessage );
390     TEST_ASSERT_EQUAL( 100U, xSocket.u.xTCP.usTimeout );
391 
392     xTCPWindowLoggingLevel = 1;
393 }
394 
395 /* @brief Test xTCPSocketCheck function when the stream is non-NULL and the
396  *        time out is non-zero. Additionally, the user has requested to shutdown
397  *        the socket. */
test_xTCPSocketCheck_StateeCONNECT_SYN_TxStreamNonNull_UserShutdown(void)398 void test_xTCPSocketCheck_StateeCONNECT_SYN_TxStreamNonNull_UserShutdown( void )
399 {
400     BaseType_t xReturn, xToReturn = 0;
401     FreeRTOS_Socket_t xSocket;
402 
403     memset( &xSocket, 0, sizeof( xSocket ) );
404 
405     xSocket.u.xTCP.eTCPState = eCONNECT_SYN;
406     xSocket.u.xTCP.txStream = ( void * ) &xSocket;
407     xSocket.u.xTCP.pxAckMessage = ( void * ) &xSocket;
408     xSocket.u.xTCP.usTimeout = 100;
409     xSocket.u.xTCP.bits.bUserShutdown = pdTRUE_UNSIGNED;
410 
411     vReleaseNetworkBufferAndDescriptor_Expect( xSocket.u.xTCP.pxAckMessage );
412 
413     prvTCPSendPacket_ExpectAndReturn( &xSocket, 0 );
414 
415     prvTCPStatusAgeCheck_ExpectAndReturn( &xSocket, xToReturn );
416 
417     xReturn = xTCPSocketCheck( &xSocket );
418 
419     TEST_ASSERT_EQUAL( xToReturn, xReturn );
420     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxAckMessage );
421     /* ARP phase. Check every half second. */
422     TEST_ASSERT_EQUAL( 500U, xSocket.u.xTCP.usTimeout );
423 }
424 
425 /* @brief Test prvTCPTouchSocket function. */
test_prvTCPTouchSocket(void)426 void test_prvTCPTouchSocket( void )
427 {
428     FreeRTOS_Socket_t xSocket;
429     BaseType_t xTickCountAck = 0xAABBEEDD;
430     BaseType_t xTickCountAlive = 0xAABBEFDD;
431 
432     memset( &xSocket, 0xAA, sizeof( xSocket ) );
433 
434     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
435     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
436 
437     prvTCPTouchSocket( &xSocket );
438 
439     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
440     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
441     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
442     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
443     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
444 }
445 
446 /* test prvTCPNextTimeout function */
test_prvTCPNextTimeout_ConnSyn_State_Not_Active(void)447 void test_prvTCPNextTimeout_ConnSyn_State_Not_Active( void )
448 {
449     TickType_t Return = 0;
450 
451     pxSocket = &xSocket;
452 
453     pxSocket->u.xTCP.eTCPState = eCONNECT_SYN;
454     pxSocket->u.xTCP.bits.bConnPrepared = pdFALSE;
455     pxSocket->u.xTCP.ucRepCount = 0;
456 
457     Return = prvTCPNextTimeout( pxSocket );
458     TEST_ASSERT_EQUAL( 500, Return );
459 }
460 
461 /* test prvTCPNextTimeout function */
test_prvTCPNextTimeout_ConnSyn_State_Active_Rep0(void)462 void test_prvTCPNextTimeout_ConnSyn_State_Active_Rep0( void )
463 {
464     TickType_t Return = 0;
465 
466     pxSocket = &xSocket;
467 
468     pxSocket->u.xTCP.eTCPState = eCONNECT_SYN;
469     pxSocket->u.xTCP.bits.bConnPrepared = pdTRUE;
470     pxSocket->u.xTCP.ucRepCount = 0;
471 
472     Return = prvTCPNextTimeout( pxSocket );
473     TEST_ASSERT_EQUAL( 1, Return );
474 }
475 
476 /* test prvTCPNextTimeout function */
test_prvTCPNextTimeout_ConnSyn_State_Active_Rep1(void)477 void test_prvTCPNextTimeout_ConnSyn_State_Active_Rep1( void )
478 {
479     TickType_t Return = 0;
480 
481     pxSocket = &xSocket;
482 
483     pxSocket->u.xTCP.eTCPState = eCONNECT_SYN;
484     pxSocket->u.xTCP.bits.bConnPrepared = pdTRUE;
485     pxSocket->u.xTCP.ucRepCount = 1;
486 
487     Return = prvTCPNextTimeout( pxSocket );
488     TEST_ASSERT_EQUAL( 3000, Return );
489 }
490 
491 /* test prvTCPNextTimeout function */
test_prvTCPNextTimeout_ConnSyn_State_Active_Rep3(void)492 void test_prvTCPNextTimeout_ConnSyn_State_Active_Rep3( void )
493 {
494     TickType_t Return = 0;
495 
496     pxSocket = &xSocket;
497 
498     pxSocket->u.xTCP.eTCPState = eCONNECT_SYN;
499     pxSocket->u.xTCP.bits.bConnPrepared = pdTRUE;
500     pxSocket->u.xTCP.ucRepCount = 3;
501 
502     Return = prvTCPNextTimeout( pxSocket );
503     TEST_ASSERT_EQUAL( 11000, Return );
504 }
505 
506 /* test prvTCPNextTimeout function */
test_prvTCPNextTimeout_Established_State_Active_Timeout_Set(void)507 void test_prvTCPNextTimeout_Established_State_Active_Timeout_Set( void )
508 {
509     TickType_t Return = 0;
510 
511     pxSocket = &xSocket;
512 
513     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
514     pxSocket->u.xTCP.usTimeout = 5000;
515     pxSocket->u.xTCP.ucRepCount = 3;
516 
517     Return = prvTCPNextTimeout( pxSocket );
518     TEST_ASSERT_EQUAL( 5000, Return );
519 }
520 
521 /* test prvTCPNextTimeout function */
test_prvTCPNextTimeout_Established_State_Active_Timeout_Not_Set_Has_Data_With_Delay(void)522 void test_prvTCPNextTimeout_Established_State_Active_Timeout_Not_Set_Has_Data_With_Delay( void )
523 {
524     TickType_t Return = 0;
525 
526     pxSocket = &xSocket;
527     TickType_t TxWinReturn = 1000;
528 
529     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
530     pxSocket->u.xTCP.usTimeout = 0;
531     pxSocket->u.xTCP.ucRepCount = 3;
532 
533     xTCPWindowTxHasData_ExpectAnyArgsAndReturn( pdTRUE );
534     xTCPWindowTxHasData_ReturnThruPtr_pulDelay( &TxWinReturn );
535 
536     Return = prvTCPNextTimeout( pxSocket );
537     TEST_ASSERT_EQUAL( 1000, Return );
538 }
539 
540 /* test prvTCPNextTimeout function */
test_prvTCPNextTimeout_Established_State_Active_Timeout_Not_Set_Has_Data_Without_Delay(void)541 void test_prvTCPNextTimeout_Established_State_Active_Timeout_Not_Set_Has_Data_Without_Delay( void )
542 {
543     TickType_t Return = 0;
544 
545     pxSocket = &xSocket;
546     TickType_t TxWinReturn = 0;
547 
548     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
549     pxSocket->u.xTCP.usTimeout = 0;
550     pxSocket->u.xTCP.ucRepCount = 3;
551 
552     xTCPWindowTxHasData_ExpectAnyArgsAndReturn( pdTRUE );
553     xTCPWindowTxHasData_ReturnThruPtr_pulDelay( &TxWinReturn );
554 
555     Return = prvTCPNextTimeout( pxSocket );
556     TEST_ASSERT_EQUAL( 1, Return );
557 }
558 
559 /* test prvTCPNextTimeout function */
test_prvTCPNextTimeout_Established_State_Active_Timeout_Not_Set_No_Data_Without_Delay(void)560 void test_prvTCPNextTimeout_Established_State_Active_Timeout_Not_Set_No_Data_Without_Delay( void )
561 {
562     TickType_t Return = 0;
563 
564     pxSocket = &xSocket;
565     TickType_t TxWinReturn = 0;
566 
567     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
568     pxSocket->u.xTCP.usTimeout = 0;
569     pxSocket->u.xTCP.ucRepCount = 3;
570 
571     xTCPWindowTxHasData_ExpectAnyArgsAndReturn( pdFALSE );
572     xTCPWindowTxHasData_ReturnThruPtr_pulDelay( &TxWinReturn );
573 
574     Return = prvTCPNextTimeout( pxSocket );
575     TEST_ASSERT_EQUAL( tcpMAXIMUM_TCP_WAKEUP_TIME_MS, Return );
576 }
577 
578 /* @brief Test vTCPStateChange function when the state to be reached and the
579  *        current state equal to closed state. */
test_vTCPStateChange_ClosedState(void)580 void test_vTCPStateChange_ClosedState( void )
581 {
582     FreeRTOS_Socket_t xSocket;
583     enum eTCP_STATE eTCPState;
584     BaseType_t xTickCountAck = 0xAABBEEDD;
585     BaseType_t xTickCountAlive = 0xAABBEFDD;
586 
587     memset( &xSocket, 0, sizeof( xSocket ) );
588     eTCPState = eCLOSED;
589 
590     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
591     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
592 
593     vSocketWakeUpUser_Expect( &xSocket );
594 
595     vTCPStateChange( &xSocket, eTCPState );
596 
597     TEST_ASSERT_EQUAL( eCLOSED, xSocket.u.xTCP.eTCPState );
598     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
599     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
600     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
601     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
602     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
603 }
604 
605 /* @brief Test vTCPStateChange function when the state to be reached is closed wait
606  *        and current state is equal to connect syn. */
test_vTCPStateChange_ClosedWaitState_PrvStateSyn(void)607 void test_vTCPStateChange_ClosedWaitState_PrvStateSyn( void )
608 {
609     FreeRTOS_Socket_t xSocket;
610     enum eTCP_STATE eTCPState;
611     BaseType_t xTickCountAck = 0xAABBEEDD;
612     BaseType_t xTickCountAlive = 0xAABBEFDD;
613 
614     memset( &xSocket, 0, sizeof( xSocket ) );
615     eTCPState = eCLOSE_WAIT;
616 
617     xSocket.u.xTCP.eTCPState = eCONNECT_SYN;
618 
619     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
620     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
621     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
622 
623     vSocketWakeUpUser_Expect( &xSocket );
624 
625     vTCPStateChange( &xSocket, eTCPState );
626 
627     TEST_ASSERT_EQUAL( eCLOSE_WAIT, xSocket.u.xTCP.eTCPState );
628     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
629     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
630     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
631     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
632     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
633 }
634 
635 /* @brief Test vTCPStateChange function when the state to be reached is closed wait
636  *        and current state is equal to syn first. */
test_vTCPStateChange_ClosedWaitState_PrvStateSynFirst(void)637 void test_vTCPStateChange_ClosedWaitState_PrvStateSynFirst( void )
638 {
639     FreeRTOS_Socket_t xSocket;
640     enum eTCP_STATE eTCPState;
641     BaseType_t xTickCountAck = 0xAABBEEDD;
642     BaseType_t xTickCountAlive = 0xAABBEFDD;
643 
644     memset( &xSocket, 0, sizeof( xSocket ) );
645     eTCPState = eCLOSE_WAIT;
646 
647     xSocket.u.xTCP.eTCPState = eSYN_FIRST;
648 
649     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
650     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
651     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
652 
653     vSocketWakeUpUser_Expect( &xSocket );
654 
655     vTCPStateChange( &xSocket, eTCPState );
656 
657     TEST_ASSERT_EQUAL( eCLOSE_WAIT, xSocket.u.xTCP.eTCPState );
658     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
659     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
660     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
661     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
662     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
663 }
664 
665 /* @brief Test vTCPStateChange function when the state to be reached is closed wait
666  *        and current state is equal to syn first. */
test_vTCPStateChange_ClosedWaitState_CurrentStateSynFirstNextStateCloseWait(void)667 void test_vTCPStateChange_ClosedWaitState_CurrentStateSynFirstNextStateCloseWait( void )
668 {
669     FreeRTOS_Socket_t xSocket;
670     enum eTCP_STATE eTCPState;
671     BaseType_t xTickCountAck = 0xAABBEEDD;
672     BaseType_t xTickCountAlive = 0xAABBEFDD;
673 
674     memset( &xSocket, 0, sizeof( xSocket ) );
675     eTCPState = eCLOSE_WAIT;
676 
677     xSocketToListen = NULL;
678 
679     xSocket.u.xTCP.eTCPState = eSYN_FIRST;
680     xSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
681 
682     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
683     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
684     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
685 
686     vSocketWakeUpUser_Expect( &xSocket );
687 
688     vTCPStateChange( &xSocket, eTCPState );
689 
690     TEST_ASSERT_EQUAL( eCLOSED, xSocket.u.xTCP.eTCPState );
691     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
692     TEST_ASSERT_EQUAL( &xSocket, xSocketToListen );
693     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
694     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
695     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
696     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
697 }
698 
699 /* @brief Test vTCPStateChange function when the state to be reached is closed wait
700  *        and current state is equal to syn received. */
test_vTCPStateChange_ClosedWaitState_PrvStateSynRecvd(void)701 void test_vTCPStateChange_ClosedWaitState_PrvStateSynRecvd( void )
702 {
703     FreeRTOS_Socket_t xSocket;
704     enum eTCP_STATE eTCPState;
705     BaseType_t xTickCountAck = 0xAABBEEDD;
706     BaseType_t xTickCountAlive = 0xAABBEFDD;
707 
708     memset( &xSocket, 0, sizeof( xSocket ) );
709     eTCPState = eCLOSE_WAIT;
710 
711     xSocket.u.xTCP.eTCPState = eSYN_RECEIVED;
712 
713     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
714     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
715     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
716 
717     vSocketWakeUpUser_Expect( &xSocket );
718 
719     vTCPStateChange( &xSocket, eTCPState );
720 
721     TEST_ASSERT_EQUAL( eCLOSE_WAIT, xSocket.u.xTCP.eTCPState );
722     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
723     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
724     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
725     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
726     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
727 }
728 
729 /* @brief Test vTCPStateChange function when the state to be reached and the
730  *        current state equal to close wait state. */
test_vTCPStateChange_ClosedWaitState(void)731 void test_vTCPStateChange_ClosedWaitState( void )
732 {
733     FreeRTOS_Socket_t xSocket;
734     enum eTCP_STATE eTCPState;
735     BaseType_t xTickCountAck = 0xAABBEEDD;
736     BaseType_t xTickCountAlive = 0xAABBEFDD;
737 
738     memset( &xSocket, 0, sizeof( xSocket ) );
739     eTCPState = eCLOSE_WAIT;
740 
741     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
742     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
743 
744     vSocketWakeUpUser_Expect( &xSocket );
745 
746     vTCPStateChange( &xSocket, eTCPState );
747 
748     TEST_ASSERT_EQUAL( eCLOSE_WAIT, xSocket.u.xTCP.eTCPState );
749     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
750     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
751     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
752     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
753     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
754 }
755 
756 /* @brief Test vTCPStateChange function when the state to be reached and the
757  *        current state equal to close wait state. Additionally, the pass queued
758  *        bit is set and the function is being called from IP task. */
test_vTCPStateChange_ClosedWaitState_CallingFromIPTask(void)759 void test_vTCPStateChange_ClosedWaitState_CallingFromIPTask( void )
760 {
761     FreeRTOS_Socket_t xSocket;
762     enum eTCP_STATE eTCPState;
763     BaseType_t xTickCountAck = 0xAABBEEDD;
764     BaseType_t xTickCountAlive = 0xAABBEFDD;
765 
766     memset( &xSocket, 0, sizeof( xSocket ) );
767     xSocket.u.xTCP.eTCPState = eCLOSE_WAIT;
768     eTCPState = eCLOSE_WAIT;
769 
770     xSocket.u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
771 
772     xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
773 
774     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
775     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
776 
777     vSocketWakeUpUser_Expect( &xSocket );
778 
779     vTCPStateChange( &xSocket, eTCPState );
780 
781     TEST_ASSERT_EQUAL( eCLOSE_WAIT, xSocket.u.xTCP.eTCPState );
782     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
783     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
784     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
785     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
786     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
787 }
788 
789 /* @brief Test vTCPStateChange function when the state to be reached and the
790  *        current state equal to close wait state. Additionally, the pass queued
791  *        bit is set and the function is not being called from IP task. */
test_vTCPStateChange_ClosedWaitState_NotCallingFromIPTask(void)792 void test_vTCPStateChange_ClosedWaitState_NotCallingFromIPTask( void )
793 {
794     FreeRTOS_Socket_t xSocket;
795     enum eTCP_STATE eTCPState;
796     BaseType_t xTickCountAck = 0xAABBEEDD;
797     BaseType_t xTickCountAlive = 0xAABBEFDD;
798 
799     memset( &xSocket, 0, sizeof( xSocket ) );
800     eTCPState = eCLOSE_WAIT;
801 
802     xSocket.u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
803 
804     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
805 
806     catch_assert( vTCPStateChange( &xSocket, eTCPState ) );
807 }
808 
809 /* @brief Test vTCPStateChange function when the state to be reached and the
810  *        current state equal to close wait state. Additionally, the pass accept
811  *        bit is set and the function is being called from IP task. */
test_vTCPStateChange_ClosedWaitState_CallingFromIPTask1(void)812 void test_vTCPStateChange_ClosedWaitState_CallingFromIPTask1( void )
813 {
814     FreeRTOS_Socket_t xSocket;
815     enum eTCP_STATE eTCPState;
816     BaseType_t xTickCountAck = 0xAABBEEDD;
817     BaseType_t xTickCountAlive = 0xAABBEFDD;
818 
819     memset( &xSocket, 0, sizeof( xSocket ) );
820     eTCPState = eCLOSE_WAIT;
821 
822     xSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
823 
824     xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
825 
826     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
827     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
828 
829     vSocketWakeUpUser_Expect( &xSocket );
830 
831     vTCPStateChange( &xSocket, eTCPState );
832 
833     TEST_ASSERT_EQUAL( eCLOSE_WAIT, xSocket.u.xTCP.eTCPState );
834     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
835     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
836     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
837     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
838     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
839 }
840 
841 /* @brief Test vTCPStateChange function when the state to be reached and the
842  *        current state equal to close wait state. Additionally, the pass accept
843  *        bit is set and the function is not being called from IP task. */
test_vTCPStateChange_ClosedWaitState_NotCallingFromIPTask1(void)844 void test_vTCPStateChange_ClosedWaitState_NotCallingFromIPTask1( void )
845 {
846     FreeRTOS_Socket_t xSocket;
847     enum eTCP_STATE eTCPState;
848 
849     memset( &xSocket, 0, sizeof( xSocket ) );
850     eTCPState = eCLOSE_WAIT;
851 
852     xSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
853 
854     xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
855 
856     catch_assert( vTCPStateChange( &xSocket, eTCPState ) );
857 }
858 
859 /* @brief Test vTCPStateChange function when the state to be reached and the
860  *        current state equal to close wait state. Additionally, the pass accept
861  *        and reuse socket bits are set. */
test_vTCPStateChange_ClosedWaitState_ReuseSocket(void)862 void test_vTCPStateChange_ClosedWaitState_ReuseSocket( void )
863 {
864     FreeRTOS_Socket_t xSocket;
865     enum eTCP_STATE eTCPState;
866     BaseType_t xTickCountAck = 0xAABBEEDD;
867     BaseType_t xTickCountAlive = 0xAABBEFDD;
868 
869     memset( &xSocket, 0, sizeof( xSocket ) );
870     eTCPState = eCLOSE_WAIT;
871 
872     xSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
873     xSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
874 
875     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
876     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
877 
878     vSocketWakeUpUser_Expect( &xSocket );
879 
880     vTCPStateChange( &xSocket, eTCPState );
881 
882     TEST_ASSERT_EQUAL( eCLOSE_WAIT, xSocket.u.xTCP.eTCPState );
883     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
884     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
885     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
886     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
887     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
888 }
889 
890 /* @brief Test vTCPStateChange function when the state to be reached and the
891  *        current state equal to established state. Additionally, the pass accept
892  *        and reuse socket bits are set. */
test_vTCPStateChange_EstablishedState_ReuseSocket(void)893 void test_vTCPStateChange_EstablishedState_ReuseSocket( void )
894 {
895     FreeRTOS_Socket_t xSocket;
896     enum eTCP_STATE eTCPState;
897     BaseType_t xTickCountAck = 0xAABBEEDD;
898     BaseType_t xTickCountAlive = 0xAABBEFDD;
899     BaseType_t xBackup;
900 
901     memset( &xSocket, 0, sizeof( xSocket ) );
902     eTCPState = eESTABLISHED;
903     xSocket.u.xTCP.eTCPState = eESTABLISHED;
904 
905     xSocket.u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
906     xSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
907 
908     xBackup = xTCPWindowLoggingLevel;
909     xTCPWindowLoggingLevel = -1;
910 
911     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
912     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
913 
914     vSocketWakeUpUser_Expect( &xSocket );
915 
916     vTCPStateChange( &xSocket, eTCPState );
917 
918     TEST_ASSERT_EQUAL( eESTABLISHED, xSocket.u.xTCP.eTCPState );
919     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
920     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
921     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
922     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
923     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
924 
925     xTCPWindowLoggingLevel = xBackup;
926 }
927 
928 /* @brief Test vTCPStateChange function when the state to be reached is closed and the
929  *        current state is established state. Additionally, the pass accept
930  *        and reuse socket bits are set. */
test_vTCPStateChange_EstablishedToClosedState_SocketInactive(void)931 void test_vTCPStateChange_EstablishedToClosedState_SocketInactive( void )
932 {
933     FreeRTOS_Socket_t xSocket;
934     enum eTCP_STATE eTCPState;
935     BaseType_t xTickCountAck = 0xAABBEEDD;
936     BaseType_t xTickCountAlive = 0xAABBEFDD;
937     BaseType_t xBackup;
938 
939     memset( &xSocket, 0, sizeof( xSocket ) );
940     eTCPState = eCLOSED;
941     xSocket.u.xTCP.eTCPState = eESTABLISHED;
942 
943     xSocket.u.xTCP.usTimeout = 100;
944 
945     xBackup = xTCPWindowLoggingLevel;
946     xTCPWindowLoggingLevel = 2;
947 
948     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, 0 );
949 
950     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
951     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
952 
953     vSocketWakeUpUser_Expect( &xSocket );
954 
955     vTCPStateChange( &xSocket, eTCPState );
956 
957     TEST_ASSERT_EQUAL( eCLOSED, xSocket.u.xTCP.eTCPState );
958     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
959     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
960     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
961     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
962     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
963     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.usTimeout );
964     TEST_ASSERT_EQUAL( eSOCKET_CLOSED, xSocket.xEventBits );
965 
966     xTCPWindowLoggingLevel = xBackup;
967 }
968 
969 /* @brief Test vTCPStateChange function when the state to be reached is closed and the
970  *        current state is established state.
971  */
test_vTCPStateChange_EstablishedToClosedState_SocketActive(void)972 void test_vTCPStateChange_EstablishedToClosedState_SocketActive( void )
973 {
974     FreeRTOS_Socket_t xSocket;
975     enum eTCP_STATE eTCPState;
976     BaseType_t xTickCountAck = 0xAABBEEDD;
977     BaseType_t xTickCountAlive = 0xAABBEFDD;
978     BaseType_t xBackup;
979 
980     memset( &xSocket, 0, sizeof( xSocket ) );
981     eTCPState = eCLOSED;
982     xSocket.u.xTCP.eTCPState = eESTABLISHED;
983 
984     xSocket.u.xTCP.usTimeout = 100;
985     xSocket.u.xTCP.pxHandleConnected = HandleConnected;
986 
987     xBackup = xTCPWindowLoggingLevel;
988     xTCPWindowLoggingLevel = 2;
989 
990     xHandleConnectedSocket = &xSocket;
991     xHandleConnectedLength = 0;
992 
993     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
994 
995     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
996     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
997 
998     vSocketWakeUpUser_Expect( &xSocket );
999 
1000     vTCPStateChange( &xSocket, eTCPState );
1001 
1002     TEST_ASSERT_EQUAL( eCLOSED, xSocket.u.xTCP.eTCPState );
1003     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
1004     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
1005     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
1006     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
1007     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
1008     TEST_ASSERT_EQUAL( 100, xSocket.u.xTCP.usTimeout );
1009     TEST_ASSERT_EQUAL( eSOCKET_CLOSED, xSocket.xEventBits );
1010 
1011     xTCPWindowLoggingLevel = xBackup;
1012 }
1013 
1014 /* @brief Test vTCPStateChange function when the state to be reached is closed and the
1015  *        current state is established state. Socket select bit is set to select except. */
test_vTCPStateChange_EstablishedToClosedState_SocketActive_SelectExcept(void)1016 void test_vTCPStateChange_EstablishedToClosedState_SocketActive_SelectExcept( void )
1017 {
1018     FreeRTOS_Socket_t xSocket;
1019     enum eTCP_STATE eTCPState;
1020     BaseType_t xTickCountAck = 0xAABBEEDD;
1021     BaseType_t xTickCountAlive = 0xAABBEFDD;
1022     BaseType_t xBackup;
1023 
1024     memset( &xSocket, 0, sizeof( xSocket ) );
1025     eTCPState = eCLOSED;
1026     xSocket.u.xTCP.eTCPState = eESTABLISHED;
1027 
1028     xSocket.u.xTCP.usTimeout = 100;
1029     xSocket.u.xTCP.pxHandleConnected = HandleConnected;
1030     xSocket.xSelectBits = eSELECT_EXCEPT;
1031 
1032     xBackup = xTCPWindowLoggingLevel;
1033     xTCPWindowLoggingLevel = 2;
1034 
1035     xHandleConnectedSocket = &xSocket;
1036     xHandleConnectedLength = 0;
1037 
1038     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
1039 
1040     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
1041     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
1042 
1043     vSocketWakeUpUser_Expect( &xSocket );
1044 
1045     vTCPStateChange( &xSocket, eTCPState );
1046 
1047     TEST_ASSERT_EQUAL( eCLOSED, xSocket.u.xTCP.eTCPState );
1048     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
1049     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
1050     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
1051     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
1052     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
1053     TEST_ASSERT_EQUAL( 100, xSocket.u.xTCP.usTimeout );
1054     TEST_ASSERT_EQUAL( eSOCKET_CLOSED | ( eSELECT_EXCEPT << SOCKET_EVENT_BIT_COUNT ), xSocket.xEventBits );
1055 
1056     xTCPWindowLoggingLevel = xBackup;
1057 }
1058 
1059 /* @brief Test vTCPStateChange function when the state to be reached is established and the
1060  *        current state is closed. Socket select bit is set to select except. */
test_vTCPStateChange_ClosedToEstablishedState_SocketActive_SelectExcept(void)1061 void test_vTCPStateChange_ClosedToEstablishedState_SocketActive_SelectExcept( void )
1062 {
1063     FreeRTOS_Socket_t xSocket;
1064     enum eTCP_STATE eTCPState;
1065     BaseType_t xTickCountAck = 0xAABBEEDD;
1066     BaseType_t xTickCountAlive = 0xAABBEFDD;
1067     BaseType_t xBackup;
1068 
1069     memset( &xSocket, 0, sizeof( xSocket ) );
1070     eTCPState = eESTABLISHED;
1071     xSocket.u.xTCP.eTCPState = eCLOSED;
1072 
1073     xSocket.u.xTCP.usTimeout = 100;
1074     xSocket.u.xTCP.pxHandleConnected = HandleConnected;
1075     xSocket.xSelectBits = eSELECT_EXCEPT;
1076 
1077     xHandleConnectedSocket = &xSocket;
1078     /* Expect the connected field to be set. */
1079     xHandleConnectedLength = 1;
1080 
1081     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
1082 
1083     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
1084     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
1085 
1086     vSocketWakeUpUser_Expect( &xSocket );
1087 
1088     vTCPStateChange( &xSocket, eTCPState );
1089 
1090     TEST_ASSERT_EQUAL( eESTABLISHED, xSocket.u.xTCP.eTCPState );
1091     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
1092     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
1093     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
1094     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
1095     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
1096     TEST_ASSERT_EQUAL( 100, xSocket.u.xTCP.usTimeout );
1097     TEST_ASSERT_EQUAL( eSOCKET_CONNECT, xSocket.xEventBits );
1098 }
1099 
1100 /* @brief Test vTCPStateChange function when the state to be reached is established and the
1101  *        current state is closed. Socket select bit is set to select write. */
test_vTCPStateChange_ClosedToEstablishedState_SocketActive_SelectWrite(void)1102 void test_vTCPStateChange_ClosedToEstablishedState_SocketActive_SelectWrite( void )
1103 {
1104     FreeRTOS_Socket_t xSocket;
1105     enum eTCP_STATE eTCPState;
1106     BaseType_t xTickCountAck = 0xAABBEEDD;
1107     BaseType_t xTickCountAlive = 0xAABBEFDD;
1108     BaseType_t xBackup;
1109 
1110     memset( &xSocket, 0, sizeof( xSocket ) );
1111     eTCPState = eESTABLISHED;
1112     xSocket.u.xTCP.eTCPState = eCLOSED;
1113 
1114     xSocket.u.xTCP.usTimeout = 100;
1115     xSocket.u.xTCP.pxHandleConnected = HandleConnected;
1116     xSocket.xSelectBits = eSELECT_WRITE;
1117 
1118     xHandleConnectedSocket = &xSocket;
1119     /* Expect the connected field to be set. */
1120     xHandleConnectedLength = 1;
1121 
1122     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
1123 
1124     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
1125     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
1126 
1127     vSocketWakeUpUser_Expect( &xSocket );
1128 
1129     vTCPStateChange( &xSocket, eTCPState );
1130 
1131     TEST_ASSERT_EQUAL( eESTABLISHED, xSocket.u.xTCP.eTCPState );
1132     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
1133     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
1134     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
1135     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
1136     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
1137     TEST_ASSERT_EQUAL( 100, xSocket.u.xTCP.usTimeout );
1138     TEST_ASSERT_EQUAL( eSOCKET_CONNECT | ( eSELECT_WRITE << SOCKET_EVENT_BIT_COUNT ), xSocket.xEventBits );
1139 }
1140 
1141 /* @brief Test vTCPStateChange function when the state to be reached is established and the
1142  *        current state is closed. Socket select bit is set to select write. Also, this socket
1143  *        is an orphan. Since parent socket is NULL and reuse bit is not set, it will hit an
1144  *        assertion.*/
test_vTCPStateChange_ClosedToEstablishedState_SelectWrite_QueuedBitSet(void)1145 void test_vTCPStateChange_ClosedToEstablishedState_SelectWrite_QueuedBitSet( void )
1146 {
1147     FreeRTOS_Socket_t xSocket;
1148     enum eTCP_STATE eTCPState;
1149     BaseType_t xTickCountAck = 0xAABBEEDD;
1150     BaseType_t xTickCountAlive = 0xAABBEFDD;
1151     BaseType_t xBackup;
1152 
1153     memset( &xSocket, 0, sizeof( xSocket ) );
1154     eTCPState = eESTABLISHED;
1155     xSocket.u.xTCP.eTCPState = eCLOSED;
1156 
1157     xSocket.u.xTCP.usTimeout = 100;
1158     xSocket.xSelectBits = eSELECT_WRITE;
1159     /* if bPassQueued is true, this socket is an orphan until it gets connected. */
1160     xSocket.u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
1161 
1162     catch_assert( vTCPStateChange( &xSocket, eTCPState ) );
1163 }
1164 
1165 /* @brief Test vTCPStateChange function when the state to be reached is established and the
1166  *        current state is closed. Socket select bit is set to select write. Also, this socket
1167  *        is an orphan. Parent socket is non-NULL and reuse bit is not set. */
test_vTCPStateChange_ClosedToEstablishedState_SelectWrite_QueuedBitSet_ParentNonNULL(void)1168 void test_vTCPStateChange_ClosedToEstablishedState_SelectWrite_QueuedBitSet_ParentNonNULL( void )
1169 {
1170     FreeRTOS_Socket_t xSocket, xParentSock;
1171     enum eTCP_STATE eTCPState;
1172     BaseType_t xTickCountAck = 0xAABBEEDD;
1173     BaseType_t xTickCountAlive = 0xAABBEFDD;
1174     BaseType_t xBackup;
1175 
1176     memset( &xSocket, 0, sizeof( xSocket ) );
1177     memset( &xParentSock, 0, sizeof( xParentSock ) );
1178     eTCPState = eESTABLISHED;
1179     xSocket.u.xTCP.eTCPState = eCLOSED;
1180 
1181     xSocket.u.xTCP.usTimeout = 100;
1182     xSocket.u.xTCP.pxHandleConnected = HandleConnected;
1183     xSocket.xSelectBits = eSELECT_WRITE;
1184     /* if bPassQueued is true, this socket is an orphan until it gets connected. */
1185     xSocket.u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
1186     xSocket.u.xTCP.pxPeerSocket = &xParentSock;
1187 
1188     xHandleConnectedSocket = &xSocket;
1189     /* Expect the connected field to be set. */
1190     xHandleConnectedLength = 1;
1191 
1192     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
1193 
1194     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
1195     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
1196 
1197     vSocketWakeUpUser_Expect( &xParentSock );
1198 
1199     vTCPStateChange( &xSocket, eTCPState );
1200 
1201     TEST_ASSERT_EQUAL( eESTABLISHED, xSocket.u.xTCP.eTCPState );
1202     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
1203     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
1204     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
1205     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
1206     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
1207     TEST_ASSERT_EQUAL( 100, xSocket.u.xTCP.usTimeout );
1208     TEST_ASSERT_EQUAL( eSOCKET_ACCEPT, xParentSock.xEventBits );
1209     TEST_ASSERT_EQUAL( &xSocket, xParentSock.u.xTCP.pxPeerSocket );
1210     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxPeerSocket );
1211     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bPassQueued );
1212     TEST_ASSERT_EQUAL( pdTRUE_UNSIGNED, xSocket.u.xTCP.bits.bPassAccept );
1213 }
1214 
1215 /* @brief Test vTCPStateChange function when the state to be reached is established and the
1216  *        current state is closed. Socket select bit is set to select write. Also, this socket
1217  *        is an orphan. Parent socket is non-NULL and reuse bit is not set. Additionally, the
1218  *        parent socket has a connected handler. */
test_vTCPStateChange_ClosedToEstablishedState_QueuedBitSet_ParentNonNULL_HasHandler(void)1219 void test_vTCPStateChange_ClosedToEstablishedState_QueuedBitSet_ParentNonNULL_HasHandler( void )
1220 {
1221     FreeRTOS_Socket_t xSocket, xParentSock;
1222     enum eTCP_STATE eTCPState;
1223     BaseType_t xTickCountAck = 0xAABBEEDD;
1224     BaseType_t xTickCountAlive = 0xAABBEFDD;
1225     BaseType_t xBackup;
1226 
1227     memset( &xSocket, 0, sizeof( xSocket ) );
1228     memset( &xParentSock, 0, sizeof( xParentSock ) );
1229     eTCPState = eESTABLISHED;
1230     xSocket.u.xTCP.eTCPState = eCLOSED;
1231 
1232     xSocket.u.xTCP.usTimeout = 100;
1233     xParentSock.u.xTCP.pxHandleConnected = HandleConnected;
1234     /* if bPassQueued is true, this socket is an orphan until it gets connected. */
1235     xSocket.u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
1236     xSocket.u.xTCP.pxPeerSocket = &xParentSock;
1237 
1238     xHandleConnectedSocket = &xParentSock;
1239     /* Expect the connected field to be set. */
1240     xHandleConnectedLength = 1;
1241 
1242     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
1243 
1244     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
1245     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
1246 
1247     vSocketWakeUpUser_Expect( &xParentSock );
1248 
1249     vTCPStateChange( &xSocket, eTCPState );
1250 
1251     TEST_ASSERT_EQUAL( eESTABLISHED, xSocket.u.xTCP.eTCPState );
1252     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
1253     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
1254     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
1255     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
1256     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
1257     TEST_ASSERT_EQUAL( 100, xSocket.u.xTCP.usTimeout );
1258     TEST_ASSERT_EQUAL( eSOCKET_ACCEPT, xParentSock.xEventBits );
1259     TEST_ASSERT_EQUAL( &xSocket, xParentSock.u.xTCP.pxPeerSocket );
1260     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxPeerSocket );
1261     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bPassQueued );
1262     TEST_ASSERT_EQUAL( pdTRUE_UNSIGNED, xSocket.u.xTCP.bits.bPassAccept );
1263 }
1264 
1265 /* @brief Test vTCPStateChange function when the state to be reached is established and the
1266  *        current state is closed. Socket select bit is set to select write. Also, this socket
1267  *        is an orphan. Parent socket is non-NULL and reuse bit is not set. Additionally, the
1268  *        parent socket has a connected handler. */
test_vTCPStateChange_ClosedToEstablishedState_QueuedBitSet_ParentNonNULL_HasHandler1(void)1269 void test_vTCPStateChange_ClosedToEstablishedState_QueuedBitSet_ParentNonNULL_HasHandler1( void )
1270 {
1271     FreeRTOS_Socket_t xSocket, xParentSock;
1272     enum eTCP_STATE eTCPState;
1273     BaseType_t xTickCountAck = 0xAABBEEDD;
1274     BaseType_t xTickCountAlive = 0xAABBEFDD;
1275     BaseType_t xBackup;
1276 
1277     memset( &xSocket, 0, sizeof( xSocket ) );
1278     memset( &xParentSock, 0, sizeof( xParentSock ) );
1279     eTCPState = eESTABLISHED;
1280     xSocket.u.xTCP.eTCPState = eCLOSED;
1281 
1282     xSocket.u.xTCP.usTimeout = 100;
1283     xParentSock.u.xTCP.pxHandleConnected = HandleConnected;
1284     xSocket.u.xTCP.pxHandleConnected = HandleConnected;
1285     /* if bPassQueued is true, this socket is an orphan until it gets connected. */
1286     xSocket.u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
1287     xSocket.u.xTCP.pxPeerSocket = &xParentSock;
1288     xParentSock.u.xTCP.pxPeerSocket = &xSocket;
1289 
1290     xHandleConnectedSocket = &xParentSock;
1291     /* Expect the connected field to be set. */
1292     xHandleConnectedLength = 1;
1293 
1294     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
1295 
1296     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
1297     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
1298 
1299     vSocketWakeUpUser_Expect( &xParentSock );
1300 
1301     vTCPStateChange( &xSocket, eTCPState );
1302 
1303     TEST_ASSERT_EQUAL( eESTABLISHED, xSocket.u.xTCP.eTCPState );
1304     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
1305     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
1306     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
1307     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
1308     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
1309     TEST_ASSERT_EQUAL( 100, xSocket.u.xTCP.usTimeout );
1310     TEST_ASSERT_EQUAL( eSOCKET_ACCEPT, xParentSock.xEventBits );
1311     TEST_ASSERT_EQUAL( &xSocket, xParentSock.u.xTCP.pxPeerSocket );
1312     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxPeerSocket );
1313     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bPassQueued );
1314     TEST_ASSERT_EQUAL( pdTRUE_UNSIGNED, xSocket.u.xTCP.bits.bPassAccept );
1315 }
1316 
1317 /* @brief Test vTCPStateChange function when the state to be reached is established and the
1318  *        current state is closed. Socket select bit is set to select read. Also, this socket
1319  *        is an orphan. Parent socket is NULL and reuse bit is set. */
test_vTCPStateChange_ClosedToEstablishedState_SelectRead_QueuedBitSet_ParentNULLReuse(void)1320 void test_vTCPStateChange_ClosedToEstablishedState_SelectRead_QueuedBitSet_ParentNULLReuse( void )
1321 {
1322     FreeRTOS_Socket_t xSocket;
1323     enum eTCP_STATE eTCPState;
1324     BaseType_t xTickCountAck = 0xAABBEEDD;
1325     BaseType_t xTickCountAlive = 0xAABBEFDD;
1326     BaseType_t xBackup;
1327 
1328     memset( &xSocket, 0, sizeof( xSocket ) );
1329 
1330     eTCPState = eESTABLISHED;
1331     xSocket.u.xTCP.eTCPState = eCLOSED;
1332 
1333     xSocket.u.xTCP.usTimeout = 100;
1334     xSocket.u.xTCP.pxHandleConnected = HandleConnected;
1335     xSocket.xSelectBits = eSELECT_READ;
1336     /* if bPassQueued is true, this socket is an orphan until it gets connected. */
1337     xSocket.u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
1338     xSocket.u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
1339 
1340     xHandleConnectedSocket = &xSocket;
1341     /* Expect the connected field to be set. */
1342     xHandleConnectedLength = 1;
1343 
1344     prvTCPSocketIsActive_ExpectAndReturn( xSocket.u.xTCP.eTCPState, pdTRUE );
1345 
1346     xTaskGetTickCount_ExpectAndReturn( xTickCountAck );
1347     xTaskGetTickCount_ExpectAndReturn( xTickCountAlive );
1348 
1349     vSocketWakeUpUser_Expect( &xSocket );
1350 
1351     vTCPStateChange( &xSocket, eTCPState );
1352 
1353     TEST_ASSERT_EQUAL( eESTABLISHED, xSocket.u.xTCP.eTCPState );
1354     TEST_ASSERT_EQUAL( xTickCountAck, xSocket.u.xTCP.xLastActTime );
1355     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bWaitKeepAlive );
1356     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bSendKeepAlive );
1357     TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.ucKeepRepCount );
1358     TEST_ASSERT_EQUAL( xTickCountAlive, xSocket.u.xTCP.xLastAliveTime );
1359     TEST_ASSERT_EQUAL( 100, xSocket.u.xTCP.usTimeout );
1360     TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxPeerSocket );
1361     TEST_ASSERT_EQUAL( pdFALSE_UNSIGNED, xSocket.u.xTCP.bits.bPassQueued );
1362     TEST_ASSERT_EQUAL( pdTRUE_UNSIGNED, xSocket.u.xTCP.bits.bPassAccept );
1363     TEST_ASSERT_EQUAL( eSOCKET_ACCEPT | ( eSELECT_READ << SOCKET_EVENT_BIT_COUNT ), xSocket.xEventBits );
1364 }
1365 
1366 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Null_Descriptor(void)1367 void test_xProcessReceivedTCPPacket_Null_Descriptor( void )
1368 {
1369     BaseType_t Return = pdFALSE;
1370 
1371     pxNetworkBuffer = &xNetworkBuffer;
1372     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1373 
1374     pxNetworkBuffer->xDataLength = 40;
1375 
1376     catch_assert( xProcessReceivedTCPPacket( NULL ) );
1377 }
1378 
1379 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Null_Buffer(void)1380 void test_xProcessReceivedTCPPacket_Null_Buffer( void )
1381 {
1382     BaseType_t Return = pdFALSE;
1383 
1384     pxNetworkBuffer = &xNetworkBuffer;
1385     pxNetworkBuffer->pucEthernetBuffer = NULL;
1386 
1387     pxNetworkBuffer->xDataLength = 40;
1388 
1389     catch_assert( xProcessReceivedTCPPacket( pxNetworkBuffer ) );
1390 }
1391 
1392 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Minimal_Data_Length(void)1393 void test_xProcessReceivedTCPPacket_Minimal_Data_Length( void )
1394 {
1395     BaseType_t Return = pdFALSE;
1396 
1397     pxNetworkBuffer = &xNetworkBuffer;
1398     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1399 
1400     pxNetworkBuffer->xDataLength = 40;
1401 
1402     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1403     TEST_ASSERT_EQUAL( pdFALSE, Return );
1404 }
1405 
1406 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_No_Socket(void)1407 void test_xProcessReceivedTCPPacket_No_Socket( void )
1408 {
1409     BaseType_t Return = pdFALSE;
1410 
1411     pxNetworkBuffer = &xNetworkBuffer;
1412     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1413     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1414 
1415     pxNetworkBuffer->xDataLength = 100;
1416     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_ACK;
1417 
1418     pxTCPSocketLookup_ExpectAnyArgsAndReturn( NULL );
1419 
1420     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1421     TEST_ASSERT_EQUAL( pdFALSE, Return );
1422 }
1423 
1424 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_No_Active_Socket(void)1425 void test_xProcessReceivedTCPPacket_No_Active_Socket( void )
1426 {
1427     BaseType_t Return = pdFALSE;
1428 
1429     pxNetworkBuffer = &xNetworkBuffer;
1430     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1431     pxSocket = &xSocket;
1432     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1433 
1434     pxNetworkBuffer->xDataLength = 100;
1435     pxSocket->u.xTCP.eTCPState = eCLOSE_WAIT;
1436     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_RST;
1437 
1438     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1439     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdFALSE );
1440 
1441     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1442     TEST_ASSERT_EQUAL( pdFALSE, Return );
1443 }
1444 
1445 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_No_Active_Socket_Send_Reset(void)1446 void test_xProcessReceivedTCPPacket_No_Active_Socket_Send_Reset( void )
1447 {
1448     BaseType_t Return = pdFALSE;
1449 
1450     pxNetworkBuffer = &xNetworkBuffer;
1451     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1452     pxSocket = &xSocket;
1453     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1454 
1455     pxNetworkBuffer->xDataLength = 100;
1456     pxSocket->u.xTCP.eTCPState = eCLOSE_WAIT;
1457     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_ACK | tcpTCP_FLAG_FIN;
1458 
1459     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1460     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdFALSE );
1461     prvTCPSendReset_ExpectAnyArgsAndReturn( pdTRUE );
1462 
1463     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1464     TEST_ASSERT_EQUAL( pdFALSE, Return );
1465 }
1466 
1467 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Listen_State_Not_Syn_No_Rst(void)1468 void test_xProcessReceivedTCPPacket_Listen_State_Not_Syn_No_Rst( void )
1469 {
1470     BaseType_t Return = pdFALSE;
1471 
1472     pxNetworkBuffer = &xNetworkBuffer;
1473     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1474     pxSocket = &xSocket;
1475     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1476 
1477     pxNetworkBuffer->xDataLength = 100;
1478     pxSocket->u.xTCP.eTCPState = eTCP_LISTEN;
1479     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_RST;
1480 
1481     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1482     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1483 
1484     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1485     TEST_ASSERT_EQUAL( pdFALSE, Return );
1486 }
1487 
1488 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Listen_State_Not_Syn_Rst(void)1489 void test_xProcessReceivedTCPPacket_Listen_State_Not_Syn_Rst( void )
1490 {
1491     BaseType_t Return = pdFALSE;
1492 
1493     pxNetworkBuffer = &xNetworkBuffer;
1494     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1495     pxSocket = &xSocket;
1496     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1497 
1498     pxNetworkBuffer->xDataLength = 100;
1499     pxSocket->u.xTCP.eTCPState = eTCP_LISTEN;
1500     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_ACK;
1501 
1502     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1503     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1504     prvTCPSendReset_ExpectAnyArgsAndReturn( pdTRUE );
1505 
1506     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1507     TEST_ASSERT_EQUAL( pdFALSE, Return );
1508 }
1509 
1510 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Listen_State_Syn_Null_Socket(void)1511 void test_xProcessReceivedTCPPacket_Listen_State_Syn_Null_Socket( void )
1512 {
1513     BaseType_t Return = pdFALSE;
1514 
1515     pxNetworkBuffer = &xNetworkBuffer;
1516     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1517     pxSocket = &xSocket;
1518     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1519 
1520     pxNetworkBuffer->xDataLength = 100;
1521     pxSocket->u.xTCP.eTCPState = eTCP_LISTEN;
1522     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_SYN;
1523 
1524     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1525     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1526     prvHandleListen_ExpectAnyArgsAndReturn( NULL );
1527 
1528     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1529     TEST_ASSERT_EQUAL( pdFALSE, Return );
1530 }
1531 
1532 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Listen_State_Syn_NoOp_Sent_Something(void)1533 void test_xProcessReceivedTCPPacket_Listen_State_Syn_NoOp_Sent_Something( void )
1534 {
1535     BaseType_t Return = pdFALSE;
1536 
1537     pxNetworkBuffer = &xNetworkBuffer;
1538     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1539     pxSocket = &xSocket;
1540     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1541 
1542     pxNetworkBuffer->xDataLength = 100;
1543     pxSocket->u.xTCP.eTCPState = eTCP_LISTEN;
1544     pxSocket->u.xTCP.usTimeout = 1000;
1545     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_SYN;
1546     pxProtocolHeaders->xTCPHeader.ucTCPOffset = 0x50;
1547 
1548     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1549     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1550     prvHandleListen_ExpectAnyArgsAndReturn( pxSocket );
1551     xTaskGetTickCount_ExpectAndReturn( 1000 );
1552     xTaskGetTickCount_ExpectAndReturn( 1500 );
1553     prvTCPHandleState_ExpectAnyArgsAndReturn( 70 );
1554     prvTCPSendRepeated_ExpectAnyArgsAndReturn( 70 );
1555     vReleaseNetworkBufferAndDescriptor_ExpectAnyArgs();
1556 
1557     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1558     TEST_ASSERT_EQUAL( pdTRUE, Return );
1559 }
1560 
1561 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Listen_State_Syn_NoOp_Sent_None(void)1562 void test_xProcessReceivedTCPPacket_Listen_State_Syn_NoOp_Sent_None( void )
1563 {
1564     BaseType_t Return = pdFALSE;
1565 
1566     pxNetworkBuffer = &xNetworkBuffer;
1567     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1568     pxSocket = &xSocket;
1569     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1570 
1571     pxNetworkBuffer->xDataLength = 100;
1572     pxSocket->u.xTCP.eTCPState = eTCP_LISTEN;
1573     pxSocket->u.xTCP.usTimeout = 1000;
1574     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_SYN;
1575     pxProtocolHeaders->xTCPHeader.ucTCPOffset = 0x50;
1576 
1577     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1578     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1579     prvHandleListen_ExpectAnyArgsAndReturn( pxSocket );
1580     xTaskGetTickCount_ExpectAndReturn( 1000 );
1581     xTaskGetTickCount_ExpectAndReturn( 1500 );
1582     prvTCPHandleState_ExpectAnyArgsAndReturn( 0 );
1583     vReleaseNetworkBufferAndDescriptor_ExpectAnyArgs();
1584 
1585     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1586     TEST_ASSERT_EQUAL( pdTRUE, Return );
1587 }
1588 
1589 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Listen_State_Syn_With_Op_Check_Failed(void)1590 void test_xProcessReceivedTCPPacket_Listen_State_Syn_With_Op_Check_Failed( void )
1591 {
1592     BaseType_t Return = pdFALSE;
1593     NetworkBufferDescriptor_t * pNullBuffer = NULL;
1594 
1595     pxNetworkBuffer = &xNetworkBuffer;
1596     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1597     pxSocket = &xSocket;
1598     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1599 
1600     pxNetworkBuffer->xDataLength = 100;
1601     pxSocket->u.xTCP.eTCPState = eTCP_LISTEN;
1602     pxSocket->u.xTCP.usTimeout = 1000;
1603     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_SYN;
1604     pxProtocolHeaders->xTCPHeader.ucTCPOffset = 0x80;
1605 
1606     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1607     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1608     prvHandleListen_ExpectAnyArgsAndReturn( pxSocket );
1609     xTaskGetTickCount_ExpectAndReturn( 1000 );
1610     xTaskGetTickCount_ExpectAndReturn( 1500 );
1611     prvCheckOptions_ExpectAnyArgsAndReturn( pdFALSE );
1612 
1613     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1614     TEST_ASSERT_EQUAL( pdFALSE, Return );
1615 }
1616 
1617 
1618 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Listen_State_Syn_With_Op_Sent_Something_Buffer_Gone(void)1619 void test_xProcessReceivedTCPPacket_Listen_State_Syn_With_Op_Sent_Something_Buffer_Gone( void )
1620 {
1621     BaseType_t Return = pdFALSE;
1622     NetworkBufferDescriptor_t * pNullBuffer = NULL;
1623 
1624     pxNetworkBuffer = &xNetworkBuffer;
1625     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1626     pxSocket = &xSocket;
1627     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1628 
1629     pxNetworkBuffer->xDataLength = 100;
1630     pxSocket->u.xTCP.eTCPState = eTCP_LISTEN;
1631     pxSocket->u.xTCP.usTimeout = 1000;
1632     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_SYN;
1633     pxProtocolHeaders->xTCPHeader.ucTCPOffset = 0x80;
1634 
1635     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1636     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1637     prvHandleListen_ExpectAnyArgsAndReturn( pxSocket );
1638     xTaskGetTickCount_ExpectAndReturn( 1000 );
1639     xTaskGetTickCount_ExpectAndReturn( 1500 );
1640     prvCheckOptions_ExpectAnyArgsAndReturn( pdTRUE );
1641     prvTCPHandleState_ExpectAnyArgsAndReturn( 70 );
1642     prvTCPSendRepeated_ExpectAnyArgsAndReturn( 70 );
1643     prvTCPSendRepeated_ReturnThruPtr_ppxNetworkBuffer( &pNullBuffer );
1644 
1645     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1646     TEST_ASSERT_EQUAL( pdTRUE, Return );
1647 }
1648 
1649 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Establish_State_Syn(void)1650 void test_xProcessReceivedTCPPacket_Establish_State_Syn( void )
1651 {
1652     BaseType_t Return = pdFALSE;
1653 
1654     pxNetworkBuffer = &xNetworkBuffer;
1655     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1656     pxSocket = &xSocket;
1657     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1658 
1659     pxNetworkBuffer->xDataLength = 100;
1660     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
1661     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_SYN;
1662 
1663     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1664     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1665 
1666     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1667     TEST_ASSERT_EQUAL( pdFALSE, Return );
1668 }
1669 
1670 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_ConnectSyn_State_Rst_Change_State(void)1671 void test_xProcessReceivedTCPPacket_ConnectSyn_State_Rst_Change_State( void )
1672 {
1673     BaseType_t Return = pdFALSE;
1674 
1675     pxNetworkBuffer = &xNetworkBuffer;
1676     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1677     pxSocket = &xSocket;
1678     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1679 
1680     pxNetworkBuffer->xDataLength = 100;
1681     pxSocket->u.xTCP.eTCPState = eCONNECT_SYN;
1682     pxSocket->u.xTCP.xTCPWindow.ulOurSequenceNumber = 0;
1683     pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( 1 );
1684     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_RST;
1685 
1686     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1687     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1688     xTaskGetTickCount_ExpectAndReturn( 1000 );
1689     xTaskGetTickCount_ExpectAndReturn( 1500 );
1690 
1691     vSocketWakeUpUser_Expect( pxSocket );
1692 
1693     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1694     TEST_ASSERT_EQUAL( pdFALSE, Return );
1695     TEST_ASSERT_EQUAL( eCLOSED, pxSocket->u.xTCP.eTCPState );
1696 }
1697 
1698 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_ConnectSyn_State_Rst_SeqNo_Wrong(void)1699 void test_xProcessReceivedTCPPacket_ConnectSyn_State_Rst_SeqNo_Wrong( void )
1700 {
1701     BaseType_t Return = pdFALSE;
1702 
1703     pxNetworkBuffer = &xNetworkBuffer;
1704     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1705     pxSocket = &xSocket;
1706     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1707 
1708     pxNetworkBuffer->xDataLength = 100;
1709     pxSocket->u.xTCP.eTCPState = eCONNECT_SYN;
1710     pxSocket->u.xTCP.xTCPWindow.ulOurSequenceNumber = 0;
1711     pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( 100 );
1712     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_RST;
1713 
1714     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1715     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1716 
1717     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1718     TEST_ASSERT_EQUAL( pdFALSE, Return );
1719 }
1720 
1721 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_SynReceived_State_Rst(void)1722 void test_xProcessReceivedTCPPacket_SynReceived_State_Rst( void )
1723 {
1724     BaseType_t Return = pdFALSE;
1725 
1726     pxNetworkBuffer = &xNetworkBuffer;
1727     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1728     pxSocket = &xSocket;
1729     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1730 
1731     pxNetworkBuffer->xDataLength = 100;
1732     pxSocket->u.xTCP.eTCPState = eSYN_RECEIVED;
1733     pxSocket->u.xTCP.xTCPWindow.rx.ulCurrentSequenceNumber = 1000;
1734     pxProtocolHeaders->xTCPHeader.ucTCPOffset = 0x50;
1735     pxProtocolHeaders->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( 1001 );
1736     pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( 100 );
1737     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_SYN;
1738 
1739     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1740     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1741     xTaskGetTickCount_ExpectAndReturn( 1000 );
1742     xTaskGetTickCount_ExpectAndReturn( 1500 );
1743     prvTCPHandleState_ExpectAnyArgsAndReturn( 0 );
1744     vReleaseNetworkBufferAndDescriptor_ExpectAnyArgs();
1745 
1746     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1747     TEST_ASSERT_EQUAL( pdTRUE, Return );
1748 }
1749 
1750 
1751 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Establish_State_Rst_Change_State(void)1752 void test_xProcessReceivedTCPPacket_Establish_State_Rst_Change_State( void )
1753 {
1754     BaseType_t Return = pdFALSE;
1755 
1756     pxNetworkBuffer = &xNetworkBuffer;
1757     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1758     pxSocket = &xSocket;
1759     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1760 
1761     pxNetworkBuffer->xDataLength = 100;
1762     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
1763     pxSocket->u.xTCP.xTCPWindow.rx.ulCurrentSequenceNumber = 1000;
1764     pxProtocolHeaders->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( 1000 );
1765     pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( 100 );
1766     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_RST;
1767 
1768     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1769     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1770     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1771     xTaskGetTickCount_ExpectAndReturn( 1000 );
1772     xTaskGetTickCount_ExpectAndReturn( 1500 );
1773 
1774     vSocketWakeUpUser_Expect( pxSocket );
1775 
1776     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1777     TEST_ASSERT_EQUAL( pdFALSE, Return );
1778     TEST_ASSERT_EQUAL( eCLOSED, pxSocket->u.xTCP.eTCPState );
1779 }
1780 
1781 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Establish_State_Rst_Seq_InRange(void)1782 void test_xProcessReceivedTCPPacket_Establish_State_Rst_Seq_InRange( void )
1783 {
1784     BaseType_t Return = pdFALSE;
1785 
1786     pxNetworkBuffer = &xNetworkBuffer;
1787     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1788     pxSocket = &xSocket;
1789     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1790 
1791     pxNetworkBuffer->xDataLength = 100;
1792     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
1793     pxSocket->u.xTCP.xTCPWindow.rx.ulCurrentSequenceNumber = 1000;
1794     pxProtocolHeaders->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( 1001 );
1795     pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( 100 );
1796     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_RST;
1797 
1798     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1799     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1800     xSequenceGreaterThan_ExpectAnyArgsAndReturn( pdTRUE );
1801     xSequenceLessThan_ExpectAnyArgsAndReturn( pdTRUE );
1802     prvTCPSendChallengeAck_ExpectAnyArgsAndReturn( pdTRUE );
1803 
1804     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1805     TEST_ASSERT_EQUAL( pdFALSE, Return );
1806 }
1807 
1808 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Establish_State_Rst_Seq_OutRange1(void)1809 void test_xProcessReceivedTCPPacket_Establish_State_Rst_Seq_OutRange1( void )
1810 {
1811     BaseType_t Return = pdFALSE;
1812 
1813     pxNetworkBuffer = &xNetworkBuffer;
1814     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1815     pxSocket = &xSocket;
1816     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1817 
1818     pxNetworkBuffer->xDataLength = 100;
1819     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
1820     pxSocket->u.xTCP.xTCPWindow.rx.ulCurrentSequenceNumber = 1000;
1821     pxProtocolHeaders->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( 1001 );
1822     pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( 100 );
1823     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_RST;
1824 
1825     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1826     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1827     xSequenceGreaterThan_ExpectAnyArgsAndReturn( pdTRUE );
1828     xSequenceLessThan_ExpectAnyArgsAndReturn( pdFALSE );
1829 
1830     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1831     TEST_ASSERT_EQUAL( pdFALSE, Return );
1832 }
1833 
1834 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Establish_State_Rst_Seq_OutRange2(void)1835 void test_xProcessReceivedTCPPacket_Establish_State_Rst_Seq_OutRange2( void )
1836 {
1837     BaseType_t Return = pdFALSE;
1838 
1839     pxNetworkBuffer = &xNetworkBuffer;
1840     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1841     pxSocket = &xSocket;
1842     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1843 
1844     pxNetworkBuffer->xDataLength = 100;
1845     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
1846     pxSocket->u.xTCP.xTCPWindow.rx.ulCurrentSequenceNumber = 1000;
1847     pxProtocolHeaders->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( 1001 );
1848     pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( 100 );
1849     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_RST;
1850 
1851     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1852     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1853     xSequenceGreaterThan_ExpectAnyArgsAndReturn( pdFALSE );
1854 
1855     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1856     TEST_ASSERT_EQUAL( pdFALSE, Return );
1857 }
1858 
1859 
1860 /* test xProcessReceivedTCPPacket function */
test_xProcessReceivedTCPPacket_Establish_State_Ack(void)1861 void test_xProcessReceivedTCPPacket_Establish_State_Ack( void )
1862 {
1863     BaseType_t Return = pdFALSE;
1864 
1865     pxNetworkBuffer = &xNetworkBuffer;
1866     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1867     pxSocket = &xSocket;
1868     ProtocolHeaders_t * pxProtocolHeaders = ( ( const ProtocolHeaders_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer ) ] ) );
1869 
1870     pxNetworkBuffer->xDataLength = 100;
1871     pxSocket->u.xTCP.eTCPState = eESTABLISHED;
1872     pxSocket->u.xTCP.xTCPWindow.rx.ulCurrentSequenceNumber = 1000;
1873     pxProtocolHeaders->xTCPHeader.ucTCPOffset = 0x50;
1874     pxProtocolHeaders->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( 1001 );
1875     pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( 100 );
1876     pxProtocolHeaders->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_ACK;
1877 
1878     pxTCPSocketLookup_ExpectAnyArgsAndReturn( pxSocket );
1879     prvTCPSocketIsActive_ExpectAnyArgsAndReturn( pdTRUE );
1880     xTaskGetTickCount_ExpectAndReturn( 1000 );
1881     xTaskGetTickCount_ExpectAndReturn( 1500 );
1882     prvTCPHandleState_ExpectAnyArgsAndReturn( 0 );
1883     vReleaseNetworkBufferAndDescriptor_ExpectAnyArgs();
1884 
1885     Return = xProcessReceivedTCPPacket( pxNetworkBuffer );
1886     TEST_ASSERT_EQUAL( pdTRUE, Return );
1887 }
1888 
test_Helper_ListInitialise(List_t * const pxList)1889 static void test_Helper_ListInitialise( List_t * const pxList )
1890 {
1891     /* The list structure contains a list item which is used to mark the
1892      * end of the list.  To initialise the list the list end is inserted
1893      * as the only list entry. */
1894     pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */
1895 
1896     /* The list end value is the highest possible value in the list to
1897      * ensure it remains at the end of the list. */
1898     pxList->xListEnd.xItemValue = portMAX_DELAY;
1899 
1900     /* The list end next and previous pointers point to itself so we know
1901      * when the list is empty. */
1902     pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );     /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */
1903     pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */
1904 
1905     pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
1906 
1907     /* Write known values into the list if
1908      * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
1909     listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );
1910     listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
1911 }
1912 
test_Helper_ListInsertEnd(List_t * const pxList,ListItem_t * const pxNewListItem)1913 static void test_Helper_ListInsertEnd( List_t * const pxList,
1914                                        ListItem_t * const pxNewListItem )
1915 {
1916     ListItem_t * const pxIndex = pxList->pxIndex;
1917 
1918     /* Only effective when configASSERT() is also defined, these tests may catch
1919      * the list data structures being overwritten in memory.  They will not catch
1920      * data errors caused by incorrect configuration or use of FreeRTOS. */
1921     listTEST_LIST_INTEGRITY( pxList );
1922     listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
1923 
1924     /* Insert a new list item into pxList, but rather than sort the list,
1925      * makes the new list item the last item to be removed by a call to
1926      * listGET_OWNER_OF_NEXT_ENTRY(). */
1927     pxNewListItem->pxNext = pxIndex;
1928     pxNewListItem->pxPrevious = pxIndex->pxPrevious;
1929 
1930     /* Only used during decision coverage testing. */
1931     mtCOVERAGE_TEST_DELAY();
1932 
1933     pxIndex->pxPrevious->pxNext = pxNewListItem;
1934     pxIndex->pxPrevious = pxNewListItem;
1935 
1936     /* Remember which list the item is in. */
1937     pxNewListItem->pxContainer = pxList;
1938 
1939     ( pxList->uxNumberOfItems )++;
1940 }
1941 
1942 /* test xTCPCheckNewClient function */
test_xTCPCheckNewClient_Empty_List(void)1943 void test_xTCPCheckNewClient_Empty_List( void )
1944 {
1945     BaseType_t Return = pdFALSE;
1946 
1947     pxSocket = &xSocket;
1948     List_t * pSocketList = &xBoundTCPSocketsList;
1949     MiniListItem_t EndItem;
1950 
1951     test_Helper_ListInitialise( pSocketList );
1952 
1953     pxSocket->usLocalPort = 40000;
1954     Return = xTCPCheckNewClient( pxSocket );
1955     TEST_ASSERT_EQUAL( pdFALSE, Return );
1956     TEST_ASSERT_EQUAL( NULL, pxSocket->u.xTCP.pxPeerSocket );
1957 }
1958 
1959 /* test xTCPCheckNewClient function */
test_xTCPCheckNewClient_Not_Found_No_Port(void)1960 void test_xTCPCheckNewClient_Not_Found_No_Port( void )
1961 {
1962     BaseType_t Return = pdFALSE;
1963 
1964     pxSocket = &xSocket;
1965     List_t * pSocketList = &xBoundTCPSocketsList;
1966     ListItem_t NewEntry;
1967 
1968     pxSocket->xBoundSocketListItem.xItemValue = 443;
1969 
1970     test_Helper_ListInitialise( pSocketList );
1971     test_Helper_ListInsertEnd( &xBoundTCPSocketsList, &( pxSocket->xBoundSocketListItem ) );
1972 
1973     pxSocket->usLocalPort = FreeRTOS_ntohs( 40000 );
1974     Return = xTCPCheckNewClient( pxSocket );
1975     TEST_ASSERT_EQUAL( pdFALSE, Return );
1976     TEST_ASSERT_EQUAL( NULL, pxSocket->u.xTCP.pxPeerSocket );
1977 }
1978 
1979 /* test xTCPCheckNewClient function */
test_xTCPCheckNewClient_Not_Found_Not_TCP(void)1980 void test_xTCPCheckNewClient_Not_Found_Not_TCP( void )
1981 {
1982     BaseType_t Return = pdFALSE;
1983 
1984     pxSocket = &xSocket;
1985     List_t * pSocketList = &xBoundTCPSocketsList;
1986     ListItem_t NewEntry;
1987 
1988     pxSocket->xBoundSocketListItem.xItemValue = 40000;
1989     pxSocket->xBoundSocketListItem.pvOwner = pxSocket;
1990     pxSocket->ucProtocol = FREERTOS_IPPROTO_UDP;
1991     pxSocket->u.xTCP.bits.bPassAccept = pdTRUE;
1992 
1993 
1994     test_Helper_ListInitialise( pSocketList );
1995     test_Helper_ListInsertEnd( &xBoundTCPSocketsList, &( pxSocket->xBoundSocketListItem ) );
1996 
1997     pxSocket->usLocalPort = FreeRTOS_ntohs( 40000 );
1998     Return = xTCPCheckNewClient( pxSocket );
1999     TEST_ASSERT_EQUAL( pdFALSE, Return );
2000     TEST_ASSERT_EQUAL( NULL, pxSocket->u.xTCP.pxPeerSocket );
2001 }
2002 
2003 /* test xTCPCheckNewClient function */
test_xTCPCheckNewClient_Not_Found_Not_Aceept(void)2004 void test_xTCPCheckNewClient_Not_Found_Not_Aceept( void )
2005 {
2006     BaseType_t Return = pdFALSE;
2007 
2008     pxSocket = &xSocket;
2009     List_t * pSocketList = &xBoundTCPSocketsList;
2010     ListItem_t NewEntry;
2011 
2012     pxSocket->xBoundSocketListItem.xItemValue = 40000;
2013     pxSocket->xBoundSocketListItem.pvOwner = pxSocket;
2014     pxSocket->ucProtocol = FREERTOS_IPPROTO_TCP;
2015     pxSocket->u.xTCP.bits.bPassAccept = pdFALSE;
2016 
2017 
2018     test_Helper_ListInitialise( pSocketList );
2019     test_Helper_ListInsertEnd( &xBoundTCPSocketsList, &( pxSocket->xBoundSocketListItem ) );
2020 
2021     pxSocket->usLocalPort = FreeRTOS_ntohs( 40000 );
2022     Return = xTCPCheckNewClient( pxSocket );
2023     TEST_ASSERT_EQUAL( pdFALSE, Return );
2024     TEST_ASSERT_EQUAL( NULL, pxSocket->u.xTCP.pxPeerSocket );
2025 }
2026 
2027 /* test xTCPCheckNewClient function */
test_xTCPCheckNewClient_Found(void)2028 void test_xTCPCheckNewClient_Found( void )
2029 {
2030     BaseType_t Return = pdFALSE;
2031 
2032     pxSocket = &xSocket;
2033     List_t * pSocketList = &xBoundTCPSocketsList;
2034     ListItem_t NewEntry;
2035 
2036     pxSocket->xBoundSocketListItem.xItemValue = 40000;
2037     pxSocket->xBoundSocketListItem.pvOwner = pxSocket;
2038     pxSocket->ucProtocol = FREERTOS_IPPROTO_TCP;
2039     pxSocket->u.xTCP.bits.bPassAccept = pdTRUE;
2040 
2041     test_Helper_ListInitialise( pSocketList );
2042     test_Helper_ListInsertEnd( &xBoundTCPSocketsList, &( pxSocket->xBoundSocketListItem ) );
2043 
2044     pxSocket->usLocalPort = FreeRTOS_ntohs( 40000 );
2045     Return = xTCPCheckNewClient( pxSocket );
2046     TEST_ASSERT_EQUAL( pdTRUE, Return );
2047     TEST_ASSERT_EQUAL_PTR( pxSocket, pxSocket->u.xTCP.pxPeerSocket );
2048 }
2049