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_IPv4_Sockets.h"
52 #include "mock_FreeRTOS_IPv6_Sockets.h"
53 #include "mock_FreeRTOS_Sockets.h"
54
55 #include "FreeRTOS_Sockets.h"
56
57 #include "FreeRTOS_Sockets_stubs.c"
58 #include "catch_assert.h"
59
60 #include "FreeRTOSIPConfig.h"
61
62 /* =========================== EXTERN VARIABLES =========================== */
63
64 extern List_t xBoundUDPSocketsList;
65 extern List_t xBoundTCPSocketsList;
66
67 /* 2001::1 */
68 static IPv6_Address_t xIPv6Address = { { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } };
69
70 /* ============================== Test Cases ============================== */
71
72 /**
73 * @brief Creation of socket when socket size determination fails as IP task is not ready.
74 */
test_FreeRTOS_socket_SockSizeFailure(void)75 void test_FreeRTOS_socket_SockSizeFailure( void )
76 {
77 Socket_t xSocket;
78 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_STREAM, xProtocol = FREERTOS_IPPROTO_TCP;
79 FreeRTOS_Socket_t const * pxSocket = NULL;
80
81 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
82
83 xSocket = FreeRTOS_socket( xDomain, xType, xProtocol );
84
85 TEST_ASSERT_EQUAL( FREERTOS_INVALID_SOCKET, xSocket );
86 }
87
88 /**
89 * @brief Creation of socket when socket size determination fails as IP task is not ready.
90 */
test_FreeRTOS_socket_SockSizeFailure_SockDependent(void)91 void test_FreeRTOS_socket_SockSizeFailure_SockDependent( void )
92 {
93 Socket_t xSocket;
94 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_STREAM | FREERTOS_SOCK_DGRAM;
95 BaseType_t xProtocol = FREERTOS_SOCK_DEPENDENT_PROTO;
96 FreeRTOS_Socket_t const * pxSocket = NULL;
97
98 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
99
100 xSocket = FreeRTOS_socket( xDomain, xType, xProtocol );
101
102 TEST_ASSERT_EQUAL( FREERTOS_INVALID_SOCKET, xSocket );
103 }
104
105 /**
106 * @brief Creation of socket when no memory could be allocated.
107 */
test_FreeRTOS_socket_NoMemory(void)108 void test_FreeRTOS_socket_NoMemory( void )
109 {
110 Socket_t xSocket;
111 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_STREAM, xProtocol = FREERTOS_IPPROTO_TCP;
112 FreeRTOS_Socket_t const * pxSocket = NULL;
113
114 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
115
116 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
117 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
118
119 pvPortMalloc_ExpectAndReturn( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ), NULL );
120
121 xSocket = FreeRTOS_socket( xDomain, xType, xProtocol );
122
123 TEST_ASSERT_EQUAL( FREERTOS_INVALID_SOCKET, xSocket );
124 }
125
126 /**
127 * @brief Creation of socket when event group creation fails.
128 */
test_FreeRTOS_socket_EventGroupCreationFailed(void)129 void test_FreeRTOS_socket_EventGroupCreationFailed( void )
130 {
131 Socket_t xSocket;
132 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_STREAM, xProtocol = FREERTOS_IPPROTO_TCP;
133 FreeRTOS_Socket_t const * pxSocket = NULL;
134 uint8_t ucSocket[ ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ) ];
135
136 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
137
138 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
139 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
140
141 pvPortMalloc_ExpectAndReturn( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ), ( void * ) ucSocket );
142
143 xEventGroupCreate_ExpectAndReturn( NULL );
144
145 vPortFree_Expect( ucSocket );
146
147 xSocket = FreeRTOS_socket( xDomain, xType, xProtocol );
148
149 TEST_ASSERT_EQUAL( FREERTOS_INVALID_SOCKET, xSocket );
150 }
151
152 /**
153 * @brief Creation of socket when the protocol is TCP.
154 */
test_FreeRTOS_socket_TCPSocket_ProtocolDependent(void)155 void test_FreeRTOS_socket_TCPSocket_ProtocolDependent( void )
156 {
157 Socket_t xSocket;
158 FreeRTOS_Socket_t * pxSocket;
159 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_STREAM, xProtocol = FREERTOS_SOCK_DEPENDENT_PROTO;
160 uint8_t ucSocket[ ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ) ];
161 uint8_t xEventGroup[ sizeof( uintptr_t ) ];
162
163 pxSocket = ( FreeRTOS_Socket_t * ) ucSocket;
164
165 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
166
167 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
168 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
169
170 pvPortMalloc_ExpectAndReturn( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ), ( void * ) ucSocket );
171
172 xEventGroupCreate_ExpectAndReturn( ( EventGroupHandle_t ) xEventGroup );
173
174 FreeRTOS_round_up_ExpectAndReturn( ipconfigTCP_TX_BUFFER_LENGTH, ipconfigTCP_MSS, 0xAABB );
175 FreeRTOS_max_size_t_ExpectAndReturn( 1U, ( uint32_t ) ( ipconfigTCP_RX_BUFFER_LENGTH / 2U ) / ipconfigTCP_MSS, 0x1234 );
176 FreeRTOS_max_size_t_ExpectAndReturn( 1U, ( uint32_t ) ( 0xAABB / 2U ) / ipconfigTCP_MSS, 0x3456 );
177
178 vListInitialiseItem_Expect( &( pxSocket->xBoundSocketListItem ) );
179
180 listSET_LIST_ITEM_OWNER_Expect( &( pxSocket->xBoundSocketListItem ), pxSocket );
181
182
183 xSocket = FreeRTOS_socket( xDomain, xType, xProtocol );
184
185 TEST_ASSERT_EQUAL( ucSocket, xSocket );
186 TEST_ASSERT_EQUAL( xSocket->xEventGroup, xEventGroup );
187 TEST_ASSERT_EQUAL( xSocket->xReceiveBlockTime, ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME );
188 TEST_ASSERT_EQUAL( xSocket->xSendBlockTime, ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME );
189 TEST_ASSERT_EQUAL( xSocket->ucSocketOptions, ( uint8_t ) FREERTOS_SO_UDPCKSUM_OUT );
190 TEST_ASSERT_EQUAL( xSocket->ucProtocol, ( uint8_t ) FREERTOS_IPPROTO_TCP );
191 TEST_ASSERT_EQUAL( xSocket->u.xTCP.usMSS, ( uint16_t ) ipconfigTCP_MSS );
192 TEST_ASSERT_EQUAL( xSocket->u.xTCP.uxRxStreamSize, ( size_t ) ipconfigTCP_RX_BUFFER_LENGTH );
193 TEST_ASSERT_EQUAL( xSocket->u.xTCP.uxTxStreamSize, 0xAABB );
194 TEST_ASSERT_EQUAL( 0x1234, pxSocket->u.xTCP.uxRxWinSize );
195 TEST_ASSERT_EQUAL( 0x3456, pxSocket->u.xTCP.uxTxWinSize );
196 }
197
198 /**
199 * @brief Creation of socket when the protocol is TCP.
200 */
test_FreeRTOS_socket_TCPSocket(void)201 void test_FreeRTOS_socket_TCPSocket( void )
202 {
203 Socket_t xSocket;
204 FreeRTOS_Socket_t * pxSocket;
205 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_STREAM, xProtocol = FREERTOS_IPPROTO_TCP;
206 uint8_t ucSocket[ ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ) ];
207 uint8_t xEventGroup[ sizeof( uintptr_t ) ];
208
209 pxSocket = ( FreeRTOS_Socket_t * ) ucSocket;
210
211 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
212
213 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
214 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
215
216 pvPortMalloc_ExpectAndReturn( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ), ( void * ) ucSocket );
217
218 xEventGroupCreate_ExpectAndReturn( ( EventGroupHandle_t ) xEventGroup );
219
220 FreeRTOS_round_up_ExpectAndReturn( ipconfigTCP_TX_BUFFER_LENGTH, ipconfigTCP_MSS, 0xAABB );
221 FreeRTOS_max_size_t_ExpectAndReturn( 1U, ( uint32_t ) ( ipconfigTCP_RX_BUFFER_LENGTH / 2U ) / ipconfigTCP_MSS, 0x1234 );
222 FreeRTOS_max_size_t_ExpectAndReturn( 1U, ( uint32_t ) ( 0xAABB / 2U ) / ipconfigTCP_MSS, 0x3456 );
223
224 vListInitialiseItem_Expect( &( pxSocket->xBoundSocketListItem ) );
225
226 listSET_LIST_ITEM_OWNER_Expect( &( pxSocket->xBoundSocketListItem ), pxSocket );
227
228 xSocket = FreeRTOS_socket( xDomain, xType, xProtocol );
229
230 TEST_ASSERT_EQUAL( ucSocket, xSocket );
231 TEST_ASSERT_EQUAL( xSocket->xEventGroup, xEventGroup );
232 TEST_ASSERT_EQUAL( xSocket->xReceiveBlockTime, ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME );
233 TEST_ASSERT_EQUAL( xSocket->xSendBlockTime, ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME );
234 TEST_ASSERT_EQUAL( xSocket->ucSocketOptions, ( uint8_t ) FREERTOS_SO_UDPCKSUM_OUT );
235 TEST_ASSERT_EQUAL( xSocket->ucProtocol, ( uint8_t ) xProtocol );
236 TEST_ASSERT_EQUAL( xSocket->u.xTCP.usMSS, ( uint16_t ) ipconfigTCP_MSS );
237 TEST_ASSERT_EQUAL( xSocket->u.xTCP.uxRxStreamSize, ( size_t ) ipconfigTCP_RX_BUFFER_LENGTH );
238 TEST_ASSERT_EQUAL( xSocket->u.xTCP.uxTxStreamSize, 0xAABB );
239 TEST_ASSERT_EQUAL( 0x1234, pxSocket->u.xTCP.uxRxWinSize );
240 TEST_ASSERT_EQUAL( 0x3456, pxSocket->u.xTCP.uxTxWinSize );
241 }
242
243 /**
244 * @brief Creation of socket when the protocol is UDP.
245 */
test_FreeRTOS_socket_UDPSocket(void)246 void test_FreeRTOS_socket_UDPSocket( void )
247 {
248 Socket_t xSocket;
249 FreeRTOS_Socket_t * pxSocket;
250 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_DGRAM, xProtocol = FREERTOS_IPPROTO_UDP;
251 uint8_t ucSocket[ ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xUDP ) ];
252 uint8_t xEventGroup[ sizeof( uintptr_t ) ];
253
254 pxSocket = ( FreeRTOS_Socket_t * ) ucSocket;
255
256 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
257
258 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
259 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
260
261 pvPortMalloc_ExpectAndReturn( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xUDP ), ( void * ) ucSocket );
262
263 xEventGroupCreate_ExpectAndReturn( ( EventGroupHandle_t ) xEventGroup );
264
265 vListInitialise_Expect( &( pxSocket->u.xUDP.xWaitingPacketsList ) );
266
267 vListInitialiseItem_Expect( &( pxSocket->xBoundSocketListItem ) );
268
269 listSET_LIST_ITEM_OWNER_Expect( &( pxSocket->xBoundSocketListItem ), pxSocket );
270
271 xSocket = FreeRTOS_socket( xDomain, xType, xProtocol );
272
273 TEST_ASSERT_EQUAL( ucSocket, xSocket );
274 TEST_ASSERT_EQUAL( xSocket->xEventGroup, xEventGroup );
275 TEST_ASSERT_EQUAL( xSocket->xReceiveBlockTime, ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME );
276 TEST_ASSERT_EQUAL( xSocket->xSendBlockTime, ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME );
277 TEST_ASSERT_EQUAL( xSocket->ucSocketOptions, ( uint8_t ) FREERTOS_SO_UDPCKSUM_OUT );
278 TEST_ASSERT_EQUAL( xSocket->ucProtocol, ( uint8_t ) xProtocol );
279 TEST_ASSERT_EQUAL( xSocket->u.xUDP.uxMaxPackets, ( UBaseType_t ) ipconfigUDP_MAX_RX_PACKETS );
280 }
281
282 /**
283 * @brief Creation of socket when the protocol is UDP.
284 */
test_FreeRTOS_socket_UDPSocket_ProtocolDependent(void)285 void test_FreeRTOS_socket_UDPSocket_ProtocolDependent( void )
286 {
287 Socket_t xSocket;
288 FreeRTOS_Socket_t * pxSocket;
289 BaseType_t xDomain = FREERTOS_AF_INET, xType = FREERTOS_SOCK_DGRAM, xProtocol = FREERTOS_SOCK_DEPENDENT_PROTO;
290 uint8_t ucSocket[ ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xUDP ) ];
291 uint8_t xEventGroup[ sizeof( uintptr_t ) ];
292
293 pxSocket = ( FreeRTOS_Socket_t * ) ucSocket;
294
295 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
296
297 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
298 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
299
300 pvPortMalloc_ExpectAndReturn( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xUDP ), ( void * ) ucSocket );
301
302 xEventGroupCreate_ExpectAndReturn( ( EventGroupHandle_t ) xEventGroup );
303
304 vListInitialise_Expect( &( pxSocket->u.xUDP.xWaitingPacketsList ) );
305
306 vListInitialiseItem_Expect( &( pxSocket->xBoundSocketListItem ) );
307
308 listSET_LIST_ITEM_OWNER_Expect( &( pxSocket->xBoundSocketListItem ), pxSocket );
309
310 xSocket = FreeRTOS_socket( xDomain, xType, xProtocol );
311
312 TEST_ASSERT_EQUAL( ucSocket, xSocket );
313 TEST_ASSERT_EQUAL( xSocket->xEventGroup, xEventGroup );
314 TEST_ASSERT_EQUAL( xSocket->xReceiveBlockTime, ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME );
315 TEST_ASSERT_EQUAL( xSocket->xSendBlockTime, ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME );
316 TEST_ASSERT_EQUAL( xSocket->ucSocketOptions, ( uint8_t ) FREERTOS_SO_UDPCKSUM_OUT );
317 TEST_ASSERT_EQUAL( xSocket->ucProtocol, ( uint8_t ) FREERTOS_IPPROTO_UDP );
318 TEST_ASSERT_EQUAL( xSocket->u.xUDP.uxMaxPackets, ( UBaseType_t ) ipconfigUDP_MAX_RX_PACKETS );
319 }
320
321 /**
322 * @brief Assertion when unknown domain comes.
323 */
test_FreeRTOS_socket_unknownDomain(void)324 void test_FreeRTOS_socket_unknownDomain( void )
325 {
326 BaseType_t xDomain = FREERTOS_AF_INET + 1, xType = FREERTOS_SOCK_DGRAM, xProtocol = FREERTOS_SOCK_DEPENDENT_PROTO;
327
328 catch_assert( FreeRTOS_socket( xDomain, xType, xProtocol ) );
329 }
330
331 /**
332 * @brief Creation of socket when the protocol is TCPv6.
333 */
test_FreeRTOS_socket_TCPv6Socket(void)334 void test_FreeRTOS_socket_TCPv6Socket( void )
335 {
336 Socket_t xSocket;
337 FreeRTOS_Socket_t * pxSocket;
338 BaseType_t xDomain = FREERTOS_AF_INET6, xType = FREERTOS_SOCK_STREAM, xProtocol = FREERTOS_IPPROTO_TCP;
339 uint8_t ucSocket[ ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ) ];
340 uint8_t xEventGroup[ sizeof( uintptr_t ) ];
341
342 pxSocket = ( FreeRTOS_Socket_t * ) ucSocket;
343
344 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
345
346 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundUDPSocketsList, pdTRUE );
347 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
348
349 pvPortMalloc_ExpectAndReturn( ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP ), ( void * ) ucSocket );
350
351 xEventGroupCreate_ExpectAndReturn( ( EventGroupHandle_t ) xEventGroup );
352
353 FreeRTOS_round_up_ExpectAndReturn( ipconfigTCP_TX_BUFFER_LENGTH, ipconfigTCP_MSS, 0xAABB );
354 FreeRTOS_max_size_t_ExpectAndReturn( 1U, ( uint32_t ) ( ipconfigTCP_RX_BUFFER_LENGTH / 2U ) / ipconfigTCP_MSS, 0x1234 );
355 FreeRTOS_max_size_t_ExpectAndReturn( 1U, ( uint32_t ) ( 0xAABB / 2U ) / ipconfigTCP_MSS, 0x3456 );
356
357 vListInitialiseItem_Expect( &( pxSocket->xBoundSocketListItem ) );
358
359 listSET_LIST_ITEM_OWNER_Expect( &( pxSocket->xBoundSocketListItem ), pxSocket );
360
361 xSocket = FreeRTOS_socket( xDomain, xType, xProtocol );
362
363 TEST_ASSERT_EQUAL( ucSocket, xSocket );
364 TEST_ASSERT_EQUAL( xSocket->xEventGroup, xEventGroup );
365 TEST_ASSERT_EQUAL( xSocket->xReceiveBlockTime, ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME );
366 TEST_ASSERT_EQUAL( xSocket->xSendBlockTime, ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME );
367 TEST_ASSERT_EQUAL( xSocket->ucSocketOptions, ( uint8_t ) FREERTOS_SO_UDPCKSUM_OUT );
368 TEST_ASSERT_EQUAL( xSocket->ucProtocol, ( uint8_t ) xProtocol );
369 TEST_ASSERT_EQUAL( xSocket->u.xTCP.usMSS, ( uint16_t ) ipconfigTCP_MSS - ( ipSIZE_OF_IPv6_HEADER - ipSIZE_OF_IPv4_HEADER ) );
370 TEST_ASSERT_EQUAL( xSocket->u.xTCP.uxRxStreamSize, ( size_t ) ipconfigTCP_RX_BUFFER_LENGTH );
371 TEST_ASSERT_EQUAL( xSocket->u.xTCP.uxTxStreamSize, 0xAABB );
372 TEST_ASSERT_EQUAL( 0x1234, pxSocket->u.xTCP.uxRxWinSize );
373 TEST_ASSERT_EQUAL( 0x3456, pxSocket->u.xTCP.uxTxWinSize );
374 }
375
376 /**
377 * @brief Creation of socket-set when there is no memory.
378 */
test_FreeRTOS_CreateSocketSet_NoMemory(void)379 void test_FreeRTOS_CreateSocketSet_NoMemory( void )
380 {
381 SocketSelect_t * pxSocketSet;
382
383 pvPortMalloc_ExpectAndReturn( sizeof( *pxSocketSet ), NULL );
384
385 pxSocketSet = FreeRTOS_CreateSocketSet();
386
387 TEST_ASSERT_EQUAL( NULL, pxSocketSet );
388 }
389
390 /**
391 * @brief Creation of socket-set when event group creation fails.
392 */
test_FreeRTOS_CreateSocketSet_EventGroupCreationFails(void)393 void test_FreeRTOS_CreateSocketSet_EventGroupCreationFails( void )
394 {
395 SocketSelect_t * pxSocketSet;
396 uint8_t ucSocket[ sizeof( *pxSocketSet ) ];
397
398 pvPortMalloc_ExpectAndReturn( sizeof( *pxSocketSet ), ucSocket );
399
400 xEventGroupCreate_ExpectAndReturn( NULL );
401
402 vPortFree_Expect( ucSocket );
403
404 pxSocketSet = FreeRTOS_CreateSocketSet();
405
406 TEST_ASSERT_EQUAL( NULL, pxSocketSet );
407 }
408
409 /**
410 * @brief Creation of socket-set happy path.
411 */
test_FreeRTOS_CreateSocketSet_HappyPath(void)412 void test_FreeRTOS_CreateSocketSet_HappyPath( void )
413 {
414 SocketSelect_t * pxSocketSet;
415 uint8_t ucSocketSet[ sizeof( *pxSocketSet ) ];
416 uint8_t xEventGroup[ sizeof( uintptr_t ) ];
417
418 pvPortMalloc_ExpectAndReturn( sizeof( *pxSocketSet ), ucSocketSet );
419
420 xEventGroupCreate_ExpectAndReturn( ( EventGroupHandle_t ) xEventGroup );
421
422 pxSocketSet = FreeRTOS_CreateSocketSet();
423
424 TEST_ASSERT_EQUAL( ucSocketSet, pxSocketSet );
425 TEST_ASSERT_EQUAL( xEventGroup, pxSocketSet->xSelectGroup );
426 }
427
428 /**
429 * @brief Deletion of socket-set happy path.
430 */
test_FreeRTOS_DeleteSocketSet_happyPath(void)431 void test_FreeRTOS_DeleteSocketSet_happyPath( void )
432 {
433 SocketSet_t xSocketSet;
434
435 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdPASS );
436 xSendEventStructToIPTask_IgnoreArg_pxEvent();
437
438 FreeRTOS_DeleteSocketSet( xSocketSet );
439 }
440
441 /**
442 * @brief Deletion of socket-set when sending of event to IP task fails.
443 */
test_FreeRTOS_DeleteSocketSet_SendingFailed(void)444 void test_FreeRTOS_DeleteSocketSet_SendingFailed( void )
445 {
446 SocketSet_t xSocketSet;
447
448 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdFAIL );
449 xSendEventStructToIPTask_IgnoreArg_pxEvent();
450
451 FreeRTOS_DeleteSocketSet( xSocketSet );
452 }
453
454 /**
455 * @brief Assertion when socket is NULL.
456 */
test_FreeRTOS_FD_SET_CatchAssert1(void)457 void test_FreeRTOS_FD_SET_CatchAssert1( void )
458 {
459 Socket_t xSocket = NULL;
460 SocketSet_t xSocketSet;
461 EventBits_t xBitsToSet;
462
463 catch_assert( FreeRTOS_FD_SET( xSocket, xSocketSet, xBitsToSet ) );
464 }
465
466 /**
467 * @brief Assertion when socket-set is NULL.
468 */
test_FreeRTOS_FD_SET_CatchAssert2(void)469 void test_FreeRTOS_FD_SET_CatchAssert2( void )
470 {
471 uint8_t ucSocket[ sizeof( FreeRTOS_Socket_t ) ];
472 Socket_t xSocket = ( Socket_t ) ucSocket;
473 SocketSet_t xSocketSet = NULL;
474 EventBits_t xBitsToSet;
475
476 catch_assert( FreeRTOS_FD_SET( xSocket, xSocketSet, xBitsToSet ) );
477 }
478
479 /**
480 * @brief Test when no-bits are to be set.
481 */
test_FreeRTOS_FD_SET_NoBitsToSet(void)482 void test_FreeRTOS_FD_SET_NoBitsToSet( void )
483 {
484 uint8_t ucSocket[ sizeof( FreeRTOS_Socket_t ) ];
485 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
486 Socket_t xSocket = ( Socket_t ) ucSocket;
487 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
488 EventBits_t xBitsToSet = 0;
489
490 memset( ucSocket, 0, sizeof( FreeRTOS_Socket_t ) );
491 memset( ucSocketSet, 0, sizeof( SocketSelect_t ) );
492
493 FreeRTOS_FD_SET( xSocket, xSocketSet, xBitsToSet );
494
495 TEST_ASSERT_EQUAL( 0, xSocket->xSelectBits );
496 }
497
498 /**
499 * @brief Test for when all bits are to be set.
500 */
test_FreeRTOS_FD_SET_AllBitsToSet(void)501 void test_FreeRTOS_FD_SET_AllBitsToSet( void )
502 {
503 uint8_t ucSocket[ sizeof( FreeRTOS_Socket_t ) ];
504 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
505 Socket_t xSocket = ( Socket_t ) ucSocket;
506 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
507 EventBits_t xBitsToSet = eSELECT_ALL;
508
509 memset( ucSocket, 0, sizeof( FreeRTOS_Socket_t ) );
510 memset( ucSocketSet, 0, sizeof( SocketSelect_t ) );
511
512 xEventGroupClearBits_ExpectAndReturn( xSocketSet->xSelectGroup, ( BaseType_t ) eSELECT_CALL_IP, 0 );
513 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdFAIL );
514
515 FreeRTOS_FD_SET( xSocket, xSocketSet, xBitsToSet );
516
517 TEST_ASSERT_EQUAL( eSELECT_ALL, xSocket->xSelectBits );
518 TEST_ASSERT_EQUAL( ucSocketSet, xSocket->pxSocketSet );
519 }
520
521 /**
522 * @brief Assertion when socket is NULL.
523 */
test_FreeRTOS_FD_CLR_CatchAssert1(void)524 void test_FreeRTOS_FD_CLR_CatchAssert1( void )
525 {
526 Socket_t xSocket = NULL;
527 SocketSet_t xSocketSet;
528 EventBits_t xBitsToClear;
529
530 catch_assert( FreeRTOS_FD_CLR( xSocket, xSocketSet, xBitsToClear ) );
531 }
532
533 /**
534 * @brief Assertion when socket-set is NULL.
535 */
test_FreeRTOS_FD_CLR_CatchAssert2(void)536 void test_FreeRTOS_FD_CLR_CatchAssert2( void )
537 {
538 uint8_t ucSocket[ sizeof( FreeRTOS_Socket_t ) ];
539 Socket_t xSocket = ( Socket_t ) ucSocket;
540 SocketSet_t xSocketSet = NULL;
541 EventBits_t xBitsToClear;
542
543 catch_assert( FreeRTOS_FD_CLR( xSocket, xSocketSet, xBitsToClear ) );
544 }
545
546 /**
547 * @brief No bits to be cleared.
548 */
test_FreeRTOS_FD_CLR_NoBitsToClear(void)549 void test_FreeRTOS_FD_CLR_NoBitsToClear( void )
550 {
551 uint8_t ucSocket[ sizeof( FreeRTOS_Socket_t ) ];
552 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
553 Socket_t xSocket = ( Socket_t ) ucSocket;
554 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
555 EventBits_t xBitsToClear = 0;
556
557 memset( ucSocket, 0, sizeof( FreeRTOS_Socket_t ) );
558 memset( ucSocketSet, 0, sizeof( SocketSelect_t ) );
559
560 xSocket->xSelectBits = 0;
561
562 FreeRTOS_FD_CLR( xSocket, xSocketSet, xBitsToClear );
563
564 TEST_ASSERT_EQUAL( NULL, xSocket->pxSocketSet );
565 TEST_ASSERT_EQUAL( 0, xSocket->xSelectBits );
566 }
567
568 /**
569 * @brief All bits to be cleared.
570 */
test_FreeRTOS_FD_CLR_AllBitsToClear(void)571 void test_FreeRTOS_FD_CLR_AllBitsToClear( void )
572 {
573 uint8_t ucSocket[ sizeof( FreeRTOS_Socket_t ) ];
574 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
575 Socket_t xSocket = ( Socket_t ) ucSocket;
576 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
577 EventBits_t xBitsToClear = 0;
578
579 memset( ucSocket, 0, sizeof( FreeRTOS_Socket_t ) );
580 memset( ucSocketSet, 0, sizeof( SocketSelect_t ) );
581
582 xSocket->xSelectBits = eSELECT_ALL;
583
584 FreeRTOS_FD_CLR( xSocket, xSocketSet, xBitsToClear );
585
586 TEST_ASSERT_EQUAL( xSocketSet, xSocket->pxSocketSet );
587 TEST_ASSERT_EQUAL( eSELECT_ALL, xSocket->xSelectBits );
588 }
589
590 /**
591 * @brief Assertion when socket is NULL.
592 */
test_FreeRTOS_FD_ISSET_CatchAssert1(void)593 void test_FreeRTOS_FD_ISSET_CatchAssert1( void )
594 {
595 Socket_t xSocket = NULL;
596 SocketSet_t xSocketSet;
597
598 /* Assertion that the socket must be non-NULL. */
599 catch_assert( FreeRTOS_FD_ISSET( xSocket, xSocketSet ) );
600 }
601
602 /**
603 * @brief Assertion when socket-set is NULL.
604 */
test_FreeRTOS_FD_ISSET_CatchAssert2(void)605 void test_FreeRTOS_FD_ISSET_CatchAssert2( void )
606 {
607 uint8_t ucSocket[ sizeof( FreeRTOS_Socket_t ) ];
608 Socket_t xSocket = ( Socket_t ) ucSocket;
609 SocketSet_t xSocketSet = NULL;
610
611 /* Assertion that the socket set must be non-NULL. */
612 catch_assert( FreeRTOS_FD_ISSET( xSocket, xSocketSet ) );
613 }
614
615 /**
616 * @brief Test for when the socket set is different.
617 */
test_FreeRTOS_FD_ISSET_SocketSetDifferent(void)618 void test_FreeRTOS_FD_ISSET_SocketSetDifferent( void )
619 {
620 uint8_t ucSocket[ sizeof( FreeRTOS_Socket_t ) ];
621 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
622 Socket_t xSocket = ( Socket_t ) ucSocket;
623 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
624 EventBits_t xReturn;
625
626 memset( ucSocket, 0, sizeof( FreeRTOS_Socket_t ) );
627 memset( ucSocketSet, 0, sizeof( SocketSelect_t ) );
628
629 xReturn = FreeRTOS_FD_ISSET( xSocket, xSocketSet );
630
631 TEST_ASSERT_EQUAL( 0, xReturn );
632 }
633
634 /**
635 * @brief Happy path.
636 */
test_FreeRTOS_FD_ISSET_SocketSetSame(void)637 void test_FreeRTOS_FD_ISSET_SocketSetSame( void )
638 {
639 uint8_t ucSocket[ sizeof( FreeRTOS_Socket_t ) ];
640 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
641 Socket_t xSocket = ( Socket_t ) ucSocket;
642 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
643 EventBits_t xReturn;
644
645 memset( ucSocket, 0, sizeof( FreeRTOS_Socket_t ) );
646 memset( ucSocketSet, 0, sizeof( SocketSelect_t ) );
647
648 xSocket->pxSocketSet = xSocketSet;
649
650 xSocket->xSocketBits = 0x12;
651
652 xReturn = FreeRTOS_FD_ISSET( xSocket, xSocketSet );
653
654 TEST_ASSERT_EQUAL( 0x12 & eSELECT_ALL, xReturn );
655 }
656
657 /**
658 * @brief Assertion when socket-set is NULL.
659 */
test_FreeRTOS_select_CatchAssert(void)660 void test_FreeRTOS_select_CatchAssert( void )
661 {
662 BaseType_t xReturn;
663 SocketSet_t xSocketSet = NULL;
664 TickType_t xBlockTimeTicks;
665
666 /* Assertion that the socket set must be non-NULL. */
667 catch_assert( FreeRTOS_select( xSocketSet, xBlockTimeTicks ) );
668 }
669
670 /**
671 * @brief Test case when bits matched.
672 */
test_FreeRTOS_select_BitsMatched(void)673 void test_FreeRTOS_select_BitsMatched( void )
674 {
675 BaseType_t xReturn;
676 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
677 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
678 TickType_t xBlockTimeTicks = 0xAB12;
679
680 vTaskSetTimeOutState_ExpectAnyArgs();
681
682 xEventGroupWaitBits_ExpectAndReturn( xSocketSet->xSelectGroup, ( ( EventBits_t ) eSELECT_ALL ), pdFALSE, pdFALSE, xBlockTimeTicks, pdFALSE );
683
684 xEventGroupClearBits_ExpectAndReturn( xSocketSet->xSelectGroup, ( BaseType_t ) eSELECT_CALL_IP, pdFALSE );
685
686 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdFAIL );
687
688 xEventGroupClearBits_ExpectAndReturn( xSocketSet->xSelectGroup, 0, 0x123 );
689
690 xReturn = FreeRTOS_select( xSocketSet, xBlockTimeTicks );
691
692 TEST_ASSERT_EQUAL( 0x123, xReturn );
693 }
694
695 /**
696 * @brief Call to select timed out.
697 */
test_FreeRTOS_select_Timeout(void)698 void test_FreeRTOS_select_Timeout( void )
699 {
700 BaseType_t xReturn;
701 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
702 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
703 TickType_t xBlockTimeTicks = 0xAB12;
704
705 vTaskSetTimeOutState_ExpectAnyArgs();
706
707 xEventGroupWaitBits_ExpectAndReturn( xSocketSet->xSelectGroup, ( ( EventBits_t ) eSELECT_ALL ), pdFALSE, pdFALSE, xBlockTimeTicks, pdFALSE );
708
709 xEventGroupClearBits_ExpectAndReturn( xSocketSet->xSelectGroup, ( BaseType_t ) eSELECT_CALL_IP, pdFALSE );
710
711 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdFAIL );
712
713 xEventGroupClearBits_ExpectAndReturn( xSocketSet->xSelectGroup, 0, 0 );
714
715 xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
716
717 xReturn = FreeRTOS_select( xSocketSet, xBlockTimeTicks );
718
719 TEST_ASSERT_EQUAL( 0, xReturn );
720 }
721
722 /**
723 * @brief Call to select timed out second time.
724 */
test_FreeRTOS_select_TimeoutSecondTime(void)725 void test_FreeRTOS_select_TimeoutSecondTime( void )
726 {
727 BaseType_t xReturn;
728 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
729 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
730 TickType_t xBlockTimeTicks = 0xAB12;
731
732 vTaskSetTimeOutState_ExpectAnyArgs();
733
734 for( int i = 0; i < 2; i++ )
735 {
736 xEventGroupWaitBits_ExpectAndReturn( xSocketSet->xSelectGroup, ( ( EventBits_t ) eSELECT_ALL ), pdFALSE, pdFALSE, xBlockTimeTicks, pdFALSE );
737
738 xEventGroupClearBits_ExpectAndReturn( xSocketSet->xSelectGroup, ( BaseType_t ) eSELECT_CALL_IP, pdFALSE );
739
740 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdFAIL );
741
742 xEventGroupClearBits_ExpectAndReturn( xSocketSet->xSelectGroup, 0, 0 );
743
744 if( i == 0 )
745 {
746 xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
747 }
748 else
749 {
750 xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
751 }
752 }
753
754 xReturn = FreeRTOS_select( xSocketSet, xBlockTimeTicks );
755
756 TEST_ASSERT_EQUAL( 0, xReturn );
757 }
758
759 /**
760 * @brief Found the bits for which the select function was waiting.
761 */
test_FreeRTOS_select_FoundWaitBits(void)762 void test_FreeRTOS_select_FoundWaitBits( void )
763 {
764 BaseType_t xReturn;
765 uint8_t ucSocketSet[ sizeof( SocketSelect_t ) ];
766 SocketSet_t xSocketSet = ( SocketSet_t ) ucSocketSet;
767 TickType_t xBlockTimeTicks = 0xAB12;
768
769 vTaskSetTimeOutState_ExpectAnyArgs();
770
771 xEventGroupWaitBits_ExpectAndReturn( xSocketSet->xSelectGroup, ( ( EventBits_t ) eSELECT_ALL ), pdFALSE, pdFALSE, xBlockTimeTicks, eSELECT_INTR );
772
773 xEventGroupClearBits_ExpectAndReturn( xSocketSet->xSelectGroup, ( BaseType_t ) eSELECT_INTR, pdFALSE );
774
775 xReturn = FreeRTOS_select( xSocketSet, xBlockTimeTicks );
776
777 TEST_ASSERT_EQUAL( eSELECT_INTR, xReturn );
778 }
779
780 /**
781 * @brief Bind cannot be call from IP task.
782 */
test_FreeRTOS_bind_catchAssert(void)783 void test_FreeRTOS_bind_catchAssert( void )
784 {
785 BaseType_t xReturn;
786 Socket_t xSocket;
787 struct freertos_sockaddr xAddress;
788 socklen_t xAddressLength = 0;
789
790 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
791
792 catch_assert( FreeRTOS_bind( xSocket, &xAddress, xAddressLength ) );
793 }
794
795 /**
796 * @brief Binding a NULL socket.
797 */
test_FreeRTOS_bind_SocketIsNULL(void)798 void test_FreeRTOS_bind_SocketIsNULL( void )
799 {
800 BaseType_t xReturn;
801 Socket_t xSocket = NULL;
802 struct freertos_sockaddr xAddress;
803 socklen_t xAddressLength = 0;
804
805 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
806
807 xReturn = FreeRTOS_bind( xSocket, &xAddress, xAddressLength );
808
809 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
810 }
811
812 /**
813 * @brief Binding invalid socket.
814 */
test_FreeRTOS_bind_SocketIsInvalid(void)815 void test_FreeRTOS_bind_SocketIsInvalid( void )
816 {
817 BaseType_t xReturn;
818 Socket_t xSocket = FREERTOS_INVALID_SOCKET;
819 struct freertos_sockaddr xAddress;
820 socklen_t xAddressLength = 0;
821
822 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
823
824 xReturn = FreeRTOS_bind( xSocket, &xAddress, xAddressLength );
825
826 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
827 }
828
829 /**
830 * @brief Binding already bound socket.
831 */
test_FreeRTOS_bind_SocketIsAlreadyBound(void)832 void test_FreeRTOS_bind_SocketIsAlreadyBound( void )
833 {
834 BaseType_t xReturn;
835 FreeRTOS_Socket_t xSocket;
836 struct freertos_sockaddr xAddress;
837 socklen_t xAddressLength;
838
839 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
840
841 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), ( struct xLIST * ) ( uintptr_t ) 0x11223344 );
842
843 xReturn = FreeRTOS_bind( &xSocket, &xAddress, xAddressLength );
844
845 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
846 }
847
848 /**
849 * @brief Binding event to IP task cannot be sent.
850 */
test_FreeRTOS_bind_SendToIPTaskFailed(void)851 void test_FreeRTOS_bind_SendToIPTaskFailed( void )
852 {
853 BaseType_t xReturn;
854 FreeRTOS_Socket_t xSocket;
855 struct freertos_sockaddr xAddress;
856 socklen_t xAddressLength;
857
858 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
859
860 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
861
862 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdFAIL );
863 xSendEventStructToIPTask_IgnoreArg_pxEvent();
864
865 xReturn = FreeRTOS_bind( &xSocket, NULL, xAddressLength );
866
867 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ECANCELED, xReturn );
868 }
869
870 /**
871 * @brief IP task did not bind the socket.
872 */
test_FreeRTOS_bind_IPTaskDidNotBindTheSocket(void)873 void test_FreeRTOS_bind_IPTaskDidNotBindTheSocket( void )
874 {
875 BaseType_t xReturn;
876 FreeRTOS_Socket_t xSocket;
877 struct freertos_sockaddr xAddress;
878 socklen_t xAddressLength;
879
880 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
881
882 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
883
884 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdPASS );
885 xSendEventStructToIPTask_IgnoreArg_pxEvent();
886
887 xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, ( EventBits_t ) eSOCKET_BOUND, pdTRUE, pdFALSE, portMAX_DELAY, pdPASS );
888
889 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
890
891 xReturn = FreeRTOS_bind( &xSocket, NULL, xAddressLength );
892
893 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
894 }
895
896 /**
897 * @brief IP task bound to socket to a NULL address.
898 */
test_FreeRTOS_bind_NonNullAddress(void)899 void test_FreeRTOS_bind_NonNullAddress( void )
900 {
901 BaseType_t xReturn;
902 FreeRTOS_Socket_t xSocket;
903 struct freertos_sockaddr xAddress;
904 socklen_t xAddressLength;
905
906 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
907
908 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
909
910 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdPASS );
911 xSendEventStructToIPTask_IgnoreArg_pxEvent();
912
913 xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, ( EventBits_t ) eSOCKET_BOUND, pdTRUE, pdFALSE, portMAX_DELAY, pdPASS );
914
915 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
916
917 xReturn = FreeRTOS_bind( &xSocket, &xAddress, xAddressLength );
918
919 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
920 }
921
922 /**
923 * @brief IPv4 socket did not bind the socket.
924 */
test_FreeRTOS_bind_IPTaskDidNotBindTheSocketIPv4Address(void)925 void test_FreeRTOS_bind_IPTaskDidNotBindTheSocketIPv4Address( void )
926 {
927 BaseType_t xReturn;
928 FreeRTOS_Socket_t xSocket;
929 struct freertos_sockaddr xAddress;
930 socklen_t xAddressLength;
931 uint32_t ulExpectIPAddress = 0xC0A80101; /* 192.168.1.1 */
932 uint16_t usExpectPort = 0x1234;
933
934 xAddress.sin_family = FREERTOS_AF_INET4;
935 xAddress.sin_address.ulIP_IPv4 = FreeRTOS_htonl( ulExpectIPAddress );
936 xAddress.sin_port = FreeRTOS_htons( usExpectPort );
937
938 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
939
940 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
941
942 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdPASS );
943 xSendEventStructToIPTask_IgnoreArg_pxEvent();
944
945 xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, ( EventBits_t ) eSOCKET_BOUND, pdTRUE, pdFALSE, portMAX_DELAY, pdPASS );
946
947 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
948
949 xReturn = FreeRTOS_bind( &xSocket, &xAddress, xAddressLength );
950
951 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
952 TEST_ASSERT_EQUAL( pdFALSE, xSocket.bits.bIsIPv6 );
953 TEST_ASSERT_EQUAL( ulExpectIPAddress, xSocket.xLocalAddress.ulIP_IPv4 );
954 TEST_ASSERT_EQUAL( usExpectPort, xSocket.usLocalPort );
955 }
956
957 /**
958 * @brief IPv6 socket did not bind the socket.
959 */
test_FreeRTOS_bind_IPTaskDidNotBindTheSocketIPv6Address(void)960 void test_FreeRTOS_bind_IPTaskDidNotBindTheSocketIPv6Address( void )
961 {
962 BaseType_t xReturn;
963 FreeRTOS_Socket_t xSocket;
964 struct freertos_sockaddr xAddress;
965 socklen_t xAddressLength;
966 IPv6_Address_t xExpectIPv6Address = { { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }; /* 2001::1 */
967 uint16_t usExpectPort = 0x1234;
968
969 xAddress.sin_family = FREERTOS_AF_INET6;
970 memcpy( xAddress.sin_address.xIP_IPv6.ucBytes, xExpectIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
971 xAddress.sin_port = FreeRTOS_htons( usExpectPort );
972
973 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
974
975 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
976
977 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdPASS );
978 xSendEventStructToIPTask_IgnoreArg_pxEvent();
979
980 xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, ( EventBits_t ) eSOCKET_BOUND, pdTRUE, pdFALSE, portMAX_DELAY, pdPASS );
981
982 listLIST_ITEM_CONTAINER_ExpectAndReturn( &( xSocket.xBoundSocketListItem ), NULL );
983
984 xReturn = FreeRTOS_bind( &xSocket, &xAddress, xAddressLength );
985
986 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
987 TEST_ASSERT_EQUAL( pdTRUE, xSocket.bits.bIsIPv6 );
988 TEST_ASSERT_EQUAL_MEMORY( xExpectIPv6Address.ucBytes, xSocket.xLocalAddress.xIP_IPv6.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
989 TEST_ASSERT_EQUAL( usExpectPort, xSocket.usLocalPort );
990 }
991
992 /**
993 * @brief Trying to close a NULL socket.
994 */
test_FreeRTOS_closesocket_NULLSocket(void)995 void test_FreeRTOS_closesocket_NULLSocket( void )
996 {
997 BaseType_t xReturn;
998 Socket_t xSocket = NULL;
999
1000 xReturn = FreeRTOS_closesocket( xSocket );
1001
1002 TEST_ASSERT_EQUAL( 0, xReturn );
1003 }
1004
1005 /**
1006 * @brief Trying to close an invalid socket.
1007 */
test_FreeRTOS_closesocket_InvalidSocket(void)1008 void test_FreeRTOS_closesocket_InvalidSocket( void )
1009 {
1010 BaseType_t xReturn;
1011 Socket_t xSocket = ( Socket_t ) ( uintptr_t ) FREERTOS_INVALID_SOCKET;
1012
1013 xReturn = FreeRTOS_closesocket( xSocket );
1014
1015 TEST_ASSERT_EQUAL( 0, xReturn );
1016 }
1017
1018 /**
1019 * @brief Sending event to IP task failed.
1020 */
test_FreeRTOS_closesocket_TCPSocketSendFail(void)1021 void test_FreeRTOS_closesocket_TCPSocketSendFail( void )
1022 {
1023 BaseType_t xReturn;
1024 FreeRTOS_Socket_t xSocket;
1025
1026 memset( &xSocket, 0xAB, sizeof( xSocket ) );
1027
1028 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1029
1030 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdFAIL );
1031 xSendEventStructToIPTask_IgnoreArg_pxEvent();
1032
1033 xReturn = FreeRTOS_closesocket( &xSocket );
1034
1035 TEST_ASSERT_EQUAL( -1, xReturn );
1036 TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxHandleConnected );
1037 TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxHandleReceive );
1038 TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxHandleSent );
1039 }
1040
1041 /**
1042 * @brief Closing socket successful.
1043 */
test_FreeRTOS_closesocket_TCPSocketSendPass(void)1044 void test_FreeRTOS_closesocket_TCPSocketSendPass( void )
1045 {
1046 BaseType_t xReturn;
1047 FreeRTOS_Socket_t xSocket;
1048
1049 memset( &xSocket, 0xAB, sizeof( xSocket ) );
1050
1051 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_TCP;
1052
1053 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdPASS );
1054 xSendEventStructToIPTask_IgnoreArg_pxEvent();
1055
1056 xReturn = FreeRTOS_closesocket( &xSocket );
1057
1058 TEST_ASSERT_EQUAL( 1, xReturn );
1059 TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxHandleConnected );
1060 TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxHandleReceive );
1061 TEST_ASSERT_EQUAL( NULL, xSocket.u.xTCP.pxHandleSent );
1062 }
1063
1064 /**
1065 * @brief UDP socket closing failed as sending event to IP task failed.
1066 */
test_FreeRTOS_closesocket_UDPSocketSendFail(void)1067 void test_FreeRTOS_closesocket_UDPSocketSendFail( void )
1068 {
1069 BaseType_t xReturn;
1070 FreeRTOS_Socket_t xSocket;
1071
1072 memset( &xSocket, 0xAB, sizeof( xSocket ) );
1073
1074 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_UDP;
1075
1076 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdFAIL );
1077 xSendEventStructToIPTask_IgnoreArg_pxEvent();
1078
1079 xReturn = FreeRTOS_closesocket( &xSocket );
1080
1081 TEST_ASSERT_EQUAL( -1, xReturn );
1082 TEST_ASSERT_EQUAL( NULL, xSocket.u.xUDP.pxHandleReceive );
1083 TEST_ASSERT_EQUAL( NULL, xSocket.u.xUDP.pxHandleSent );
1084 }
1085
1086 /**
1087 * @brief Closing UDP socket successful.
1088 */
test_FreeRTOS_closesocket_UDPSocketSendPass(void)1089 void test_FreeRTOS_closesocket_UDPSocketSendPass( void )
1090 {
1091 BaseType_t xReturn;
1092 FreeRTOS_Socket_t xSocket;
1093
1094 memset( &xSocket, 0xAB, sizeof( xSocket ) );
1095
1096 xSocket.ucProtocol = ( uint8_t ) FREERTOS_IPPROTO_UDP;
1097
1098 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdPASS );
1099 xSendEventStructToIPTask_IgnoreArg_pxEvent();
1100
1101 xReturn = FreeRTOS_closesocket( &xSocket );
1102
1103 TEST_ASSERT_EQUAL( 1, xReturn );
1104 TEST_ASSERT_EQUAL( NULL, xSocket.u.xUDP.pxHandleReceive );
1105 TEST_ASSERT_EQUAL( NULL, xSocket.u.xUDP.pxHandleSent );
1106 }
1107
1108 /**
1109 * @brief Closing socket with unknown protocol.
1110 */
test_FreeRTOS_closesocket_UnknownProtocol(void)1111 void test_FreeRTOS_closesocket_UnknownProtocol( void )
1112 {
1113 BaseType_t xReturn;
1114 FreeRTOS_Socket_t xSocket;
1115
1116 memset( &xSocket, 0xAB, sizeof( xSocket ) );
1117
1118 xSendEventStructToIPTask_ExpectAndReturn( NULL, portMAX_DELAY, pdPASS );
1119 xSendEventStructToIPTask_IgnoreArg_pxEvent();
1120
1121 xReturn = FreeRTOS_closesocket( &xSocket );
1122
1123 TEST_ASSERT_EQUAL( 1, xReturn );
1124 }
1125
1126 /**
1127 * @brief Setting option of a NULL socket.
1128 */
test_FreeRTOS_setsockopt_NULLSocket(void)1129 void test_FreeRTOS_setsockopt_NULLSocket( void )
1130 {
1131 BaseType_t xReturn;
1132 FreeRTOS_Socket_t xSocket;
1133 int32_t lLevel;
1134 int32_t lOptionName;
1135 const void * pvOptionValue;
1136 size_t uxOptionLength;
1137
1138 xReturn = FreeRTOS_setsockopt( NULL, lLevel, lOptionName, pvOptionValue, uxOptionLength );
1139 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1140 }
1141
1142 /**
1143 * @brief Setting option of an invalid socket.
1144 */
test_FreeRTOS_setsockopt_InvalidSocket(void)1145 void test_FreeRTOS_setsockopt_InvalidSocket( void )
1146 {
1147 BaseType_t xReturn;
1148 FreeRTOS_Socket_t xSocket;
1149 int32_t lLevel;
1150 int32_t lOptionName;
1151 const void * pvOptionValue;
1152 size_t uxOptionLength;
1153
1154 xReturn = FreeRTOS_setsockopt( FREERTOS_INVALID_SOCKET, lLevel, lOptionName, pvOptionValue, uxOptionLength );
1155 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1156 }
1157
1158 /**
1159 * @brief
1160 */
test_FreeRTOS_setsockopt_RecvTimeOut(void)1161 void test_FreeRTOS_setsockopt_RecvTimeOut( void )
1162 {
1163 BaseType_t xReturn;
1164 FreeRTOS_Socket_t xSocket;
1165 int32_t lLevel;
1166 int32_t lOptionName = FREERTOS_SO_RCVTIMEO;
1167 TickType_t vOptionValue = 0x123;
1168 size_t uxOptionLength;
1169
1170 memset( &xSocket, 0, sizeof( xSocket ) );
1171
1172 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1173 TEST_ASSERT_EQUAL( 0, xReturn );
1174 TEST_ASSERT_EQUAL( vOptionValue, xSocket.xReceiveBlockTime );
1175 }
1176
1177 /**
1178 * @brief Setting timeout option.
1179 */
test_FreeRTOS_setsockopt_SendTimeOut(void)1180 void test_FreeRTOS_setsockopt_SendTimeOut( void )
1181 {
1182 BaseType_t xReturn;
1183 FreeRTOS_Socket_t xSocket;
1184 int32_t lLevel;
1185 int32_t lOptionName = FREERTOS_SO_SNDTIMEO;
1186 TickType_t vOptionValue = 0x123;
1187 size_t uxOptionLength;
1188
1189 memset( &xSocket, 0, sizeof( xSocket ) );
1190
1191 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1192
1193 TEST_ASSERT_EQUAL( 0, xReturn );
1194 TEST_ASSERT_EQUAL( vOptionValue, xSocket.xSendBlockTime );
1195 }
1196
1197 /**
1198 * @brief Setting send timeout option for UDP socket.
1199 */
test_FreeRTOS_setsockopt_SendTimeOutUDP(void)1200 void test_FreeRTOS_setsockopt_SendTimeOutUDP( void )
1201 {
1202 BaseType_t xReturn;
1203 FreeRTOS_Socket_t xSocket;
1204 int32_t lLevel;
1205 int32_t lOptionName = FREERTOS_SO_SNDTIMEO;
1206 TickType_t vOptionValue = ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS;
1207 size_t uxOptionLength;
1208
1209 memset( &xSocket, 0, sizeof( xSocket ) );
1210
1211 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1212
1213 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1214
1215 TEST_ASSERT_EQUAL( 0, xReturn );
1216 TEST_ASSERT_EQUAL( vOptionValue, xSocket.xSendBlockTime );
1217 }
1218
1219 /**
1220 * @brief Setting send timeout option for UDP socket, timeout is more than maximum allowed value.
1221 */
test_FreeRTOS_setsockopt_SendTimeOutUDPMoreBockingTime(void)1222 void test_FreeRTOS_setsockopt_SendTimeOutUDPMoreBockingTime( void )
1223 {
1224 BaseType_t xReturn;
1225 FreeRTOS_Socket_t xSocket;
1226 int32_t lLevel;
1227 int32_t lOptionName = FREERTOS_SO_SNDTIMEO;
1228 TickType_t vOptionValue = ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS + 100;
1229 size_t uxOptionLength;
1230
1231 memset( &xSocket, 0, sizeof( xSocket ) );
1232
1233 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1234
1235 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1236
1237 TEST_ASSERT_EQUAL( 0, xReturn );
1238 TEST_ASSERT_EQUAL( ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS, xSocket.xSendBlockTime );
1239 }
1240
1241 /**
1242 * @brief Setting maximum waiting packet limit in UDP socket.
1243 */
test_FreeRTOS_setsockopt_UDPMaxRxPackets(void)1244 void test_FreeRTOS_setsockopt_UDPMaxRxPackets( void )
1245 {
1246 BaseType_t xReturn;
1247 FreeRTOS_Socket_t xSocket;
1248 int32_t lLevel;
1249 int32_t lOptionName = FREERTOS_SO_UDP_MAX_RX_PACKETS;
1250 UBaseType_t vOptionValue = 100;
1251 size_t uxOptionLength;
1252
1253 memset( &xSocket, 0, sizeof( xSocket ) );
1254
1255 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1256
1257 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1258
1259 TEST_ASSERT_EQUAL( 0, xReturn );
1260 TEST_ASSERT_EQUAL( 100, xSocket.u.xUDP.uxMaxPackets );
1261 }
1262
1263 /**
1264 * @brief Setting maximum waiting packet limit in non-UDP socket.
1265 */
test_FreeRTOS_setsockopt_UDPMaxRxPacketsNonUDPSock(void)1266 void test_FreeRTOS_setsockopt_UDPMaxRxPacketsNonUDPSock( void )
1267 {
1268 BaseType_t xReturn;
1269 FreeRTOS_Socket_t xSocket;
1270 int32_t lLevel;
1271 int32_t lOptionName = FREERTOS_SO_UDP_MAX_RX_PACKETS;
1272 UBaseType_t vOptionValue = 100;
1273 size_t uxOptionLength;
1274
1275 memset( &xSocket, 0, sizeof( xSocket ) );
1276
1277 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1278
1279 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1280
1281 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1282 TEST_ASSERT_EQUAL( 0, xSocket.u.xUDP.uxMaxPackets );
1283 }
1284
1285 /**
1286 * @brief Set UDP checksum option with NULL value.
1287 */
test_FreeRTOS_setsockopt_UDPChkSumNULL(void)1288 void test_FreeRTOS_setsockopt_UDPChkSumNULL( void )
1289 {
1290 BaseType_t xReturn;
1291 FreeRTOS_Socket_t xSocket;
1292 int32_t lLevel;
1293 int32_t lOptionName = FREERTOS_SO_UDPCKSUM_OUT;
1294 UBaseType_t vOptionValue = 100;
1295 size_t uxOptionLength;
1296
1297 memset( &xSocket, 0, sizeof( xSocket ) );
1298
1299 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1300 xSocket.ucSocketOptions = ( uint8_t ) FREERTOS_SO_UDPCKSUM_OUT;
1301
1302 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, NULL, uxOptionLength );
1303
1304 TEST_ASSERT_EQUAL( 0, xReturn );
1305 TEST_ASSERT_EQUAL( 0, xSocket.ucSocketOptions );
1306 }
1307
1308 /**
1309 * @brief Set UDP checksum option.
1310 */
test_FreeRTOS_setsockopt_UDPChkSum(void)1311 void test_FreeRTOS_setsockopt_UDPChkSum( void )
1312 {
1313 BaseType_t xReturn;
1314 FreeRTOS_Socket_t xSocket;
1315 int32_t lLevel;
1316 int32_t lOptionName = FREERTOS_SO_UDPCKSUM_OUT;
1317 UBaseType_t vOptionValue = 100;
1318 size_t uxOptionLength;
1319
1320 memset( &xSocket, 0, sizeof( xSocket ) );
1321
1322 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1323
1324 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1325
1326 TEST_ASSERT_EQUAL( 0, xReturn );
1327 TEST_ASSERT_EQUAL( FREERTOS_SO_UDPCKSUM_OUT, xSocket.ucSocketOptions );
1328 }
1329
1330 /**
1331 * @brief Set TCP connection handler for UDP socket.
1332 */
test_FreeRTOS_setsockopt_TCPConnInvalidProtocol(void)1333 void test_FreeRTOS_setsockopt_TCPConnInvalidProtocol( void )
1334 {
1335 BaseType_t xReturn;
1336 FreeRTOS_Socket_t xSocket;
1337 int32_t lLevel;
1338 int32_t lOptionName = FREERTOS_SO_TCP_CONN_HANDLER;
1339 UBaseType_t vOptionValue = 100;
1340 size_t uxOptionLength;
1341
1342 memset( &xSocket, 0, sizeof( xSocket ) );
1343
1344 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1345
1346 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1347
1348 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1349 }
1350
1351 /**
1352 * @brief TCP connection handler success.
1353 */
test_FreeRTOS_setsockopt_TCPConnSuccess(void)1354 void test_FreeRTOS_setsockopt_TCPConnSuccess( void )
1355 {
1356 BaseType_t xReturn;
1357 FreeRTOS_Socket_t xSocket;
1358 int32_t lLevel;
1359 int32_t lOptionName = FREERTOS_SO_TCP_CONN_HANDLER;
1360 F_TCP_UDP_Handler_t vOptionValue;
1361 size_t uxOptionLength;
1362
1363 memset( &xSocket, 0, sizeof( xSocket ) );
1364
1365 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1366
1367 vOptionValue.pxOnTCPConnected = ( FOnConnected_t ) 0x123ABD;
1368
1369 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1370
1371 TEST_ASSERT_EQUAL( 0, xReturn );
1372 TEST_ASSERT_EQUAL( 0x123ABD, xSocket.u.xTCP.pxHandleConnected );
1373 }
1374
1375 /**
1376 * @brief
1377 */
test_FreeRTOS_setsockopt_TCPRecvInvalidProtocol(void)1378 void test_FreeRTOS_setsockopt_TCPRecvInvalidProtocol( void )
1379 {
1380 BaseType_t xReturn;
1381 FreeRTOS_Socket_t xSocket;
1382 int32_t lLevel;
1383 int32_t lOptionName = FREERTOS_SO_TCP_RECV_HANDLER;
1384 UBaseType_t vOptionValue = 100;
1385 size_t uxOptionLength;
1386
1387 memset( &xSocket, 0, sizeof( xSocket ) );
1388
1389 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1390
1391 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1392
1393 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1394 }
1395
1396 /**
1397 * @brief TCP receive handler success.
1398 */
test_FreeRTOS_setsockopt_TCPRecvSuccess(void)1399 void test_FreeRTOS_setsockopt_TCPRecvSuccess( void )
1400 {
1401 BaseType_t xReturn;
1402 FreeRTOS_Socket_t xSocket;
1403 int32_t lLevel;
1404 int32_t lOptionName = FREERTOS_SO_TCP_RECV_HANDLER;
1405 F_TCP_UDP_Handler_t vOptionValue;
1406 size_t uxOptionLength;
1407
1408 memset( &xSocket, 0, sizeof( xSocket ) );
1409
1410 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1411
1412 vOptionValue.pxOnTCPReceive = ( FOnTCPReceive_t ) 0x123ABD;
1413
1414 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1415
1416 TEST_ASSERT_EQUAL( 0, xReturn );
1417 TEST_ASSERT_EQUAL( 0x123ABD, xSocket.u.xTCP.pxHandleReceive );
1418 }
1419
1420 /**
1421 * @brief Setting TCP send handler for a UDP socket.
1422 */
test_FreeRTOS_setsockopt_TCPSendInvalidProtocol(void)1423 void test_FreeRTOS_setsockopt_TCPSendInvalidProtocol( void )
1424 {
1425 BaseType_t xReturn;
1426 FreeRTOS_Socket_t xSocket;
1427 int32_t lLevel;
1428 int32_t lOptionName = FREERTOS_SO_TCP_SENT_HANDLER;
1429 UBaseType_t vOptionValue = 100;
1430 size_t uxOptionLength;
1431
1432 memset( &xSocket, 0, sizeof( xSocket ) );
1433
1434 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1435
1436 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1437
1438 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1439 }
1440
1441 /**
1442 * @brief Set TCP sending handler.
1443 */
test_FreeRTOS_setsockopt_TCPSendSuccess(void)1444 void test_FreeRTOS_setsockopt_TCPSendSuccess( void )
1445 {
1446 BaseType_t xReturn;
1447 FreeRTOS_Socket_t xSocket;
1448 int32_t lLevel;
1449 int32_t lOptionName = FREERTOS_SO_TCP_SENT_HANDLER;
1450 F_TCP_UDP_Handler_t vOptionValue;
1451 size_t uxOptionLength;
1452
1453 memset( &xSocket, 0, sizeof( xSocket ) );
1454
1455 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1456
1457 vOptionValue.pxOnTCPSent = ( FOnTCPSent_t ) 0x123ABD;
1458
1459 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1460
1461 TEST_ASSERT_EQUAL( 0, xReturn );
1462 TEST_ASSERT_EQUAL( 0x123ABD, xSocket.u.xTCP.pxHandleSent );
1463 }
1464
1465 /**
1466 * @brief Set UDP receive handler for a TCP socket.
1467 */
test_FreeRTOS_setsockopt_UDPRecvInvalidProtocol(void)1468 void test_FreeRTOS_setsockopt_UDPRecvInvalidProtocol( void )
1469 {
1470 BaseType_t xReturn;
1471 FreeRTOS_Socket_t xSocket;
1472 int32_t lLevel;
1473 int32_t lOptionName = FREERTOS_SO_UDP_RECV_HANDLER;
1474 UBaseType_t vOptionValue = 100;
1475 size_t uxOptionLength;
1476
1477 memset( &xSocket, 0, sizeof( xSocket ) );
1478
1479 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1480
1481 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1482
1483 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1484 }
1485
1486 /**
1487 * @brief Set UDP receive handler.
1488 */
test_FreeRTOS_setsockopt_UDPRecvSuccess(void)1489 void test_FreeRTOS_setsockopt_UDPRecvSuccess( void )
1490 {
1491 BaseType_t xReturn;
1492 FreeRTOS_Socket_t xSocket;
1493 int32_t lLevel;
1494 int32_t lOptionName = FREERTOS_SO_UDP_RECV_HANDLER;
1495 F_TCP_UDP_Handler_t vOptionValue;
1496 size_t uxOptionLength;
1497
1498 memset( &xSocket, 0, sizeof( xSocket ) );
1499
1500 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1501
1502 vOptionValue.pxOnUDPReceive = ( FOnUDPReceive_t ) 0x123ABD;
1503
1504 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1505
1506 TEST_ASSERT_EQUAL( 0, xReturn );
1507 TEST_ASSERT_EQUAL( 0x123ABD, xSocket.u.xUDP.pxHandleReceive );
1508 }
1509
1510 /**
1511 * @brief UDP send handler for TCP socket.
1512 */
test_FreeRTOS_setsockopt_UDPSendInvalidProtocol(void)1513 void test_FreeRTOS_setsockopt_UDPSendInvalidProtocol( void )
1514 {
1515 BaseType_t xReturn;
1516 FreeRTOS_Socket_t xSocket;
1517 int32_t lLevel;
1518 int32_t lOptionName = FREERTOS_SO_UDP_SENT_HANDLER;
1519 UBaseType_t vOptionValue = 100;
1520 size_t uxOptionLength;
1521
1522 memset( &xSocket, 0, sizeof( xSocket ) );
1523
1524 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1525
1526 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1527
1528 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1529 }
1530
1531 /**
1532 * @brief Set UDP send handler.
1533 */
test_FreeRTOS_setsockopt_UDPSendSuccess(void)1534 void test_FreeRTOS_setsockopt_UDPSendSuccess( void )
1535 {
1536 BaseType_t xReturn;
1537 FreeRTOS_Socket_t xSocket;
1538 int32_t lLevel;
1539 int32_t lOptionName = FREERTOS_SO_UDP_SENT_HANDLER;
1540 F_TCP_UDP_Handler_t vOptionValue;
1541 size_t uxOptionLength;
1542
1543 memset( &xSocket, 0, sizeof( xSocket ) );
1544
1545 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1546
1547 vOptionValue.pxOnUDPSent = ( FOnUDPSent_t ) 0x123ABD;
1548
1549 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1550
1551 TEST_ASSERT_EQUAL( 0, xReturn );
1552 TEST_ASSERT_EQUAL( 0x123ABD, xSocket.u.xUDP.pxHandleSent );
1553 }
1554
1555 /**
1556 * @brief Set semaphore for a socket.
1557 */
test_FreeRTOS_setsockopt_SetSemaphore(void)1558 void test_FreeRTOS_setsockopt_SetSemaphore( void )
1559 {
1560 BaseType_t xReturn;
1561 FreeRTOS_Socket_t xSocket;
1562 int32_t lLevel;
1563 int32_t lOptionName = FREERTOS_SO_SET_SEMAPHORE;
1564 SemaphoreHandle_t vOptionValue;
1565 size_t uxOptionLength;
1566
1567 memset( &xSocket, 0, sizeof( xSocket ) );
1568
1569 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1570
1571 TEST_ASSERT_EQUAL( 0, xReturn );
1572 TEST_ASSERT_EQUAL( vOptionValue, xSocket.pxUserSemaphore );
1573 }
1574
1575 /**
1576 * @brief Set wakeup callback.
1577 */
test_FreeRTOS_setsockopt_WakeUpCallback(void)1578 void test_FreeRTOS_setsockopt_WakeUpCallback( void )
1579 {
1580 BaseType_t xReturn;
1581 FreeRTOS_Socket_t xSocket;
1582 int32_t lLevel;
1583 int32_t lOptionName = FREERTOS_SO_WAKEUP_CALLBACK;
1584 SemaphoreHandle_t vOptionValue;
1585 size_t uxOptionLength;
1586
1587 memset( &xSocket, 0, sizeof( xSocket ) );
1588
1589 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1590
1591 TEST_ASSERT_EQUAL( 0, xReturn );
1592 TEST_ASSERT_EQUAL( &vOptionValue, xSocket.pxUserWakeCallback );
1593 }
1594
1595 /**
1596 * @brief Set low high water mark of socket having invalid protocol.
1597 */
test_FreeRTOS_setsockopt_SetLowHighWaterInvalidProtocol(void)1598 void test_FreeRTOS_setsockopt_SetLowHighWaterInvalidProtocol( void )
1599 {
1600 BaseType_t xReturn;
1601 FreeRTOS_Socket_t xSocket;
1602 int32_t lLevel;
1603 int32_t lOptionName = FREERTOS_SO_SET_LOW_HIGH_WATER;
1604 SemaphoreHandle_t vOptionValue;
1605 size_t uxOptionLength;
1606
1607 memset( &xSocket, 0, sizeof( xSocket ) );
1608
1609 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1610
1611 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1612
1613 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1614 }
1615
1616 /**
1617 * @brief Set low high water mark of socket with invalid values.
1618 */
test_FreeRTOS_setsockopt_SetLowHighWaterInvalidValues1(void)1619 void test_FreeRTOS_setsockopt_SetLowHighWaterInvalidValues1( void )
1620 {
1621 BaseType_t xReturn;
1622 FreeRTOS_Socket_t xSocket;
1623 int32_t lLevel;
1624 int32_t lOptionName = FREERTOS_SO_SET_LOW_HIGH_WATER;
1625 LowHighWater_t vOptionValue;
1626 size_t uxOptionLength;
1627
1628 memset( &xSocket, 0, sizeof( xSocket ) );
1629
1630 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1631
1632 vOptionValue.uxLittleSpace = 0x123;
1633 vOptionValue.uxEnoughSpace = vOptionValue.uxLittleSpace;
1634
1635 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1636
1637 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1638 }
1639
1640 /**
1641 * @brief Set low high water mark of socket with invalid values.
1642 */
test_FreeRTOS_setsockopt_SetLowHighWaterInvalidValues2(void)1643 void test_FreeRTOS_setsockopt_SetLowHighWaterInvalidValues2( void )
1644 {
1645 BaseType_t xReturn;
1646 FreeRTOS_Socket_t xSocket;
1647 int32_t lLevel;
1648 int32_t lOptionName = FREERTOS_SO_SET_LOW_HIGH_WATER;
1649 LowHighWater_t vOptionValue;
1650 size_t uxOptionLength;
1651
1652 memset( &xSocket, 0, sizeof( xSocket ) );
1653
1654 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1655
1656 vOptionValue.uxLittleSpace = 0x123;
1657 vOptionValue.uxEnoughSpace = vOptionValue.uxLittleSpace - 0x12;
1658
1659 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1660
1661 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1662 }
1663
1664 /**
1665 * @brief Set low high water mark of socket with invalid values.
1666 */
test_FreeRTOS_setsockopt_SetLowHighWaterInvalidValues3(void)1667 void test_FreeRTOS_setsockopt_SetLowHighWaterInvalidValues3( void )
1668 {
1669 BaseType_t xReturn;
1670 FreeRTOS_Socket_t xSocket;
1671 int32_t lLevel;
1672 int32_t lOptionName = FREERTOS_SO_SET_LOW_HIGH_WATER;
1673 LowHighWater_t vOptionValue;
1674 size_t uxOptionLength;
1675
1676 memset( &xSocket, 0, sizeof( xSocket ) );
1677
1678 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1679
1680 vOptionValue.uxLittleSpace = 0x123;
1681 vOptionValue.uxEnoughSpace = vOptionValue.uxLittleSpace + 0x123;
1682 xSocket.u.xTCP.uxRxStreamSize = vOptionValue.uxEnoughSpace - 0x12;
1683
1684 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1685
1686 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1687 }
1688
1689 /**
1690 * @brief Set low high water mark of socket.
1691 */
test_FreeRTOS_setsockopt_SetLowHighWaterHappyPath(void)1692 void test_FreeRTOS_setsockopt_SetLowHighWaterHappyPath( void )
1693 {
1694 BaseType_t xReturn;
1695 FreeRTOS_Socket_t xSocket;
1696 int32_t lLevel;
1697 int32_t lOptionName = FREERTOS_SO_SET_LOW_HIGH_WATER;
1698 LowHighWater_t vOptionValue;
1699 size_t uxOptionLength;
1700
1701 memset( &xSocket, 0, sizeof( xSocket ) );
1702
1703 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1704
1705 vOptionValue.uxLittleSpace = 0x123;
1706 vOptionValue.uxEnoughSpace = vOptionValue.uxLittleSpace + 0x123;
1707 xSocket.u.xTCP.uxRxStreamSize = vOptionValue.uxEnoughSpace + 0x12;
1708
1709 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1710
1711 TEST_ASSERT_EQUAL( 0, xReturn );
1712 TEST_ASSERT_EQUAL( vOptionValue.uxLittleSpace, xSocket.u.xTCP.uxLittleSpace );
1713 TEST_ASSERT_EQUAL( vOptionValue.uxEnoughSpace, xSocket.u.xTCP.uxEnoughSpace );
1714 }
1715
1716 /**
1717 * @brief Send buffer set for TCP socket.
1718 */
test_FreeRTOS_setsockopt_SendBuff(void)1719 void test_FreeRTOS_setsockopt_SendBuff( void )
1720 {
1721 BaseType_t xReturn;
1722 FreeRTOS_Socket_t xSocket;
1723 int32_t lLevel;
1724 int32_t lOptionName = FREERTOS_SO_SNDBUF;
1725 uint32_t vOptionValue = 0xABCD1234;
1726 size_t uxOptionLength;
1727
1728 memset( &xSocket, 0, sizeof( xSocket ) );
1729
1730 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1731 xSocket.u.xTCP.txStream = NULL;
1732 xSocket.u.xTCP.usMSS = 0x12;
1733
1734 FreeRTOS_round_up_ExpectAndReturn( vOptionValue, xSocket.u.xTCP.usMSS, 0xAB );
1735
1736 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1737
1738 TEST_ASSERT_EQUAL( 0, xReturn );
1739 TEST_ASSERT_EQUAL( 0xAB, xSocket.u.xTCP.uxTxStreamSize );
1740 }
1741
1742 /**
1743 * @brief Receive buffer set for TCP socket.
1744 */
test_FreeRTOS_setsockopt_RecvBuff(void)1745 void test_FreeRTOS_setsockopt_RecvBuff( void )
1746 {
1747 BaseType_t xReturn;
1748 FreeRTOS_Socket_t xSocket;
1749 int32_t lLevel;
1750 int32_t lOptionName = FREERTOS_SO_RCVBUF;
1751 uint32_t vOptionValue = 0xABCD1234;
1752 size_t uxOptionLength;
1753
1754 memset( &xSocket, 0, sizeof( xSocket ) );
1755
1756 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1757 xSocket.u.xTCP.rxStream = NULL;
1758
1759 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1760
1761 TEST_ASSERT_EQUAL( 0, xReturn );
1762 TEST_ASSERT_EQUAL( vOptionValue, xSocket.u.xTCP.uxRxStreamSize );
1763 }
1764
1765 /**
1766 * @brief Set windows properties of a socket for a UDP socket.
1767 */
test_FreeRTOS_setsockopt_WinPropsInvalidProtocol(void)1768 void test_FreeRTOS_setsockopt_WinPropsInvalidProtocol( void )
1769 {
1770 BaseType_t xReturn;
1771 FreeRTOS_Socket_t xSocket;
1772 int32_t lLevel;
1773 int32_t lOptionName = FREERTOS_SO_WIN_PROPERTIES;
1774 uint32_t vOptionValue = 0xABCD1234;
1775 size_t uxOptionLength;
1776
1777 memset( &xSocket, 0, sizeof( xSocket ) );
1778
1779 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1780
1781 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1782
1783 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1784 }
1785
1786 /**
1787 * @brief Set windows properties of a socket which doesn't have a valid Tx stream.
1788 */
test_FreeRTOS_setsockopt_WinPropsInvalidTxStream(void)1789 void test_FreeRTOS_setsockopt_WinPropsInvalidTxStream( void )
1790 {
1791 BaseType_t xReturn;
1792 FreeRTOS_Socket_t xSocket;
1793 int32_t lLevel;
1794 int32_t lOptionName = FREERTOS_SO_WIN_PROPERTIES;
1795 uint32_t vOptionValue = 0xABCD1234;
1796 size_t uxOptionLength;
1797
1798 memset( &xSocket, 0, sizeof( xSocket ) );
1799
1800 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1801 xSocket.u.xTCP.txStream = ( StreamBuffer_t * ) 0x1234;
1802
1803 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1804
1805 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1806 }
1807
1808 /**
1809 * @brief Set windows properties of a socket which doesn't have a valid Rx stream.
1810 */
test_FreeRTOS_setsockopt_WinPropsInvalidRxStream(void)1811 void test_FreeRTOS_setsockopt_WinPropsInvalidRxStream( void )
1812 {
1813 BaseType_t xReturn;
1814 FreeRTOS_Socket_t xSocket;
1815 int32_t lLevel;
1816 int32_t lOptionName = FREERTOS_SO_WIN_PROPERTIES;
1817 WinProperties_t vOptionValue;
1818 size_t uxOptionLength;
1819
1820 memset( &xSocket, 0, sizeof( xSocket ) );
1821
1822 vOptionValue.lTxBufSize = 0xBB;
1823
1824 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1825 xSocket.u.xTCP.rxStream = ( StreamBuffer_t * ) 0x1234;
1826 xSocket.u.xTCP.usMSS = 0x12;
1827
1828 FreeRTOS_round_up_ExpectAndReturn( vOptionValue.lTxBufSize, xSocket.u.xTCP.usMSS, 0xAB );
1829
1830 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1831
1832 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1833 }
1834
1835 /**
1836 * @brief Set windows properties of a socket whose windowing has not been initialised.
1837 */
test_FreeRTOS_setsockopt_WinPropsTCPWinNotInit(void)1838 void test_FreeRTOS_setsockopt_WinPropsTCPWinNotInit( void )
1839 {
1840 BaseType_t xReturn;
1841 FreeRTOS_Socket_t xSocket;
1842 int32_t lLevel;
1843 int32_t lOptionName = FREERTOS_SO_WIN_PROPERTIES;
1844 WinProperties_t vOptionValue;
1845 size_t uxOptionLength;
1846
1847 memset( &xSocket, 0, sizeof( xSocket ) );
1848 memset( &vOptionValue, 0xCB, sizeof( vOptionValue ) );
1849
1850 vOptionValue.lTxBufSize = 0xBB;
1851
1852 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1853 xSocket.u.xTCP.usMSS = 0x12;
1854 xSocket.u.xTCP.xTCPWindow.u.bits.bHasInit = pdFALSE;
1855
1856 FreeRTOS_round_up_ExpectAndReturn( vOptionValue.lTxBufSize, xSocket.u.xTCP.usMSS, 0xAB );
1857
1858 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1859
1860 TEST_ASSERT_EQUAL( 0, xReturn );
1861 TEST_ASSERT_EQUAL( ( uint32_t ) vOptionValue.lTxWinSize, xSocket.u.xTCP.uxRxWinSize );
1862 TEST_ASSERT_EQUAL( ( uint32_t ) vOptionValue.lTxWinSize, xSocket.u.xTCP.uxTxWinSize );
1863 }
1864
1865 /**
1866 * @brief Set windows properties of a socket whose windowing has been initialised.
1867 */
test_FreeRTOS_setsockopt_WinPropsTCPWinInit(void)1868 void test_FreeRTOS_setsockopt_WinPropsTCPWinInit( void )
1869 {
1870 BaseType_t xReturn;
1871 FreeRTOS_Socket_t xSocket;
1872 int32_t lLevel;
1873 int32_t lOptionName = FREERTOS_SO_WIN_PROPERTIES;
1874 WinProperties_t vOptionValue;
1875 size_t uxOptionLength;
1876
1877 memset( &xSocket, 0, sizeof( xSocket ) );
1878 memset( &vOptionValue, 0xCB, sizeof( vOptionValue ) );
1879
1880 vOptionValue.lTxBufSize = 0xBB;
1881
1882 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1883 xSocket.u.xTCP.usMSS = 0x12;
1884 xSocket.u.xTCP.xTCPWindow.u.bits.bHasInit = pdTRUE;
1885
1886 FreeRTOS_round_up_ExpectAndReturn( vOptionValue.lTxBufSize, xSocket.u.xTCP.usMSS, 0xAB );
1887
1888 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1889
1890 TEST_ASSERT_EQUAL( 0, xReturn );
1891 TEST_ASSERT_EQUAL( ( uint32_t ) vOptionValue.lRxWinSize, xSocket.u.xTCP.uxRxWinSize );
1892 TEST_ASSERT_EQUAL( ( uint32_t ) vOptionValue.lTxWinSize, xSocket.u.xTCP.uxTxWinSize );
1893 TEST_ASSERT_EQUAL_UINT32( ( ( uint32_t ) vOptionValue.lRxWinSize * xSocket.u.xTCP.usMSS ), xSocket.u.xTCP.xTCPWindow.xSize.ulRxWindowLength );
1894 TEST_ASSERT_EQUAL_UINT32( ( ( uint32_t ) vOptionValue.lTxWinSize * xSocket.u.xTCP.usMSS ), xSocket.u.xTCP.xTCPWindow.xSize.ulTxWindowLength );
1895 }
1896
1897 /**
1898 * @brief Set option to reuse socket of a UDP socket.
1899 */
test_FreeRTOS_setsockopt_ReUseListenSock_InvalidProtocol(void)1900 void test_FreeRTOS_setsockopt_ReUseListenSock_InvalidProtocol( void )
1901 {
1902 BaseType_t xReturn;
1903 FreeRTOS_Socket_t xSocket;
1904 int32_t lLevel;
1905 int32_t lOptionName = FREERTOS_SO_REUSE_LISTEN_SOCKET;
1906 BaseType_t vOptionValue;
1907 size_t uxOptionLength;
1908
1909 memset( &xSocket, 0, sizeof( xSocket ) );
1910 memset( &vOptionValue, 0xCB, sizeof( vOptionValue ) );
1911
1912 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1913
1914 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1915
1916 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1917 }
1918
1919 /**
1920 * @brief Set reuse of a socket to true.
1921 */
test_FreeRTOS_setsockopt_ReUseListenSock_Set(void)1922 void test_FreeRTOS_setsockopt_ReUseListenSock_Set( void )
1923 {
1924 BaseType_t xReturn;
1925 FreeRTOS_Socket_t xSocket;
1926 int32_t lLevel;
1927 int32_t lOptionName = FREERTOS_SO_REUSE_LISTEN_SOCKET;
1928 BaseType_t vOptionValue = pdTRUE;
1929 size_t uxOptionLength;
1930
1931 memset( &xSocket, 0, sizeof( xSocket ) );
1932
1933 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1934
1935 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1936
1937 TEST_ASSERT_EQUAL( 0, xReturn );
1938 TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bReuseSocket );
1939 }
1940
1941 /**
1942 * @brief Set reuse of a socket to false.
1943 */
test_FreeRTOS_setsockopt_ReUseListenSock_Reset(void)1944 void test_FreeRTOS_setsockopt_ReUseListenSock_Reset( void )
1945 {
1946 BaseType_t xReturn;
1947 FreeRTOS_Socket_t xSocket;
1948 int32_t lLevel;
1949 int32_t lOptionName = FREERTOS_SO_REUSE_LISTEN_SOCKET;
1950 BaseType_t vOptionValue = pdFALSE;
1951 size_t uxOptionLength;
1952
1953 memset( &xSocket, 0, sizeof( xSocket ) );
1954
1955 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
1956 xSocket.u.xTCP.bits.bReuseSocket = pdTRUE;
1957
1958 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1959
1960 TEST_ASSERT_EQUAL( 0, xReturn );
1961 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bReuseSocket );
1962 }
1963
1964 /**
1965 * @brief Close after send of a UDP socket.
1966 */
test_FreeRTOS_setsockopt_SockClose_InvalidProtocol(void)1967 void test_FreeRTOS_setsockopt_SockClose_InvalidProtocol( void )
1968 {
1969 BaseType_t xReturn;
1970 FreeRTOS_Socket_t xSocket;
1971 int32_t lLevel;
1972 int32_t lOptionName = FREERTOS_SO_CLOSE_AFTER_SEND;
1973 BaseType_t vOptionValue;
1974 size_t uxOptionLength;
1975
1976 memset( &xSocket, 0, sizeof( xSocket ) );
1977
1978 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
1979
1980 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
1981
1982 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
1983 }
1984
1985 /**
1986 * @brief Close after send option set.
1987 */
test_FreeRTOS_setsockopt_SockClose_Set(void)1988 void test_FreeRTOS_setsockopt_SockClose_Set( void )
1989 {
1990 BaseType_t xReturn;
1991 FreeRTOS_Socket_t xSocket;
1992 int32_t lLevel;
1993 int32_t lOptionName = FREERTOS_SO_CLOSE_AFTER_SEND;
1994 BaseType_t vOptionValue = pdTRUE;
1995 size_t uxOptionLength;
1996
1997 memset( &xSocket, 0, sizeof( xSocket ) );
1998
1999 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2000
2001 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2002
2003 TEST_ASSERT_EQUAL( 0, xReturn );
2004 TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bCloseAfterSend );
2005 }
2006
2007 /**
2008 * @brief Close after send option reset.
2009 */
test_FreeRTOS_setsockopt_SockClose_Reset(void)2010 void test_FreeRTOS_setsockopt_SockClose_Reset( void )
2011 {
2012 BaseType_t xReturn;
2013 FreeRTOS_Socket_t xSocket;
2014 int32_t lLevel;
2015 int32_t lOptionName = FREERTOS_SO_CLOSE_AFTER_SEND;
2016 BaseType_t vOptionValue = pdFALSE;
2017 size_t uxOptionLength;
2018
2019 memset( &xSocket, 0, sizeof( xSocket ) );
2020
2021 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2022 xSocket.u.xTCP.bits.bReuseSocket = pdTRUE;
2023
2024 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2025
2026 TEST_ASSERT_EQUAL( 0, xReturn );
2027 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bCloseAfterSend );
2028 }
2029
2030 /**
2031 * @brief Set full size of UDP socket.
2032 */
test_FreeRTOS_setsockopt_SetFullSize_InvalidProtocol(void)2033 void test_FreeRTOS_setsockopt_SetFullSize_InvalidProtocol( void )
2034 {
2035 BaseType_t xReturn;
2036 FreeRTOS_Socket_t xSocket;
2037 int32_t lLevel;
2038 int32_t lOptionName = FREERTOS_SO_SET_FULL_SIZE;
2039 BaseType_t vOptionValue;
2040 size_t uxOptionLength;
2041
2042 memset( &xSocket, 0, sizeof( xSocket ) );
2043
2044 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
2045
2046 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2047
2048 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
2049 }
2050
2051 /**
2052 * @brief Set full size option set.
2053 */
test_FreeRTOS_setsockopt_SetFullSize_Set(void)2054 void test_FreeRTOS_setsockopt_SetFullSize_Set( void )
2055 {
2056 BaseType_t xReturn;
2057 FreeRTOS_Socket_t xSocket;
2058 int32_t lLevel;
2059 int32_t lOptionName = FREERTOS_SO_SET_FULL_SIZE;
2060 BaseType_t vOptionValue = pdTRUE;
2061 size_t uxOptionLength;
2062
2063 memset( &xSocket, 0, sizeof( xSocket ) );
2064
2065 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2066
2067 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2068
2069 TEST_ASSERT_EQUAL( 0, xReturn );
2070 TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.xTCPWindow.u.bits.bSendFullSize );
2071 }
2072
2073 /**
2074 * @brief Set full size option reset but the state is not correct.
2075 */
test_FreeRTOS_setsockopt_SetFullSize_Reset_StateIncorrect(void)2076 void test_FreeRTOS_setsockopt_SetFullSize_Reset_StateIncorrect( void )
2077 {
2078 BaseType_t xReturn;
2079 FreeRTOS_Socket_t xSocket;
2080 int32_t lLevel;
2081 int32_t lOptionName = FREERTOS_SO_SET_FULL_SIZE;
2082 BaseType_t vOptionValue = pdFALSE;
2083 size_t uxOptionLength;
2084
2085 memset( &xSocket, 0, sizeof( xSocket ) );
2086
2087 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2088 xSocket.u.xTCP.bits.bReuseSocket = pdTRUE;
2089 xSocket.u.xTCP.eTCPState = eESTABLISHED - 1;
2090
2091 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2092
2093 TEST_ASSERT_EQUAL( 0, xReturn );
2094 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.xTCPWindow.u.bits.bSendFullSize );
2095 TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.usTimeout );
2096 }
2097
2098 /**
2099 * @brief Set full size option reset.
2100 */
test_FreeRTOS_setsockopt_SetFullSize_Reset_StateCorrect(void)2101 void test_FreeRTOS_setsockopt_SetFullSize_Reset_StateCorrect( void )
2102 {
2103 BaseType_t xReturn;
2104 FreeRTOS_Socket_t xSocket;
2105 int32_t lLevel;
2106 int32_t lOptionName = FREERTOS_SO_SET_FULL_SIZE;
2107 BaseType_t vOptionValue = pdFALSE;
2108 size_t uxOptionLength;
2109
2110 memset( &xSocket, 0, sizeof( xSocket ) );
2111
2112 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2113 xSocket.u.xTCP.bits.bReuseSocket = pdTRUE;
2114 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2115
2116 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2117
2118 TEST_ASSERT_EQUAL( 0, xReturn );
2119 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.xTCPWindow.u.bits.bSendFullSize );
2120 TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.usTimeout );
2121 }
2122
2123 /**
2124 * @brief Set full size option reset.
2125 */
test_FreeRTOS_setsockopt_SetFullSize_Reset_HappyPath(void)2126 void test_FreeRTOS_setsockopt_SetFullSize_Reset_HappyPath( void )
2127 {
2128 BaseType_t xReturn;
2129 FreeRTOS_Socket_t xSocket;
2130 int32_t lLevel;
2131 int32_t lOptionName = FREERTOS_SO_SET_FULL_SIZE;
2132 BaseType_t vOptionValue = pdFALSE;
2133 size_t uxOptionLength;
2134
2135 memset( &xSocket, 0, sizeof( xSocket ) );
2136
2137 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2138 xSocket.u.xTCP.bits.bReuseSocket = pdTRUE;
2139 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2140 xSocket.u.xTCP.txStream = ( StreamBuffer_t * ) 0xABCD;
2141
2142 uxStreamBufferGetSize_ExpectAndReturn( xSocket.u.xTCP.txStream, 0x123 );
2143 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdTRUE );
2144
2145 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2146
2147 TEST_ASSERT_EQUAL( 0, xReturn );
2148 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.xTCPWindow.u.bits.bSendFullSize );
2149 TEST_ASSERT_EQUAL( 1, xSocket.u.xTCP.usTimeout );
2150 }
2151
2152 /**
2153 * @brief Stop receive with a UDP socket.
2154 */
test_FreeRTOS_setsockopt_StopRx_InvalidProtocol(void)2155 void test_FreeRTOS_setsockopt_StopRx_InvalidProtocol( void )
2156 {
2157 BaseType_t xReturn;
2158 FreeRTOS_Socket_t xSocket;
2159 int32_t lLevel;
2160 int32_t lOptionName = FREERTOS_SO_STOP_RX;
2161 BaseType_t vOptionValue;
2162 size_t uxOptionLength;
2163
2164 memset( &xSocket, 0, sizeof( xSocket ) );
2165
2166 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
2167
2168 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2169
2170 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
2171 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bWinChange );
2172 TEST_ASSERT_EQUAL( 0, xSocket.u.xTCP.usTimeout );
2173 }
2174
2175 /**
2176 * @brief Stop receive set.
2177 */
test_FreeRTOS_setsockopt_StopRx_Set(void)2178 void test_FreeRTOS_setsockopt_StopRx_Set( void )
2179 {
2180 BaseType_t xReturn;
2181 FreeRTOS_Socket_t xSocket;
2182 int32_t lLevel;
2183 int32_t lOptionName = FREERTOS_SO_STOP_RX;
2184 BaseType_t vOptionValue = pdTRUE;
2185 size_t uxOptionLength;
2186
2187 memset( &xSocket, 0, sizeof( xSocket ) );
2188
2189 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2190
2191 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2192
2193 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2194
2195 TEST_ASSERT_EQUAL( 0, xReturn );
2196 TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bRxStopped );
2197 TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bWinChange );
2198 TEST_ASSERT_EQUAL( 1, xSocket.u.xTCP.usTimeout );
2199 }
2200
2201 /**
2202 * @brief Stop receive reset.
2203 */
test_FreeRTOS_setsockopt_StopRx_Reset(void)2204 void test_FreeRTOS_setsockopt_StopRx_Reset( void )
2205 {
2206 BaseType_t xReturn;
2207 FreeRTOS_Socket_t xSocket;
2208 int32_t lLevel;
2209 int32_t lOptionName = FREERTOS_SO_STOP_RX;
2210 BaseType_t vOptionValue = pdFALSE;
2211 size_t uxOptionLength;
2212
2213 memset( &xSocket, 0, sizeof( xSocket ) );
2214
2215 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2216 xSocket.u.xTCP.bits.bReuseSocket = pdTRUE;
2217
2218 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2219
2220 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2221
2222 TEST_ASSERT_EQUAL( 0, xReturn );
2223 TEST_ASSERT_EQUAL( pdFALSE, xSocket.u.xTCP.bits.bRxStopped );
2224 TEST_ASSERT_EQUAL( pdTRUE, xSocket.u.xTCP.bits.bWinChange );
2225 TEST_ASSERT_EQUAL( 1, xSocket.u.xTCP.usTimeout );
2226 }
2227
2228 /**
2229 * @brief Setting an invalid option.
2230 */
test_FreeRTOS_setsockopt_InvalidOption(void)2231 void test_FreeRTOS_setsockopt_InvalidOption( void )
2232 {
2233 BaseType_t xReturn;
2234 FreeRTOS_Socket_t xSocket;
2235 int32_t lLevel;
2236 int32_t lOptionName = 100;
2237 BaseType_t vOptionValue = pdFALSE;
2238 size_t uxOptionLength;
2239
2240 memset( &xSocket, 0, sizeof( xSocket ) );
2241
2242 xReturn = FreeRTOS_setsockopt( &xSocket, lLevel, lOptionName, &vOptionValue, uxOptionLength );
2243
2244 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOPROTOOPT, xReturn );
2245 }
2246
2247 /**
2248 * @brief Translate 32-bit IP to string.
2249 */
test_FreeRTOS_inet_ntoa_1(void)2250 void test_FreeRTOS_inet_ntoa_1( void )
2251 {
2252 const char * pucReturn;
2253 uint32_t ulIPAddress = 0;
2254 char pcBuffer[ 255 ];
2255 char * pucIdealReturn = "0.0.0.0";
2256
2257 pucReturn = FreeRTOS_inet_ntoa( ulIPAddress, pcBuffer );
2258
2259 TEST_ASSERT_EQUAL( pucReturn, pcBuffer );
2260 TEST_ASSERT_EQUAL_STRING( pucIdealReturn, pucReturn );
2261 }
2262
2263 /**
2264 * @brief Translate 32-bit IP to string.
2265 */
test_FreeRTOS_inet_ntoa_2(void)2266 void test_FreeRTOS_inet_ntoa_2( void )
2267 {
2268 const char * pucReturn;
2269 uint32_t ulIPAddress = 0xAAAAAAAA;
2270 char pcBuffer[ 255 ];
2271 char * pucIdealReturn = "170.170.170.170";
2272
2273 pucReturn = FreeRTOS_inet_ntoa( ulIPAddress, pcBuffer );
2274
2275 TEST_ASSERT_EQUAL( pucReturn, pcBuffer );
2276 TEST_ASSERT_EQUAL_STRING( pucIdealReturn, pucReturn );
2277 }
2278
2279 /**
2280 * @brief Translate 32-bit IP to string.
2281 */
test_FreeRTOS_inet_ntoa_3(void)2282 void test_FreeRTOS_inet_ntoa_3( void )
2283 {
2284 const char * pucReturn;
2285 uint32_t ulIPAddress = 0xFFFFFFFF;
2286 char pcBuffer[ 255 ];
2287 char * pucIdealReturn = "255.255.255.255";
2288
2289 pucReturn = FreeRTOS_inet_ntoa( ulIPAddress, pcBuffer );
2290
2291 TEST_ASSERT_EQUAL( pucReturn, pcBuffer );
2292 TEST_ASSERT_EQUAL_STRING( pucIdealReturn, pucReturn );
2293 }
2294
2295 /**
2296 * @brief Incorrect address family.
2297 */
test_FreeRTOS_inet_pton_IncorrectAddressFamily(void)2298 void test_FreeRTOS_inet_pton_IncorrectAddressFamily( void )
2299 {
2300 BaseType_t xReturn;
2301 BaseType_t xAddressFamily = FREERTOS_AF_INET + 1;
2302 const char * pcSource;
2303 void * pvDestination;
2304
2305 xReturn = FreeRTOS_inet_pton( xAddressFamily, pcSource, pvDestination );
2306
2307 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EAFNOSUPPORT, xReturn );
2308 }
2309
2310 /**
2311 * @brief Octal notation being converted.
2312 */
test_FreeRTOS_inet_pton_Octal(void)2313 void test_FreeRTOS_inet_pton_Octal( void )
2314 {
2315 BaseType_t xReturn;
2316 BaseType_t xAddressFamily = FREERTOS_AF_INET;
2317 const char * pcSource = "00.01.2.3";
2318 uint32_t ulDestination = 0;
2319
2320 FreeRTOS_inet_pton4_ExpectAndReturn( pcSource, &ulDestination, pdFAIL );
2321 xReturn = FreeRTOS_inet_pton( xAddressFamily, pcSource, &ulDestination );
2322
2323 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
2324 TEST_ASSERT_EQUAL( 0, ulDestination );
2325 }
2326
2327 /**
2328 * @brief Happy path of this function.
2329 */
test_FreeRTOS_inet_pton_HappyPath(void)2330 void test_FreeRTOS_inet_pton_HappyPath( void )
2331 {
2332 BaseType_t xReturn;
2333 BaseType_t xAddressFamily = FREERTOS_AF_INET;
2334 const char * pcSource = "255.255.255.255";
2335 uint32_t ulDestination;
2336 uint32_t ulExpectDestination = 0xFFFFFFFF;
2337
2338 FreeRTOS_inet_pton4_ExpectAndReturn( pcSource, &ulDestination, pdPASS );
2339 FreeRTOS_inet_pton4_ReturnMemThruPtr_pvDestination( &ulExpectDestination, sizeof( ulExpectDestination ) );
2340 xReturn = FreeRTOS_inet_pton( xAddressFamily, pcSource, &ulDestination );
2341
2342 TEST_ASSERT_EQUAL( pdPASS, xReturn );
2343 TEST_ASSERT_EQUAL_UINT32( ulExpectDestination, ulDestination );
2344 }
2345
2346 /**
2347 * @brief Happy path of this function for IPv6.
2348 */
test_FreeRTOS_inet_pton_IPv6HappyPath(void)2349 void test_FreeRTOS_inet_pton_IPv6HappyPath( void )
2350 {
2351 BaseType_t xReturn;
2352 BaseType_t xAddressFamily = FREERTOS_AF_INET6;
2353 const char * pcSource = "2001::1";
2354 IPv6_Address_t xDestination;
2355 IPv6_Address_t * pxExpectDestination = &xIPv6Address;
2356
2357 FreeRTOS_inet_pton6_ExpectAndReturn( pcSource, &xDestination, pdPASS );
2358 FreeRTOS_inet_pton6_ReturnMemThruPtr_pvDestination( pxExpectDestination->ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2359 xReturn = FreeRTOS_inet_pton( xAddressFamily, pcSource, &xDestination );
2360
2361 TEST_ASSERT_EQUAL( pdPASS, xReturn );
2362 TEST_ASSERT_EQUAL_MEMORY( pxExpectDestination->ucBytes, xDestination.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2363 }
2364
2365 /**
2366 * @brief Translate array to string for MAC address.
2367 */
test_FreeRTOS_EUI48_ntop1(void)2368 void test_FreeRTOS_EUI48_ntop1( void )
2369 {
2370 uint8_t pucSource[ 6 ] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
2371 char pcTarget[ 18 ];
2372 char cTen = 'A';
2373 char cSeparator = ':';
2374
2375 memset( pcTarget, 0, sizeof( pcTarget ) );
2376
2377 FreeRTOS_EUI48_ntop( pucSource, pcTarget, cTen, cSeparator );
2378 TEST_ASSERT_EQUAL_STRING( "AA:AA:AA:AA:AA:AA", pcTarget );
2379
2380 cTen = 'a';
2381 FreeRTOS_EUI48_ntop( pucSource, pcTarget, cTen, cSeparator );
2382 TEST_ASSERT_EQUAL_STRING( "aa:aa:aa:aa:aa:aa", pcTarget );
2383
2384 cTen = 'a';
2385 cSeparator = '-';
2386 FreeRTOS_EUI48_ntop( pucSource, pcTarget, cTen, cSeparator );
2387 TEST_ASSERT_EQUAL_STRING( "aa-aa-aa-aa-aa-aa", pcTarget );
2388 }
2389
2390 /**
2391 * @brief Translate array to string for MAC address.
2392 */
test_FreeRTOS_EUI48_ntop2(void)2393 void test_FreeRTOS_EUI48_ntop2( void )
2394 {
2395 uint8_t pucSource[ 6 ] = { 0x12, 0x34, 0x56, 0x78, 0xef, 0xdc };
2396 char pcTarget[ 18 ];
2397 char cTen = 'A';
2398 char cSeparator = ':';
2399
2400 memset( pcTarget, 0, sizeof( pcTarget ) );
2401
2402 FreeRTOS_EUI48_ntop( pucSource, pcTarget, cTen, cSeparator );
2403 TEST_ASSERT_EQUAL_STRING( "12:34:56:78:EF:DC", pcTarget );
2404
2405 cSeparator = '-';
2406 FreeRTOS_EUI48_ntop( pucSource, pcTarget, cTen, cSeparator );
2407 TEST_ASSERT_EQUAL_STRING( "12-34-56-78-EF-DC", pcTarget );
2408
2409 cTen = 'a';
2410 cSeparator = ':';
2411 FreeRTOS_EUI48_ntop( pucSource, pcTarget, cTen, cSeparator );
2412 TEST_ASSERT_EQUAL_STRING( "12:34:56:78:ef:dc", pcTarget );
2413
2414 cTen = 'a';
2415 cSeparator = '-';
2416 FreeRTOS_EUI48_ntop( pucSource, pcTarget, cTen, cSeparator );
2417 TEST_ASSERT_EQUAL_STRING( "12-34-56-78-ef-dc", pcTarget );
2418 }
2419
2420 /**
2421 * @brief Translate array to string for MAC address. Invalid values.
2422 */
test_FreeRTOS_EUI48_pton_InvalidInput(void)2423 void test_FreeRTOS_EUI48_pton_InvalidInput( void )
2424 {
2425 BaseType_t xReturn;
2426 const char * pcSource = "12345678::::";
2427 uint8_t pucTarget[ 6 ];
2428
2429 xReturn = FreeRTOS_EUI48_pton( pcSource, pucTarget );
2430 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
2431 }
2432
2433 /**
2434 * @brief Translate array to string for MAC address. Invalid values.
2435 */
test_FreeRTOS_EUI48_pton_InvalidInput2(void)2436 void test_FreeRTOS_EUI48_pton_InvalidInput2( void )
2437 {
2438 BaseType_t xReturn;
2439 const char * pcSource = "12:34:56:78:ab:ty";
2440 uint8_t pucTarget[ 6 ];
2441
2442 xReturn = FreeRTOS_EUI48_pton( pcSource, pucTarget );
2443 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
2444 }
2445
2446 /**
2447 * @brief Translate array to string for MAC address. Invalid values.
2448 */
test_FreeRTOS_EUI48_pton_InvalidInput3(void)2449 void test_FreeRTOS_EUI48_pton_InvalidInput3( void )
2450 {
2451 BaseType_t xReturn;
2452 const char * pcSource = "12:34#56:78:ab:cd";
2453 uint8_t pucTarget[ 6 ];
2454
2455 xReturn = FreeRTOS_EUI48_pton( pcSource, pucTarget );
2456 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
2457 }
2458
2459 /**
2460 * @brief Translate array to string for MAC address. Invalid values.
2461 */
test_FreeRTOS_EUI48_pton_InvalidInput4(void)2462 void test_FreeRTOS_EUI48_pton_InvalidInput4( void )
2463 {
2464 BaseType_t xReturn;
2465 const char * pcSource = "";
2466 uint8_t pucTarget[ 6 ];
2467
2468 xReturn = FreeRTOS_EUI48_pton( pcSource, pucTarget );
2469 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
2470 }
2471
2472 /**
2473 * @brief Translate string to array for MAC address.
2474 */
test_FreeRTOS_EUI48_pton_HappyPath(void)2475 void test_FreeRTOS_EUI48_pton_HappyPath( void )
2476 {
2477 BaseType_t xReturn;
2478 const char * pcSource = "12:34:56:78:ab:cd";
2479 uint8_t pucTarget[ 6 ];
2480 uint8_t pucIdeal[] = { 0x12, 0x34, 0x56, 0x78, 0xab, 0xcd };
2481
2482 xReturn = FreeRTOS_EUI48_pton( pcSource, pucTarget );
2483 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
2484 TEST_ASSERT_EQUAL_UINT8_ARRAY( pucIdeal, pucTarget, 6 );
2485 }
2486
2487 /**
2488 * @brief Translate string to array for MAC address.
2489 */
test_FreeRTOS_EUI48_pton_HappyPath1(void)2490 void test_FreeRTOS_EUI48_pton_HappyPath1( void )
2491 {
2492 BaseType_t xReturn;
2493 const char * pcSource = "12-34-56-78-ab-cd";
2494 uint8_t pucTarget[ 6 ];
2495 uint8_t pucIdeal[] = { 0x12, 0x34, 0x56, 0x78, 0xab, 0xcd };
2496
2497 xReturn = FreeRTOS_EUI48_pton( pcSource, pucTarget );
2498 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
2499 TEST_ASSERT_EQUAL_UINT8_ARRAY( pucIdeal, pucTarget, 6 );
2500 }
2501
2502 /**
2503 * @brief Translate string to array for MAC address.
2504 */
test_FreeRTOS_EUI48_pton_HappyPath2(void)2505 void test_FreeRTOS_EUI48_pton_HappyPath2( void )
2506 {
2507 BaseType_t xReturn;
2508 const char * pcSource = "FF-34-56-78-ab-cd";
2509 uint8_t pucTarget[ 6 ];
2510 uint8_t pucIdeal[] = { 0xff, 0x34, 0x56, 0x78, 0xab, 0xcd };
2511
2512 xReturn = FreeRTOS_EUI48_pton( pcSource, pucTarget );
2513 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
2514 TEST_ASSERT_EQUAL_UINT8_ARRAY( pucIdeal, pucTarget, 6 );
2515 }
2516
2517 /**
2518 * @brief Invalid input to convert to IP address.
2519 */
test_FreeRTOS_inet_addr_InvalidString(void)2520 void test_FreeRTOS_inet_addr_InvalidString( void )
2521 {
2522 uint32_t ulReturn;
2523 char * pcIPAddress = "0..12.34.4";
2524
2525 FreeRTOS_inet_pton4_ExpectAndReturn( pcIPAddress, NULL, pdFAIL );
2526 FreeRTOS_inet_pton4_IgnoreArg_pvDestination();
2527 ulReturn = FreeRTOS_inet_addr( pcIPAddress );
2528 TEST_ASSERT_EQUAL( 0, ulReturn );
2529 }
2530
2531 /**
2532 * @brief Valid input to convert to IP address.
2533 */
test_FreeRTOS_inet_addr_ValidString(void)2534 void test_FreeRTOS_inet_addr_ValidString( void )
2535 {
2536 uint32_t ulExpectAnswer = 0x04030201;
2537 uint32_t ulReturn;
2538 char * pcIPAddress = "1.2.3.4";
2539
2540 FreeRTOS_inet_pton4_ExpectAndReturn( pcIPAddress, NULL, pdPASS );
2541 FreeRTOS_inet_pton4_IgnoreArg_pvDestination();
2542 FreeRTOS_inet_pton4_ReturnMemThruPtr_pvDestination( &ulExpectAnswer, sizeof( ulExpectAnswer ) );
2543 ulReturn = FreeRTOS_inet_addr( pcIPAddress );
2544 TEST_ASSERT_EQUAL( ulExpectAnswer, ulReturn );
2545 }
2546
2547 /**
2548 * @brief Get local address from a socket.
2549 */
test_FreeRTOS_GetLocalAddress(void)2550 void test_FreeRTOS_GetLocalAddress( void )
2551 {
2552 size_t uxReturn;
2553 FreeRTOS_Socket_t xSocket;
2554 struct freertos_sockaddr xAddress;
2555
2556 memset( &xSocket, 0, sizeof( xSocket ) );
2557 memset( &xAddress, 0, sizeof( xAddress ) );
2558
2559 xSocket.usLocalPort = 0xAB12;
2560 xSocket.xLocalAddress.ulIP_IPv4 = 0xABFC8769;
2561
2562 uxReturn = FreeRTOS_GetLocalAddress( &xSocket, &xAddress );
2563
2564 TEST_ASSERT_EQUAL( sizeof( xAddress ), uxReturn );
2565 TEST_ASSERT_EQUAL( FreeRTOS_htonl( 0xABFC8769 ), xAddress.sin_address.ulIP_IPv4 );
2566 TEST_ASSERT_EQUAL( FreeRTOS_htons( 0xAB12 ), xAddress.sin_port );
2567 }
2568
2569 /**
2570 * @brief Get local address from an IPv6 socket.
2571 */
test_FreeRTOS_GetLocalAddress_IPv6(void)2572 void test_FreeRTOS_GetLocalAddress_IPv6( void )
2573 {
2574 size_t uxReturn;
2575 FreeRTOS_Socket_t xSocket;
2576 struct freertos_sockaddr xAddress;
2577 IPv6_Address_t xIPAddress = { { 0x20 } };
2578
2579 memset( &xSocket, 0, sizeof( xSocket ) );
2580 memset( &xAddress, 0, sizeof( xAddress ) );
2581
2582 xSocket.bits.bIsIPv6 = pdTRUE;
2583 xSocket.usLocalPort = 0xAB12;
2584 memcpy( xSocket.xLocalAddress.xIP_IPv6.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2585
2586 uxReturn = FreeRTOS_GetLocalAddress( &xSocket, &xAddress );
2587
2588 TEST_ASSERT_EQUAL( FREERTOS_AF_INET6, xAddress.sin_family );
2589 TEST_ASSERT_EQUAL_MEMORY( xIPv6Address.ucBytes, xAddress.sin_address.xIP_IPv6.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2590 TEST_ASSERT_EQUAL( FreeRTOS_htons( 0xAB12 ), xAddress.sin_port );
2591 }
2592
2593 /**
2594 * @brief All fields are NULL in the socket.
2595 */
test_FreeRTOS_connect_SocketValuesNULL(void)2596 void test_FreeRTOS_connect_SocketValuesNULL( void )
2597 {
2598 BaseType_t xResult;
2599 FreeRTOS_Socket_t xSocket;
2600 struct freertos_sockaddr xAddress;
2601 socklen_t xAddressLength;
2602
2603 memset( &xSocket, 0, sizeof( xSocket ) );
2604
2605 xResult = FreeRTOS_connect( &xSocket, &xAddress, xAddressLength );
2606
2607 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EBADF, xResult );
2608 }
2609
2610 /**
2611 * @brief Test for invalid values.
2612 */
test_FreeRTOS_connect_InvalidValues(void)2613 void test_FreeRTOS_connect_InvalidValues( void )
2614 {
2615 BaseType_t xResult;
2616 FreeRTOS_Socket_t xSocket;
2617 struct freertos_sockaddr xAddress;
2618 socklen_t xAddressLength;
2619
2620 memset( &xSocket, 0, sizeof( xSocket ) );
2621
2622 /* Invalid protocol. */
2623 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
2624 xResult = FreeRTOS_connect( &xSocket, &xAddress, xAddressLength );
2625 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EBADF, xResult );
2626
2627 /* Socket not bound. Binding failed. */
2628 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2629 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( NULL );
2630 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
2631 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( NULL );
2632 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdFAIL );
2633 xResult = FreeRTOS_connect( &xSocket, &xAddress, xAddressLength );
2634 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ECANCELED, xResult );
2635
2636 /* Socket NULL. */
2637 xResult = FreeRTOS_connect( NULL, &xAddress, xAddressLength );
2638 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EBADF, xResult );
2639
2640 /* Address NULL. */
2641 xResult = FreeRTOS_connect( &xSocket, NULL, xAddressLength );
2642 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xResult );
2643 }
2644
2645 /**
2646 * @brief Non blocking connect.
2647 */
test_FreeRTOS_connect_NonBlocking(void)2648 void test_FreeRTOS_connect_NonBlocking( void )
2649 {
2650 BaseType_t xResult;
2651 FreeRTOS_Socket_t xSocket;
2652 struct freertos_sockaddr xAddress;
2653 socklen_t xAddressLength;
2654
2655 memset( &xSocket, 0, sizeof( xSocket ) );
2656
2657 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2658 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2659
2660 vTCPStateChange_Expect( &xSocket, eCONNECT_SYN );
2661 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2662
2663 xResult = FreeRTOS_connect( &xSocket, &xAddress, xAddressLength );
2664
2665 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EWOULDBLOCK, xResult );
2666 }
2667
2668 /**
2669 * @brief Timeout in connection.
2670 */
test_FreeRTOS_connect_Timeout(void)2671 void test_FreeRTOS_connect_Timeout( void )
2672 {
2673 BaseType_t xResult;
2674 FreeRTOS_Socket_t xSocket;
2675 struct freertos_sockaddr xAddress;
2676 socklen_t xAddressLength;
2677
2678 memset( &xSocket, 0, sizeof( xSocket ) );
2679
2680 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2681 /* Non 0 value to show blocking. */
2682 xSocket.xReceiveBlockTime = 0x123;
2683 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2684
2685 vTCPStateChange_Expect( &xSocket, eCONNECT_SYN );
2686 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2687
2688 /* Using a local variable. */
2689 vTaskSetTimeOutState_ExpectAnyArgs();
2690
2691 /* No timeout the first time. */
2692 xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
2693
2694 xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_CONNECT | eSOCKET_CLOSED, pdTRUE, pdFALSE, xSocket.xReceiveBlockTime, pdTRUE );
2695
2696 /* Timed out! */
2697 xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
2698
2699 xResult = FreeRTOS_connect( &xSocket, &xAddress, xAddressLength );
2700
2701 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ETIMEDOUT, xResult );
2702 }
2703
2704 /**
2705 * @brief Timeout in connection.
2706 */
test_FreeRTOS_connect_SocketClosed(void)2707 void test_FreeRTOS_connect_SocketClosed( void )
2708 {
2709 BaseType_t xResult;
2710 FreeRTOS_Socket_t xSocket;
2711 struct freertos_sockaddr xAddress;
2712 socklen_t xAddressLength;
2713
2714 memset( &xSocket, 0, sizeof( xSocket ) );
2715
2716 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2717 /* Non 0 value to show blocking. */
2718 xSocket.xReceiveBlockTime = 0x123;
2719 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2720
2721 vTCPStateChange_Expect( &xSocket, eCONNECT_SYN );
2722 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2723
2724 /* Using a local variable. */
2725 vTaskSetTimeOutState_ExpectAnyArgs();
2726
2727 /* No timeout the first time. */
2728 xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
2729
2730 xEventGroupWaitBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_CONNECT | eSOCKET_CLOSED, pdTRUE, pdFALSE, xSocket.xReceiveBlockTime, eSOCKET_CLOSED );
2731
2732 xResult = FreeRTOS_connect( &xSocket, &xAddress, xAddressLength );
2733
2734 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOTCONN, xResult );
2735 }
2736
2737 /**
2738 * @brief Connection successful.
2739 */
test_FreeRTOS_connect_Connected(void)2740 void test_FreeRTOS_connect_Connected( void )
2741 {
2742 BaseType_t xResult;
2743 struct freertos_sockaddr xAddress;
2744 socklen_t xAddressLength;
2745
2746 memset( &xGlobalSocket, 0, sizeof( xGlobalSocket ) );
2747 memset( &xAddress, 0, sizeof( xAddress ) );
2748
2749 xAddress.sin_family = FREERTOS_AF_INET4;
2750
2751 xGlobalSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2752 /* Non 0 value to show blocking. */
2753 xGlobalSocket.xReceiveBlockTime = 0x123;
2754 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2755
2756 vTCPStateChange_Expect( &xGlobalSocket, eCONNECT_SYN );
2757 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2758
2759 /* Using a local variable. */
2760 vTaskSetTimeOutState_ExpectAnyArgs();
2761
2762 xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
2763
2764 xEventGroupWaitBits_Stub( xStubForEventGroupWaitBits );
2765
2766 xResult = FreeRTOS_connect( &xGlobalSocket, &xAddress, xAddressLength );
2767
2768 TEST_ASSERT_EQUAL( 0, xResult );
2769 }
2770
2771 /**
2772 * @brief Connection failed due to error happening during sleep.
2773 */
test_FreeRTOS_connect_SocketErrorDuringSleep(void)2774 void test_FreeRTOS_connect_SocketErrorDuringSleep( void )
2775 {
2776 BaseType_t xResult;
2777 struct freertos_sockaddr xAddress;
2778 socklen_t xAddressLength;
2779
2780 memset( &xGlobalSocket, 0, sizeof( xGlobalSocket ) );
2781
2782 xGlobalSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2783 /* Non 0 value to show blocking. */
2784 xGlobalSocket.xReceiveBlockTime = 0x123;
2785 listLIST_ITEM_CONTAINER_ExpectAnyArgsAndReturn( &xBoundTCPSocketsList );
2786
2787 vTCPStateChange_Expect( &xGlobalSocket, eCONNECT_SYN );
2788 xSendEventToIPTask_ExpectAndReturn( eTCPTimerEvent, pdPASS );
2789
2790 /* Set the global socket handler to error during sleep. */
2791 vTaskSetTimeOutState_Stub( vStub_vTaskSetTimeOutState_socketError );
2792
2793 xResult = FreeRTOS_connect( &xGlobalSocket, &xAddress, xAddressLength );
2794
2795 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xResult );
2796 }
2797
2798 /**
2799 * @brief Invalid protocol.
2800 */
test_FreeRTOS_GetRemoteAddress_InvalidProtocol(void)2801 void test_FreeRTOS_GetRemoteAddress_InvalidProtocol( void )
2802 {
2803 BaseType_t xReturn;
2804 FreeRTOS_Socket_t xSocket;
2805 struct freertos_sockaddr xAddress;
2806
2807 memset( &xSocket, 0, sizeof( xSocket ) );
2808 memset( &xAddress, 0, sizeof( xAddress ) );
2809
2810 xReturn = FreeRTOS_GetRemoteAddress( &xSocket, &xAddress );
2811
2812 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
2813 }
2814
2815 /**
2816 * @brief happy path.
2817 */
test_FreeRTOS_GetRemoteAddress_HappyPath(void)2818 void test_FreeRTOS_GetRemoteAddress_HappyPath( void )
2819 {
2820 BaseType_t xReturn;
2821 FreeRTOS_Socket_t xSocket;
2822 struct freertos_sockaddr xAddress;
2823
2824 memset( &xSocket, 0, sizeof( xSocket ) );
2825 memset( &xAddress, 0, sizeof( xAddress ) );
2826
2827 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2828 xSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = 0xABCDEF12;
2829 xSocket.u.xTCP.usRemotePort = 0x1234;
2830
2831 xReturn = FreeRTOS_GetRemoteAddress( &xSocket, &xAddress );
2832
2833 TEST_ASSERT_EQUAL( sizeof( xAddress ), xReturn );
2834 TEST_ASSERT_EQUAL( FreeRTOS_htonl( 0xABCDEF12 ), xAddress.sin_address.ulIP_IPv4 );
2835 TEST_ASSERT_EQUAL( FreeRTOS_htons( 0x1234 ), xAddress.sin_port );
2836 }
2837
2838 /**
2839 * @brief IPv6 happy path.
2840 */
test_FreeRTOS_GetRemoteAddress_IPv6HappyPath(void)2841 void test_FreeRTOS_GetRemoteAddress_IPv6HappyPath( void )
2842 {
2843 BaseType_t xReturn;
2844 FreeRTOS_Socket_t xSocket;
2845 struct freertos_sockaddr xAddress;
2846
2847 memset( &xSocket, 0, sizeof( xSocket ) );
2848 memset( &xAddress, 0, sizeof( xAddress ) );
2849
2850 xSocket.bits.bIsIPv6 = pdTRUE_UNSIGNED;
2851 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2852 memcpy( xSocket.u.xTCP.xRemoteIP.xIP_IPv6.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2853 xSocket.u.xTCP.usRemotePort = 0x1234;
2854
2855 xReturn = FreeRTOS_GetRemoteAddress( &xSocket, &xAddress );
2856
2857 TEST_ASSERT_EQUAL( sizeof( xAddress ), xReturn );
2858 TEST_ASSERT_EQUAL_MEMORY( xIPv6Address.ucBytes, xAddress.sin_address.xIP_IPv6.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2859 TEST_ASSERT_EQUAL( FreeRTOS_htons( 0x1234 ), xAddress.sin_port );
2860 }
2861
2862 /**
2863 * @brief Invalid values.
2864 */
test_FreeRTOS_maywrite_InvalidValues(void)2865 void test_FreeRTOS_maywrite_InvalidValues( void )
2866 {
2867 BaseType_t xReturn;
2868 FreeRTOS_Socket_t xSocket;
2869
2870 memset( &xSocket, 0, sizeof( xSocket ) );
2871
2872 /* Invalid Protocol. */
2873 xReturn = FreeRTOS_maywrite( &xSocket );
2874 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
2875
2876 /* Invalid States. */
2877 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2878 xSocket.u.xTCP.eTCPState = eTCP_LISTEN; /* eCONNECT_SYN - 1 */
2879 xReturn = FreeRTOS_maywrite( &xSocket );
2880 TEST_ASSERT_EQUAL( -1, xReturn );
2881
2882 xSocket.u.xTCP.eTCPState = eFIN_WAIT_1; /* eESTABLISHED + 1 */
2883 xReturn = FreeRTOS_maywrite( &xSocket );
2884 TEST_ASSERT_EQUAL( -1, xReturn );
2885
2886 xSocket.u.xTCP.eTCPState = eCONNECT_SYN;
2887 xReturn = FreeRTOS_maywrite( &xSocket );
2888 TEST_ASSERT_EQUAL( 0, xReturn );
2889
2890 xSocket.u.xTCP.eTCPState = eSYN_FIRST; /* eCONNECT_SYN + 1 */
2891 xReturn = FreeRTOS_maywrite( &xSocket );
2892 TEST_ASSERT_EQUAL( 0, xReturn );
2893
2894 /* Transmission NULL. */
2895 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2896 xSocket.u.xTCP.uxTxStreamSize = 0x123;
2897 xReturn = FreeRTOS_maywrite( &xSocket );
2898 TEST_ASSERT_EQUAL( 0x123, xReturn );
2899 }
2900
2901 /**
2902 * @brief Happy path.
2903 */
test_FreeRTOS_maywrite_HappyPath(void)2904 void test_FreeRTOS_maywrite_HappyPath( void )
2905 {
2906 BaseType_t xReturn;
2907 FreeRTOS_Socket_t xSocket;
2908 uint8_t ucStream[ 20 ];
2909
2910 memset( &xSocket, 0, sizeof( xSocket ) );
2911
2912 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
2913 xSocket.u.xTCP.eTCPState = eESTABLISHED;
2914 xSocket.u.xTCP.txStream = ( StreamBuffer_t * ) ucStream;
2915
2916 uxStreamBufferGetSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0x3344 );
2917
2918 xReturn = FreeRTOS_maywrite( &xSocket );
2919 TEST_ASSERT_EQUAL( 0x3344, xReturn );
2920 }
2921
2922 /**
2923 * @brief Test setting socket ID when the socket is NULL.
2924 */
test_xSocketSetSocketID_NULLSocket(void)2925 void test_xSocketSetSocketID_NULLSocket( void )
2926 {
2927 BaseType_t xReturn;
2928
2929 xReturn = xSocketSetSocketID( NULL, NULL );
2930
2931 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
2932 }
2933
2934 /**
2935 * @brief Test setting socket ID when the socket is invalid.
2936 */
test_xSocketSetSocketID_InvalidSocket(void)2937 void test_xSocketSetSocketID_InvalidSocket( void )
2938 {
2939 BaseType_t xReturn;
2940
2941 xReturn = xSocketSetSocketID( FREERTOS_INVALID_SOCKET, NULL );
2942
2943 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
2944 }
2945
2946 /**
2947 * @brief Test setting socket ID when the socket is Valid.
2948 */
test_xSocketSetSocketID_ValidSocket(void)2949 void test_xSocketSetSocketID_ValidSocket( void )
2950 {
2951 BaseType_t xReturn;
2952 FreeRTOS_Socket_t xSocket;
2953 BaseType_t AnchorVariable;
2954
2955 memset( &xSocket, 0, sizeof( xSocket ) );
2956
2957 xReturn = xSocketSetSocketID( &xSocket, &AnchorVariable );
2958
2959 TEST_ASSERT_EQUAL( 0, xReturn );
2960 TEST_ASSERT_EQUAL( &AnchorVariable, xSocket.pvSocketID );
2961 }
2962
2963 /**
2964 * @brief Test setting socket ID when the socket is NULL.
2965 */
test_pvSocketGetSocketID_NULLSocket(void)2966 void test_pvSocketGetSocketID_NULLSocket( void )
2967 {
2968 void * pvReturn;
2969
2970 pvReturn = pvSocketGetSocketID( NULL );
2971
2972 TEST_ASSERT_EQUAL( NULL, pvReturn );
2973 }
2974
2975 /**
2976 * @brief Test setting socket ID when the socket is invalid.
2977 */
test_pvSocketGetSocketID_InvalidSocket(void)2978 void test_pvSocketGetSocketID_InvalidSocket( void )
2979 {
2980 void * pvReturn;
2981
2982 pvReturn = pvSocketGetSocketID( FREERTOS_INVALID_SOCKET );
2983
2984 TEST_ASSERT_EQUAL( NULL, pvReturn );
2985 }
2986
2987 /**
2988 * @brief Test setting socket ID when the socket is Valid.
2989 */
test_pvSocketGetSocketID_ValidSocket(void)2990 void test_pvSocketGetSocketID_ValidSocket( void )
2991 {
2992 BaseType_t pvReturn;
2993 FreeRTOS_Socket_t xSocket;
2994 BaseType_t AnchorVariable;
2995
2996 memset( &xSocket, 0, sizeof( xSocket ) );
2997
2998 xSocket.pvSocketID = &AnchorVariable;
2999
3000 pvReturn = ( BaseType_t ) pvSocketGetSocketID( &xSocket );
3001
3002 TEST_ASSERT_EQUAL( &AnchorVariable, pvReturn );
3003 }
3004
3005 /**
3006 * @brief This function just prints out some data. It is expected to make calls to the
3007 * below functions when IP stack is not initialised.
3008 */
test_vTCPNetStat_IPStackNotInit(void)3009 void test_vTCPNetStat_IPStackNotInit( void )
3010 {
3011 uxGetMinimumFreeNetworkBuffers_ExpectAndReturn( 0 );
3012 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 0 );
3013
3014 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdFALSE );
3015
3016 vTCPNetStat();
3017 }
3018
3019 /**
3020 * @brief This function just prints out some data. It is expected to make calls to the
3021 * below functions when IP stack is initialised. It is expected to go through the
3022 * list of TCP and UDP sockets which are bound and print them out.
3023 */
test_vTCPNetStat_IPStackInit(void)3024 void test_vTCPNetStat_IPStackInit( void )
3025 {
3026 ListItem_t xLocalTCPItem, xLocalUDPItem, xIterator;
3027 FreeRTOS_Socket_t xSocket, xSocket2;
3028
3029 memset( &xSocket, 0, sizeof( xSocket ) );
3030 memset( &xSocket2, 0, sizeof( xSocket2 ) );
3031
3032 uxGetMinimumFreeNetworkBuffers_ExpectAndReturn( 0 );
3033 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 0 );
3034
3035 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
3036
3037 listGET_END_MARKER_ExpectAndReturn( &xBoundTCPSocketsList, &xLocalTCPItem );
3038 listGET_END_MARKER_ExpectAndReturn( &xBoundUDPSocketsList, &xLocalUDPItem );
3039
3040 /* First Iteration. */
3041 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, &xIterator );
3042
3043 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xSocket );
3044
3045 xTaskGetTickCount_ExpectAndReturn( 0x10 );
3046
3047 uxIPHeaderSizeSocket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
3048
3049 /* Second Iteration. */
3050 xSocket2.u.xTCP.eTCPState = eTCP_LISTEN;
3051 listGET_NEXT_ExpectAndReturn( &xIterator, &xIterator );
3052 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xSocket2 );
3053
3054 xTaskGetTickCount_ExpectAndReturn( 0x20 );
3055
3056 /* TCP last iteration. */
3057 listGET_NEXT_ExpectAndReturn( &xIterator, &xLocalTCPItem );
3058
3059
3060 /* UDP */
3061 /* First Iteration. */
3062 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundUDPSocketsList, &xIterator );
3063
3064 /* Second Iteration. */
3065 listGET_NEXT_ExpectAndReturn( &xIterator, &xIterator );
3066
3067 /* TCP last iteration. */
3068 listGET_NEXT_ExpectAndReturn( &xIterator, &xLocalUDPItem );
3069
3070 vTCPNetStat();
3071 }
3072
3073 /**
3074 * @brief This function just prints out some data. It is expected to change the age ( current tick - last alive )
3075 * if it's greater than 999999.
3076 */
test_vTCPNetStat_LongTimeSinceLastAlive(void)3077 void test_vTCPNetStat_LongTimeSinceLastAlive( void )
3078 {
3079 ListItem_t xLocalTCPItem, xLocalUDPItem, xIterator;
3080 FreeRTOS_Socket_t xSocket, xSocket2;
3081
3082 memset( &xSocket, 0, sizeof( xSocket ) );
3083 memset( &xSocket2, 0, sizeof( xSocket2 ) );
3084
3085 uxGetMinimumFreeNetworkBuffers_ExpectAndReturn( 0 );
3086 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 0 );
3087
3088 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
3089
3090 listGET_END_MARKER_ExpectAndReturn( &xBoundTCPSocketsList, &xLocalTCPItem );
3091 listGET_END_MARKER_ExpectAndReturn( &xBoundUDPSocketsList, &xLocalUDPItem );
3092
3093 /* First Iteration. */
3094 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, &xIterator );
3095
3096 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xSocket );
3097
3098 xTaskGetTickCount_ExpectAndReturn( 1000000U );
3099
3100 /* Second Iteration. */
3101 xSocket2.u.xTCP.eTCPState = eTCP_LISTEN;
3102 listGET_NEXT_ExpectAndReturn( &xIterator, &xIterator );
3103 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xSocket2 );
3104
3105 xTaskGetTickCount_ExpectAndReturn( 0x20 );
3106
3107 /* TCP last iteration. */
3108 listGET_NEXT_ExpectAndReturn( &xIterator, &xLocalTCPItem );
3109
3110
3111 /* UDP */
3112 /* First Iteration. */
3113 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundUDPSocketsList, &xIterator );
3114
3115 /* Second Iteration. */
3116 listGET_NEXT_ExpectAndReturn( &xIterator, &xIterator );
3117
3118 /* TCP last iteration. */
3119 listGET_NEXT_ExpectAndReturn( &xIterator, &xLocalUDPItem );
3120
3121 vTCPNetStat();
3122 }
3123
3124 /**
3125 * @brief This function just prints out some data. It is able to print IPv6
3126 * socket as well.
3127 */
test_vTCPNetStat_IPv6Socket(void)3128 void test_vTCPNetStat_IPv6Socket( void )
3129 {
3130 ListItem_t xLocalTCPItem, xLocalUDPItem, xIterator;
3131 FreeRTOS_Socket_t xSocket;
3132
3133 memset( &xSocket, 0, sizeof( xSocket ) );
3134
3135 xSocket.bits.bIsIPv6 = pdTRUE_UNSIGNED;
3136
3137 uxGetMinimumFreeNetworkBuffers_ExpectAndReturn( 0 );
3138 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 0 );
3139
3140 listLIST_IS_INITIALISED_ExpectAndReturn( &xBoundTCPSocketsList, pdTRUE );
3141
3142 listGET_END_MARKER_ExpectAndReturn( &xBoundTCPSocketsList, &xLocalTCPItem );
3143 listGET_END_MARKER_ExpectAndReturn( &xBoundUDPSocketsList, &xLocalUDPItem );
3144
3145 /* First Iteration. */
3146 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundTCPSocketsList, &xIterator );
3147
3148 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xIterator, &xSocket );
3149
3150 xTaskGetTickCount_ExpectAndReturn( 0x10 );
3151
3152 /* TCP last iteration. */
3153 listGET_NEXT_ExpectAndReturn( &xIterator, &xLocalTCPItem );
3154
3155 /* UDP */
3156 /* First Iteration. */
3157 listGET_HEAD_ENTRY_ExpectAndReturn( &xBoundUDPSocketsList, &xIterator );
3158
3159 /* Second Iteration. */
3160 listGET_NEXT_ExpectAndReturn( &xIterator, &xIterator );
3161
3162 /* TCP last iteration. */
3163 listGET_NEXT_ExpectAndReturn( &xIterator, &xLocalUDPItem );
3164
3165 vTCPNetStat();
3166 }
3167
3168 /**
3169 * @brief Socket select function when only UDP sockets are bound.
3170 */
test_vSocketSelect_UDPSocketsOnly(void)3171 void test_vSocketSelect_UDPSocketsOnly( void )
3172 {
3173 SocketSelect_t xSocketSet;
3174 ListItem_t xLocalListItem;
3175 FreeRTOS_Socket_t xSocket, xSocket2, xSocket3, xSocket4;
3176
3177 memset( &xSocket, 0, sizeof( xSocket ) );
3178 memset( &xSocket2, 0, sizeof( xSocket2 ) );
3179 memset( &xSocket3, 0, sizeof( xSocket3 ) );
3180 memset( &xSocket4, 0, sizeof( xSocket4 ) );
3181
3182 xSocket2.pxSocketSet = &xSocketSet;
3183 xSocket3.pxSocketSet = &xSocketSet;
3184 xSocket4.pxSocketSet = &xSocketSet;
3185
3186 /* Round 0. Not same socket set. */
3187 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundUDPSocketsList.xListEnd ), &xLocalListItem );
3188 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket );
3189
3190 /* Round 1. Same socket set. No select bits. */
3191 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3192 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket2 );
3193
3194 /* Round 2. Same socket set. elect bits. */
3195 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3196 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket3 );
3197
3198 xSocket3.xSelectBits = eSELECT_READ;
3199 listCURRENT_LIST_LENGTH_ExpectAndReturn( &( xSocket3.u.xUDP.xWaitingPacketsList ), 0 );
3200
3201 /* Round 3. Same socket set. elect bits. */
3202 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3203 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket4 );
3204
3205 xSocket4.xSelectBits = eSELECT_READ;
3206 listCURRENT_LIST_LENGTH_ExpectAndReturn( &( xSocket4.u.xUDP.xWaitingPacketsList ), 3 );
3207
3208 /* Last item. */
3209 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundUDPSocketsList.xListEnd ) );
3210
3211 /* Last item. Nothing in TCP. */
3212 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
3213
3214 xEventGroupClearBits_ExpectAndReturn( xSocketSet.xSelectGroup, 0, 0 );
3215
3216 xEventGroupSetBits_ExpectAndReturn( xSocketSet.xSelectGroup, eSELECT_READ | eSELECT_CALL_IP, pdPASS );
3217
3218 vSocketSelect( &xSocketSet );
3219
3220 TEST_ASSERT_EQUAL( 0, xSocket.xSocketBits );
3221 TEST_ASSERT_EQUAL( 0, xSocket2.xSocketBits );
3222 TEST_ASSERT_EQUAL( 0, xSocket3.xSocketBits );
3223 TEST_ASSERT_EQUAL( eSELECT_READ, xSocket4.xSocketBits );
3224 }
3225
3226 /**
3227 * @brief Socket select function when only TCP sockets are bound.
3228 */
test_vSocketSelect_TCPSocketsOnly(void)3229 void test_vSocketSelect_TCPSocketsOnly( void )
3230 {
3231 SocketSelect_t xSocketSet;
3232 ListItem_t xLocalListItem;
3233 uint8_t ucStream[ 20 ];
3234 FreeRTOS_Socket_t xSocket[ 9 ], xPeerSocket, xPeerSocket1;
3235
3236 for( int i = 1; i < 9; i++ )
3237 {
3238 memset( &xSocket[ i ], 0, sizeof( xSocket[ i ] ) );
3239 xSocket[ i ].pxSocketSet = &xSocketSet;
3240 xSocket[ i ].ucProtocol = FREERTOS_IPPROTO_TCP;
3241 }
3242
3243 memset( &xPeerSocket, 0, sizeof( xPeerSocket ) );
3244 memset( &xPeerSocket1, 0, sizeof( xPeerSocket1 ) );
3245 memset( &xSocket[ 0 ], 0, sizeof( xSocket[ 0 ] ) );
3246
3247 xSocket[ 0 ].ucProtocol = FREERTOS_IPPROTO_TCP;
3248
3249 /* Last item. Nothing in UDP. */
3250 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundUDPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundUDPSocketsList.xListEnd ) );
3251
3252 /* Round 0. Not same socket set. */
3253 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), &xLocalListItem );
3254 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket[ 0 ] );
3255
3256 /* Round 1. Same socket set. No bits Set. */
3257 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3258 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket[ 1 ] );
3259
3260 /* Round 2. Same socket set. All bits Set. */
3261 xSocket[ 2 ].xSelectBits = eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE;
3262 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3263 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket[ 2 ] );
3264
3265 /* Round 3. */
3266 xSocket[ 3 ].xSelectBits = eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE;
3267 xSocket[ 3 ].u.xTCP.bits.bPassAccept = pdTRUE;
3268 xSocket[ 3 ].u.xTCP.eTCPState = eTCP_LISTEN;
3269 xSocket[ 3 ].u.xTCP.pxPeerSocket = &xPeerSocket;
3270 xSocket[ 3 ].u.xTCP.bits.bConnPrepared = pdTRUE_UNSIGNED;
3271 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3272 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket[ 3 ] );
3273
3274 /* Round 4. */
3275 xSocket[ 4 ].xSelectBits = eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE;
3276 xSocket[ 4 ].u.xTCP.bits.bPassAccept = pdTRUE;
3277 xSocket[ 4 ].u.xTCP.eTCPState = eTCP_LISTEN;
3278 xSocket[ 4 ].u.xTCP.pxPeerSocket = &xPeerSocket1;
3279 xSocket[ 4 ].u.xTCP.pxPeerSocket->u.xTCP.bits.bPassAccept = pdTRUE;
3280 xSocket[ 4 ].u.xTCP.bits.bConnPrepared = pdTRUE_UNSIGNED;
3281 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3282 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket[ 4 ] );
3283
3284 /* Round 5. */
3285 xSocket[ 5 ].xSelectBits = eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE;
3286 xSocket[ 5 ].u.xTCP.eTCPState = eTCP_LISTEN;
3287 xSocket[ 5 ].u.xTCP.bits.bConnPrepared = pdTRUE_UNSIGNED;
3288 xSocket[ 5 ].u.xTCP.txStream = ( StreamBuffer_t * ) ucStream;
3289 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3290 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket[ 5 ] );
3291 uxStreamBufferGetSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0xABCD );
3292
3293 /* Round 5. */
3294 xSocket[ 6 ].xSelectBits = eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE;
3295 xSocket[ 6 ].u.xTCP.eTCPState = eCLOSE_WAIT;
3296 xSocket[ 6 ].u.xTCP.bits.bConnPrepared = pdTRUE_UNSIGNED;
3297 xSocket[ 6 ].u.xTCP.txStream = ( StreamBuffer_t * ) ucStream;
3298 xSocket[ 6 ].u.xTCP.rxStream = ( StreamBuffer_t * ) ucStream;
3299 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3300 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket[ 6 ] );
3301 uxStreamBufferGetSize_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0xAB );
3302 uxStreamBufferGetSpace_ExpectAndReturn( ( StreamBuffer_t * ) ucStream, 0xABCD );
3303
3304 /* Round 6. */
3305 xSocket[ 7 ].xSelectBits = eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE;
3306 xSocket[ 7 ].u.xTCP.eTCPState = eESTABLISHED;
3307 xSocket[ 7 ].u.xTCP.bits.bConnPrepared = pdTRUE_UNSIGNED;
3308 xSocket[ 7 ].u.xTCP.bits.bPassQueued = pdTRUE;
3309 xSocket[ 7 ].u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
3310 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3311 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket[ 7 ] );
3312
3313 /* Round 7. */
3314 xSocket[ 8 ].xSelectBits = eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE;
3315 xSocket[ 8 ].u.xTCP.eTCPState = eESTABLISHED;
3316 xSocket[ 8 ].u.xTCP.bits.bConnPrepared = pdTRUE_UNSIGNED;
3317 xSocket[ 8 ].u.xTCP.bits.bPassQueued = pdTRUE;
3318 xSocket[ 8 ].u.xTCP.bits.bReuseSocket = pdTRUE_UNSIGNED;
3319 xSocket[ 8 ].u.xTCP.bits.bPassAccept = pdTRUE_UNSIGNED;
3320 xSocket[ 8 ].u.xTCP.bits.bConnPassed = pdTRUE_UNSIGNED;
3321 listGET_NEXT_ExpectAndReturn( &xLocalListItem, &xLocalListItem );
3322 listGET_LIST_ITEM_OWNER_ExpectAndReturn( &xLocalListItem, &xSocket[ 8 ] );
3323
3324 /* Last item. */
3325 listGET_NEXT_ExpectAndReturn( &xLocalListItem, ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
3326
3327 xEventGroupClearBits_ExpectAndReturn( xSocketSet.xSelectGroup, 0, eSELECT_READ );
3328
3329 xEventGroupSetBits_ExpectAnyArgsAndReturn( pdPASS );
3330
3331 vSocketSelect( &xSocketSet );
3332
3333 TEST_ASSERT_EQUAL( 0, xSocket[ 0 ].xSocketBits );
3334 TEST_ASSERT_EQUAL( 0, xSocket[ 1 ].xSocketBits );
3335 TEST_ASSERT_EQUAL( eSELECT_EXCEPT, xSocket[ 2 ].xSocketBits );
3336 TEST_ASSERT_EQUAL( pdFALSE, xSocket[ 2 ].u.xTCP.bits.bConnPassed );
3337 TEST_ASSERT_EQUAL( 0, xSocket[ 3 ].xSocketBits );
3338 TEST_ASSERT_EQUAL( eSELECT_READ, xSocket[ 4 ].xSocketBits );
3339 TEST_ASSERT_EQUAL( eSELECT_WRITE, xSocket[ 5 ].xSocketBits );
3340 TEST_ASSERT_EQUAL( eSELECT_WRITE | eSELECT_READ | eSELECT_EXCEPT, xSocket[ 6 ].xSocketBits );
3341 TEST_ASSERT_EQUAL( eSELECT_WRITE, xSocket[ 7 ].xSocketBits );
3342 TEST_ASSERT_EQUAL( eSELECT_READ, xSocket[ 8 ].xSocketBits );
3343 }
3344
3345 /**
3346 * @brief Socket select function when no sockets are bound.
3347 */
test_vSocketSelect_NoSocketsAtAll(void)3348 void test_vSocketSelect_NoSocketsAtAll( void )
3349 {
3350 SocketSelect_t xSocketSet;
3351 ListItem_t xLocalListItem;
3352 uint8_t ucStream[ 20 ];
3353
3354 /* Last item. Nothing in UDP. */
3355 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundUDPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundUDPSocketsList.xListEnd ) );
3356
3357 /* Last item. Nothing in TCP. */
3358 listGET_NEXT_ExpectAndReturn( ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ), ( ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) );
3359
3360 xEventGroupClearBits_ExpectAndReturn( xSocketSet.xSelectGroup, 0, eSELECT_READ );
3361 xEventGroupClearBits_ExpectAnyArgsAndReturn( pdPASS );
3362 xEventGroupSetBits_ExpectAndReturn( xSocketSet.xSelectGroup, eSELECT_CALL_IP, pdPASS );
3363
3364 vSocketSelect( &xSocketSet );
3365 }
3366
3367 /**
3368 * @brief Signalling socket with invalid values given for socket.
3369 */
test_FreeRTOS_SignalSocket_InvalidSocket(void)3370 void test_FreeRTOS_SignalSocket_InvalidSocket( void )
3371 {
3372 BaseType_t xReturn;
3373 FreeRTOS_Socket_t xSocket;
3374
3375 memset( &xSocket, 0, sizeof( xSocket ) );
3376
3377 xReturn = FreeRTOS_SignalSocket( NULL );
3378 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
3379
3380 xReturn = FreeRTOS_SignalSocket( &xSocket );
3381 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
3382 }
3383
3384 /**
3385 * @brief Event group is present for the socket being signalled.
3386 */
test_FreeRTOS_SignalSocket_NonNULLEventGroup(void)3387 void test_FreeRTOS_SignalSocket_NonNULLEventGroup( void )
3388 {
3389 BaseType_t xReturn;
3390 FreeRTOS_Socket_t xSocket;
3391 SocketSelect_t xSocketSet;
3392 uint8_t xEventGroup[ sizeof( size_t ) ];
3393
3394 memset( &xSocket, 0, sizeof( xSocket ) );
3395 memset( &xSocketSet, 0, sizeof( xSocketSet ) );
3396
3397 xSocket.pxSocketSet = &xSocketSet;
3398 xSocket.xEventGroup = ( EventGroupHandle_t ) xEventGroup;
3399
3400 xEventGroupSetBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_INTR, pdFALSE );
3401
3402 xReturn = FreeRTOS_SignalSocket( &xSocket );
3403 TEST_ASSERT_EQUAL( 0, xReturn );
3404 }
3405
3406 /**
3407 * @brief Select group is present for the socket being called.
3408 */
test_FreeRTOS_SignalSocket_NonNULLSelectGroup(void)3409 void test_FreeRTOS_SignalSocket_NonNULLSelectGroup( void )
3410 {
3411 BaseType_t xReturn;
3412 FreeRTOS_Socket_t xSocket;
3413 SocketSelect_t xSocketSet;
3414 uint8_t xSelectGroup[ sizeof( size_t ) ];
3415
3416 memset( &xSocket, 0, sizeof( xSocket ) );
3417 memset( &xSocketSet, 0, sizeof( xSocketSet ) );
3418
3419 xSocket.pxSocketSet = &xSocketSet;
3420 xSocket.pxSocketSet->xSelectGroup = ( EventGroupHandle_t ) xSelectGroup;
3421
3422 xEventGroupSetBits_ExpectAndReturn( xSocket.pxSocketSet->xSelectGroup, eSELECT_INTR, pdFALSE );
3423
3424 xReturn = FreeRTOS_SignalSocket( &xSocket );
3425 TEST_ASSERT_EQUAL( 0, xReturn );
3426 }
3427
3428 /**
3429 * @brief Catch various asserts.
3430 */
test_FreeRTOS_SignalSocketFromISR_catchAsserts(void)3431 void test_FreeRTOS_SignalSocketFromISR_catchAsserts( void )
3432 {
3433 FreeRTOS_Socket_t xSocket;
3434 BaseType_t xHigherPriorityTaskWoken;
3435
3436 /* Socket cannot be NULL. */
3437 catch_assert( FreeRTOS_SignalSocketFromISR( NULL, &xHigherPriorityTaskWoken ) );
3438
3439 memset( &xSocket, 0, sizeof( xSocket ) );
3440 /* Socket must have TCP protocol. */
3441 catch_assert( FreeRTOS_SignalSocketFromISR( &xSocket, &xHigherPriorityTaskWoken ) );
3442
3443 memset( &xSocket, 0, sizeof( xSocket ) );
3444 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
3445 /* Event group must be non-NULL. */
3446 catch_assert( FreeRTOS_SignalSocketFromISR( &xSocket, &xHigherPriorityTaskWoken ) );
3447 }
3448
3449 /**
3450 * @brief happy path of the function.
3451 */
test_FreeRTOS_SignalSocketFromISR_HappyPath(void)3452 void test_FreeRTOS_SignalSocketFromISR_HappyPath( void )
3453 {
3454 BaseType_t xReturn;
3455 FreeRTOS_Socket_t xSocket;
3456 BaseType_t xHigherPriorityTaskWoken;
3457 uint8_t xEventGroup[ sizeof( size_t ) ];
3458
3459 memset( &xSocket, 0, sizeof( xSocket ) );
3460 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
3461 xSocket.xEventGroup = ( EventGroupHandle_t ) xEventGroup;
3462
3463 xQueueGenericSendFromISR_ExpectAnyArgsAndReturn( 0xABC );
3464
3465 xReturn = FreeRTOS_SignalSocketFromISR( &xSocket, &xHigherPriorityTaskWoken );
3466 TEST_ASSERT_EQUAL( 0xABC, xReturn );
3467 }
3468
3469 /**
3470 * @brief Get TCPv4 packets property string.
3471 */
test_prvSocketProps_TCPv4()3472 void test_prvSocketProps_TCPv4()
3473 {
3474 FreeRTOS_Socket_t xSocket;
3475 uint32_t ulExpectSrcIP = 0xC0A80101;
3476 uint32_t ulExpectRemoteIP = 0xC0A80102;
3477 uint16_t usSrcPort = 1024U;
3478 uint16_t usRemotePort = 2048U;
3479 const char * pcReturn;
3480
3481 memset( &xSocket, 0, sizeof( xSocket ) );
3482 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
3483 xSocket.bits.bIsIPv6 = pdFALSE;
3484 xSocket.xLocalAddress.ulIP_IPv4 = ulExpectSrcIP;
3485 xSocket.usLocalPort = usSrcPort;
3486 xSocket.u.xTCP.xRemoteIP.ulIP_IPv4 = ulExpectRemoteIP;
3487 xSocket.u.xTCP.usRemotePort = usRemotePort;
3488
3489 pcReturn = prvSocketProps( &xSocket );
3490 TEST_ASSERT_EQUAL_STRING( "c0a80101ip port 1024 to c0a80102ip port 2048", pcReturn );
3491 }
3492
3493 /**
3494 * @brief Get UDPv4 packets property string.
3495 */
test_prvSocketProps_UDPv4()3496 void test_prvSocketProps_UDPv4()
3497 {
3498 FreeRTOS_Socket_t xSocket;
3499 uint32_t ulExpectSrcIP = 0xC0A80101;
3500 const char * pcReturn;
3501
3502 memset( &xSocket, 0, sizeof( xSocket ) );
3503 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
3504 xSocket.bits.bIsIPv6 = pdFALSE;
3505 xSocket.xLocalAddress.ulIP_IPv4 = ulExpectSrcIP;
3506 xSocket.usLocalPort = 1024U;
3507
3508 pcReturn = prvSocketProps( &xSocket );
3509 TEST_ASSERT_EQUAL_STRING( "c0a80101ip port 1024", pcReturn );
3510 }
3511
3512 /**
3513 * @brief Get TCPv6 packets property string.
3514 */
test_prvSocketProps_TCPv6()3515 void test_prvSocketProps_TCPv6()
3516 {
3517 FreeRTOS_Socket_t xSocket;
3518 IPv6_Address_t * pxIPv6SrcAddress = &xIPv6Address; /* 2001::1 */
3519 IPv6_Address_t xIPv6RemoteAddress = { { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 } }; /* 2001::2 */
3520 uint16_t usSrcPort = 1024U;
3521 uint16_t usRemotePort = 2048U;
3522 const char * pcReturn;
3523
3524 memset( &xSocket, 0, sizeof( xSocket ) );
3525 xSocket.ucProtocol = FREERTOS_IPPROTO_TCP;
3526 xSocket.bits.bIsIPv6 = pdTRUE;
3527 memcpy( xSocket.xLocalAddress.xIP_IPv6.ucBytes, pxIPv6SrcAddress->ucBytes, ipSIZE_OF_IPv6_ADDRESS );
3528 xSocket.usLocalPort = usSrcPort;
3529 memcpy( xSocket.u.xTCP.xRemoteIP.xIP_IPv6.ucBytes, xIPv6RemoteAddress.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
3530 xSocket.u.xTCP.usRemotePort = usRemotePort;
3531
3532 pcReturn = prvSocketProps( &xSocket );
3533 }
3534
3535 /**
3536 * @brief Get UDPv6 packets property string.
3537 */
test_prvSocketProps_UDPv6()3538 void test_prvSocketProps_UDPv6()
3539 {
3540 FreeRTOS_Socket_t xSocket;
3541 IPv6_Address_t * pxIPv6SrcAddress = &xIPv6Address; /* 2001::1 */
3542 uint16_t usSrcPort = 1024U;
3543 const char * pcReturn;
3544
3545 memset( &xSocket, 0, sizeof( xSocket ) );
3546 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP;
3547 xSocket.bits.bIsIPv6 = pdTRUE;
3548 memcpy( xSocket.xLocalAddress.xIP_IPv6.ucBytes, pxIPv6SrcAddress->ucBytes, ipSIZE_OF_IPv6_ADDRESS );
3549 xSocket.usLocalPort = usSrcPort;
3550
3551 pcReturn = prvSocketProps( &xSocket );
3552 }
3553
3554 /**
3555 * @brief Get packets property string with unknown protocol.
3556 */
test_prvSocketProps_UnknownProtocol()3557 void test_prvSocketProps_UnknownProtocol()
3558 {
3559 FreeRTOS_Socket_t xSocket;
3560 IPv6_Address_t * pxIPv6SrcAddress = &xIPv6Address; /* 2001::1 */
3561 uint16_t usSrcPort = 1024U;
3562 const char * pcReturn;
3563
3564 memset( &xSocket, 0, sizeof( xSocket ) );
3565 xSocket.ucProtocol = FREERTOS_IPPROTO_UDP + 1;
3566 xSocket.bits.bIsIPv6 = pdTRUE;
3567 memcpy( xSocket.xLocalAddress.xIP_IPv6.ucBytes, pxIPv6SrcAddress->ucBytes, ipSIZE_OF_IPv6_ADDRESS );
3568 xSocket.usLocalPort = usSrcPort;
3569
3570 pcReturn = prvSocketProps( &xSocket );
3571 }
3572
3573 /**
3574 * @brief Happy path of this function for IPv4.
3575 */
test_FreeRTOS_inet_ntop_IPv4(void)3576 void test_FreeRTOS_inet_ntop_IPv4( void )
3577 {
3578 const char * pcReturn;
3579 uint32_t ulIPAddress = 0x10101010; /* 16.16.16.16 */
3580 char * pcExpectResult = "16.16.16.16";
3581 const size_t xSize = 16;
3582 char cDestination[ xSize ];
3583 BaseType_t xAddressFamily = FREERTOS_AF_INET4;
3584
3585 memset( cDestination, 0, sizeof( cDestination ) );
3586
3587 FreeRTOS_inet_ntop4_ExpectAndReturn( &ulIPAddress, cDestination, xSize, cDestination );
3588 FreeRTOS_inet_ntop4_ReturnMemThruPtr_pcDestination( pcExpectResult, strlen( pcExpectResult ) );
3589 pcReturn = FreeRTOS_inet_ntop( xAddressFamily, &ulIPAddress, cDestination, xSize );
3590
3591 TEST_ASSERT_EQUAL_STRING( pcExpectResult, pcReturn );
3592 }
3593
3594 /**
3595 * @brief Happy path of this function for IPv4.
3596 */
test_FreeRTOS_inet_ntop_IPv6(void)3597 void test_FreeRTOS_inet_ntop_IPv6( void )
3598 {
3599 const char * pcReturn;
3600 IPv6_Address_t * pxIPAddress = &xIPv6Address;
3601 char * pcExpectResult = "2001::1";
3602 const size_t xSize = 16;
3603 char cDestination[ xSize ];
3604 BaseType_t xAddressFamily = FREERTOS_AF_INET6;
3605
3606 memset( cDestination, 0, sizeof( cDestination ) );
3607
3608 FreeRTOS_inet_ntop6_ExpectAndReturn( pxIPAddress, cDestination, xSize, cDestination );
3609 FreeRTOS_inet_ntop6_ReturnMemThruPtr_pcDestination( pcExpectResult, strlen( pcExpectResult ) );
3610 pcReturn = FreeRTOS_inet_ntop( xAddressFamily, pxIPAddress, cDestination, xSize );
3611
3612 TEST_ASSERT_EQUAL_STRING( pcExpectResult, pcReturn );
3613 }
3614
3615 /**
3616 * @brief Happy path of this function for unknown family.
3617 */
test_FreeRTOS_inet_ntop_Unknown(void)3618 void test_FreeRTOS_inet_ntop_Unknown( void )
3619 {
3620 const char * pcReturn;
3621 uint32_t ulIPAddress = 0x10101010; /* 16.16.16.16 */
3622 char * pcExpectResult = "16.16.16.16";
3623 const size_t xSize = 16;
3624 char cDestination[ xSize ];
3625 BaseType_t xAddressFamily = FREERTOS_AF_INET6 + 1;
3626
3627 memset( cDestination, 0, sizeof( cDestination ) );
3628
3629 pcReturn = FreeRTOS_inet_ntop( xAddressFamily, &ulIPAddress, cDestination, xSize );
3630
3631 TEST_ASSERT_EQUAL( NULL, pcReturn );
3632 }
3633
3634 /**
3635 * @brief Query socket type of IPv4 socket.
3636 */
test_FreeRTOS_GetIPType_IPv4HappyPath(void)3637 void test_FreeRTOS_GetIPType_IPv4HappyPath( void )
3638 {
3639 BaseType_t xReturn;
3640 FreeRTOS_Socket_t xSocket;
3641
3642 memset( &xSocket, 0, sizeof( xSocket ) );
3643
3644 xSocket.bits.bIsIPv6 = pdFALSE_UNSIGNED;
3645
3646 xReturn = FreeRTOS_GetIPType( &xSocket );
3647
3648 TEST_ASSERT_EQUAL( ipTYPE_IPv4, xReturn );
3649 }
3650
3651 /**
3652 * @brief Query socket type of IPv6 socket.
3653 */
test_FreeRTOS_GetIPType_IPv6HappyPath(void)3654 void test_FreeRTOS_GetIPType_IPv6HappyPath( void )
3655 {
3656 BaseType_t xReturn;
3657 FreeRTOS_Socket_t xSocket;
3658
3659 memset( &xSocket, 0, sizeof( xSocket ) );
3660
3661 xSocket.bits.bIsIPv6 = pdTRUE_UNSIGNED;
3662
3663 xReturn = FreeRTOS_GetIPType( &xSocket );
3664
3665 TEST_ASSERT_EQUAL( ipTYPE_IPv6, xReturn );
3666 }
3667