@@ -2544,6 +2544,21 @@ static const char *mock_nrf_inet_ntop_ipv6_callback(int af, const void *src, cha
25442544 return dst ;
25452545}
25462546
2547+ /* Helper callback for mocking nrf_inet_ntop with multiple IPv4 addresses */
2548+ static const char * mock_nrf_inet_ntop_ipv4_multi_callback (int af , const void * src , char * dst ,
2549+ nrf_socklen_t size , int num_calls )
2550+ {
2551+ const struct nrf_in_addr * addr = src ;
2552+
2553+ if (af == NRF_AF_INET && addr -> s_addr == net_htonl (0xC0A80001 )) {
2554+ strcpy (dst , "192.168.0.1" );
2555+ } else if (af == NRF_AF_INET && addr -> s_addr == net_htonl (0x0A000002 )) {
2556+ strcpy (dst , "10.0.0.2" );
2557+ }
2558+
2559+ return dst ;
2560+ }
2561+
25472562/* Helper callback for mocking successful nrf_getaddrinfo (IPv4) */
25482563static int mock_nrf_getaddrinfo_ipv4_callback (const char * nodename , const char * servname ,
25492564 const struct nrf_addrinfo * hints ,
@@ -2571,6 +2586,41 @@ static int mock_nrf_getaddrinfo_ipv4_callback(const char *nodename, const char *
25712586 return 0 ;
25722587}
25732588
2589+ /* Helper callback for mocking successful nrf_getaddrinfo (multiple IPv4 results) */
2590+ static int mock_nrf_getaddrinfo_ipv4_multi_callback (const char * nodename , const char * servname ,
2591+ const struct nrf_addrinfo * hints ,
2592+ struct nrf_addrinfo * * res , int num_calls )
2593+ {
2594+ static struct {
2595+ struct nrf_addrinfo ai [2 ];
2596+ struct nrf_sockaddr_in sa [2 ];
2597+ } result ;
2598+
2599+ memset (& result , 0 , sizeof (result ));
2600+
2601+ result .sa [0 ].sin_family = NRF_AF_INET ;
2602+ result .sa [0 ].sin_addr .s_addr = net_htonl (0xC0A80001 ); /* 192.168.0.1 */
2603+ result .sa [1 ].sin_family = NRF_AF_INET ;
2604+ result .sa [1 ].sin_addr .s_addr = net_htonl (0x0A000002 ); /* 10.0.0.2 */
2605+
2606+ result .ai [0 ].ai_family = NRF_AF_INET ;
2607+ result .ai [0 ].ai_socktype = NRF_SOCK_STREAM ;
2608+ result .ai [0 ].ai_protocol = NRF_IPPROTO_TCP ;
2609+ result .ai [0 ].ai_addrlen = sizeof (result .sa [0 ]);
2610+ result .ai [0 ].ai_addr = (struct nrf_sockaddr * )& result .sa [0 ];
2611+ result .ai [0 ].ai_next = & result .ai [1 ];
2612+
2613+ result .ai [1 ].ai_family = NRF_AF_INET ;
2614+ result .ai [1 ].ai_socktype = NRF_SOCK_STREAM ;
2615+ result .ai [1 ].ai_protocol = NRF_IPPROTO_TCP ;
2616+ result .ai [1 ].ai_addrlen = sizeof (result .sa [1 ]);
2617+ result .ai [1 ].ai_addr = (struct nrf_sockaddr * )& result .sa [1 ];
2618+ result .ai [1 ].ai_next = NULL ;
2619+
2620+ * res = & result .ai [0 ];
2621+ return 0 ;
2622+ }
2623+
25742624/* Helper callback for mocking successful nrf_getaddrinfo (IPv6) */
25752625static int mock_nrf_getaddrinfo_ipv6_callback (const char * nodename , const char * servname ,
25762626 const struct nrf_addrinfo * hints ,
@@ -2626,6 +2676,27 @@ void test_xgetaddrinfo_ipv4(void)
26262676 TEST_ASSERT_TRUE (strstr (response , "OK" ) != NULL );
26272677}
26282678
2679+ /*
2680+ * Test: Resolve hostname via AT#XGETADDRINFO command with multiple IPv4 results
2681+ * - Command: AT#XGETADDRINFO="hostname"
2682+ * - Tests: Iteration uses each addrinfo entry address
2683+ */
2684+ void test_xgetaddrinfo_ipv4_multiple_results (void )
2685+ {
2686+ const char * response ;
2687+
2688+ __cmock_nrf_getaddrinfo_Stub (mock_nrf_getaddrinfo_ipv4_multi_callback );
2689+ __cmock_nrf_inet_ntop_Stub (mock_nrf_inet_ntop_ipv4_multi_callback );
2690+ __cmock_nrf_freeaddrinfo_Expect (NULL );
2691+ __cmock_nrf_freeaddrinfo_IgnoreArg_ai ();
2692+
2693+ send_at_command ("AT#XGETADDRINFO=\"example.com\"\r\n" );
2694+
2695+ response = get_captured_response ();
2696+ TEST_ASSERT_TRUE (strstr (response , "#XGETADDRINFO: \"192.168.0.1 10.0.0.2\"" ) != NULL );
2697+ TEST_ASSERT_TRUE (strstr (response , "OK" ) != NULL );
2698+ }
2699+
26292700/*
26302701 * Test: Resolve hostname via AT#XGETADDRINFO command (IPv6)
26312702 * - Command: AT#XGETADDRINFO="hostname",2
0 commit comments