test: add vectored uv_write() ping-pong tests

PR-URL: https://github.com/libuv/libuv/pull/1843
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Bartosz Sosnowski <bartosz@janeasystems.com>
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
This commit is contained in:
Bert Belder 2018-05-21 17:02:49 -07:00
parent e7e8b6fb9b
commit b36c0945d1
No known key found for this signature in database
GPG Key ID: 7A77887B2E2ED461
2 changed files with 68 additions and 28 deletions

View File

@ -71,8 +71,11 @@ TEST_DECLARE (ipc_closed_handle)
#endif #endif
TEST_DECLARE (tcp_alloc_cb_fail) TEST_DECLARE (tcp_alloc_cb_fail)
TEST_DECLARE (tcp_ping_pong) TEST_DECLARE (tcp_ping_pong)
TEST_DECLARE (tcp_ping_pong_v6) TEST_DECLARE (tcp_ping_pong_vec)
TEST_DECLARE (tcp6_ping_pong)
TEST_DECLARE (tcp6_ping_pong_vec)
TEST_DECLARE (pipe_ping_pong) TEST_DECLARE (pipe_ping_pong)
TEST_DECLARE (pipe_ping_pong_vec)
TEST_DECLARE (delayed_accept) TEST_DECLARE (delayed_accept)
TEST_DECLARE (multiple_listen) TEST_DECLARE (multiple_listen)
#ifndef _WIN32 #ifndef _WIN32
@ -499,12 +502,21 @@ TASK_LIST_START
TEST_ENTRY (tcp_ping_pong) TEST_ENTRY (tcp_ping_pong)
TEST_HELPER (tcp_ping_pong, tcp4_echo_server) TEST_HELPER (tcp_ping_pong, tcp4_echo_server)
TEST_ENTRY (tcp_ping_pong_v6) TEST_ENTRY (tcp_ping_pong_vec)
TEST_HELPER (tcp_ping_pong_v6, tcp6_echo_server) TEST_HELPER (tcp_ping_pong_vec, tcp4_echo_server)
TEST_ENTRY (tcp6_ping_pong)
TEST_HELPER (tcp6_ping_pong, tcp6_echo_server)
TEST_ENTRY (tcp6_ping_pong_vec)
TEST_HELPER (tcp6_ping_pong_vec, tcp6_echo_server)
TEST_ENTRY (pipe_ping_pong) TEST_ENTRY (pipe_ping_pong)
TEST_HELPER (pipe_ping_pong, pipe_echo_server) TEST_HELPER (pipe_ping_pong, pipe_echo_server)
TEST_ENTRY (pipe_ping_pong_vec)
TEST_HELPER (pipe_ping_pong_vec, pipe_echo_server)
TEST_ENTRY (delayed_accept) TEST_ENTRY (delayed_accept)
TEST_ENTRY (multiple_listen) TEST_ENTRY (multiple_listen)

View File

@ -22,8 +22,8 @@
#include "uv.h" #include "uv.h"
#include "task.h" #include "task.h"
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
static int completed_pingers = 0; static int completed_pingers = 0;
@ -41,6 +41,7 @@ static int pinger_on_connect_count;
typedef struct { typedef struct {
int vectored_writes;
int pongs; int pongs;
int state; int state;
union { union {
@ -77,15 +78,26 @@ static void pinger_after_write(uv_write_t *req, int status) {
static void pinger_write_ping(pinger_t* pinger) { static void pinger_write_ping(pinger_t* pinger) {
uv_write_t *req; uv_write_t *req;
uv_buf_t buf; uv_buf_t bufs[sizeof PING - 1];
int i, nbufs;
buf = uv_buf_init(PING, sizeof(PING) - 1); if (!pinger->vectored_writes) {
/* Write a single buffer. */
nbufs = 1;
bufs[0] = uv_buf_init(PING, sizeof PING - 1);
} else {
/* Write multiple buffers, each with one byte in them. */
nbufs = sizeof PING - 1;
for (i = 0; i < nbufs; i++) {
bufs[i] = uv_buf_init(&PING[i], 1);
}
}
req = malloc(sizeof(*req)); req = malloc(sizeof(*req));
if (uv_write(req, if (uv_write(req,
(uv_stream_t*) &pinger->stream.tcp, (uv_stream_t*) &pinger->stream.tcp,
&buf, bufs,
1, nbufs,
pinger_after_write)) { pinger_after_write)) {
FATAL("uv_write failed"); FATAL("uv_write failed");
} }
@ -154,7 +166,7 @@ static void pinger_on_connect(uv_connect_t *req, int status) {
/* same ping-pong test, but using IPv6 connection */ /* same ping-pong test, but using IPv6 connection */
static void tcp_pinger_v6_new(void) { static void tcp_pinger_v6_new(int vectored_writes) {
int r; int r;
struct sockaddr_in6 server_addr; struct sockaddr_in6 server_addr;
pinger_t *pinger; pinger_t *pinger;
@ -163,6 +175,7 @@ static void tcp_pinger_v6_new(void) {
ASSERT(0 ==uv_ip6_addr("::1", TEST_PORT, &server_addr)); ASSERT(0 ==uv_ip6_addr("::1", TEST_PORT, &server_addr));
pinger = malloc(sizeof(*pinger)); pinger = malloc(sizeof(*pinger));
ASSERT(pinger != NULL); ASSERT(pinger != NULL);
pinger->vectored_writes = vectored_writes;
pinger->state = 0; pinger->state = 0;
pinger->pongs = 0; pinger->pongs = 0;
@ -184,7 +197,7 @@ static void tcp_pinger_v6_new(void) {
} }
static void tcp_pinger_new(void) { static void tcp_pinger_new(int vectored_writes) {
int r; int r;
struct sockaddr_in server_addr; struct sockaddr_in server_addr;
pinger_t *pinger; pinger_t *pinger;
@ -192,6 +205,7 @@ static void tcp_pinger_new(void) {
ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr)); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
pinger = malloc(sizeof(*pinger)); pinger = malloc(sizeof(*pinger));
ASSERT(pinger != NULL); ASSERT(pinger != NULL);
pinger->vectored_writes = vectored_writes;
pinger->state = 0; pinger->state = 0;
pinger->pongs = 0; pinger->pongs = 0;
@ -213,12 +227,13 @@ static void tcp_pinger_new(void) {
} }
static void pipe_pinger_new(void) { static void pipe_pinger_new(int vectored_writes) {
int r; int r;
pinger_t *pinger; pinger_t *pinger;
pinger = (pinger_t*)malloc(sizeof(*pinger)); pinger = (pinger_t*)malloc(sizeof(*pinger));
ASSERT(pinger != NULL); ASSERT(pinger != NULL);
pinger->vectored_writes = vectored_writes;
pinger->state = 0; pinger->state = 0;
pinger->pongs = 0; pinger->pongs = 0;
@ -237,10 +252,8 @@ static void pipe_pinger_new(void) {
} }
TEST_IMPL(tcp_ping_pong) { static int run_ping_pong_test(void) {
tcp_pinger_new();
uv_run(uv_default_loop(), UV_RUN_DEFAULT); uv_run(uv_default_loop(), UV_RUN_DEFAULT);
ASSERT(completed_pingers == 1); ASSERT(completed_pingers == 1);
MAKE_VALGRIND_HAPPY(); MAKE_VALGRIND_HAPPY();
@ -248,26 +261,41 @@ TEST_IMPL(tcp_ping_pong) {
} }
TEST_IMPL(tcp_ping_pong_v6) { TEST_IMPL(tcp_ping_pong) {
tcp_pinger_new(0);
return run_ping_pong_test();
}
TEST_IMPL(tcp_ping_pong_vec) {
tcp_pinger_new(1);
return run_ping_pong_test();
}
TEST_IMPL(tcp6_ping_pong) {
if (!can_ipv6()) if (!can_ipv6())
RETURN_SKIP("IPv6 not supported"); RETURN_SKIP("IPv6 not supported");
tcp_pinger_v6_new(0);
return run_ping_pong_test();
}
tcp_pinger_v6_new();
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
ASSERT(completed_pingers == 1); TEST_IMPL(tcp6_ping_pong_vec) {
if (!can_ipv6())
MAKE_VALGRIND_HAPPY(); RETURN_SKIP("IPv6 not supported");
return 0; tcp_pinger_v6_new(1);
return run_ping_pong_test();
} }
TEST_IMPL(pipe_ping_pong) { TEST_IMPL(pipe_ping_pong) {
pipe_pinger_new(); pipe_pinger_new(0);
uv_run(uv_default_loop(), UV_RUN_DEFAULT); return run_ping_pong_test();
}
ASSERT(completed_pingers == 1);
MAKE_VALGRIND_HAPPY(); TEST_IMPL(pipe_ping_pong_vec) {
return 0; pipe_pinger_new(1);
return run_ping_pong_test();
} }