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