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_Sockets.h"
37 #include "mock_FreeRTOS_IP_Private.h"
38 #include "mock_FreeRTOS_IP_Timers.h"
39 #include "mock_task.h"
40 #include "mock_queue.h"
41 #include "mock_portable.h"
42 
43 #include "FreeRTOS_DNS_Callback.h"
44 
45 #include "mock_list.h"
46 #include "mock_Sockets_list_macros.h"
47 
48 #include "mock_FreeRTOS_DNS_Parser.h"
49 #include "mock_NetworkBufferManagement.h"
50 #include "FreeRTOS_DNS.h"
51 
52 #include "catch_assert.h"
53 
54 #include "FreeRTOSIPConfig.h"
55 
56 #define LLMNR_ADDRESS     "freertos"
57 #define GOOD_ADDRESS      "www.freertos.org"
58 #define BAD_ADDRESS       "this is a bad address"
59 #define DOTTED_ADDRESS    "192.268.0.1"
60 
61 typedef void (* FOnDNSEvent ) ( const char * /* pcName */,
62                                 void * /* pvSearchID */,
63                                 struct freertos_addrinfo * /* pxAddressInfo */ );
64 
65 /* ===========================   GLOBAL VARIABLES =========================== */
66 static int callback_called = 0;
67 
68 
69 /* ===========================  STATIC FUNCTIONS  =========================== */
dns_callback(const char * pcName,void * pvSearchID,uint32_t ulIPAddress)70 static void dns_callback( const char * pcName,
71                           void * pvSearchID,
72                           uint32_t ulIPAddress )
73 {
74     callback_called = 1;
75 }
76 
77 
78 static DNSCallback_t dnsCallback;
79 /* ============================  TEST FIXTURES  ============================= */
80 
81 /**
82  * @brief calls at the beginning of each test case
83  */
setUp(void)84 void setUp( void )
85 {
86     vListInitialise_ExpectAnyArgs();
87     vDNSCallbackInitialise();
88     callback_called = 0;
89     memset( &dnsCallback, 0x00, sizeof( DNSCallback_t ) );
90 }
91 
92 /**
93  * @brief calls at the end of each test case
94  */
tearDown(void)95 void tearDown( void )
96 {
97 }
98 
99 /* =============================  TEST CASES  =============================== */
100 
101 /**
102  * @brief Happy Path identifier passed is not found!
103  */
test_xDNSDoCallback_success_not_equal_identifier(void)104 void test_xDNSDoCallback_success_not_equal_identifier( void )
105 {
106     BaseType_t ret;
107     ParseSet_t pxSet;
108     struct freertos_addrinfo pxAddress;
109     DNSMessage_t xDNSMessageHeader;
110 
111     pxSet.pxDNSMessageHeader = &xDNSMessageHeader;
112     pxSet.pxDNSMessageHeader->usIdentifier = 123;
113     char pc_name[] = "test";
114     strcpy( pxSet.pcName, pc_name );
115 
116     listGET_LIST_ITEM_OWNER_IgnoreAndReturn( ( DNSCallback_t * ) 1234 );
117     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 4 ); /* xEnd */
118     vTaskSuspendAll_Expect();
119     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
120 
121     listGET_LIST_ITEM_VALUE_ExpectAnyArgsAndReturn( 12345 );
122     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 4 );
123 
124     xTaskResumeAll_ExpectAndReturn( pdFALSE );
125 
126     ret = xDNSDoCallback( &pxSet, &pxAddress );
127     TEST_ASSERT_EQUAL( pdFALSE, ret );
128 }
129 
130 /**
131  * @brief Happy Path!
132  */
test_xDNSDoCallback_success_equal_identifier(void)133 void test_xDNSDoCallback_success_equal_identifier( void )
134 {
135     BaseType_t ret;
136     ParseSet_t pxSet;
137     struct freertos_addrinfo pxAddress;
138     DNSMessage_t xDNSMessageHeader;
139 
140     pxSet.pxDNSMessageHeader = &xDNSMessageHeader;
141     pxSet.pxDNSMessageHeader->usIdentifier = 123;
142     char pc_name[] = "test";
143     strcpy( pxSet.pcName, pc_name );
144 
145     dnsCallback.pCallbackFunction = dns_callback;
146 
147     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 4 );
148 
149     vTaskSuspendAll_Expect();
150     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
151 
152     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
153     listGET_LIST_ITEM_VALUE_ExpectAnyArgsAndReturn( 123 );
154     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
155     vPortFree_ExpectAnyArgs();
156     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdFALSE );
157 
158     xTaskResumeAll_ExpectAndReturn( pdFALSE );
159 
160     ret = xDNSDoCallback( &pxSet, &pxAddress );
161     TEST_ASSERT_EQUAL( pdTRUE, ret );
162     TEST_ASSERT_EQUAL( 1, callback_called );
163 }
164 
165 /**
166  * @brief Happy Path!
167  */
test_xDNSDoCallback_success_equal_identifier_set_timer(void)168 void test_xDNSDoCallback_success_equal_identifier_set_timer( void )
169 {
170     BaseType_t ret;
171     ParseSet_t pxSet;
172     struct freertos_addrinfo pxAddress;
173     DNSMessage_t xDNSMessageHeader;
174 
175     pxSet.pxDNSMessageHeader = &xDNSMessageHeader;
176     pxSet.pxDNSMessageHeader->usIdentifier = 123;
177     char pc_name[] = "test";
178     strcpy( pxSet.pcName, pc_name );
179     dnsCallback.pCallbackFunction = dns_callback;
180 
181     /* Expectations */
182     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 4 );
183     vTaskSuspendAll_Expect();
184     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
185 
186     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
187     listGET_LIST_ITEM_VALUE_ExpectAnyArgsAndReturn( 123 );
188     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
189     vPortFree_ExpectAnyArgs();
190     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
191 
192     vIPSetDNSTimerEnableState_ExpectAnyArgs();
193 
194     xTaskResumeAll_ExpectAndReturn( pdFALSE );
195     /* API Call */
196     ret = xDNSDoCallback( &pxSet, &pxAddress );
197 
198     /* Validations */
199     TEST_ASSERT_EQUAL( pdTRUE, ret );
200     TEST_ASSERT_EQUAL( 1, callback_called );
201 }
202 
203 /**
204  * @brief Happy Path!
205  */
test_vDNSSetCallback_success(void)206 void test_vDNSSetCallback_success( void )
207 {
208     void * pvSearchID = NULL;
209 
210     /* Expectations */
211     pvPortMalloc_ExpectAnyArgsAndReturn( &dnsCallback );
212     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdFALSE );
213     vTaskSetTimeOutState_ExpectAnyArgs();
214     listSET_LIST_ITEM_OWNER_ExpectAnyArgs();
215     listSET_LIST_ITEM_VALUE_ExpectAnyArgs();
216     vTaskSuspendAll_Expect();
217     vListInsertEnd_ExpectAnyArgs();
218     xTaskResumeAll_ExpectAndReturn( pdFALSE );
219 
220     /* API Call */
221     vDNSSetCallBack( "hostname", pvSearchID, dns_callback, 56, 123, pdFALSE );
222 
223     /* Validations */
224     TEST_ASSERT_EQUAL( 0, strcmp( dnsCallback.pcName, "hostname" ) );
225     TEST_ASSERT_EQUAL( dns_callback, dnsCallback.pCallbackFunction );
226     TEST_ASSERT_EQUAL( pvSearchID, dnsCallback.pvSearchID );
227     TEST_ASSERT_EQUAL( 56, dnsCallback.uxRemainingTime );
228 }
229 
230 /**
231  * @brief Happy Path!
232  */
test_vDNSSetCallback_success_empty_list(void)233 void test_vDNSSetCallback_success_empty_list( void )
234 {
235     void * pvSearchID = NULL;
236 
237     /* Expectations */
238     pvPortMalloc_ExpectAnyArgsAndReturn( &dnsCallback );
239     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
240     FreeRTOS_min_uint32_ExpectAnyArgsAndReturn( 0 );
241     vDNSTimerReload_ExpectAnyArgs();
242     vTaskSetTimeOutState_ExpectAnyArgs();
243     listSET_LIST_ITEM_OWNER_ExpectAnyArgs();
244     listSET_LIST_ITEM_VALUE_ExpectAnyArgs();
245     vTaskSuspendAll_Expect();
246     vListInsertEnd_ExpectAnyArgs();
247     xTaskResumeAll_ExpectAndReturn( pdFALSE );
248 
249     /* API Call */
250     vDNSSetCallBack( "hostname", pvSearchID, dns_callback, 56, 123, pdFALSE );
251 
252     /* Validations */
253     TEST_ASSERT_EQUAL( 0, strcmp( dnsCallback.pcName, "hostname" ) );
254     TEST_ASSERT_EQUAL( dns_callback, dnsCallback.pCallbackFunction );
255     TEST_ASSERT_EQUAL( pvSearchID, dnsCallback.pvSearchID );
256     TEST_ASSERT_EQUAL( 56, dnsCallback.uxRemainingTime );
257 }
258 
259 /**
260  * @brief Memory Allocation failed
261  */
test_vDNSSetCallback_malloc_failed(void)262 void test_vDNSSetCallback_malloc_failed( void )
263 {
264     void * pvSearchID = NULL;
265 
266     /* Expectations */
267     pvPortMalloc_ExpectAnyArgsAndReturn( NULL );
268 
269     /* API Call */
270     vDNSSetCallBack( "hostname", pvSearchID, dns_callback, 56, 123, pdFALSE );
271 }
272 
273 
274 /**
275  * @brief Happy path
276  */
test_vDNSCheckCallback_success_search_id_not_null(void)277 void test_vDNSCheckCallback_success_search_id_not_null( void )
278 {
279     void * pvSearchID = ( void * ) 456;
280 
281     dnsCallback.pvSearchID = pvSearchID;
282 
283     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
284     vListInitialise_ExpectAnyArgs();
285     vTaskSuspendAll_Expect();
286     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
287     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
288     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 ); /* end marker */
289     uxListRemove_ExpectAnyArgsAndReturn( pdFALSE );
290     vPortFree_ExpectAnyArgs();
291     xTaskResumeAll_ExpectAndReturn( pdFALSE );
292     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
293     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
294     vIPSetDNSTimerEnableState_ExpectAnyArgs();
295 
296     /* API Call */
297     vDNSCheckCallBack( pvSearchID );
298 
299     /* Validations */
300 }
301 
302 /**
303  * @brief Happy path with list non-empty at end.
304  */
test_vDNSCheckCallback_success_search_id_not_null_list_empty(void)305 void test_vDNSCheckCallback_success_search_id_not_null_list_empty( void )
306 {
307     void * pvSearchID = ( void * ) 456;
308 
309     dnsCallback.pvSearchID = pvSearchID;
310 
311     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
312     vListInitialise_ExpectAnyArgs();
313     vTaskSuspendAll_Expect();
314     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
315     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
316     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 ); /* end marker */
317     uxListRemove_ExpectAnyArgsAndReturn( pdFALSE );
318     vPortFree_ExpectAnyArgs();
319     xTaskResumeAll_ExpectAndReturn( pdFALSE );
320     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
321     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdFALSE );
322 
323     /* API Call */
324     vDNSCheckCallBack( pvSearchID );
325 
326     /* Validations */
327 }
328 
329 /**
330  * @brief search id null
331  */
test_vDNSCheckCallback_success_search_id_null(void)332 void test_vDNSCheckCallback_success_search_id_null( void )
333 {
334     void * pvSearchID = ( void * ) 456;
335 
336     dnsCallback.pvSearchID = pvSearchID;
337 
338     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
339     vListInitialise_ExpectAnyArgs();
340     vTaskSuspendAll_Expect();
341     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
342     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
343     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 ); /* end marker */
344 
345     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFALSE );
346 
347     xTaskResumeAll_ExpectAndReturn( pdFALSE );
348     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
349     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
350     vIPSetDNSTimerEnableState_ExpectAnyArgs();
351 
352     /* API Call */
353     vDNSCheckCallBack( NULL );
354 
355     /* Validations */
356 }
357 
358 /**
359  * @brief search id null
360  */
test_vDNSCheckCallback_success_search_id_null_timeout(void)361 void test_vDNSCheckCallback_success_search_id_null_timeout( void )
362 {
363     List_t xTempList;
364     void * pvSearchID = ( void * ) 456;
365 
366     dnsCallback.pvSearchID = pvSearchID;
367     dnsCallback.xIsIPv6 = 0;
368     dnsCallback.pCallbackFunction = dns_callback;
369 
370     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
371     vListInitialise_ExpectAnyArgs();
372     vTaskSuspendAll_Expect();
373     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
374     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
375     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 ); /* end marker */
376 
377     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
378     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
379     vListInsertEnd_ExpectAnyArgs();
380 
381     xTaskResumeAll_ExpectAndReturn( pdFALSE );
382     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdFALSE );
383 
384     listGET_END_MARKER_ExpectAnyArgsAndReturn( NULL );
385     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
386     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
387     listGET_NEXT_ExpectAnyArgsAndReturn( NULL ); /* end marker */
388     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
389     vPortFree_ExpectAnyArgs();
390 
391     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
392     vIPSetDNSTimerEnableState_ExpectAnyArgs();
393 
394     /* API Call */
395     vDNSCheckCallBack( NULL );
396 
397     /* Validations */
398     TEST_ASSERT_EQUAL( 1, callback_called );
399 }
400 
401 /**
402  * @brief search id null same as the above function but calling IPv6
403  *        sub-branch
404  */
test_vDNSCheckCallback_success_search_id_null_timeout_IPv6(void)405 void test_vDNSCheckCallback_success_search_id_null_timeout_IPv6( void )
406 {
407     List_t xTempList;
408     void * pvSearchID = ( void * ) 456;
409 
410     dnsCallback.pvSearchID = pvSearchID;
411     dnsCallback.xIsIPv6 = 1;
412     dnsCallback.pCallbackFunction = dns_callback;
413 
414     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
415     vListInitialise_ExpectAnyArgs();
416     vTaskSuspendAll_Expect();
417     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
418     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
419     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 ); /* end marker */
420 
421     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
422     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
423     vListInsertEnd_ExpectAnyArgs();
424 
425     xTaskResumeAll_ExpectAndReturn( pdFALSE );
426     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdFALSE );
427 
428     listGET_END_MARKER_ExpectAnyArgsAndReturn( NULL );
429     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
430     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
431     listGET_NEXT_ExpectAnyArgsAndReturn( NULL ); /* end marker */
432     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
433     vPortFree_ExpectAnyArgs();
434 
435     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
436     vIPSetDNSTimerEnableState_ExpectAnyArgs();
437 
438     /* API Call */
439     vDNSCheckCallBack( NULL );
440 
441     /* Validations */
442     TEST_ASSERT_EQUAL( 1, callback_called );
443 }
444 
445 /**
446  * @brief search id null same as the above function but hitting a different
447  *        sub-branch
448  */
test_vDNSCheckCallback_success_search_id_null_timeout2(void)449 void test_vDNSCheckCallback_success_search_id_null_timeout2( void )
450 {
451     void * pvSearchID = ( void * ) 456;
452     void * pvSearchID2 = ( void * ) 457;
453 
454     dnsCallback.pvSearchID = pvSearchID2;
455     dnsCallback.xIsIPv6 = 0;
456     dnsCallback.pCallbackFunction = dns_callback;
457 
458     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
459     vListInitialise_ExpectAnyArgs();
460     vTaskSuspendAll_Expect();
461     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
462     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
463     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 ); /* end marker */
464 
465     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
466     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
467     vListInsertEnd_ExpectAnyArgs();
468 
469     xTaskResumeAll_ExpectAndReturn( pdFALSE );
470     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdFALSE );
471 
472     listGET_END_MARKER_ExpectAnyArgsAndReturn( NULL );
473     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
474     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
475     listGET_NEXT_ExpectAnyArgsAndReturn( NULL ); /* end marker */
476     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
477     vPortFree_ExpectAnyArgs();
478 
479     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
480     vIPSetDNSTimerEnableState_ExpectAnyArgs();
481 
482     /* API Call */
483     vDNSCheckCallBack( pvSearchID );
484 
485     /* Validations */
486     TEST_ASSERT_EQUAL( 1, callback_called );
487 }
488 
489 /**
490  * @brief search id null same as the above function but calling IPv6
491  *        sub-branch
492  */
test_vDNSCheckCallback_success_search_id_null_timeout2_IPv6(void)493 void test_vDNSCheckCallback_success_search_id_null_timeout2_IPv6( void )
494 {
495     void * pvSearchID = ( void * ) 456;
496     void * pvSearchID2 = ( void * ) 457;
497 
498     dnsCallback.pvSearchID = pvSearchID2;
499     dnsCallback.xIsIPv6 = 1;
500     dnsCallback.pCallbackFunction = dns_callback;
501 
502     listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 );
503     vListInitialise_ExpectAnyArgs();
504     vTaskSuspendAll_Expect();
505     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
506     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
507     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 8 ); /* end marker */
508 
509     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdTRUE );
510     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
511     vListInsertEnd_ExpectAnyArgs();
512 
513     xTaskResumeAll_ExpectAndReturn( pdFALSE );
514     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdFALSE );
515 
516     listGET_END_MARKER_ExpectAnyArgsAndReturn( NULL );
517     listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) 16 );
518     listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &dnsCallback );
519     listGET_NEXT_ExpectAnyArgsAndReturn( NULL ); /* end marker */
520     uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
521     vPortFree_ExpectAnyArgs();
522 
523     listLIST_IS_EMPTY_ExpectAnyArgsAndReturn( pdTRUE );
524     vIPSetDNSTimerEnableState_ExpectAnyArgs();
525 
526     /* API Call */
527     vDNSCheckCallBack( pvSearchID );
528 
529     /* Validations */
530     TEST_ASSERT_EQUAL( 1, callback_called );
531 }
532