Skip to content

Commit

Permalink
tests: sockets: Add tests of sendto() and recvfrom()
Browse files Browse the repository at this point in the history
- Add test cases of ipv4/ipv6 sendto() and recvfrom()
- Set the main stack size to 2048 to enable both ipv4 and ipv6 on
  qemu_x86.
- Use net app for network setup.

Signed-off-by: Aska Wu <aska.wu@linaro.org>
  • Loading branch information
Aska Wu committed Sep 28, 2017
1 parent dbd3e1a commit d73c931
Show file tree
Hide file tree
Showing 2 changed files with 205 additions and 13 deletions.
9 changes: 5 additions & 4 deletions tests/net/socket/udp/prj.conf
Expand Up @@ -4,7 +4,7 @@ CONFIG_NEWLIB_LIBC=y
# Networking config
CONFIG_NETWORKING=y
CONFIG_NET_IPV4=y
CONFIG_NET_IPV6=n
CONFIG_NET_IPV6=y
CONFIG_NET_UDP=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
Expand All @@ -13,13 +13,14 @@ CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_TEST_RANDOM_GENERATOR=y

# Network address config
#CONFIG_NET_APP_SETTINGS=y
#CONFIG_NET_APP_MY_IPV4_ADDR="192.0.2.1"
#CONFIG_NET_APP_PEER_IPV4_ADDR="192.0.2.2"
CONFIG_NET_APP_SETTINGS=y
CONFIG_NET_APP_MY_IPV4_ADDR="192.0.2.1"
CONFIG_NET_APP_MY_IPV6_ADDR="2001:db8::1"

# Network debug config
#CONFIG_NET_LOG=y
#CONFIG_NET_DEBUG_SOCKETS=y
#CONFIG_SYS_LOG_NET_LEVEL=4
CONFIG_MAIN_STACK_SIZE=2048

CONFIG_ZTEST=y
209 changes: 200 additions & 9 deletions tests/net/socket/udp/src/main.c
Expand Up @@ -8,13 +8,207 @@
#include <ztest_assert.h>

#include <net/socket.h>
#include <net/net_if.h>

#define BUF_AND_SIZE(buf) buf, sizeof(buf) - 1
#define STRLEN(buf) (sizeof(buf) - 1)

#define TEST_STR_SMALL "test"

#define LOCAL_PORT 9898
#define REMOTE_PORT 4242

#define V4_ANY_ADDR "0.0.0.0"
#define V6_ANY_ADDR "0:0:0:0:0:0:0:0"

#define V4_REMOTE_ADDR "192.0.2.2"
#define V6_REMOTE_ADDR "2001:db8::2"

static void test_v4_sendto_recvfrom(void)
{
int rv;
int sock;
ssize_t sent = 0;
ssize_t recved = 0;
char rx_buf[30] = {0};
struct sockaddr_in addr;
socklen_t socklen;

sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
zassert_true(sock >= 0, "socket open failed");

addr.sin_family = AF_INET;
addr.sin_port = htons(REMOTE_PORT);
rv = inet_pton(AF_INET, V4_REMOTE_ADDR, &(addr.sin_addr));
zassert_equal(rv, 1, "inet_pton failed");

sent = sendto(sock,
TEST_STR_SMALL,
strlen(TEST_STR_SMALL),
0,
(struct sockaddr *)&addr,
sizeof(addr));
zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");

socklen = sizeof(addr);
recved = recvfrom(sock,
rx_buf,
sizeof(rx_buf),
0,
(struct sockaddr *)&addr,
&socklen);
zassert_true(recved > 0, "recvfrom fail");
zassert_equal(recved,
strlen(TEST_STR_SMALL),
"unexpected received bytes");
zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
0,
"unexpected data");
}

static void test_v6_sendto_recvfrom(void)
{
int rv;
int sock;
ssize_t sent = 0;
ssize_t recved = 0;
char rx_buf[30] = {0};
struct sockaddr_in6 addr;
socklen_t socklen;

sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
zassert_true(sock >= 0, "socket open failed");

addr.sin6_family = AF_INET6;
addr.sin6_port = htons(REMOTE_PORT);
rv = inet_pton(AF_INET6, V6_REMOTE_ADDR, &(addr.sin6_addr));
zassert_equal(rv, 1, "inet_pton failed");

sent = sendto(sock,
TEST_STR_SMALL,
strlen(TEST_STR_SMALL),
0,
(struct sockaddr *)&addr,
sizeof(addr));
zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");

socklen = sizeof(addr);
recved = recvfrom(sock,
rx_buf,
sizeof(rx_buf),
0,
(struct sockaddr *)&addr,
&socklen);
zassert_true(recved > 0, "recvfrom fail");
zassert_equal(recved,
strlen(TEST_STR_SMALL),
"unexpected received bytes");
zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
0,
"unexpected data");
}

static void test_v4_bind_sendto(void)
{
int rv;
int sock;
ssize_t sent = 0;
ssize_t recved = 0;
char rx_buf[30] = {0};
struct sockaddr_in remote_addr;
struct sockaddr_in local_addr;
socklen_t socklen;

sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
zassert_true(sock >= 0, "socket open failed");

local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(LOCAL_PORT);
rv = inet_pton(AF_INET, V4_ANY_ADDR, &(local_addr.sin_addr));
zassert_equal(rv, 1, "inet_pton failed");

rv = bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr));
zassert_equal(rv, 0, "bind failed");

remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(REMOTE_PORT);
rv = inet_pton(AF_INET, V4_REMOTE_ADDR, &(remote_addr.sin_addr));
zassert_equal(rv, 1, "inet_pton failed");

sent = sendto(sock,
TEST_STR_SMALL,
strlen(TEST_STR_SMALL),
0,
(struct sockaddr *)&remote_addr,
sizeof(remote_addr));
zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");

socklen = sizeof(remote_addr);
recved = recvfrom(sock,
rx_buf,
sizeof(rx_buf),
0,
(struct sockaddr *)&remote_addr,
&socklen);
zassert_true(recved > 0, "recvfrom fail");
zassert_equal(recved,
strlen(TEST_STR_SMALL),
"unexpected received bytes");
zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
0,
"unexpected data");
}

static void test_v6_bind_sendto(void)
{
int rv;
int sock;
ssize_t sent = 0;
ssize_t recved = 0;
char rx_buf[30] = {0};
struct sockaddr_in6 remote_addr;
struct sockaddr_in6 local_addr;
socklen_t socklen;

sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
zassert_true(sock >= 0, "socket open failed");

local_addr.sin6_family = AF_INET6;
local_addr.sin6_port = htons(LOCAL_PORT);
rv = inet_pton(AF_INET6, V6_ANY_ADDR, &(local_addr.sin6_addr));
zassert_equal(rv, 1, "inet_pton failed");

rv = bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr));
zassert_equal(rv, 0, "bind failed");

remote_addr.sin6_family = AF_INET6;
remote_addr.sin6_port = htons(REMOTE_PORT);
rv = inet_pton(AF_INET6, V6_REMOTE_ADDR, &(remote_addr.sin6_addr));
zassert_equal(rv, 1, "inet_pton failed");

sent = sendto(sock,
TEST_STR_SMALL,
strlen(TEST_STR_SMALL),
0,
(struct sockaddr *)&remote_addr,
sizeof(remote_addr));
zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");

socklen = sizeof(remote_addr);
recved = recvfrom(sock,
rx_buf,
sizeof(rx_buf),
0,
(struct sockaddr *)&remote_addr,
&socklen);
zassert_true(recved > 0, "recvfrom fail");
zassert_equal(recved,
strlen(TEST_STR_SMALL),
"unexpected received bytes");
zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
0,
"unexpected data");
}

void test_send_recv_2_sock(void)
{
int sock1, sock2;
Expand Down Expand Up @@ -45,15 +239,12 @@ void test_send_recv_2_sock(void)

void test_main(void)
{
zassert_not_null(net_if_get_default(), "No default netif");
static struct in_addr in4addr_my = { { {192, 0, 2, 1} } };

net_if_ipv4_addr_add(net_if_get_default(), &in4addr_my,
NET_ADDR_MANUAL, 0);

ztest_test_suite(socket_udp,
ztest_unit_test(test_send_recv_2_sock)
);
ztest_unit_test(test_send_recv_2_sock),
ztest_unit_test(test_v4_sendto_recvfrom),
ztest_unit_test(test_v6_sendto_recvfrom),
ztest_unit_test(test_v4_bind_sendto),
ztest_unit_test(test_v6_bind_sendto));

ztest_run_test_suite(socket_udp);
}

0 comments on commit d73c931

Please sign in to comment.