Skip to content

Commit 2295878

Browse files
jukkarhenrikbrixandersen
authored andcommitted
tests: net: udp: Add shutdown() test
Make sure shutdown() closes receiving side of the UDP socket. Signed-off-by: Jukka Rissanen <[email protected]>
1 parent fe932dd commit 2295878

File tree

1 file changed

+109
-0
lines changed
  • tests/net/socket/udp/src

1 file changed

+109
-0
lines changed

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

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3477,6 +3477,115 @@ ZTEST_USER(net_socket_udp, test_44_recvmsg_ancillary_ipv6_hoplimit_data_user)
34773477
sizeof(server_addr));
34783478
}
34793479

3480+
static void sendto_recvfrom(int client_sock,
3481+
struct sockaddr *client_addr,
3482+
socklen_t client_addrlen,
3483+
int server_sock,
3484+
struct sockaddr *server_addr,
3485+
socklen_t server_addrlen,
3486+
bool expect_failure)
3487+
{
3488+
ssize_t sent = 0;
3489+
ssize_t recved = 0;
3490+
struct sockaddr addr;
3491+
socklen_t addrlen;
3492+
struct sockaddr addr2;
3493+
socklen_t addrlen2;
3494+
3495+
zassert_not_null(client_addr, "null client addr");
3496+
zassert_not_null(server_addr, "null server addr");
3497+
3498+
/*
3499+
* Test client -> server sending
3500+
*/
3501+
3502+
sent = zsock_sendto(client_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL),
3503+
0, server_addr, server_addrlen);
3504+
zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");
3505+
3506+
k_msleep(100);
3507+
3508+
/* Test normal recvfrom() */
3509+
addrlen = sizeof(addr);
3510+
clear_buf(rx_buf);
3511+
recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
3512+
0, &addr, &addrlen);
3513+
zassert_true(recved >= 0, "recvfrom fail");
3514+
zassert_equal(recved, strlen(TEST_STR_SMALL),
3515+
"unexpected received bytes");
3516+
zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
3517+
zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
3518+
3519+
/*
3520+
* Test server -> client sending
3521+
*/
3522+
3523+
sent = zsock_sendto(server_sock, TEST_STR2, sizeof(TEST_STR2) - 1,
3524+
0, &addr, addrlen);
3525+
zassert_equal(sent, STRLEN(TEST_STR2), "sendto failed");
3526+
3527+
/* Test normal recvfrom() */
3528+
addrlen2 = sizeof(addr);
3529+
clear_buf(rx_buf);
3530+
recved = zsock_recvfrom(client_sock, rx_buf, sizeof(rx_buf),
3531+
expect_failure ? ZSOCK_MSG_DONTWAIT : 0,
3532+
&addr2, &addrlen2);
3533+
if (!expect_failure) {
3534+
zassert_true(recved >= 0, "recvfrom fail");
3535+
zassert_equal(recved, STRLEN(TEST_STR2),
3536+
"unexpected received bytes");
3537+
zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR2), "wrong data");
3538+
zassert_equal(addrlen2, server_addrlen, "unexpected addrlen");
3539+
} else {
3540+
/* We should not receive anything as the socket is shutdown for
3541+
* receiving.
3542+
*/
3543+
zassert_equal(recved, -1, "recvfrom should fail (got %d)", recved);
3544+
}
3545+
}
3546+
3547+
ZTEST_USER(net_socket_udp, test_45_udp_shutdown_recv)
3548+
{
3549+
int rv;
3550+
int client_sock;
3551+
int server_sock;
3552+
struct sockaddr_in client_addr;
3553+
struct sockaddr_in server_addr;
3554+
3555+
prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
3556+
prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
3557+
3558+
rv = zsock_bind(server_sock,
3559+
(struct sockaddr *)&server_addr,
3560+
sizeof(server_addr));
3561+
zassert_equal(rv, 0, "bind failed");
3562+
3563+
sendto_recvfrom(client_sock,
3564+
(struct sockaddr *)&client_addr,
3565+
sizeof(client_addr),
3566+
server_sock,
3567+
(struct sockaddr *)&server_addr,
3568+
sizeof(server_addr),
3569+
false);
3570+
3571+
/* Shutdown UDP socket for receiving and verify that we do not get any data. */
3572+
rv = zsock_shutdown(client_sock, ZSOCK_SHUT_RD);
3573+
zassert_equal(rv, 0, "shutdown failed (%d)", -errno);
3574+
3575+
sendto_recvfrom(client_sock,
3576+
(struct sockaddr *)&client_addr,
3577+
sizeof(client_addr),
3578+
server_sock,
3579+
(struct sockaddr *)&server_addr,
3580+
sizeof(server_addr),
3581+
true);
3582+
3583+
rv = zsock_close(client_sock);
3584+
zassert_equal(rv, 0, "close failed");
3585+
rv = zsock_close(server_sock);
3586+
zassert_equal(rv, 0, "close failed");
3587+
}
3588+
34803589
static void after(void *arg)
34813590
{
34823591
ARG_UNUSED(arg);

0 commit comments

Comments
 (0)