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 /* Include Unity header */
28 #include "unity.h"
29
30 /* Include standard libraries */
31 #include <stdlib.h>
32 #include <string.h>
33 #include <stdint.h>
34
35 #include "mock_FreeRTOS_IP.h"
36 #include "mock_FreeRTOS_Routing.h"
37 #include "mock_FreeRTOS_Sockets.h"
38 #include "mock_FreeRTOS_IP_Private.h"
39 #include "mock_FreeRTOS_DNS_Networking.h"
40 #include "mock_task.h"
41 #include "mock_list.h"
42 #include "mock_queue.h"
43
44 #include "mock_FreeRTOS_DNS_Callback.h"
45 #include "mock_FreeRTOS_DNS_Cache.h"
46 #include "mock_FreeRTOS_DNS_Parser.h"
47 #include "mock_FreeRTOS_DNS_Networking.h"
48 #include "mock_NetworkBufferManagement.h"
49 #include "FreeRTOS_DNS.h"
50
51
52 #include "catch_assert.h"
53
54 #include "FreeRTOSIPConfig.h"
55 #include "FreeRTOS_DNS_stubs.c"
56
57 /* =========================== EXTERN VARIABLES =========================== */
58
59 #define LLMNR_ADDRESS "freertos"
60 #define LOCAL_ADDRESS "freertos.local"
61 #define GOOD_ADDRESS "www.freertos.org"
62 #define BAD_ADDRESS "this is a bad address"
63 #define DOTTED_IPV4_ADDRESS "192.168.0.1"
64 #define DOTTED_IPV4_ADDRESS_UINT32 ( 0x0100A8C0 )
65 #define DOTTED_IPv6_ADDRESS "2001::1"
66
67 IPv6_Address_t xIPv6Address = { { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } };
68
69 typedef void (* FOnDNSEvent ) ( const char * /* pcName */,
70 void * /* pvSearchID */,
71 struct freertos_addrinfo * /* pxAddressInfo */ );
72
73 extern IPPreference_t xDNS_IP_Preference;
74
75 /* ============================ Unity Fixtures ============================ */
76
77 /**
78 * @brief calls at the beginning of each test case
79 */
setUp(void)80 void setUp( void )
81 {
82 xDNS_IP_Preference = xPreferenceIPv4;
83 callback_called = 0;
84 isMallocFail = false;
85 }
86
87 /* ============================== Test Cases ============================== */
88
89 /**
90 * @brief Ensures all corresponding initialisation modules are called
91 */
test_vDNSInitialise(void)92 void test_vDNSInitialise( void )
93 {
94 vDNSCallbackInitialise_Expect();
95 vDNSInitialise();
96 }
97
98 /**
99 * @brief Ensures when a network buffer cannot be allocated a zero is returned
100 */
test_FreeRTOS_gethostbyname_FailAllocateNetworkBuffer(void)101 void test_FreeRTOS_gethostbyname_FailAllocateNetworkBuffer( void )
102 {
103 uint32_t ret;
104 NetworkEndPoint_t xEndPoint = { 0 };
105 struct xSOCKET xDNSSocket;
106
107 xEndPoint.bits.bIPv6 = 0;
108 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = 0xC0C0C0C0;
109 xEndPoint.ipv4_settings.ucDNSIndex = 0;
110 xDNSSocket.usLocalPort = 0;
111
112 DNS_BindSocket_IgnoreAndReturn( 0 );
113
114 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
115 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 0 );
116 xApplicationGetRandomNumber_IgnoreAndReturn( pdTRUE );
117
118 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
119 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
120 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
121
122 /* in prvGetHostByName */
123 /* in prvGetPayloadBuffer */
124
125 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( NULL );
126 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( NULL );
127 DNS_CloseSocket_ExpectAnyArgs();
128
129 ret = FreeRTOS_gethostbyname( GOOD_ADDRESS );
130
131 TEST_ASSERT_EQUAL( 0, ret );
132 }
133
134 /**
135 * @brief ensure that when a NULL address is received a zero is returned
136 */
test_FreeRTOS_gethostbyname_FailNullAddress(void)137 void test_FreeRTOS_gethostbyname_FailNullAddress( void )
138 {
139 uint32_t ret;
140
141 ret = FreeRTOS_gethostbyname( NULL );
142 TEST_ASSERT_EQUAL( 0, ret );
143 }
144
145 /**
146 * @brief ensure that when the function receives a long (longer than
147 * ipconfigDNS_CACHE_NAME_LENGTH ) hostname, a zero is returned
148 */
test_FreeRTOS_gethostbyname_FailLongAddress(void)149 void test_FreeRTOS_gethostbyname_FailLongAddress( void )
150 {
151 uint32_t ret;
152 char address[ ipconfigDNS_CACHE_NAME_LENGTH + 3 ];
153
154 memset( address, 'a', ipconfigDNS_CACHE_NAME_LENGTH );
155 address[ ipconfigDNS_CACHE_NAME_LENGTH + 3 ] = '\0';
156
157
158 ret = FreeRTOS_gethostbyname( address );
159 TEST_ASSERT_EQUAL( 0, ret );
160 }
161
162 /**
163 * @brief Ensures that when the supplied address is in the dotted format, it is
164 * translated to the numerical form and no lookup is performed
165 */
test_FreeRTOS_gethostbyname_SuccessDotAddress(void)166 void test_FreeRTOS_gethostbyname_SuccessDotAddress( void )
167 {
168 uint32_t ret;
169
170 FreeRTOS_inet_addr_ExpectAndReturn( DOTTED_IPV4_ADDRESS, 12345 );
171
172 xApplicationGetRandomNumber_IgnoreAndReturn( pdTRUE );
173 ulChar2u32_IgnoreAndReturn( 12345 );
174 ret = FreeRTOS_gethostbyname( DOTTED_IPV4_ADDRESS );
175 TEST_ASSERT_EQUAL( 12345, ret );
176 }
177
178 /**
179 * @brief Ensures that if the address is not in the dotted form and found in the cache,
180 * it is returned to the caller
181 */
test_FreeRTOS_gethostbyname_SuccessAddressInCache(void)182 void test_FreeRTOS_gethostbyname_SuccessAddressInCache( void )
183 {
184 uint32_t ret;
185
186 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
187 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 12345 );
188
189 ret = FreeRTOS_gethostbyname( GOOD_ADDRESS );
190 TEST_ASSERT_EQUAL( 12345, ret );
191 }
192
193
194 /**
195 * @brief Ensures that the code can handle when the client can't create a socket
196 */
test_FreeRTOS_gethostbyname_FailNullSocket(void)197 void test_FreeRTOS_gethostbyname_FailNullSocket( void )
198 {
199 uint32_t ret;
200 NetworkBufferDescriptor_t xNetworkBuffer;
201 uint32_t ulNumber = 0;
202
203 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
204 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 0 );
205 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
206 xApplicationGetRandomNumber_ReturnThruPtr_pulNumber( &ulNumber );
207
208 DNS_CreateSocket_ExpectAnyArgsAndReturn( NULL );
209
210 ret = FreeRTOS_gethostbyname( GOOD_ADDRESS );
211 TEST_ASSERT_EQUAL( 0, ret );
212 }
213
214 /**
215 * @brief Ensures that when the dns request fails the function returns zero to
216 * the caller
217 */
test_FreeRTOS_gethostbyname_FailSendDNSRequest(void)218 void test_FreeRTOS_gethostbyname_FailSendDNSRequest( void )
219 {
220 int i;
221 uint32_t ret;
222 uint32_t ulNumber = 0;
223 NetworkBufferDescriptor_t xNetworkBuffer;
224 NetworkEndPoint_t xEndPoint = { 0 };
225 struct xSOCKET xDNSSocket;
226
227 xEndPoint.bits.bIPv6 = 0;
228 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = 0xC0C0C0C0;
229 xEndPoint.ipv4_settings.ucDNSIndex = 0;
230 xNetworkBuffer.xDataLength = 2280;
231 xDNSSocket.usLocalPort = 0;
232
233 xNetworkBuffer.pucEthernetBuffer = malloc( 2280 + ipBUFFER_PADDING );
234 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
235
236 DNS_BindSocket_IgnoreAndReturn( 0 );
237 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
238 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 0 );
239 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
240 xApplicationGetRandomNumber_ReturnThruPtr_pulNumber( &ulNumber );
241
242 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
243
244 /* prvGetHostByNameOp */
245 for( i = 0; i < ipconfigDNS_REQUEST_ATTEMPTS; i++ )
246 {
247 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
248 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
249
250 /* in prvGetHostByName */
251 /* in prvGetPayloadBuffer */
252 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
253 /* back in prvGetHostByName */
254 /* prvFillSockAddress */
255 /* back prvGetHostByNameOp */
256 DNS_SendRequest_ExpectAnyArgsAndReturn( pdFAIL );
257 vReleaseNetworkBufferAndDescriptor_ExpectAnyArgs();
258 }
259
260 /* back in prvGetHostByName */
261 DNS_CloseSocket_ExpectAnyArgs();
262
263 ret = FreeRTOS_gethostbyname( GOOD_ADDRESS );
264 TEST_ASSERT_EQUAL( 0, ret );
265
266 xNetworkBuffer.pucEthernetBuffer -= ipBUFFER_PADDING;
267 free( xNetworkBuffer.pucEthernetBuffer );
268 }
269
270 /**
271 * @brief Ensures when reading the dns reply fails, the test would try the set
272 * number of times, and return zero to the caller
273 */
test_FreeRTOS_gethostbyname_FailReadDNSReplyNull(void)274 void test_FreeRTOS_gethostbyname_FailReadDNSReplyNull( void )
275 {
276 uint32_t ret;
277 int i;
278 NetworkBufferDescriptor_t xNetworkBuffer;
279 struct xDNSBuffer xReceiveBuffer;
280 NetworkEndPoint_t xEndPoint = { 0 };
281 struct xSOCKET xDNSSocket;
282
283 xEndPoint.bits.bIPv6 = 0;
284 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = 0xC0C0C0C0;
285 xEndPoint.ipv4_settings.ucDNSIndex = 0;
286 xReceiveBuffer.pucPayloadBuffer = NULL;
287 xReceiveBuffer.uxPayloadLength = 0;
288 xNetworkBuffer.xDataLength = 2280;
289 xNetworkBuffer.pucEthernetBuffer = malloc( 2280 + ipBUFFER_PADDING );
290 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
291 xDNSSocket.usLocalPort = 0;
292
293 DNS_BindSocket_IgnoreAndReturn( 0 );
294 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
295 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
296 FreeRTOS_inet_addr_ExpectAndReturn( LLMNR_ADDRESS, 0 );
297 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 0 );
298 xApplicationGetRandomNumber_IgnoreAndReturn( pdTRUE );
299 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
300
301 /* prvGetHostByNameOp */
302 /* prvFillSockAddress */
303 for( i = 0; i < ipconfigDNS_REQUEST_ATTEMPTS; i++ )
304 {
305 /* in prvGetHostByName */
306 /* in prvGetPayloadBuffer */
307 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
308 /* back in prvGetHostByName */
309 /* back prvGetHostByNameOp */
310 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
311
312 DNS_ReadReply_ExpectAnyArgsAndReturn( 0 );
313 DNS_ReadReply_ReturnThruPtr_pxReceiveBuffer( &xReceiveBuffer );
314 }
315
316 /* back in prvGetHostByName */
317 DNS_CloseSocket_ExpectAnyArgs();
318
319 ret = FreeRTOS_gethostbyname( LLMNR_ADDRESS );
320 TEST_ASSERT_EQUAL( 0, ret );
321
322 xNetworkBuffer.pucEthernetBuffer -= ipBUFFER_PADDING;
323 free( xNetworkBuffer.pucEthernetBuffer );
324 }
325
326 /**
327 * @brief Ensure that a bad parse of a DNS packet causes the return to be zero
328 */
test_FreeRTOS_gethostbyname_FailSendDNSReplyZero(void)329 void test_FreeRTOS_gethostbyname_FailSendDNSReplyZero( void )
330 {
331 int i;
332 uint32_t ret;
333 NetworkBufferDescriptor_t xNetworkBuffer;
334 struct xDNSBuffer xReceiveBuffer;
335 uint32_t ulNumber = 0;
336 NetworkEndPoint_t xEndPoint = { 0 };
337 struct xSOCKET xDNSSocket;
338 uint8_t pucPayloadBuffer_Arr[ 300 ];
339
340 uint8_t buffer[ 2280 + ipBUFFER_PADDING ];
341
342 xEndPoint.bits.bIPv6 = 0;
343 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = 0xC0C0C0C0;
344 xEndPoint.ipv4_settings.ucDNSIndex = 0;
345 xReceiveBuffer.pucPayloadBuffer = pucPayloadBuffer_Arr;
346 xReceiveBuffer.uxPayloadLength = 300;
347 memset( xReceiveBuffer.pucPayloadBuffer, 0x00, 300 );
348 DNSMessage_t * header = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
349
350 header->usIdentifier = 0;
351
352 xNetworkBuffer.xDataLength = 2280;
353 xNetworkBuffer.pucEthernetBuffer = buffer;
354 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
355 xNetworkBuffer.pxEndPoint = &xEndPoint;
356 xDNSSocket.usLocalPort = 0;
357
358 DNS_BindSocket_IgnoreAndReturn( 0 );
359 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
360 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
361 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
362 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 0 );
363 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
364 xApplicationGetRandomNumber_ReturnThruPtr_pulNumber( &ulNumber );
365 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
366
367 /* prvGetHostByNameOp */
368 /* prvFillSockAddress */
369 for( i = 0; i < ipconfigDNS_REQUEST_ATTEMPTS; i++ )
370 {
371 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
372 /* back prvGetHostByNameOp */
373 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
374 DNS_ReadReply_ExpectAnyArgsAndReturn( 0 );
375 DNS_ReadReply_ReturnThruPtr_pxReceiveBuffer( &xReceiveBuffer );
376
377 FreeRTOS_ReleaseUDPPayloadBuffer_ExpectAnyArgs();
378 }
379
380 /* back in prvGetHostByName */
381 DNS_CloseSocket_ExpectAnyArgs();
382
383 ret = FreeRTOS_gethostbyname( GOOD_ADDRESS );
384 TEST_ASSERT_EQUAL( 0, ret );
385
386 xNetworkBuffer.pucEthernetBuffer -= ipBUFFER_PADDING;
387 }
388
389 /**
390 * @brief Successful case, Ensures that the parsed DNS packet's IP address is
391 * returned to the caller
392 */
test_FreeRTOS_gethostbyname_Success(void)393 void test_FreeRTOS_gethostbyname_Success( void )
394 {
395 uint32_t ret;
396 NetworkBufferDescriptor_t xNetworkBuffer;
397 struct xDNSBuffer xReceiveBuffer;
398 uint32_t ulNumber = 343;
399 NetworkEndPoint_t xEndPoint = { 0 };
400 struct xSOCKET xDNSSocket;
401
402 uint8_t buffer[ 2280 + ipBUFFER_PADDING ];
403
404 xEndPoint.bits.bIPv6 = 0;
405 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = 0xC0C0C0C0;
406 xEndPoint.ipv4_settings.ucDNSIndex = 0;
407 xReceiveBuffer.pucPayloadBuffer = malloc( 300 );
408 xReceiveBuffer.uxPayloadLength = 300;
409 memset( xReceiveBuffer.pucPayloadBuffer, 0x00, 300 );
410 DNSMessage_t * header = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
411
412 header->usIdentifier = 0;
413 xDNSSocket.usLocalPort = 0;
414
415 xNetworkBuffer.xDataLength = 2280;
416 xNetworkBuffer.pucEthernetBuffer = buffer;
417 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
418 memset( xNetworkBuffer.pucEthernetBuffer, 0x00, 2280 );
419
420 DNS_BindSocket_IgnoreAndReturn( 0 );
421 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
422 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 0 );
423 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
424 xApplicationGetRandomNumber_ReturnThruPtr_pulNumber( &ulNumber );
425
426 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
427 /* in prvGetHostByName */
428 /* in prvGetPayloadBuffer */
429 /* prvGetHostByNameOp */
430 /*FreeRTOS_GetAddressConfiguration_ExpectAnyArgs(); */
431 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
432 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
433 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
434 /* prvFillSockAddress */
435 /* back prvGetHostByNameOp */
436 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
437 DNS_ReadReply_ExpectAnyArgsAndReturn( 4 );
438 DNS_ReadReply_ReturnThruPtr_pxReceiveBuffer( &xReceiveBuffer );
439 /* prvDNSReply */
440 DNS_ParseDNSReply_ExpectAnyArgsAndReturn( 12345 );
441 FreeRTOS_ReleaseUDPPayloadBuffer_ExpectAnyArgs();
442
443 /* back in prvGetHostByName */
444 DNS_CloseSocket_Ignore();
445
446 ret = FreeRTOS_gethostbyname( GOOD_ADDRESS );
447 TEST_ASSERT_EQUAL( 12345, ret );
448
449 xNetworkBuffer.pucEthernetBuffer -= ipBUFFER_PADDING;
450 free( xReceiveBuffer.pucPayloadBuffer );
451 }
452
453 /**
454 * @brief Ensures that DNS_ParseDNSReply is called, this function always returns
455 * pdFAIL
456 * @warning Function not really tested besides code coverage
457 */
test_ulDNSHandlePacket_Success(void)458 void test_ulDNSHandlePacket_Success( void )
459 {
460 uint32_t ret;
461 NetworkBufferDescriptor_t xNetworkBuffer;
462
463 xNetworkBuffer.xDataLength = sizeof( UDPPacket_t ) + sizeof( DNSMessage_t );
464 xNetworkBuffer.pucEthernetBuffer = malloc( sizeof( UDPPacket_t ) +
465 sizeof( DNSMessage_t ) );
466
467 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
468 DNS_ParseDNSReply_ExpectAnyArgsAndReturn( 0 );
469
470 ret = ulDNSHandlePacket( &xNetworkBuffer );
471 TEST_ASSERT_EQUAL( pdFAIL, ret );
472 free( xNetworkBuffer.pucEthernetBuffer );
473 }
474
475 /**
476 * @brief This function always returns pdFAIL
477 * @warning Function not really tested besides code coverage
478 */
test_ulDNSHandlePacket_FailSmallBuffer(void)479 void test_ulDNSHandlePacket_FailSmallBuffer( void )
480 {
481 uint32_t ret;
482 NetworkBufferDescriptor_t xNetworkBuffer;
483
484 xNetworkBuffer.xDataLength = sizeof( UDPPacket_t ) - 2;
485 xNetworkBuffer.pucEthernetBuffer = malloc( sizeof( UDPPacket_t ) - 2 );
486
487 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
488
489 ret = ulDNSHandlePacket( &xNetworkBuffer );
490 TEST_ASSERT_EQUAL( pdFAIL, ret );
491 free( xNetworkBuffer.pucEthernetBuffer );
492 }
493
494 /**
495 * @brief Always returns pdFAIL, trying different scenarios to have move
496 * coverage
497 * @warning Function not really tested besides code coverage
498 */
test_ulDNSHandlePacket_FailSmallBuffer2(void)499 void test_ulDNSHandlePacket_FailSmallBuffer2( void )
500 {
501 uint32_t ret;
502 NetworkBufferDescriptor_t xNetworkBuffer;
503
504 xNetworkBuffer.xDataLength = sizeof( UDPPacket_t ) + 2;
505 xNetworkBuffer.pucEthernetBuffer = malloc( sizeof( UDPPacket_t ) + 2 );
506
507 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
508
509 ret = ulDNSHandlePacket( &xNetworkBuffer );
510 TEST_ASSERT_EQUAL( pdFAIL, ret );
511 free( xNetworkBuffer.pucEthernetBuffer );
512 }
513
514 /**
515 * @brief Make sure function release the allocated buffer from DNS_ParseDNSReply
516 */
test_ulDNSHandlePacket_FreeBuffer(void)517 void test_ulDNSHandlePacket_FreeBuffer( void )
518 {
519 uint32_t ret;
520 NetworkBufferDescriptor_t xNetworkBuffer;
521 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
522 struct freertos_addrinfo * pxAddress;
523
524 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
525 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
526
527 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
528
529 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
530 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
531
532 pxAddress = ( struct freertos_addrinfo * ) pvPortMalloc( sizeof( struct freertos_addrinfo ) );
533 memset( pxAddress, 0, sizeof( struct freertos_addrinfo ) );
534
535 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
536 DNS_ParseDNSReply_ExpectAnyArgsAndReturn( 0 );
537 DNS_ParseDNSReply_ReturnThruPtr_ppxAddressInfo( &pxAddress );
538
539 ret = ulDNSHandlePacket( &xNetworkBuffer );
540 TEST_ASSERT_EQUAL( pdFAIL, ret );
541 }
542
543 /**
544 * @brief Functions always returns pdFAIL
545 * @warning Function not really tested besides code coverage
546 */
test_ulNBNSHandlePacket_Success(void)547 void test_ulNBNSHandlePacket_Success( void )
548 {
549 uint32_t ret;
550 NetworkBufferDescriptor_t xNetworkBuffer;
551 size_t uxBytesNeeded = sizeof( UDPPacket_t ) + sizeof( NBNSRequest_t );
552
553 xNetworkBuffer.xDataLength = uxBytesNeeded;
554 xNetworkBuffer.pucEthernetBuffer = malloc( uxBytesNeeded );
555
556 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
557 DNS_TreatNBNS_ExpectAnyArgs();
558
559 ret = ulNBNSHandlePacket( &xNetworkBuffer );
560 TEST_ASSERT_EQUAL( pdFAIL, ret );
561 free( xNetworkBuffer.pucEthernetBuffer );
562 }
563
564 /**
565 * @brief Functions always returns pdFAIL
566 * @warning Function not really tested besides code coverage
567 */
test_ulNBNSHandlePacket_FailSmallBuffer(void)568 void test_ulNBNSHandlePacket_FailSmallBuffer( void )
569 {
570 uint32_t ret;
571 NetworkBufferDescriptor_t xNetworkBuffer;
572 size_t uxBytesNeeded = sizeof( UDPPacket_t ) + sizeof( NBNSRequest_t );
573
574 xNetworkBuffer.xDataLength = uxBytesNeeded - 5;
575 xNetworkBuffer.pucEthernetBuffer = malloc( uxBytesNeeded - 5 );
576
577 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
578
579 ret = ulNBNSHandlePacket( &xNetworkBuffer );
580 TEST_ASSERT_EQUAL( pdFAIL, ret );
581
582 free( xNetworkBuffer.pucEthernetBuffer );
583 }
584
585 /**
586 * @brief Ensures that vDNSCheckCallback is called
587 */
test_FreeRTOS_gethostbyname_CancelSuccess(void)588 void test_FreeRTOS_gethostbyname_CancelSuccess( void )
589 {
590 void * pvSearchID = NULL;
591
592 vDNSCheckCallBack_ExpectAnyArgs();
593 FreeRTOS_gethostbyname_cancel( pvSearchID );
594 }
595
596
597 /**
598 * @brief Ensures that if pCallback is not null and the hostname is not in the
599 * cache, the application support random number generation,
600 * the callback function is set
601 */
test_FreeRTOS_gethostbyname_a_SetCallback(void)602 void test_FreeRTOS_gethostbyname_a_SetCallback( void )
603 {
604 uint32_t ret;
605 int pvSearchID = 32;
606 NetworkBufferDescriptor_t xNetworkBuffer;
607 struct xSOCKET xDNSSocket;
608
609 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
610 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 0 );
611 xApplicationGetRandomNumber_IgnoreAndReturn( pdTRUE );
612 vDNSSetCallBack_ExpectAnyArgs();
613 DNS_CreateSocket_ExpectAnyArgsAndReturn( NULL );
614
615 ret = FreeRTOS_gethostbyname_a( GOOD_ADDRESS,
616 dns_callback,
617 &pvSearchID,
618 0 );
619 TEST_ASSERT_EQUAL( 0, ret );
620 TEST_ASSERT_EQUAL( 0, callback_called );
621 }
622
623 /**
624 * @brief Ensures that if the application has no random number generation
625 * support, and ip is zero, no action is performed
626 */
test_FreeRTOS_gethostbyname_a_NoSetCallback(void)627 void test_FreeRTOS_gethostbyname_a_NoSetCallback( void )
628 {
629 uint32_t ret;
630 int pvSearchID = 32;
631 NetworkBufferDescriptor_t xNetworkBuffer;
632
633 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
634 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 0 );
635 xApplicationGetRandomNumber_IgnoreAndReturn( pdFALSE );
636
637 ret = FreeRTOS_gethostbyname_a( GOOD_ADDRESS,
638 dns_callback,
639 &pvSearchID,
640 0 );
641 TEST_ASSERT_EQUAL( 0, ret );
642 TEST_ASSERT_EQUAL( 0, callback_called );
643 }
644
645
646 /**
647 * @brief Ensures that if the function receives a callback, and ip address is
648 * not zero, the callback is called
649 */
test_FreeRTOS_gethostbyname_a_Callback(void)650 void test_FreeRTOS_gethostbyname_a_Callback( void )
651 {
652 uint32_t ret;
653 int pvSearchID = 32;
654
655 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
656 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 5 );
657 xApplicationGetRandomNumber_IgnoreAndReturn( pdTRUE );
658
659 ret = FreeRTOS_gethostbyname_a( GOOD_ADDRESS,
660 dns_callback,
661 &pvSearchID,
662 0 );
663 TEST_ASSERT_EQUAL( 5, ret );
664 TEST_ASSERT_EQUAL( 1, callback_called );
665 }
666
667 /**
668 * @brief Ensures that if vDNSSetCallBack is called the client is put in
669 * asynchronous mode, and only one retry is performed by calling
670 * prvGetHostByNameOp instead of prvGetHostByNameOp_WithRetry
671 */
test_FreeRTOS_gethostbyname_a_NoCallbackRetryOnce(void)672 void test_FreeRTOS_gethostbyname_a_NoCallbackRetryOnce( void )
673 {
674 uint32_t ret;
675 uint32_t ulNumber = 34;
676 int pvSearchID = 32;
677 NetworkEndPoint_t xEndPoint = { 0 };
678 NetworkBufferDescriptor_t xNetworkBuffer;
679 struct xDNSBuffer xReceiveBuffer;
680 struct xSOCKET xDNSSocket;
681 size_t uxBytesNeeded = sizeof( UDPPacket_t ) + sizeof( NBNSRequest_t );
682
683 xNetworkBuffer.pucEthernetBuffer = malloc( uxBytesNeeded + ipBUFFER_PADDING );
684 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
685 xNetworkBuffer.xDataLength = uxBytesNeeded;
686 xReceiveBuffer.pucPayloadBuffer = malloc( 300 );
687 xReceiveBuffer.uxPayloadLength = 300;
688 ( void ) memset( xNetworkBuffer.pucEthernetBuffer, 0x00, uxBytesNeeded );
689 ( void ) memset( xReceiveBuffer.pucPayloadBuffer, 0x00, 300 );
690 DNSMessage_t * header = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
691
692 header->usIdentifier = 12;
693 xDNSSocket.usLocalPort = 0;
694 xEndPoint.bits.bIPv6 = pdFALSE;
695 xEndPoint.ipv4_settings.ucDNSIndex = 0;
696 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = 0xC0C0C0C0;
697
698 DNS_BindSocket_IgnoreAndReturn( 0 );
699 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
700 Prepare_CacheLookup_ExpectAnyArgsAndReturn( 0 );
701 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
702 xApplicationGetRandomNumber_ReturnThruPtr_pulNumber( &ulNumber );
703 vDNSSetCallBack_ExpectAnyArgs();
704
705 /* in prvGetHostByName */
706 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
707 /* prvGetHostByNameOp */
708 /* prvFillSockAddress */
709 /* in prvSendBuffer */
710 /* in prvGetPayloadBuffer */
711
712 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
713 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
714
715 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
716
717 /* back in prvSendBuffer */
718 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
719
720 /* back in prvGetHostByNameOp */
721 DNS_ReadReply_ExpectAnyArgsAndReturn( 4 );
722 DNS_ReadReply_ReturnThruPtr_pxReceiveBuffer( &xReceiveBuffer );
723 /* prvDNSReply */
724 DNS_ParseDNSReply_ExpectAnyArgsAndReturn( 12345 );
725 FreeRTOS_ReleaseUDPPayloadBuffer_ExpectAnyArgs();
726
727 /* back in prvGetHostByName */
728 DNS_CloseSocket_ExpectAnyArgs();
729
730 ret = FreeRTOS_gethostbyname_a( GOOD_ADDRESS,
731 dns_callback,
732 &pvSearchID,
733 0 );
734 TEST_ASSERT_EQUAL( 12345, ret );
735 TEST_ASSERT_EQUAL( 0, callback_called );
736
737 free( xNetworkBuffer.pucEthernetBuffer - ipBUFFER_PADDING );
738 free( xReceiveBuffer.pucPayloadBuffer );
739 }
740
741 /**
742 * @brief NULL input
743 */
test_FreeRTOS_getaddrinfo_NullInput(void)744 void test_FreeRTOS_getaddrinfo_NullInput( void )
745 {
746 BaseType_t xReturn;
747
748 xReturn = FreeRTOS_getaddrinfo( "Domain", "Service", NULL, NULL );
749
750 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
751 }
752
753 /**
754 * @brief Unknown family in preferences
755 */
test_FreeRTOS_getaddrinfo_a_UnknownHintFamily(void)756 void test_FreeRTOS_getaddrinfo_a_UnknownHintFamily( void )
757 {
758 BaseType_t xReturn;
759 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
760 struct freertos_addrinfo xHint, * pxHint = &xHint;
761
762 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
763 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
764
765 xHint.ai_family = FREERTOS_AF_INET6 + 1;
766
767 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
768
769 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EINVAL, xReturn );
770 TEST_ASSERT_EQUAL( NULL, pxAddress );
771 }
772
773 /**
774 * @brief IP address found with IPv4 address input
775 */
test_FreeRTOS_getaddrinfo_a_IPv4AddressFound(void)776 void test_FreeRTOS_getaddrinfo_a_IPv4AddressFound( void )
777 {
778 BaseType_t xReturn;
779 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
780 struct freertos_addrinfo xHint, * pxHint = &xHint;
781
782 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
783 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
784
785 xHint.ai_family = FREERTOS_AF_INET4;
786
787 FreeRTOS_inet_addr_ExpectAndReturn( DOTTED_IPV4_ADDRESS, DOTTED_IPV4_ADDRESS_UINT32 );
788 ulChar2u32_IgnoreAndReturn( DOTTED_IPV4_ADDRESS_UINT32 );
789
790 xReturn = FreeRTOS_getaddrinfo_a( DOTTED_IPV4_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
791
792 TEST_ASSERT_EQUAL( 0, xReturn );
793 TEST_ASSERT_EQUAL( 1, callback_called );
794 TEST_ASSERT_EQUAL( FREERTOS_AF_INET4, pxAddress->ai_family );
795 TEST_ASSERT_EQUAL( DOTTED_IPV4_ADDRESS_UINT32, FreeRTOS_htonl( pxAddress->ai_addr->sin_address.ulIP_IPv4 ) );
796 TEST_ASSERT_EQUAL( ipSIZE_OF_IPv4_ADDRESS, pxAddress->ai_addrlen );
797 }
798
799 /**
800 * @brief IP address found with IPv6 address input
801 */
test_FreeRTOS_getaddrinfo_a_IPv6AddressFound(void)802 void test_FreeRTOS_getaddrinfo_a_IPv6AddressFound( void )
803 {
804 BaseType_t xReturn;
805 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
806 struct freertos_addrinfo xHint, * pxHint = &xHint;
807
808 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
809 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
810
811 xHint.ai_family = FREERTOS_AF_INET6;
812
813 FreeRTOS_inet_pton6_ExpectAndReturn( DOTTED_IPv6_ADDRESS, NULL, 1 );
814 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
815 FreeRTOS_inet_pton6_ReturnMemThruPtr_pvDestination( &xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
816
817 xReturn = FreeRTOS_getaddrinfo_a( DOTTED_IPv6_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
818
819 TEST_ASSERT_EQUAL( 0, xReturn );
820 TEST_ASSERT_EQUAL( 1, callback_called );
821 TEST_ASSERT_EQUAL( FREERTOS_AF_INET6, pxAddress->ai_family );
822 TEST_ASSERT_EQUAL_MEMORY( xIPv6Address.ucBytes, pxAddress->ai_addr->sin_address.xIP_IPv6.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
823 TEST_ASSERT_EQUAL( ipSIZE_OF_IPv6_ADDRESS, pxAddress->ai_addrlen );
824 }
825
826 /**
827 * @brief IP address found with IPv4 domain input
828 */
test_FreeRTOS_getaddrinfo_a_IPv4DomainCacheFound(void)829 void test_FreeRTOS_getaddrinfo_a_IPv4DomainCacheFound( void )
830 {
831 BaseType_t xReturn;
832 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
833 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
834
835 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
836 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
837
838 xExpectedAddress.ai_family = FREERTOS_AF_INET4;
839
840 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
841 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET4, &pxAddress, DOTTED_IPV4_ADDRESS_UINT32 );
842 Prepare_CacheLookup_ReturnMemThruPtr_ppxAddressInfo( &pxExpectedAddress, sizeof( struct freertos_addrinfo ) );
843
844 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", NULL, &pxAddress, dns_callback, NULL, 0U );
845
846 TEST_ASSERT_EQUAL( 0, xReturn );
847 TEST_ASSERT_EQUAL( 1, callback_called );
848 TEST_ASSERT_EQUAL( FREERTOS_AF_INET4, pxAddress->ai_family );
849 }
850
851 /**
852 * @brief IP address found with IPv6 domain input
853 */
test_FreeRTOS_getaddrinfo_a_IPv6DomainCacheFound(void)854 void test_FreeRTOS_getaddrinfo_a_IPv6DomainCacheFound( void )
855 {
856 BaseType_t xReturn;
857 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
858 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
859 struct freertos_addrinfo xHint, * pxHint = &xHint;
860
861 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
862 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
863 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
864
865 xHint.ai_family = FREERTOS_AF_INET6;
866
867 xExpectedAddress.ai_family = FREERTOS_AF_INET6;
868
869 FreeRTOS_inet_pton6_ExpectAndReturn( GOOD_ADDRESS, NULL, 0 );
870 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
871 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 1 );
872 Prepare_CacheLookup_ReturnThruPtr_ppxAddressInfo( &pxExpectedAddress );
873
874 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
875
876 TEST_ASSERT_EQUAL( 0, xReturn );
877 TEST_ASSERT_EQUAL( 1, callback_called );
878 TEST_ASSERT_EQUAL( FREERTOS_AF_INET6, pxAddress->ai_family );
879 }
880
881 /**
882 * @brief IP address not found with IPv4 domain input. But we get unique identifier from random.
883 */
test_FreeRTOS_getaddrinfo_a_IPv4DomainCacheMiss_Random(void)884 void test_FreeRTOS_getaddrinfo_a_IPv4DomainCacheMiss_Random( void )
885 {
886 BaseType_t xReturn;
887 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
888 uint32_t ulRandom = 0x1234U;
889
890 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
891
892 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
893 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET4, &pxAddress, 0 );
894 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
895 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
896 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdFALSE );
897 DNS_CreateSocket_ExpectAndReturn( 0U, NULL );
898
899 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", NULL, &pxAddress, dns_callback, NULL, 0U );
900
901 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
902 }
903
904 /**
905 * @brief IP address not found with IPv6 domain input. But we get unique identifier from random.
906 */
test_FreeRTOS_getaddrinfo_a_IPv6DomainCacheMiss_Random(void)907 void test_FreeRTOS_getaddrinfo_a_IPv6DomainCacheMiss_Random( void )
908 {
909 BaseType_t xReturn;
910 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
911 struct freertos_addrinfo xHint, * pxHint = &xHint;
912 uint32_t ulRandom = 0x1234U;
913
914 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
915 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
916
917 xHint.ai_family = FREERTOS_AF_INET6;
918
919 FreeRTOS_inet_pton6_ExpectAndReturn( GOOD_ADDRESS, NULL, 0 );
920 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
921 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
922 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
923 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
924 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
925 DNS_CreateSocket_ExpectAndReturn( 0U, NULL );
926
927 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
928
929 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
930 }
931
932 /**
933 * @brief Try to get IP address through network but no valid endpoint found
934 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_EndPointNotFound(void)935 void test_FreeRTOS_getaddrinfo_a_IPv6Random_EndPointNotFound( void )
936 {
937 BaseType_t xReturn;
938 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
939 struct freertos_addrinfo xHint, * pxHint = &xHint;
940 uint32_t ulRandom = 0x1234U;
941 struct xSOCKET xDNSSocket;
942 NetworkEndPoint_t xEndPoint;
943
944 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
945 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
946 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
947 memset( &xEndPoint, 0, sizeof( xEndPoint ) );
948
949 xEndPoint.bits.bIPv6 = pdFALSE;
950
951 xHint.ai_family = FREERTOS_AF_INET6;
952
953 FreeRTOS_inet_pton6_ExpectAndReturn( GOOD_ADDRESS, NULL, 0 );
954 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
955 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
956 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
957 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
958 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
959
960 /* In prvGetHostByName */
961 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
962 /* In prvGetHostByNameOp */
963 /* In prvFillSockAddress */
964 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
965 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
966 DNS_CloseSocket_Expect( &xDNSSocket );
967
968 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
969
970 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
971 }
972
973 /**
974 * @brief IPv4 socket bind fail with domain name containing dot
975 */
test_FreeRTOS_getaddrinfo_a_IPv4Random_BindFailWithDot(void)976 void test_FreeRTOS_getaddrinfo_a_IPv4Random_BindFailWithDot( void )
977 {
978 BaseType_t xReturn;
979 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
980 struct freertos_addrinfo xHint, * pxHint = &xHint;
981 uint32_t ulRandom = 0x1234U;
982 struct xSOCKET xDNSSocket;
983 NetworkEndPoint_t xEndPoint[ 4 ];
984
985 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
986 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
987 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
988 memset( &xEndPoint[ 0 ], 0, sizeof( NetworkEndPoint_t ) );
989 memset( &xEndPoint[ 1 ], 0, sizeof( NetworkEndPoint_t ) );
990 memset( &xEndPoint[ 2 ], 0, sizeof( NetworkEndPoint_t ) );
991 memset( &xEndPoint[ 3 ], 0, sizeof( NetworkEndPoint_t ) );
992
993 xEndPoint[ 0 ].bits.bIPv6 = pdTRUE;
994
995 xEndPoint[ 1 ].bits.bIPv6 = pdFALSE;
996 xEndPoint[ 1 ].ipv4_settings.ucDNSIndex = 0;
997 xEndPoint[ 1 ].ipv4_settings.ulDNSServerAddresses[ 0 ] = 0U;
998
999 xEndPoint[ 2 ].bits.bIPv6 = pdFALSE;
1000 xEndPoint[ 2 ].ipv4_settings.ucDNSIndex = 0;
1001 xEndPoint[ 2 ].ipv4_settings.ulDNSServerAddresses[ 0 ] = ipBROADCAST_IP_ADDRESS;
1002
1003 xEndPoint[ 3 ].bits.bIPv6 = pdFALSE;
1004 xEndPoint[ 3 ].ipv4_settings.ucDNSIndex = 0;
1005 xEndPoint[ 3 ].ipv4_settings.ulDNSServerAddresses[ 0 ] = DOTTED_IPV4_ADDRESS_UINT32;
1006
1007 xHint.ai_family = FREERTOS_AF_INET4;
1008
1009 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
1010 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET4, &pxAddress, 0 );
1011 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1012 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1013 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdFALSE );
1014
1015 /* In prvGetHostByName */
1016 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
1017 /* In prvGetHostByNameOp */
1018 /* In prvFillSockAddress */
1019 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 0 ] );
1020 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 0 ], &xEndPoint[ 1 ] );
1021 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 1 ], &xEndPoint[ 2 ] );
1022 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 2 ], &xEndPoint[ 3 ] );
1023 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, 0U, -1 );
1024 DNS_CloseSocket_Expect( &xDNSSocket );
1025
1026 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1027
1028 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1029 }
1030
1031 /**
1032 * @brief IPv6 socket bind fail with domain name containing dot
1033 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_BindFailWithDot(void)1034 void test_FreeRTOS_getaddrinfo_a_IPv6Random_BindFailWithDot( void )
1035 {
1036 BaseType_t xReturn;
1037 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1038 struct freertos_addrinfo xHint, * pxHint = &xHint;
1039 uint32_t ulRandom = 0x1234U;
1040 struct xSOCKET xDNSSocket;
1041 NetworkEndPoint_t xEndPoint[ 5 ];
1042
1043 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1044 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1045 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1046 memset( &xEndPoint[ 0 ], 0, sizeof( NetworkEndPoint_t ) );
1047 memset( &xEndPoint[ 1 ], 0, sizeof( NetworkEndPoint_t ) );
1048 memset( &xEndPoint[ 2 ], 0, sizeof( NetworkEndPoint_t ) );
1049 memset( &xEndPoint[ 3 ], 0, sizeof( NetworkEndPoint_t ) );
1050 memset( &xEndPoint[ 4 ], 0, sizeof( NetworkEndPoint_t ) );
1051
1052 xEndPoint[ 0 ].bits.bIPv6 = pdFALSE;
1053
1054 xEndPoint[ 1 ].bits.bIPv6 = pdTRUE;
1055 xEndPoint[ 1 ].ipv6_settings.ucDNSIndex = 0;
1056 xEndPoint[ 1 ].ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes[ 0 ] = 0U;
1057 xEndPoint[ 1 ].ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes[ 1 ] = 1U;
1058
1059 xEndPoint[ 2 ].bits.bIPv6 = pdTRUE;
1060 xEndPoint[ 2 ].ipv6_settings.ucDNSIndex = 0;
1061 xEndPoint[ 2 ].ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes[ 0 ] = 1U;
1062 xEndPoint[ 2 ].ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes[ 1 ] = 0U;
1063
1064 xEndPoint[ 3 ].bits.bIPv6 = pdTRUE;
1065 xEndPoint[ 3 ].ipv6_settings.ucDNSIndex = 0;
1066 xEndPoint[ 3 ].ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes[ 0 ] = 0U;
1067 xEndPoint[ 3 ].ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes[ 1 ] = 0U;
1068
1069 xEndPoint[ 4 ].bits.bIPv6 = pdTRUE;
1070 xEndPoint[ 4 ].ipv6_settings.ucDNSIndex = 0;
1071 memcpy( xEndPoint[ 4 ].ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
1072
1073 xHint.ai_family = FREERTOS_AF_INET6;
1074
1075 FreeRTOS_inet_pton6_ExpectAndReturn( GOOD_ADDRESS, NULL, 0 );
1076 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
1077 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
1078 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1079 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1080 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
1081
1082 /* In prvGetHostByName */
1083 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
1084 /* In prvGetHostByNameOp */
1085 /* In prvFillSockAddress */
1086 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 0 ] );
1087 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 0 ], &xEndPoint[ 1 ] );
1088 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 1 ], &xEndPoint[ 2 ] );
1089 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 2 ], &xEndPoint[ 3 ] );
1090 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 3 ], &xEndPoint[ 4 ] );
1091 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, 0U, -1 );
1092 DNS_CloseSocket_Expect( &xDNSSocket );
1093
1094 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1095
1096 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1097 }
1098
1099 /**
1100 * @brief IPv4 socket bind fail with domain name doesn't contain dot
1101 */
test_FreeRTOS_getaddrinfo_a_IPv4Random_BindFailWODot(void)1102 void test_FreeRTOS_getaddrinfo_a_IPv4Random_BindFailWODot( void )
1103 {
1104 BaseType_t xReturn;
1105 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1106 struct freertos_addrinfo xHint, * pxHint = &xHint;
1107 uint32_t ulRandom = 0x1234U;
1108 struct xSOCKET xDNSSocket;
1109 NetworkEndPoint_t xEndPoint[ 2 ];
1110
1111 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1112 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1113 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1114 memset( &xEndPoint[ 0 ], 0, sizeof( NetworkEndPoint_t ) );
1115 memset( &xEndPoint[ 1 ], 0, sizeof( NetworkEndPoint_t ) );
1116
1117 xEndPoint[ 0 ].bits.bIPv6 = pdTRUE;
1118
1119 xEndPoint[ 1 ].bits.bIPv6 = pdFALSE;
1120 xEndPoint[ 1 ].ipv4_settings.ucDNSIndex = 0;
1121 xEndPoint[ 1 ].ipv4_settings.ulDNSServerAddresses[ 0 ] = DOTTED_IPV4_ADDRESS_UINT32;
1122
1123 xHint.ai_family = FREERTOS_AF_INET4;
1124
1125 FreeRTOS_inet_addr_ExpectAndReturn( LLMNR_ADDRESS, 0 );
1126 Prepare_CacheLookup_ExpectAndReturn( LLMNR_ADDRESS, FREERTOS_AF_INET4, &pxAddress, 0 );
1127 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1128 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1129 vDNSSetCallBack_Expect( LLMNR_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdFALSE );
1130
1131 /* In prvGetHostByName */
1132 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
1133 /* In prvGetHostByNameOp */
1134 /* In prvFillSockAddress */
1135 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 0 ] );
1136 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 0 ], &xEndPoint[ 1 ] );
1137 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, 0U, -1 );
1138 DNS_CloseSocket_Expect( &xDNSSocket );
1139
1140 xReturn = FreeRTOS_getaddrinfo_a( LLMNR_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1141
1142 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1143 }
1144
1145 /**
1146 * @brief IPv6 socket bind fail with domain name doesn't contain dot
1147 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_BindFailWODot(void)1148 void test_FreeRTOS_getaddrinfo_a_IPv6Random_BindFailWODot( void )
1149 {
1150 BaseType_t xReturn;
1151 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1152 struct freertos_addrinfo xHint, * pxHint = &xHint;
1153 uint32_t ulRandom = 0x1234U;
1154 struct xSOCKET xDNSSocket;
1155 NetworkEndPoint_t xEndPoint[ 2 ];
1156
1157 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1158 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1159 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1160 memset( &xEndPoint[ 0 ], 0, sizeof( NetworkEndPoint_t ) );
1161 memset( &xEndPoint[ 1 ], 0, sizeof( NetworkEndPoint_t ) );
1162
1163 xEndPoint[ 0 ].bits.bIPv6 = pdFALSE;
1164
1165 xEndPoint[ 1 ].bits.bIPv6 = pdTRUE;
1166 memcpy( xEndPoint[ 1 ].ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
1167
1168 xHint.ai_family = FREERTOS_AF_INET6;
1169
1170 FreeRTOS_inet_pton6_ExpectAndReturn( LLMNR_ADDRESS, NULL, 0 );
1171 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
1172 Prepare_CacheLookup_ExpectAndReturn( LLMNR_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
1173 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1174 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1175 vDNSSetCallBack_Expect( LLMNR_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
1176
1177 /* In prvGetHostByName */
1178 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
1179 /* In prvGetHostByNameOp */
1180 /* In prvFillSockAddress */
1181 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 0 ] );
1182 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint[ 0 ], &xEndPoint[ 1 ] );
1183 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, 0U, -1 );
1184 DNS_CloseSocket_Expect( &xDNSSocket );
1185
1186 xReturn = FreeRTOS_getaddrinfo_a( LLMNR_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1187
1188 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1189 }
1190
1191 /**
1192 * @brief Assertion happens when DNS server index is equal to or greater than maximum in IPv4 endpoint.
1193 */
test_FreeRTOS_getaddrinfo_a_IPv4Random_InvalidDNSServerIndex(void)1194 void test_FreeRTOS_getaddrinfo_a_IPv4Random_InvalidDNSServerIndex( void )
1195 {
1196 BaseType_t xReturn;
1197 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1198 struct freertos_addrinfo xHint, * pxHint = &xHint;
1199 uint32_t ulRandom = 0x1234U;
1200 struct xSOCKET xDNSSocket;
1201 NetworkEndPoint_t xEndPoint;
1202
1203 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1204 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1205 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1206 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1207
1208 xEndPoint.bits.bIPv6 = pdFALSE;
1209 xEndPoint.ipv4_settings.ucDNSIndex = ipconfigENDPOINT_DNS_ADDRESS_COUNT;
1210
1211 xHint.ai_family = FREERTOS_AF_INET4;
1212
1213 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
1214 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET4, &pxAddress, 0 );
1215 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1216 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1217 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdFALSE );
1218
1219 /* In prvGetHostByName */
1220 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
1221 /* In prvGetHostByNameOp */
1222 /* In prvFillSockAddress */
1223 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1224
1225 catch_assert( FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U ) );
1226 }
1227
1228 /**
1229 * @brief Assertion happens when DNS server index is equal to or greater than maximum in IPv6 endpoint.
1230 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_InvalidDNSServerIndex(void)1231 void test_FreeRTOS_getaddrinfo_a_IPv6Random_InvalidDNSServerIndex( void )
1232 {
1233 BaseType_t xReturn;
1234 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1235 struct freertos_addrinfo xHint, * pxHint = &xHint;
1236 uint32_t ulRandom = 0x1234U;
1237 struct xSOCKET xDNSSocket;
1238 NetworkEndPoint_t xEndPoint;
1239
1240 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1241 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1242 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1243 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1244
1245 xEndPoint.bits.bIPv6 = pdTRUE;
1246 xEndPoint.ipv6_settings.ucDNSIndex = ipconfigENDPOINT_DNS_ADDRESS_COUNT;
1247
1248 xHint.ai_family = FREERTOS_AF_INET6;
1249
1250 FreeRTOS_inet_pton6_ExpectAndReturn( GOOD_ADDRESS, NULL, 0 );
1251 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
1252 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
1253 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1254 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1255 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
1256
1257 /* In prvGetHostByName */
1258 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
1259 /* In prvGetHostByNameOp */
1260 /* In prvFillSockAddress */
1261 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1262
1263 catch_assert( FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U ) );
1264 }
1265
1266 /**
1267 * @brief Run DNS query with unknown DNS preference
1268 */
test_FreeRTOS_getaddrinfo_a_IPv4Random_UnknownPreference(void)1269 void test_FreeRTOS_getaddrinfo_a_IPv4Random_UnknownPreference( void )
1270 {
1271 BaseType_t xReturn;
1272 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1273 struct freertos_addrinfo xHint, * pxHint = &xHint;
1274 uint32_t ulRandom = 0x1234U;
1275 struct xSOCKET xDNSSocket;
1276 NetworkEndPoint_t xEndPoint;
1277
1278 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1279 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1280 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1281 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1282
1283 xEndPoint.bits.bIPv6 = pdFALSE;
1284 xEndPoint.ipv6_settings.ucDNSIndex = 0;
1285
1286 xHint.ai_family = FREERTOS_AF_INET4;
1287
1288 xDNS_IP_Preference = xPreferenceNone;
1289
1290 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
1291 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET4, &pxAddress, 0 );
1292 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1293 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1294 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdFALSE );
1295
1296 /* In prvGetHostByName */
1297 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
1298 /* In prvGetHostByNameOp */
1299 /* In prvFillSockAddress */
1300 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1301 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
1302 DNS_CloseSocket_Expect( &xDNSSocket );
1303
1304 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1305
1306 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1307 }
1308
1309 /**
1310 * @brief Get the IP address from prvGetHostByName successfully
1311 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_DNSReplySuccess(void)1312 void test_FreeRTOS_getaddrinfo_a_IPv6Random_DNSReplySuccess( void )
1313 {
1314 BaseType_t xReturn;
1315 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1316 struct freertos_addrinfo xHint, * pxHint = &xHint;
1317 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
1318 uint32_t ulRandom = 0x1234U;
1319 struct xSOCKET xDNSSocket;
1320 NetworkEndPoint_t xEndPoint;
1321 NetworkBufferDescriptor_t xNetworkBuffer;
1322 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
1323 struct xDNSBuffer xReceiveBuffer;
1324 DNSMessage_t * pxDNSMessageHeader = NULL;
1325
1326 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1327 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1328 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
1329 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1330 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1331 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
1332 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
1333 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
1334
1335 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
1336
1337 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
1338 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
1339
1340 xEndPoint.bits.bIPv6 = pdTRUE;
1341 xEndPoint.ipv6_settings.ucDNSIndex = 0;
1342 memcpy( xEndPoint.ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
1343
1344 xHint.ai_family = FREERTOS_AF_INET6;
1345 xExpectedAddress.ai_family = FREERTOS_AF_INET6;
1346
1347 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
1348 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ipSIZE_OF_UDP_HEADER;
1349
1350 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
1351 pxDNSMessageHeader->usIdentifier = ulRandom;
1352
1353 FreeRTOS_inet_pton6_ExpectAndReturn( GOOD_ADDRESS, NULL, 0 );
1354 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
1355 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
1356 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1357 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1358 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
1359
1360 /* In prvGetHostByName */
1361 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
1362 /* In prvGetHostByNameOp */
1363 /* In prvFillSockAddress */
1364 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1365
1366 /* Back prvGetHostByNameOp */
1367 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, 0U, 0 );
1368 /* In prvSendBuffer */
1369 /* In prvGetPayloadBuffer */
1370 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
1371 /* Back prvSendBuffer */
1372 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
1373 /* Back prvGetHostByNameOp */
1374 DNS_ReadReply_ExpectAnyArgsAndReturn( ipconfigNETWORK_MTU );
1375 DNS_ReadReply_ReturnThruPtr_pxReceiveBuffer( &xReceiveBuffer );
1376 /* In prvDNSReply */
1377 DNS_ParseDNSReply_ExpectAnyArgsAndReturn( 1 );
1378 DNS_ParseDNSReply_ReturnThruPtr_ppxAddressInfo( &pxExpectedAddress );
1379 /* Back prvGetHostByNameOp */
1380 FreeRTOS_ReleaseUDPPayloadBuffer_Expect( xReceiveBuffer.pucPayloadBuffer );
1381
1382 /* Back prvGetHostByName */
1383 DNS_CloseSocket_Expect( &xDNSSocket );
1384
1385 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1386
1387 TEST_ASSERT_EQUAL( 0, xReturn );
1388 TEST_ASSERT_EQUAL( 0, callback_called );
1389 TEST_ASSERT_EQUAL( FREERTOS_AF_INET6, pxAddress->ai_family );
1390 }
1391
1392 /**
1393 * @brief Get the IP address from prvGetHostByName fail and retry exhausted
1394 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_RetryExhaust(void)1395 void test_FreeRTOS_getaddrinfo_a_IPv6Random_RetryExhaust( void )
1396 {
1397 BaseType_t xReturn;
1398 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1399 struct freertos_addrinfo xHint, * pxHint = &xHint;
1400 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
1401 uint32_t ulRandom = 0x1234U;
1402 struct xSOCKET xDNSSocket;
1403 NetworkEndPoint_t xEndPoint;
1404 NetworkBufferDescriptor_t xNetworkBuffer;
1405 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
1406 struct xDNSBuffer xReceiveBuffer;
1407 DNSMessage_t * pxDNSMessageHeader = NULL;
1408 int i;
1409
1410 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1411 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1412 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
1413 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1414 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1415 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
1416 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
1417 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
1418
1419 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
1420
1421 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
1422 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
1423
1424 xEndPoint.bits.bIPv6 = pdTRUE;
1425 xEndPoint.ipv6_settings.ucDNSIndex = 0;
1426 memcpy( xEndPoint.ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
1427
1428 xHint.ai_family = FREERTOS_AF_INET6;
1429 xExpectedAddress.ai_family = FREERTOS_AF_INET6;
1430
1431 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
1432 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ipSIZE_OF_UDP_HEADER;
1433
1434 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
1435 pxDNSMessageHeader->usIdentifier = ulRandom;
1436
1437 FreeRTOS_inet_pton6_ExpectAndReturn( GOOD_ADDRESS, NULL, 0 );
1438 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
1439 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
1440 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1441 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1442
1443 /* In prvGetHostByName */
1444 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
1445
1446 for( i = 0; i < ipconfigDNS_REQUEST_ATTEMPTS; i++ )
1447 {
1448 /* In prvGetHostByNameOp */
1449 /* In prvFillSockAddress */
1450 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1451
1452 /* Back prvGetHostByNameOp */
1453 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, 0U, 0 );
1454 /* In prvSendBuffer */
1455 /* In prvGetPayloadBuffer */
1456 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
1457 /* Back prvSendBuffer */
1458 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
1459 /* Back prvGetHostByNameOp */
1460 DNS_ReadReply_ExpectAnyArgsAndReturn( -pdFREERTOS_ERRNO_EWOULDBLOCK );
1461 }
1462
1463 /* Back prvGetHostByName */
1464 DNS_CloseSocket_Expect( &xDNSSocket );
1465
1466 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, NULL, NULL, 0U );
1467
1468 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1469 TEST_ASSERT_EQUAL( 0, callback_called );
1470 }
1471
1472 /**
1473 * @brief Get the IPv4 address from prvGetHostByName for .local domain successfully
1474 */
test_FreeRTOS_getaddrinfo_a_IPv4Random_LocalDNSSuccess(void)1475 void test_FreeRTOS_getaddrinfo_a_IPv4Random_LocalDNSSuccess( void )
1476 {
1477 BaseType_t xReturn;
1478 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1479 struct freertos_addrinfo xHint, * pxHint = &xHint;
1480 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
1481 uint32_t ulRandom = 0x1234U;
1482 struct xSOCKET xDNSSocket;
1483 NetworkEndPoint_t xEndPoint;
1484 NetworkBufferDescriptor_t xNetworkBuffer;
1485 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
1486 struct xDNSBuffer xReceiveBuffer;
1487 DNSMessage_t * pxDNSMessageHeader = NULL;
1488 int i;
1489 struct freertos_sockaddr xExpectedSockAddress, * pxExpectedSockAddress = &xExpectedSockAddress;
1490
1491 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1492 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1493 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
1494 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1495 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1496 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
1497 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
1498 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
1499 memset( &xExpectedSockAddress, 0, sizeof( struct freertos_sockaddr ) );
1500
1501 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
1502
1503 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
1504 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
1505
1506 xEndPoint.bits.bIPv6 = pdFALSE;
1507 xEndPoint.ipv4_settings.ucDNSIndex = 0;
1508 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = DOTTED_IPV4_ADDRESS_UINT32;
1509
1510 xHint.ai_family = FREERTOS_AF_INET4;
1511 xExpectedAddress.ai_family = FREERTOS_AF_INET4;
1512
1513 xExpectedSockAddress.sin_port = FreeRTOS_htons( ipMDNS_PORT );
1514
1515 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
1516 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_UDP_HEADER;
1517
1518 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
1519 pxDNSMessageHeader->usIdentifier = ulRandom;
1520
1521 FreeRTOS_inet_addr_ExpectAndReturn( LOCAL_ADDRESS, 0 );
1522 Prepare_CacheLookup_ExpectAndReturn( LOCAL_ADDRESS, FREERTOS_AF_INET4, &pxAddress, 0 );
1523 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1524 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1525 vDNSSetCallBack_Expect( LOCAL_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdFALSE );
1526
1527 /* In prvGetHostByName */
1528 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
1529
1530 /* In prvGetHostByNameOp */
1531 /* In prvFillSockAddress */
1532 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1533
1534 /* Back prvGetHostByNameOp */
1535 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, FreeRTOS_htons( ipMDNS_PORT ), 0 );
1536 /* In prvSendBuffer */
1537 /* In prvGetPayloadBuffer */
1538 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
1539 /* Back prvSendBuffer */
1540 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
1541 /* Back prvGetHostByNameOp */
1542 DNS_ReadReply_ExpectAnyArgsAndReturn( ipconfigNETWORK_MTU );
1543 DNS_ReadReply_ReturnThruPtr_pxReceiveBuffer( &xReceiveBuffer );
1544 DNS_ReadReply_ReturnThruPtr_xAddress( pxExpectedSockAddress );
1545 /* In prvDNSReply */
1546 DNS_ParseDNSReply_ExpectAnyArgsAndReturn( 1 );
1547 DNS_ParseDNSReply_ReturnThruPtr_ppxAddressInfo( &pxExpectedAddress );
1548 /* Back prvGetHostByNameOp */
1549 FreeRTOS_ReleaseUDPPayloadBuffer_Expect( xReceiveBuffer.pucPayloadBuffer );
1550
1551 /* Back prvGetHostByName */
1552 DNS_CloseSocket_Expect( &xDNSSocket );
1553
1554 xReturn = FreeRTOS_getaddrinfo_a( LOCAL_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1555
1556 TEST_ASSERT_EQUAL( 0, xReturn );
1557 TEST_ASSERT_EQUAL( 0, callback_called );
1558 TEST_ASSERT_EQUAL( FREERTOS_AF_INET4, pxAddress->ai_family );
1559 }
1560
1561 /**
1562 * @brief Get the IPv6 address from prvGetHostByName for .local domain successfully
1563 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_LocalDNSSuccess(void)1564 void test_FreeRTOS_getaddrinfo_a_IPv6Random_LocalDNSSuccess( void )
1565 {
1566 BaseType_t xReturn;
1567 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1568 struct freertos_addrinfo xHint, * pxHint = &xHint;
1569 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
1570 uint32_t ulRandom = 0x1234U;
1571 struct xSOCKET xDNSSocket;
1572 NetworkEndPoint_t xEndPoint;
1573 NetworkBufferDescriptor_t xNetworkBuffer;
1574 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
1575 struct xDNSBuffer xReceiveBuffer;
1576 DNSMessage_t * pxDNSMessageHeader = NULL;
1577 int i;
1578
1579 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1580 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1581 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
1582 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1583 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1584 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
1585 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
1586 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
1587
1588 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
1589
1590 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
1591 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
1592
1593 xEndPoint.bits.bIPv6 = pdTRUE;
1594 xEndPoint.ipv6_settings.ucDNSIndex = 0;
1595 memcpy( xEndPoint.ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
1596
1597 xHint.ai_family = FREERTOS_AF_INET6;
1598 xExpectedAddress.ai_family = FREERTOS_AF_INET6;
1599
1600 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
1601 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ipSIZE_OF_UDP_HEADER;
1602
1603 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
1604 pxDNSMessageHeader->usIdentifier = ulRandom;
1605
1606 FreeRTOS_inet_pton6_ExpectAndReturn( LOCAL_ADDRESS, NULL, 0 );
1607 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
1608 Prepare_CacheLookup_ExpectAndReturn( LOCAL_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
1609 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1610 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1611 vDNSSetCallBack_Expect( LOCAL_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
1612
1613 /* In prvGetHostByName */
1614 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
1615
1616 /* In prvGetHostByNameOp */
1617 /* In prvFillSockAddress */
1618 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1619
1620 /* Back prvGetHostByNameOp */
1621 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, FreeRTOS_htons( ipMDNS_PORT ), 0 );
1622 /* In prvSendBuffer */
1623 /* In prvGetPayloadBuffer */
1624 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
1625 /* Back prvSendBuffer */
1626 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
1627 /* Back prvGetHostByNameOp */
1628 DNS_ReadReply_ExpectAnyArgsAndReturn( ipconfigNETWORK_MTU );
1629 DNS_ReadReply_ReturnThruPtr_pxReceiveBuffer( &xReceiveBuffer );
1630 /* In prvDNSReply */
1631 DNS_ParseDNSReply_ExpectAnyArgsAndReturn( 1 );
1632 DNS_ParseDNSReply_ReturnThruPtr_ppxAddressInfo( &pxExpectedAddress );
1633 /* Back prvGetHostByNameOp */
1634 FreeRTOS_ReleaseUDPPayloadBuffer_Expect( xReceiveBuffer.pucPayloadBuffer );
1635
1636 /* Back prvGetHostByName */
1637 DNS_CloseSocket_Expect( &xDNSSocket );
1638
1639 xReturn = FreeRTOS_getaddrinfo_a( LOCAL_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1640
1641 TEST_ASSERT_EQUAL( 0, xReturn );
1642 TEST_ASSERT_EQUAL( 0, callback_called );
1643 TEST_ASSERT_EQUAL( FREERTOS_AF_INET6, pxAddress->ai_family );
1644 }
1645
1646 /**
1647 * @brief Unknown DNS preference in local DNS query
1648 */
test_FreeRTOS_getaddrinfo_a_IPv4Random_LocalDNSUnknownPreference(void)1649 void test_FreeRTOS_getaddrinfo_a_IPv4Random_LocalDNSUnknownPreference( void )
1650 {
1651 BaseType_t xReturn;
1652 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1653 struct freertos_addrinfo xHint, * pxHint = &xHint;
1654 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
1655 uint32_t ulRandom = 0x1234U;
1656 struct xSOCKET xDNSSocket;
1657 NetworkEndPoint_t xEndPoint;
1658 NetworkBufferDescriptor_t xNetworkBuffer;
1659 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
1660 struct xDNSBuffer xReceiveBuffer;
1661 DNSMessage_t * pxDNSMessageHeader = NULL;
1662 int i;
1663
1664 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1665 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1666 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
1667 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1668 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1669 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
1670 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
1671 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
1672
1673 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
1674
1675 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
1676 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
1677
1678 xEndPoint.bits.bIPv6 = pdFALSE;
1679 xEndPoint.ipv4_settings.ucDNSIndex = 0;
1680 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = DOTTED_IPV4_ADDRESS_UINT32;
1681
1682 xHint.ai_family = FREERTOS_AF_INET4;
1683 xExpectedAddress.ai_family = FREERTOS_AF_INET4;
1684
1685 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
1686 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_UDP_HEADER;
1687
1688 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
1689 pxDNSMessageHeader->usIdentifier = ulRandom;
1690
1691 xDNS_IP_Preference = xPreferenceNone;
1692
1693 FreeRTOS_inet_addr_ExpectAndReturn( LOCAL_ADDRESS, 0 );
1694 Prepare_CacheLookup_ExpectAndReturn( LOCAL_ADDRESS, FREERTOS_AF_INET4, &pxAddress, 0 );
1695 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1696 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1697 vDNSSetCallBack_Expect( LOCAL_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdFALSE );
1698
1699 /* In prvGetHostByName */
1700 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
1701
1702 /* Back prvGetHostByName */
1703 DNS_CloseSocket_Expect( &xDNSSocket );
1704
1705 xReturn = FreeRTOS_getaddrinfo_a( LOCAL_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1706
1707 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1708 TEST_ASSERT_EQUAL( 0, callback_called );
1709 }
1710
1711 /**
1712 * @brief Get the IPv6 address from prvGetHostByName for LLMNR successfully
1713 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_LLMNRDNSSuccess(void)1714 void test_FreeRTOS_getaddrinfo_a_IPv6Random_LLMNRDNSSuccess( void )
1715 {
1716 BaseType_t xReturn;
1717 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1718 struct freertos_addrinfo xHint, * pxHint = &xHint;
1719 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
1720 uint32_t ulRandom = 0x1234U;
1721 struct xSOCKET xDNSSocket;
1722 NetworkEndPoint_t xEndPoint;
1723 NetworkBufferDescriptor_t xNetworkBuffer;
1724 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
1725 struct xDNSBuffer xReceiveBuffer;
1726 DNSMessage_t * pxDNSMessageHeader = NULL;
1727 int i;
1728
1729 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1730 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1731 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
1732 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1733 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1734 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
1735 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
1736 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
1737
1738 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
1739
1740 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
1741 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
1742
1743 xEndPoint.bits.bIPv6 = pdTRUE;
1744 xEndPoint.ipv6_settings.ucDNSIndex = 0;
1745 memcpy( xEndPoint.ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
1746
1747 xHint.ai_family = FREERTOS_AF_INET6;
1748 xExpectedAddress.ai_family = FREERTOS_AF_INET6;
1749
1750 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
1751 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ipSIZE_OF_UDP_HEADER;
1752
1753 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
1754 pxDNSMessageHeader->usIdentifier = ulRandom;
1755
1756 FreeRTOS_inet_pton6_ExpectAndReturn( LLMNR_ADDRESS, NULL, 0 );
1757 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
1758 Prepare_CacheLookup_ExpectAndReturn( LLMNR_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
1759 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1760 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1761 vDNSSetCallBack_Expect( LLMNR_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
1762
1763 /* In prvGetHostByName */
1764 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
1765
1766 /* In prvGetHostByNameOp */
1767 /* In prvFillSockAddress */
1768 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1769
1770 /* Back prvGetHostByNameOp */
1771 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, 0U, 0 );
1772 /* In prvSendBuffer */
1773 /* In prvGetPayloadBuffer */
1774 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
1775 /* Back prvSendBuffer */
1776 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
1777 /* Back prvGetHostByNameOp */
1778 DNS_ReadReply_ExpectAnyArgsAndReturn( ipconfigNETWORK_MTU );
1779 DNS_ReadReply_ReturnThruPtr_pxReceiveBuffer( &xReceiveBuffer );
1780 /* In prvDNSReply */
1781 DNS_ParseDNSReply_ExpectAnyArgsAndReturn( 1 );
1782 DNS_ParseDNSReply_ReturnThruPtr_ppxAddressInfo( &pxExpectedAddress );
1783 /* Back prvGetHostByNameOp */
1784 FreeRTOS_ReleaseUDPPayloadBuffer_Expect( xReceiveBuffer.pucPayloadBuffer );
1785
1786 /* Back prvGetHostByName */
1787 DNS_CloseSocket_Expect( &xDNSSocket );
1788
1789 xReturn = FreeRTOS_getaddrinfo_a( LLMNR_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1790
1791 TEST_ASSERT_EQUAL( 0, xReturn );
1792 TEST_ASSERT_EQUAL( 0, callback_called );
1793 TEST_ASSERT_EQUAL( FREERTOS_AF_INET6, pxAddress->ai_family );
1794 }
1795
1796 /**
1797 * @brief No endpoint available for LLMNR DNS query
1798 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_LLMNRDNSNoEndPoint(void)1799 void test_FreeRTOS_getaddrinfo_a_IPv6Random_LLMNRDNSNoEndPoint( void )
1800 {
1801 BaseType_t xReturn;
1802 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1803 struct freertos_addrinfo xHint, * pxHint = &xHint;
1804 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
1805 uint32_t ulRandom = 0x1234U;
1806 struct xSOCKET xDNSSocket;
1807 NetworkBufferDescriptor_t xNetworkBuffer;
1808 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
1809 struct xDNSBuffer xReceiveBuffer;
1810 DNSMessage_t * pxDNSMessageHeader = NULL;
1811 int i;
1812
1813 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1814 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1815 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
1816 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1817 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
1818 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
1819 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
1820
1821 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
1822
1823 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
1824 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
1825
1826 xHint.ai_family = FREERTOS_AF_INET6;
1827 xExpectedAddress.ai_family = FREERTOS_AF_INET6;
1828
1829 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
1830 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ipSIZE_OF_UDP_HEADER;
1831
1832 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
1833 pxDNSMessageHeader->usIdentifier = ulRandom;
1834
1835 FreeRTOS_inet_pton6_ExpectAndReturn( LLMNR_ADDRESS, NULL, 0 );
1836 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
1837 Prepare_CacheLookup_ExpectAndReturn( LLMNR_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
1838 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1839 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1840 vDNSSetCallBack_Expect( LLMNR_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
1841
1842 /* In prvGetHostByName */
1843 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
1844
1845 /* In prvGetHostByNameOp */
1846 /* In prvFillSockAddress */
1847 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, NULL );
1848
1849 /* Back prvGetHostByName */
1850 DNS_CloseSocket_Expect( &xDNSSocket );
1851
1852 xReturn = FreeRTOS_getaddrinfo_a( LLMNR_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1853
1854 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1855 TEST_ASSERT_EQUAL( 0, callback_called );
1856 }
1857
1858 /**
1859 * @brief Unknown DNS preference in LLMNR DNS query
1860 */
test_FreeRTOS_getaddrinfo_a_IPv4Random_LLMNRDNSUnknownPreference(void)1861 void test_FreeRTOS_getaddrinfo_a_IPv4Random_LLMNRDNSUnknownPreference( void )
1862 {
1863 BaseType_t xReturn;
1864 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1865 struct freertos_addrinfo xHint, * pxHint = &xHint;
1866 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
1867 uint32_t ulRandom = 0x1234U;
1868 struct xSOCKET xDNSSocket;
1869 NetworkEndPoint_t xEndPoint;
1870 NetworkBufferDescriptor_t xNetworkBuffer;
1871 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
1872 struct xDNSBuffer xReceiveBuffer;
1873 DNSMessage_t * pxDNSMessageHeader = NULL;
1874 int i;
1875
1876 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1877 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1878 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
1879 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1880 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1881 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
1882 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
1883 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
1884
1885 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
1886
1887 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
1888 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
1889
1890 xEndPoint.bits.bIPv6 = pdFALSE;
1891
1892 xHint.ai_family = FREERTOS_AF_INET4;
1893 xExpectedAddress.ai_family = FREERTOS_AF_INET4;
1894
1895 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
1896 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ipSIZE_OF_UDP_HEADER;
1897
1898 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
1899 pxDNSMessageHeader->usIdentifier = ulRandom;
1900
1901 xDNS_IP_Preference = xPreferenceNone;
1902
1903 FreeRTOS_inet_addr_ExpectAndReturn( LLMNR_ADDRESS, 0 );
1904 Prepare_CacheLookup_ExpectAndReturn( LLMNR_ADDRESS, FREERTOS_AF_INET4, &pxAddress, 0 );
1905 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1906 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1907 vDNSSetCallBack_Expect( LLMNR_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdFALSE );
1908
1909 /* In prvGetHostByName */
1910 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
1911
1912 /* In prvGetHostByNameOp */
1913 /* In prvFillSockAddress */
1914
1915 /* Back prvGetHostByName */
1916 DNS_CloseSocket_Expect( &xDNSSocket );
1917
1918 xReturn = FreeRTOS_getaddrinfo_a( LLMNR_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
1919
1920 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1921 TEST_ASSERT_EQUAL( 0, callback_called );
1922 }
1923
1924 /**
1925 * @brief Fail to get the IPv4 address from prvGetHostByName for LLMNR
1926 */
test_FreeRTOS_getaddrinfo_a_IPv4Random_LLMNRFail(void)1927 void test_FreeRTOS_getaddrinfo_a_IPv4Random_LLMNRFail( void )
1928 {
1929 BaseType_t xReturn;
1930 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
1931 struct freertos_addrinfo xHint, * pxHint = &xHint;
1932 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
1933 uint32_t ulRandom = 0x1234U;
1934 struct xSOCKET xDNSSocket;
1935 NetworkEndPoint_t xEndPoint;
1936 NetworkBufferDescriptor_t xNetworkBuffer;
1937 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
1938 struct xDNSBuffer xReceiveBuffer;
1939 DNSMessage_t * pxDNSMessageHeader = NULL;
1940 int i;
1941
1942 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
1943 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
1944 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
1945 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
1946 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
1947 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
1948 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
1949 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
1950
1951 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
1952
1953 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
1954 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
1955
1956 xEndPoint.bits.bIPv6 = pdFALSE;
1957
1958 xHint.ai_family = FREERTOS_AF_INET4;
1959 xExpectedAddress.ai_family = FREERTOS_AF_INET4;
1960
1961 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
1962 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_UDP_HEADER;
1963
1964 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
1965 pxDNSMessageHeader->usIdentifier = ulRandom;
1966
1967 FreeRTOS_inet_addr_ExpectAndReturn( LLMNR_ADDRESS, 0 );
1968 Prepare_CacheLookup_ExpectAndReturn( LLMNR_ADDRESS, FREERTOS_AF_INET4, &pxAddress, 0 );
1969 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
1970 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
1971
1972 /* In prvGetHostByName */
1973 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
1974
1975 for( i = 0; i < ipconfigDNS_REQUEST_ATTEMPTS; i++ )
1976 {
1977 /* In prvGetHostByNameOp */
1978 /* In prvFillSockAddress */
1979 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1980
1981 /* Back prvGetHostByNameOp */
1982 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, 0U, 0 );
1983 /* In prvSendBuffer */
1984 /* In prvGetPayloadBuffer */
1985 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
1986 /* Back prvSendBuffer */
1987 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
1988 /* Back prvGetHostByNameOp */
1989 DNS_ReadReply_ExpectAnyArgsAndReturn( 0 );
1990 }
1991
1992 /* Back prvGetHostByName */
1993 DNS_CloseSocket_Expect( &xDNSSocket );
1994
1995 xReturn = FreeRTOS_getaddrinfo_a( LLMNR_ADDRESS, "Service", pxHint, &pxAddress, NULL, NULL, 0U );
1996
1997 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
1998 TEST_ASSERT_EQUAL( 0, callback_called );
1999 }
2000
2001 /**
2002 * @brief Fail to get the IPv6 address from prvGetHostByName for LLMNR
2003 */
test_FreeRTOS_getaddrinfo_a_IPv6Random_LLMNRFail(void)2004 void test_FreeRTOS_getaddrinfo_a_IPv6Random_LLMNRFail( void )
2005 {
2006 BaseType_t xReturn;
2007 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
2008 struct freertos_addrinfo xHint, * pxHint = &xHint;
2009 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
2010 uint32_t ulRandom = 0x1234U;
2011 struct xSOCKET xDNSSocket;
2012 NetworkEndPoint_t xEndPoint;
2013 NetworkBufferDescriptor_t xNetworkBuffer;
2014 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
2015 struct xDNSBuffer xReceiveBuffer;
2016 DNSMessage_t * pxDNSMessageHeader = NULL;
2017 int i;
2018
2019 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
2020 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
2021 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
2022 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
2023 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
2024 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
2025 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
2026 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
2027
2028 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
2029
2030 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
2031 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
2032
2033 xEndPoint.bits.bIPv6 = pdTRUE;
2034
2035 xHint.ai_family = FREERTOS_AF_INET6;
2036 xExpectedAddress.ai_family = FREERTOS_AF_INET6;
2037
2038 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
2039 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ipSIZE_OF_UDP_HEADER;
2040
2041 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
2042 pxDNSMessageHeader->usIdentifier = ulRandom;
2043
2044 FreeRTOS_inet_pton6_ExpectAndReturn( LLMNR_ADDRESS, NULL, 0 );
2045 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
2046 Prepare_CacheLookup_ExpectAndReturn( LLMNR_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
2047 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
2048 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
2049
2050 /* In prvGetHostByName */
2051 DNS_CreateSocket_ExpectAnyArgsAndReturn( &xDNSSocket );
2052
2053 for( i = 0; i < ipconfigDNS_REQUEST_ATTEMPTS; i++ )
2054 {
2055 /* In prvGetHostByNameOp */
2056 /* In prvFillSockAddress */
2057 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2058
2059 /* Back prvGetHostByNameOp */
2060 DNS_BindSocket_ExpectAndReturn( &xDNSSocket, 0U, 0 );
2061 /* In prvSendBuffer */
2062 /* In prvGetPayloadBuffer */
2063 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
2064 /* Back prvSendBuffer */
2065 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
2066 /* Back prvGetHostByNameOp */
2067 DNS_ReadReply_ExpectAnyArgsAndReturn( 0 );
2068 }
2069
2070 /* Back prvGetHostByName */
2071 DNS_CloseSocket_Expect( &xDNSSocket );
2072
2073 xReturn = FreeRTOS_getaddrinfo_a( LLMNR_ADDRESS, "Service", pxHint, &pxAddress, NULL, NULL, 0U );
2074
2075 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOENT, xReturn );
2076 TEST_ASSERT_EQUAL( 0, callback_called );
2077 }
2078
2079 /**
2080 * @brief IP address found with IPv4 domain input but the address returned is NULL.
2081 */
test_FreeRTOS_getaddrinfo_a_IPv4DomainCacheFoundButNull(void)2082 void test_FreeRTOS_getaddrinfo_a_IPv4DomainCacheFoundButNull( void )
2083 {
2084 BaseType_t xReturn;
2085 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
2086 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
2087
2088 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
2089 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
2090
2091 xExpectedAddress.ai_family = FREERTOS_AF_INET4;
2092
2093 FreeRTOS_inet_addr_ExpectAndReturn( GOOD_ADDRESS, 0 );
2094 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET4, &pxAddress, DOTTED_IPV4_ADDRESS_UINT32 );
2095
2096 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", NULL, &pxAddress, dns_callback, NULL, 0U );
2097
2098 TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_ENOMEM, xReturn );
2099 }
2100
2101 /**
2102 * @brief Get the IP address from prvGetHostByName successfully
2103 */
test_FreeRTOS_getaddrinfo_a_IPv4Random_PortSpecified(void)2104 void test_FreeRTOS_getaddrinfo_a_IPv4Random_PortSpecified( void )
2105 {
2106 BaseType_t xReturn;
2107 struct freertos_addrinfo xAddress, * pxAddress = &xAddress;
2108 struct freertos_addrinfo xHint, * pxHint = &xHint;
2109 struct freertos_addrinfo xExpectedAddress, * pxExpectedAddress = &xExpectedAddress;
2110 uint32_t ulRandom = 0x1234U;
2111 struct xSOCKET xDNSSocket;
2112 NetworkEndPoint_t xEndPoint;
2113 NetworkBufferDescriptor_t xNetworkBuffer;
2114 uint8_t ucEtherBuffer[ ipconfigNETWORK_MTU + ipBUFFER_PADDING ];
2115 struct xDNSBuffer xReceiveBuffer;
2116 DNSMessage_t * pxDNSMessageHeader = NULL;
2117 uint16_t usExpectPort = 0x1234;
2118
2119 memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
2120 memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
2121 memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
2122 memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
2123 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
2124 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
2125 memset( &ucEtherBuffer, 0, sizeof( ucEtherBuffer ) );
2126 memset( &xReceiveBuffer, 0, sizeof( struct xDNSBuffer ) );
2127
2128 xNetworkBuffer.xDataLength = ipconfigNETWORK_MTU;
2129
2130 xNetworkBuffer.pucEthernetBuffer = ucEtherBuffer;
2131 xNetworkBuffer.pucEthernetBuffer += ipBUFFER_PADDING;
2132
2133 xEndPoint.bits.bIPv6 = pdTRUE;
2134 xEndPoint.ipv6_settings.ucDNSIndex = 0;
2135 memcpy( xEndPoint.ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2136
2137 xHint.ai_family = FREERTOS_AF_INET6;
2138 xExpectedAddress.ai_family = FREERTOS_AF_INET6;
2139
2140 xReceiveBuffer.pucPayloadBuffer = ucEtherBuffer;
2141 xReceiveBuffer.pucPayloadBuffer += ipBUFFER_PADDING + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ipSIZE_OF_UDP_HEADER;
2142
2143 pxDNSMessageHeader = ( DNSMessage_t * ) xReceiveBuffer.pucPayloadBuffer;
2144 pxDNSMessageHeader->usIdentifier = ulRandom;
2145
2146 xDNSSocket.usLocalPort = FreeRTOS_htons( usExpectPort );
2147
2148 FreeRTOS_inet_pton6_ExpectAndReturn( GOOD_ADDRESS, NULL, 0 );
2149 FreeRTOS_inet_pton6_IgnoreArg_pvDestination();
2150 Prepare_CacheLookup_ExpectAndReturn( GOOD_ADDRESS, FREERTOS_AF_INET6, &pxAddress, 0 );
2151 xApplicationGetRandomNumber_ExpectAnyArgsAndReturn( pdTRUE );
2152 xApplicationGetRandomNumber_ReturnMemThruPtr_pulNumber( &ulRandom, sizeof( uint32_t ) );
2153 vDNSSetCallBack_Expect( GOOD_ADDRESS, NULL, dns_callback, 0U, ulRandom, pdTRUE );
2154
2155 /* In prvGetHostByName */
2156 DNS_CreateSocket_ExpectAndReturn( 0U, &xDNSSocket );
2157 /* In prvGetHostByNameOp */
2158 /* In prvFillSockAddress */
2159 FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2160
2161 /* In prvSendBuffer */
2162 /* In prvGetPayloadBuffer */
2163 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
2164 /* Back prvSendBuffer */
2165 DNS_SendRequest_ExpectAnyArgsAndReturn( pdPASS );
2166 /* Back prvGetHostByNameOp */
2167 DNS_ReadReply_ExpectAnyArgsAndReturn( ipconfigNETWORK_MTU );
2168 DNS_ReadReply_ReturnThruPtr_pxReceiveBuffer( &xReceiveBuffer );
2169 /* In prvDNSReply */
2170 DNS_ParseDNSReply_ExpectAnyArgsAndReturn( 1 );
2171 DNS_ParseDNSReply_ReturnThruPtr_ppxAddressInfo( &pxExpectedAddress );
2172 /* Back prvGetHostByNameOp */
2173 FreeRTOS_ReleaseUDPPayloadBuffer_Expect( xReceiveBuffer.pucPayloadBuffer );
2174
2175 /* Back prvGetHostByName */
2176 DNS_CloseSocket_Expect( &xDNSSocket );
2177
2178 xReturn = FreeRTOS_getaddrinfo_a( GOOD_ADDRESS, "Service", pxHint, &pxAddress, dns_callback, NULL, 0U );
2179
2180 TEST_ASSERT_EQUAL( 0, xReturn );
2181 TEST_ASSERT_EQUAL( 0, callback_called );
2182 TEST_ASSERT_EQUAL( FREERTOS_AF_INET6, pxAddress->ai_family );
2183 }
2184
2185 /**
2186 * @brief No memory available for malloc.
2187 */
test_pxNew_AddrInfo_MallocFail(void)2188 void test_pxNew_AddrInfo_MallocFail( void )
2189 {
2190 struct freertos_addrinfo * pxAddress;
2191
2192 isMallocFail = true;
2193
2194 pxAddress = pxNew_AddrInfo( GOOD_ADDRESS, FREERTOS_AF_INET4, NULL );
2195
2196 TEST_ASSERT_EQUAL( NULL, pxAddress );
2197 }
2198
2199 /**
2200 * @brief Unknown family input.
2201 */
test_pxNew_AddrInfo_UnknownFamily(void)2202 void test_pxNew_AddrInfo_UnknownFamily( void )
2203 {
2204 struct freertos_addrinfo * pxAddress;
2205
2206 pxAddress = pxNew_AddrInfo( GOOD_ADDRESS, FREERTOS_AF_INET4 + 1, NULL );
2207
2208 TEST_ASSERT_EQUAL( NULL, pxAddress );
2209 }
2210
2211 /**
2212 * @brief Input with NULL pointer.
2213 */
test_FreeRTOS_freeaddrinfo_NullInput(void)2214 void test_FreeRTOS_freeaddrinfo_NullInput( void )
2215 {
2216 FreeRTOS_freeaddrinfo( NULL );
2217 }
2218