Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/src/sm_at_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -2211,13 +2211,13 @@ STATIC int handle_at_getaddrinfo(enum at_parser_cmd_type cmd_type, struct at_par
for (res = result; res != NULL; res = res->ai_next) {
if (res->ai_family == NRF_AF_INET) {
struct nrf_sockaddr_in *host =
(struct nrf_sockaddr_in *)result->ai_addr;
(struct nrf_sockaddr_in *)res->ai_addr;

nrf_inet_ntop(NRF_AF_INET, &host->sin_addr, hostname,
sizeof(hostname));
} else if (res->ai_family == NRF_AF_INET6) {
struct nrf_sockaddr_in6 *host =
(struct nrf_sockaddr_in6 *)result->ai_addr;
(struct nrf_sockaddr_in6 *)res->ai_addr;

nrf_inet_ntop(NRF_AF_INET6, &host->sin6_addr, hostname,
sizeof(hostname));
Expand Down
71 changes: 71 additions & 0 deletions app/tests/at_socket/src/test_at_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -2544,6 +2544,21 @@ static const char *mock_nrf_inet_ntop_ipv6_callback(int af, const void *src, cha
return dst;
}

/* Helper callback for mocking nrf_inet_ntop with multiple IPv4 addresses */
static const char *mock_nrf_inet_ntop_ipv4_multi_callback(int af, const void *src, char *dst,
nrf_socklen_t size, int num_calls)
{
const struct nrf_in_addr *addr = src;

if (af == NRF_AF_INET && addr->s_addr == net_htonl(0xC0A80001)) {
strcpy(dst, "192.168.0.1");
} else if (af == NRF_AF_INET && addr->s_addr == net_htonl(0x0A000002)) {
strcpy(dst, "10.0.0.2");
}

return dst;
}

/* Helper callback for mocking successful nrf_getaddrinfo (IPv4) */
static int mock_nrf_getaddrinfo_ipv4_callback(const char *nodename, const char *servname,
const struct nrf_addrinfo *hints,
Expand Down Expand Up @@ -2571,6 +2586,41 @@ static int mock_nrf_getaddrinfo_ipv4_callback(const char *nodename, const char *
return 0;
}

/* Helper callback for mocking successful nrf_getaddrinfo (multiple IPv4 results) */
static int mock_nrf_getaddrinfo_ipv4_multi_callback(const char *nodename, const char *servname,
const struct nrf_addrinfo *hints,
struct nrf_addrinfo **res, int num_calls)
{
static struct {
struct nrf_addrinfo ai[2];
struct nrf_sockaddr_in sa[2];
} result;

memset(&result, 0, sizeof(result));

result.sa[0].sin_family = NRF_AF_INET;
result.sa[0].sin_addr.s_addr = net_htonl(0xC0A80001); /* 192.168.0.1 */
result.sa[1].sin_family = NRF_AF_INET;
result.sa[1].sin_addr.s_addr = net_htonl(0x0A000002); /* 10.0.0.2 */

result.ai[0].ai_family = NRF_AF_INET;
result.ai[0].ai_socktype = NRF_SOCK_STREAM;
result.ai[0].ai_protocol = NRF_IPPROTO_TCP;
result.ai[0].ai_addrlen = sizeof(result.sa[0]);
result.ai[0].ai_addr = (struct nrf_sockaddr *)&result.sa[0];
result.ai[0].ai_next = &result.ai[1];

result.ai[1].ai_family = NRF_AF_INET;
result.ai[1].ai_socktype = NRF_SOCK_STREAM;
result.ai[1].ai_protocol = NRF_IPPROTO_TCP;
result.ai[1].ai_addrlen = sizeof(result.sa[1]);
result.ai[1].ai_addr = (struct nrf_sockaddr *)&result.sa[1];
result.ai[1].ai_next = NULL;

*res = &result.ai[0];
return 0;
}

/* Helper callback for mocking successful nrf_getaddrinfo (IPv6) */
static int mock_nrf_getaddrinfo_ipv6_callback(const char *nodename, const char *servname,
const struct nrf_addrinfo *hints,
Expand Down Expand Up @@ -2626,6 +2676,27 @@ void test_xgetaddrinfo_ipv4(void)
TEST_ASSERT_TRUE(strstr(response, "OK") != NULL);
}

/*
* Test: Resolve hostname via AT#XGETADDRINFO command with multiple IPv4 results
* - Command: AT#XGETADDRINFO="hostname"
* - Tests: Iteration uses each addrinfo entry address
*/
void test_xgetaddrinfo_ipv4_multiple_results(void)
{
const char *response;

__cmock_nrf_getaddrinfo_Stub(mock_nrf_getaddrinfo_ipv4_multi_callback);
__cmock_nrf_inet_ntop_Stub(mock_nrf_inet_ntop_ipv4_multi_callback);
__cmock_nrf_freeaddrinfo_Expect(NULL);
__cmock_nrf_freeaddrinfo_IgnoreArg_ai();

send_at_command("AT#XGETADDRINFO=\"example.com\"\r\n");

response = get_captured_response();
TEST_ASSERT_TRUE(strstr(response, "#XGETADDRINFO: \"192.168.0.1 10.0.0.2\"") != NULL);
TEST_ASSERT_TRUE(strstr(response, "OK") != NULL);
}

/*
* Test: Resolve hostname via AT#XGETADDRINFO command (IPv6)
* - Command: AT#XGETADDRINFO="hostname",2
Expand Down