tests: net: socket: Add getpeername() tests

Add tests for new getpeername() function.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
This commit is contained in:
Robert Lubos 2022-03-04 13:14:55 +01:00 committed by Carles Cufí
commit cea2c8de3d
2 changed files with 101 additions and 2 deletions

View file

@ -9,7 +9,7 @@ CONFIG_NET_LOOPBACK=y
CONFIG_NET_IPV4=y
CONFIG_NET_IPV6=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP=n
CONFIG_NET_TCP=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_L2_DUMMY=y
@ -37,6 +37,9 @@ CONFIG_NET_IF_MAX_IPV4_COUNT=3
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_ZTEST=y
# TCP handshake requires more packets
CONFIG_NET_PKT_TX_COUNT=10
# User mode requirements
CONFIG_TEST_USERSPACE=y
CONFIG_HEAP_MEM_POOL_SIZE=128

View file

@ -100,6 +100,9 @@ static int dummy_send(const struct device *dev, struct net_pkt *pkt)
/* Report it back to the interface. */
recv_pkt = net_pkt_clone(pkt, K_NO_WAIT);
if (recv_pkt == NULL) {
return -ENOMEM;
}
ret = net_recv_data(net_pkt_iface(recv_pkt), recv_pkt);
zassert_equal(ret, 0, "Cannot receive data (%d)", ret);
@ -331,6 +334,97 @@ void test_ipv6_so_bindtodevice(void)
sizeof(bind_addr));
}
#define ADDR_SIZE(family) ((family == AF_INET) ? \
sizeof(struct sockaddr_in) : \
sizeof(struct sockaddr_in6))
void test_getpeername(int family)
{
int ret;
int sock_c;
int sock_s;
struct sockaddr peer_addr;
socklen_t peer_addr_len;
struct sockaddr srv_addr = { 0 };
srv_addr.sa_family = family;
if (family == AF_INET) {
net_sin(&srv_addr)->sin_port = htons(DST_PORT);
ret = inet_pton(AF_INET, CONFIG_NET_CONFIG_MY_IPV4_ADDR,
&net_sin(&srv_addr)->sin_addr);
} else {
net_sin6(&srv_addr)->sin6_port = htons(DST_PORT);
ret = inet_pton(AF_INET6, CONFIG_NET_CONFIG_MY_IPV6_ADDR,
&net_sin6(&srv_addr)->sin6_addr);
}
zassert_equal(ret, 1, "inet_pton failed");
/* UDP socket */
sock_c = socket(family, SOCK_DGRAM, IPPROTO_UDP);
zassert_true(sock_c >= 0, "socket open failed");
peer_addr_len = ADDR_SIZE(family);
ret = getpeername(sock_c, &peer_addr, &peer_addr_len);
zassert_equal(ret, -1, "getpeername shouldn've failed");
zassert_equal(errno, ENOTCONN, "getpeername returned invalid error");
ret = connect(sock_c, &srv_addr, ADDR_SIZE(family));
zassert_equal(ret, 0, "connect failed");
memset(&peer_addr, 0, sizeof(peer_addr));
peer_addr_len = ADDR_SIZE(family);
ret = getpeername(sock_c, &peer_addr, &peer_addr_len);
zassert_equal(ret, 0, "getpeername failed");
zassert_mem_equal(&peer_addr, &srv_addr, ADDR_SIZE(family),
"obtained wrong address");
ret = close(sock_c);
zassert_equal(ret, 0, "close failed, %d", errno);
/* TCP socket */
sock_c = socket(family, SOCK_STREAM, IPPROTO_TCP);
zassert_true(sock_c >= 0, "socket open failed");
sock_s = socket(family, SOCK_STREAM, IPPROTO_TCP);
zassert_true(sock_s >= 0, "socket open failed");
ret = bind(sock_s, &srv_addr, ADDR_SIZE(family));
zassert_equal(ret, 0, "bind failed, %d", errno);
ret = listen(sock_s, 1);
zassert_equal(ret, 0, "listen failed, %d", errno);
peer_addr_len = ADDR_SIZE(family);
ret = getpeername(sock_c, &peer_addr, &peer_addr_len);
zassert_equal(ret, -1, "getpeername shouldn've failed");
zassert_equal(errno, ENOTCONN, "getpeername returned invalid error");
ret = connect(sock_c, &srv_addr, ADDR_SIZE(family));
zassert_equal(ret, 0, "connect failed");
memset(&peer_addr, 0, sizeof(peer_addr));
peer_addr_len = ADDR_SIZE(family);
ret = getpeername(sock_c, &peer_addr, &peer_addr_len);
zassert_equal(ret, 0, "getpeername failed");
zassert_mem_equal(&peer_addr, &srv_addr, ADDR_SIZE(family),
"obtained wrong address");
ret = close(sock_c);
zassert_equal(ret, 0, "close failed, %d", errno);
ret = close(sock_s);
zassert_equal(ret, 0, "close failed, %d", errno);
}
void test_ipv4_getpeername(void)
{
test_getpeername(AF_INET);
}
void test_ipv6_getpeername(void)
{
test_getpeername(AF_INET6);
}
void test_main(void)
{
k_thread_system_pool_assign(k_current_get());
@ -339,7 +433,9 @@ void test_main(void)
ztest_user_unit_test(test_gethostname),
ztest_user_unit_test(test_inet_pton),
ztest_user_unit_test(test_ipv4_so_bindtodevice),
ztest_user_unit_test(test_ipv6_so_bindtodevice));
ztest_user_unit_test(test_ipv6_so_bindtodevice),
ztest_user_unit_test(test_ipv4_getpeername),
ztest_user_unit_test(test_ipv6_getpeername));
ztest_run_test_suite(socket_misc);
}