Skip to content

Commit d73c931

Browse files
author
Aska Wu
committed
tests: sockets: Add tests of sendto() and recvfrom()
- 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 <[email protected]>
1 parent dbd3e1a commit d73c931

File tree

2 files changed

+205
-13
lines changed

2 files changed

+205
-13
lines changed

tests/net/socket/udp/prj.conf

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ CONFIG_NEWLIB_LIBC=y
44
# Networking config
55
CONFIG_NETWORKING=y
66
CONFIG_NET_IPV4=y
7-
CONFIG_NET_IPV6=n
7+
CONFIG_NET_IPV6=y
88
CONFIG_NET_UDP=y
99
CONFIG_NET_SOCKETS=y
1010
CONFIG_NET_SOCKETS_POSIX_NAMES=y
@@ -13,13 +13,14 @@ CONFIG_NET_SOCKETS_POSIX_NAMES=y
1313
CONFIG_TEST_RANDOM_GENERATOR=y
1414

1515
# Network address config
16-
#CONFIG_NET_APP_SETTINGS=y
17-
#CONFIG_NET_APP_MY_IPV4_ADDR="192.0.2.1"
18-
#CONFIG_NET_APP_PEER_IPV4_ADDR="192.0.2.2"
16+
CONFIG_NET_APP_SETTINGS=y
17+
CONFIG_NET_APP_MY_IPV4_ADDR="192.0.2.1"
18+
CONFIG_NET_APP_MY_IPV6_ADDR="2001:db8::1"
1919

2020
# Network debug config
2121
#CONFIG_NET_LOG=y
2222
#CONFIG_NET_DEBUG_SOCKETS=y
2323
#CONFIG_SYS_LOG_NET_LEVEL=4
24+
CONFIG_MAIN_STACK_SIZE=2048
2425

2526
CONFIG_ZTEST=y

tests/net/socket/udp/src/main.c

Lines changed: 200 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,207 @@
88
#include <ztest_assert.h>
99

1010
#include <net/socket.h>
11-
#include <net/net_if.h>
1211

1312
#define BUF_AND_SIZE(buf) buf, sizeof(buf) - 1
1413
#define STRLEN(buf) (sizeof(buf) - 1)
1514

1615
#define TEST_STR_SMALL "test"
1716

17+
#define LOCAL_PORT 9898
18+
#define REMOTE_PORT 4242
19+
20+
#define V4_ANY_ADDR "0.0.0.0"
21+
#define V6_ANY_ADDR "0:0:0:0:0:0:0:0"
22+
23+
#define V4_REMOTE_ADDR "192.0.2.2"
24+
#define V6_REMOTE_ADDR "2001:db8::2"
25+
26+
static void test_v4_sendto_recvfrom(void)
27+
{
28+
int rv;
29+
int sock;
30+
ssize_t sent = 0;
31+
ssize_t recved = 0;
32+
char rx_buf[30] = {0};
33+
struct sockaddr_in addr;
34+
socklen_t socklen;
35+
36+
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
37+
zassert_true(sock >= 0, "socket open failed");
38+
39+
addr.sin_family = AF_INET;
40+
addr.sin_port = htons(REMOTE_PORT);
41+
rv = inet_pton(AF_INET, V4_REMOTE_ADDR, &(addr.sin_addr));
42+
zassert_equal(rv, 1, "inet_pton failed");
43+
44+
sent = sendto(sock,
45+
TEST_STR_SMALL,
46+
strlen(TEST_STR_SMALL),
47+
0,
48+
(struct sockaddr *)&addr,
49+
sizeof(addr));
50+
zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");
51+
52+
socklen = sizeof(addr);
53+
recved = recvfrom(sock,
54+
rx_buf,
55+
sizeof(rx_buf),
56+
0,
57+
(struct sockaddr *)&addr,
58+
&socklen);
59+
zassert_true(recved > 0, "recvfrom fail");
60+
zassert_equal(recved,
61+
strlen(TEST_STR_SMALL),
62+
"unexpected received bytes");
63+
zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
64+
0,
65+
"unexpected data");
66+
}
67+
68+
static void test_v6_sendto_recvfrom(void)
69+
{
70+
int rv;
71+
int sock;
72+
ssize_t sent = 0;
73+
ssize_t recved = 0;
74+
char rx_buf[30] = {0};
75+
struct sockaddr_in6 addr;
76+
socklen_t socklen;
77+
78+
sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
79+
zassert_true(sock >= 0, "socket open failed");
80+
81+
addr.sin6_family = AF_INET6;
82+
addr.sin6_port = htons(REMOTE_PORT);
83+
rv = inet_pton(AF_INET6, V6_REMOTE_ADDR, &(addr.sin6_addr));
84+
zassert_equal(rv, 1, "inet_pton failed");
85+
86+
sent = sendto(sock,
87+
TEST_STR_SMALL,
88+
strlen(TEST_STR_SMALL),
89+
0,
90+
(struct sockaddr *)&addr,
91+
sizeof(addr));
92+
zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");
93+
94+
socklen = sizeof(addr);
95+
recved = recvfrom(sock,
96+
rx_buf,
97+
sizeof(rx_buf),
98+
0,
99+
(struct sockaddr *)&addr,
100+
&socklen);
101+
zassert_true(recved > 0, "recvfrom fail");
102+
zassert_equal(recved,
103+
strlen(TEST_STR_SMALL),
104+
"unexpected received bytes");
105+
zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
106+
0,
107+
"unexpected data");
108+
}
109+
110+
static void test_v4_bind_sendto(void)
111+
{
112+
int rv;
113+
int sock;
114+
ssize_t sent = 0;
115+
ssize_t recved = 0;
116+
char rx_buf[30] = {0};
117+
struct sockaddr_in remote_addr;
118+
struct sockaddr_in local_addr;
119+
socklen_t socklen;
120+
121+
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
122+
zassert_true(sock >= 0, "socket open failed");
123+
124+
local_addr.sin_family = AF_INET;
125+
local_addr.sin_port = htons(LOCAL_PORT);
126+
rv = inet_pton(AF_INET, V4_ANY_ADDR, &(local_addr.sin_addr));
127+
zassert_equal(rv, 1, "inet_pton failed");
128+
129+
rv = bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr));
130+
zassert_equal(rv, 0, "bind failed");
131+
132+
remote_addr.sin_family = AF_INET;
133+
remote_addr.sin_port = htons(REMOTE_PORT);
134+
rv = inet_pton(AF_INET, V4_REMOTE_ADDR, &(remote_addr.sin_addr));
135+
zassert_equal(rv, 1, "inet_pton failed");
136+
137+
sent = sendto(sock,
138+
TEST_STR_SMALL,
139+
strlen(TEST_STR_SMALL),
140+
0,
141+
(struct sockaddr *)&remote_addr,
142+
sizeof(remote_addr));
143+
zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");
144+
145+
socklen = sizeof(remote_addr);
146+
recved = recvfrom(sock,
147+
rx_buf,
148+
sizeof(rx_buf),
149+
0,
150+
(struct sockaddr *)&remote_addr,
151+
&socklen);
152+
zassert_true(recved > 0, "recvfrom fail");
153+
zassert_equal(recved,
154+
strlen(TEST_STR_SMALL),
155+
"unexpected received bytes");
156+
zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
157+
0,
158+
"unexpected data");
159+
}
160+
161+
static void test_v6_bind_sendto(void)
162+
{
163+
int rv;
164+
int sock;
165+
ssize_t sent = 0;
166+
ssize_t recved = 0;
167+
char rx_buf[30] = {0};
168+
struct sockaddr_in6 remote_addr;
169+
struct sockaddr_in6 local_addr;
170+
socklen_t socklen;
171+
172+
sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
173+
zassert_true(sock >= 0, "socket open failed");
174+
175+
local_addr.sin6_family = AF_INET6;
176+
local_addr.sin6_port = htons(LOCAL_PORT);
177+
rv = inet_pton(AF_INET6, V6_ANY_ADDR, &(local_addr.sin6_addr));
178+
zassert_equal(rv, 1, "inet_pton failed");
179+
180+
rv = bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr));
181+
zassert_equal(rv, 0, "bind failed");
182+
183+
remote_addr.sin6_family = AF_INET6;
184+
remote_addr.sin6_port = htons(REMOTE_PORT);
185+
rv = inet_pton(AF_INET6, V6_REMOTE_ADDR, &(remote_addr.sin6_addr));
186+
zassert_equal(rv, 1, "inet_pton failed");
187+
188+
sent = sendto(sock,
189+
TEST_STR_SMALL,
190+
strlen(TEST_STR_SMALL),
191+
0,
192+
(struct sockaddr *)&remote_addr,
193+
sizeof(remote_addr));
194+
zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");
195+
196+
socklen = sizeof(remote_addr);
197+
recved = recvfrom(sock,
198+
rx_buf,
199+
sizeof(rx_buf),
200+
0,
201+
(struct sockaddr *)&remote_addr,
202+
&socklen);
203+
zassert_true(recved > 0, "recvfrom fail");
204+
zassert_equal(recved,
205+
strlen(TEST_STR_SMALL),
206+
"unexpected received bytes");
207+
zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
208+
0,
209+
"unexpected data");
210+
}
211+
18212
void test_send_recv_2_sock(void)
19213
{
20214
int sock1, sock2;
@@ -45,15 +239,12 @@ void test_send_recv_2_sock(void)
45239

46240
void test_main(void)
47241
{
48-
zassert_not_null(net_if_get_default(), "No default netif");
49-
static struct in_addr in4addr_my = { { {192, 0, 2, 1} } };
50-
51-
net_if_ipv4_addr_add(net_if_get_default(), &in4addr_my,
52-
NET_ADDR_MANUAL, 0);
53-
54242
ztest_test_suite(socket_udp,
55-
ztest_unit_test(test_send_recv_2_sock)
56-
);
243+
ztest_unit_test(test_send_recv_2_sock),
244+
ztest_unit_test(test_v4_sendto_recvfrom),
245+
ztest_unit_test(test_v6_sendto_recvfrom),
246+
ztest_unit_test(test_v4_bind_sendto),
247+
ztest_unit_test(test_v6_bind_sendto));
57248

58249
ztest_run_test_suite(socket_udp);
59250
}

0 commit comments

Comments
 (0)