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_FreeRTOS_Sockets.h"
38
39 #include "catch_assert.h"
40
41 #include "FreeRTOSIPConfig.h"
42 #include "FreeRTOS_IPv4_Sockets.h"
43 #include "FreeRTOS_IPv4_Sockets_stubs.c"
44
45 /* ============================ Unity Fixtures ============================ */
46
setUp(void)47 void setUp( void )
48 {
49 setUpStub();
50 }
51
52 /* ============================== Test Cases ============================== */
53
54 /**
55 * @brief Test for FreeRTOS_inet_pton4 function.
56 */
test_FreeRTOS_inet_pton4(void)57 void test_FreeRTOS_inet_pton4( void )
58 {
59 char * pucValidString1 = "192.68.1.1";
60 uint32_t ulValidResponse1 = 0x010144C0;
61 char * pucValidString2 = "192.0.1.1";
62 uint32_t ulValidResponse2 = 0x010100C0;
63 char * pucValidString3 = "192.68.1.0";
64 uint32_t ulValidResponse3 = 0x000144C0;
65 char * pucValidString4 = "0.0.0.0";
66 uint32_t ulValidResponse4 = 0x00000000;
67 char * pucValidString5 = "0.68.1.1";
68 uint32_t ulValidResponse5 = 0x01014400;
69
70 char * pucInvalidString1 = "0192.68.1.1";
71 char * pucInvalidString2 = "192.68.00.1";
72 char * pucInvalidString3 = "192.00.1.1";
73 char * pucInvalidString4 = "freertos.com";
74 char * pucInvalidString5 = "192.freertos.com";
75 char * pucInvalidString6 = "\0";
76 char * pucInvalidString7 = "1234.68.1.1";
77 char * pucInvalidString8 = "123.68.0a.1";
78 uint32_t ulInValidResponse = 0x00;
79
80 BaseType_t xResult;
81 uint32_t ulIPAddress;
82
83 ulIPAddress = 0xABABABAB;
84 xResult = FreeRTOS_inet_pton4( pucValidString1, &ulIPAddress );
85 TEST_ASSERT_EQUAL( pdPASS, xResult );
86 TEST_ASSERT_EQUAL_MESSAGE( ulValidResponse1, ulIPAddress, "Could not convert string 1 correctly." );
87
88 ulIPAddress = 0xABABABAB;
89 xResult = FreeRTOS_inet_pton4( pucValidString2, &ulIPAddress );
90 TEST_ASSERT_EQUAL( pdPASS, xResult );
91 TEST_ASSERT_EQUAL_MESSAGE( ulValidResponse2, ulIPAddress, "Could not convert string 2 correctly." );
92
93 ulIPAddress = 0xABABABAB;
94 xResult = FreeRTOS_inet_pton4( pucValidString3, &ulIPAddress );
95 TEST_ASSERT_EQUAL( pdPASS, xResult );
96 TEST_ASSERT_EQUAL_MESSAGE( ulValidResponse3, ulIPAddress, "Could not convert string 3 correctly." );
97
98 ulIPAddress = 0xABABABAB;
99 xResult = FreeRTOS_inet_pton4( pucValidString4, &ulIPAddress );
100 TEST_ASSERT_EQUAL( pdPASS, xResult );
101 TEST_ASSERT_EQUAL_MESSAGE( ulValidResponse4, ulIPAddress, "Could not convert string 4 correctly." );
102
103 ulIPAddress = 0xABABABAB;
104 xResult = FreeRTOS_inet_pton4( pucValidString5, &ulIPAddress );
105 TEST_ASSERT_EQUAL( pdPASS, xResult );
106 TEST_ASSERT_EQUAL_MESSAGE( ulValidResponse5, ulIPAddress, "Could not convert string 5 correctly." );
107
108 /* Invalid test cases. */
109 ulIPAddress = 0xABABABAB;
110 xResult = FreeRTOS_inet_pton4( pucInvalidString1, &ulIPAddress );
111 TEST_ASSERT_EQUAL( pdFAIL, xResult );
112 TEST_ASSERT_EQUAL_MESSAGE( ulInValidResponse, ulIPAddress, "Incorrectly converted string 1." );
113
114 ulIPAddress = 0xABABABAB;
115 xResult = FreeRTOS_inet_pton4( pucInvalidString2, &ulIPAddress );
116 TEST_ASSERT_EQUAL( pdFAIL, xResult );
117 TEST_ASSERT_EQUAL_MESSAGE( ulInValidResponse, ulIPAddress, "Incorrectly converted string 2." );
118
119 ulIPAddress = 0xABABABAB;
120 xResult = FreeRTOS_inet_pton4( pucInvalidString3, &ulIPAddress );
121 TEST_ASSERT_EQUAL( pdFAIL, xResult );
122 TEST_ASSERT_EQUAL_MESSAGE( ulInValidResponse, ulIPAddress, "Incorrectly converted string 3." );
123
124 ulIPAddress = 0xABABABAB;
125 xResult = FreeRTOS_inet_pton4( pucInvalidString4, &ulIPAddress );
126 TEST_ASSERT_EQUAL( pdFAIL, xResult );
127 TEST_ASSERT_EQUAL_MESSAGE( ulInValidResponse, ulIPAddress, "Incorrectly converted string 4." );
128
129 ulIPAddress = 0xABABABAB;
130 xResult = FreeRTOS_inet_pton4( pucInvalidString5, &ulIPAddress );
131 TEST_ASSERT_EQUAL( pdFAIL, xResult );
132 TEST_ASSERT_EQUAL_MESSAGE( ulInValidResponse, ulIPAddress, "Incorrectly converted string 5." );
133
134 ulIPAddress = 0xABABABAB;
135 xResult = FreeRTOS_inet_pton4( pucInvalidString6, &ulIPAddress );
136 TEST_ASSERT_EQUAL( pdFAIL, xResult );
137 TEST_ASSERT_EQUAL_MESSAGE( ulInValidResponse, ulIPAddress, "Incorrectly converted string 6." );
138
139 ulIPAddress = 0xABABABAB;
140 xResult = FreeRTOS_inet_pton4( pucInvalidString7, &ulIPAddress );
141 TEST_ASSERT_EQUAL( pdFAIL, xResult );
142 TEST_ASSERT_EQUAL_MESSAGE( ulInValidResponse, ulIPAddress, "Incorrectly converted string 7." );
143
144 ulIPAddress = 0xABABABAB;
145 xResult = FreeRTOS_inet_pton4( pucInvalidString8, &ulIPAddress );
146 TEST_ASSERT_EQUAL( pdFAIL, xResult );
147 TEST_ASSERT_EQUAL_MESSAGE( ulInValidResponse, ulIPAddress, "Incorrectly converted string 8." );
148 }
149
150 /**
151 * @brief Less size of the string being passed to the function.
152 */
test_FreeRTOS_inet_ntop4_LessBufferLength(void)153 void test_FreeRTOS_inet_ntop4_LessBufferLength( void )
154 {
155 char * pucReturn;
156 uint32_t ulSource = 0x12345678U;
157 const socklen_t uxSize = 15;
158 char pcDestination[ uxSize ];
159
160 pucReturn = ( char * ) FreeRTOS_inet_ntop4( &ulSource, pcDestination, uxSize );
161
162 TEST_ASSERT_EQUAL( NULL, pucReturn );
163 }
164
165 /**
166 * @brief Happy path.
167 */
test_FreeRTOS_inet_ntop4_HappyCase(void)168 void test_FreeRTOS_inet_ntop4_HappyCase( void )
169 {
170 const char * pucReturn;
171 uint32_t ulSource;
172 const socklen_t uxSize = 16;
173 char pcDestination[ uxSize ];
174
175 ulSource = 0xFFFFFFFF;
176 prvSetString_FreeRTOS_inet_ntoa( "255.255.255.255" );
177 FreeRTOS_inet_ntoa_Stub( pucStub_FreeRTOS_inet_ntoa );
178 pucReturn = FreeRTOS_inet_ntop4( &ulSource, pcDestination, uxSize );
179
180 TEST_ASSERT_EQUAL_STRING( "255.255.255.255", pcDestination );
181
182 ulSource = 0;
183 prvSetString_FreeRTOS_inet_ntoa( "0.0.0.0" );
184 FreeRTOS_inet_ntoa_Stub( pucStub_FreeRTOS_inet_ntoa );
185 pucReturn = FreeRTOS_inet_ntop4( &ulSource, pcDestination, uxSize );
186
187 TEST_ASSERT_EQUAL_STRING( "0.0.0.0", pcDestination );
188
189 ulSource = 0xABCDEF12;
190 prvSetString_FreeRTOS_inet_ntoa( "18.239.205.171" );
191 FreeRTOS_inet_ntoa_Stub( pucStub_FreeRTOS_inet_ntoa );
192 pucReturn = FreeRTOS_inet_ntop4( &ulSource, pcDestination, uxSize );
193
194 TEST_ASSERT_EQUAL_STRING( "18.239.205.171", pcDestination );
195 }
196
197 /**
198 * @brief Happy path.
199 */
test_xSend_UDP_Update_IPv4_HappyCase(void)200 void test_xSend_UDP_Update_IPv4_HappyCase( void )
201 {
202 void * pxReturn;
203 NetworkBufferDescriptor_t xNetworkBuffer;
204 uint8_t pucEthBuffer[ ipconfigTCP_MSS ];
205 struct freertos_sockaddr xDestinationAddress;
206 uint32_t ulExpectIP = 0x12345678;
207 UDPPacket_t * pxUDPPacket;
208
209 memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
210 memset( pucEthBuffer, 0, sizeof( pucEthBuffer ) );
211 memset( &xDestinationAddress, 0, sizeof( xDestinationAddress ) );
212
213 xNetworkBuffer.pucEthernetBuffer = pucEthBuffer;
214
215 pxUDPPacket = ( UDPPacket_t * ) xNetworkBuffer.pucEthernetBuffer;
216
217 xDestinationAddress.sin_address.ulIP_IPv4 = ulExpectIP;
218
219 pxReturn = xSend_UDP_Update_IPv4( &xNetworkBuffer, &xDestinationAddress );
220
221 TEST_ASSERT_EQUAL( ulExpectIP, xNetworkBuffer.xIPAddress.ulIP_IPv4 );
222 TEST_ASSERT_EQUAL( ipIPv4_FRAME_TYPE, pxUDPPacket->xEthernetHeader.usFrameType );
223 }
224
225 /**
226 * @brief NULL network buffer pointer.
227 */
test_xSend_UDP_Update_IPv4_NullNetworkBuffer(void)228 void test_xSend_UDP_Update_IPv4_NullNetworkBuffer( void )
229 {
230 void * pxReturn;
231 NetworkBufferDescriptor_t xNetworkBuffer;
232 uint8_t pucEthBuffer[ ipconfigTCP_MSS ];
233 struct freertos_sockaddr xDestinationAddress;
234 uint32_t ulExpectIP = 0x12345678;
235 UDPPacket_t * pxUDPPacket;
236
237 memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
238 memset( pucEthBuffer, 0, sizeof( pucEthBuffer ) );
239 memset( &xDestinationAddress, 0, sizeof( xDestinationAddress ) );
240
241 xNetworkBuffer.pucEthernetBuffer = pucEthBuffer;
242
243 pxUDPPacket = ( UDPPacket_t * ) xNetworkBuffer.pucEthernetBuffer;
244
245 xDestinationAddress.sin_address.ulIP_IPv4 = ulExpectIP;
246
247 pxReturn = xSend_UDP_Update_IPv4( NULL, &xDestinationAddress );
248
249 TEST_ASSERT_EQUAL( 0, xNetworkBuffer.xIPAddress.ulIP_IPv4 );
250 TEST_ASSERT_EQUAL( 0, pxUDPPacket->xEthernetHeader.usFrameType );
251 }
252
253 /**
254 * @brief NULL destination address pointer.
255 */
test_xSend_UDP_Update_IPv4_NullDestinationAddress(void)256 void test_xSend_UDP_Update_IPv4_NullDestinationAddress( void )
257 {
258 void * pxReturn;
259 NetworkBufferDescriptor_t xNetworkBuffer;
260 uint8_t pucEthBuffer[ ipconfigTCP_MSS ];
261 struct freertos_sockaddr xDestinationAddress;
262 uint32_t ulExpectIP = 0x12345678;
263 UDPPacket_t * pxUDPPacket;
264
265 memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
266 memset( pucEthBuffer, 0, sizeof( pucEthBuffer ) );
267 memset( &xDestinationAddress, 0, sizeof( xDestinationAddress ) );
268
269 xNetworkBuffer.pucEthernetBuffer = pucEthBuffer;
270
271 pxUDPPacket = ( UDPPacket_t * ) xNetworkBuffer.pucEthernetBuffer;
272
273 xDestinationAddress.sin_address.ulIP_IPv4 = ulExpectIP;
274
275 pxReturn = xSend_UDP_Update_IPv4( &xNetworkBuffer, NULL );
276
277 TEST_ASSERT_EQUAL( 0, xNetworkBuffer.xIPAddress.ulIP_IPv4 );
278 TEST_ASSERT_EQUAL( 0, pxUDPPacket->xEthernetHeader.usFrameType );
279 }
280
281 /**
282 * @brief Happy path.
283 */
test_xRecv_Update_IPv4_HappyCase(void)284 void test_xRecv_Update_IPv4_HappyCase( void )
285 {
286 size_t xReturn;
287 NetworkBufferDescriptor_t xNetworkBuffer;
288 uint8_t pucEthBuffer[ ipconfigTCP_MSS ];
289 struct freertos_sockaddr xSrcAddress;
290 uint32_t ulExpectIP = 0x12345678;
291 uint16_t usExpectPort = 0xABCD;
292
293 memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
294 memset( pucEthBuffer, 0, sizeof( pucEthBuffer ) );
295 memset( &xSrcAddress, 0, sizeof( xSrcAddress ) );
296
297 xNetworkBuffer.pucEthernetBuffer = pucEthBuffer;
298 xNetworkBuffer.usPort = usExpectPort;
299 xNetworkBuffer.xIPAddress.ulIP_IPv4 = ulExpectIP;
300
301 xReturn = xRecv_Update_IPv4( &xNetworkBuffer, &xSrcAddress );
302
303 TEST_ASSERT_EQUAL( ipUDP_PAYLOAD_OFFSET_IPv4, xReturn );
304 TEST_ASSERT_EQUAL( FREERTOS_AF_INET, xSrcAddress.sin_family );
305 TEST_ASSERT_EQUAL( ulExpectIP, xSrcAddress.sin_address.ulIP_IPv4 );
306 TEST_ASSERT_EQUAL( usExpectPort, xSrcAddress.sin_port );
307 }
308
309 /**
310 * @brief NULL network buffer pointer.
311 */
test_xRecv_Update_IPv4_NullNetworkBuffer(void)312 void test_xRecv_Update_IPv4_NullNetworkBuffer( void )
313 {
314 size_t xReturn;
315 NetworkBufferDescriptor_t xNetworkBuffer;
316 uint8_t pucEthBuffer[ ipconfigTCP_MSS ];
317 struct freertos_sockaddr xSrcAddress;
318 uint32_t ulExpectIP = 0x12345678;
319 uint16_t usExpectPort = 0xABCD;
320
321 memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
322 memset( pucEthBuffer, 0, sizeof( pucEthBuffer ) );
323 memset( &xSrcAddress, 0, sizeof( xSrcAddress ) );
324
325 xNetworkBuffer.pucEthernetBuffer = pucEthBuffer;
326 xNetworkBuffer.usPort = usExpectPort;
327 xNetworkBuffer.xIPAddress.ulIP_IPv4 = ulExpectIP;
328
329 xReturn = xRecv_Update_IPv4( NULL, &xSrcAddress );
330
331 TEST_ASSERT_EQUAL( ipUDP_PAYLOAD_OFFSET_IPv4, xReturn );
332 }
333
334 /**
335 * @brief NULL destination address pointer.
336 */
test_xRecv_Update_IPv4_NullDestinationAddress(void)337 void test_xRecv_Update_IPv4_NullDestinationAddress( void )
338 {
339 size_t xReturn;
340 NetworkBufferDescriptor_t xNetworkBuffer;
341 uint8_t pucEthBuffer[ ipconfigTCP_MSS ];
342 struct freertos_sockaddr xSrcAddress;
343 uint32_t ulExpectIP = 0x12345678;
344 uint16_t usExpectPort = 0xABCD;
345
346 memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
347 memset( pucEthBuffer, 0, sizeof( pucEthBuffer ) );
348 memset( &xSrcAddress, 0, sizeof( xSrcAddress ) );
349
350 xNetworkBuffer.pucEthernetBuffer = pucEthBuffer;
351 xNetworkBuffer.usPort = usExpectPort;
352 xNetworkBuffer.xIPAddress.ulIP_IPv4 = ulExpectIP;
353
354 xReturn = xRecv_Update_IPv4( &xNetworkBuffer, NULL );
355
356 TEST_ASSERT_EQUAL( ipUDP_PAYLOAD_OFFSET_IPv4, xReturn );
357 }
358