summaryrefslogtreecommitdiff
path: root/deps/uv/test/test-ipc.c
diff options
context:
space:
mode:
authorcjihrig <cjihrig@gmail.com>2019-01-18 13:37:29 -0500
committercjihrig <cjihrig@gmail.com>2019-01-21 10:28:17 -0500
commitf698386c7e988ef45027a75b2ff988899ee2af1d (patch)
tree37d9c39baf7fb03e472701436410e8e461086174 /deps/uv/test/test-ipc.c
parent27871c35b685dd599710e57e76a66ee3a82c1e6d (diff)
downloadandroid-node-v8-f698386c7e988ef45027a75b2ff988899ee2af1d.tar.gz
android-node-v8-f698386c7e988ef45027a75b2ff988899ee2af1d.tar.bz2
android-node-v8-f698386c7e988ef45027a75b2ff988899ee2af1d.zip
deps: upgrade to libuv 1.25.0
PR-URL: https://github.com/nodejs/node/pull/25571 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Diffstat (limited to 'deps/uv/test/test-ipc.c')
-rw-r--r--deps/uv/test/test-ipc.c141
1 files changed, 112 insertions, 29 deletions
diff --git a/deps/uv/test/test-ipc.c b/deps/uv/test/test-ipc.c
index 829d178d47..88d04ba143 100644
--- a/deps/uv/test/test-ipc.c
+++ b/deps/uv/test/test-ipc.c
@@ -39,12 +39,15 @@ static int local_conn_accepted;
static int remote_conn_accepted;
static int tcp_server_listening;
static uv_write_t write_req;
+static uv_write_t write_req2;
static uv_write_t conn_notify_req;
static int close_cb_called;
static int connection_accepted;
static int tcp_conn_read_cb_called;
static int tcp_conn_write_cb_called;
static int closed_handle_data_read;
+static int closed_handle_write;
+static int send_zero_write;
typedef struct {
uv_connect_t conn_req;
@@ -54,7 +57,15 @@ typedef struct {
#define CONN_COUNT 100
#define BACKLOG 128
-#define LARGE_SIZE 1000000
+#define LARGE_SIZE 100000
+
+static uv_buf_t large_buf;
+static char buffer[LARGE_SIZE];
+static uv_write_t write_reqs[300];
+static int write_reqs_completed;
+
+static unsigned int write_until_data_queued(void);
+static void send_handle_and_close(void);
static void close_server_conn_cb(uv_handle_t* handle) {
@@ -92,6 +103,7 @@ static void exit_cb(uv_process_t* process,
printf("exit_cb\n");
exit_cb_called++;
ASSERT(exit_status == 0);
+ ASSERT(term_signal == 0);
uv_close((uv_handle_t*)process, NULL);
}
@@ -420,6 +432,14 @@ static void on_read_closed_handle(uv_stream_t* handle,
#endif
+static void on_read_send_zero(uv_stream_t* handle,
+ ssize_t nread,
+ const uv_buf_t* buf) {
+ ASSERT(nread == 0 || nread == UV_EOF);
+ free(buf->base);
+}
+
+
static int run_ipc_test(const char* helper, uv_read_cb read_cb) {
uv_process_t process;
int r;
@@ -544,6 +564,13 @@ TEST_IMPL(ipc_listen_after_bind_twice) {
}
#endif
+TEST_IMPL(ipc_send_zero) {
+ int r;
+ r = run_ipc_test("ipc_helper_send_zero", on_read_send_zero);
+ ASSERT(r == 0);
+ return 0;
+}
+
/* Everything here runs in a child process. */
@@ -573,14 +600,25 @@ static void tcp_connection_write_cb(uv_write_t* req, int status) {
static void closed_handle_large_write_cb(uv_write_t* req, int status) {
ASSERT(status == 0);
ASSERT(closed_handle_data_read = LARGE_SIZE);
+ if (++write_reqs_completed == ARRAY_SIZE(write_reqs)) {
+ write_reqs_completed = 0;
+ if (write_until_data_queued() > 0)
+ send_handle_and_close();
+ }
}
static void closed_handle_write_cb(uv_write_t* req, int status) {
ASSERT(status == UV_EBADF);
+ closed_handle_write = 1;
}
+static void send_zero_write_cb(uv_write_t* req, int status) {
+ ASSERT(status == 0);
+ send_zero_write++;
+}
+
static void on_tcp_child_process_read(uv_stream_t* tcp,
ssize_t nread,
const uv_buf_t* buf) {
@@ -688,7 +726,6 @@ int ipc_helper(int listen_after_write) {
* over which a handle will be transmitted.
*/
struct sockaddr_in addr;
- uv_write_t write_req;
int r;
uv_buf_t buf;
@@ -788,26 +825,28 @@ int ipc_helper_tcp_connection(void) {
return 0;
}
-
-int ipc_helper_closed_handle(void) {
+static unsigned int write_until_data_queued() {
+ unsigned int i;
int r;
- struct sockaddr_in addr;
- uv_write_t write_req;
- uv_write_t write_req2;
- uv_buf_t buf;
- char buffer[LARGE_SIZE];
- r = uv_pipe_init(uv_default_loop(), &channel, 1);
- ASSERT(r == 0);
-
- uv_pipe_open(&channel, 0);
+ i = 0;
+ do {
+ r = uv_write(&write_reqs[i],
+ (uv_stream_t*)&channel,
+ &large_buf,
+ 1,
+ closed_handle_large_write_cb);
+ ASSERT(r == 0);
+ i++;
+ } while (((uv_stream_t*)&channel)->write_queue_size == 0 &&
+ i < ARRAY_SIZE(write_reqs));
- ASSERT(1 == uv_is_readable((uv_stream_t*) &channel));
- ASSERT(1 == uv_is_writable((uv_stream_t*) &channel));
- ASSERT(0 == uv_is_closing((uv_handle_t*) &channel));
+ return ((uv_stream_t*)&channel)->write_queue_size;
+}
- memset(buffer, '.', LARGE_SIZE);
- buf = uv_buf_init(buffer, LARGE_SIZE);
+static void send_handle_and_close() {
+ int r;
+ struct sockaddr_in addr;
r = uv_tcp_init(uv_default_loop(), &tcp_server);
ASSERT(r == 0);
@@ -817,26 +856,40 @@ int ipc_helper_closed_handle(void) {
r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0);
ASSERT(r == 0);
- r = uv_write(&write_req,
- (uv_stream_t*)&channel,
- &buf,
- 1,
- closed_handle_large_write_cb);
- ASSERT(r == 0);
-
- r = uv_write2(&write_req2,
+ r = uv_write2(&write_req,
(uv_stream_t*)&channel,
- &buf,
+ &large_buf,
1,
(uv_stream_t*)&tcp_server,
closed_handle_write_cb);
ASSERT(r == 0);
uv_close((uv_handle_t*)&tcp_server, NULL);
+}
+
+int ipc_helper_closed_handle(void) {
+ int r;
+
+ memset(buffer, '.', LARGE_SIZE);
+ large_buf = uv_buf_init(buffer, LARGE_SIZE);
+
+ r = uv_pipe_init(uv_default_loop(), &channel, 1);
+ ASSERT(r == 0);
+
+ uv_pipe_open(&channel, 0);
+
+ ASSERT(1 == uv_is_readable((uv_stream_t*) &channel));
+ ASSERT(1 == uv_is_writable((uv_stream_t*) &channel));
+ ASSERT(0 == uv_is_closing((uv_handle_t*) &channel));
+
+ if (write_until_data_queued() > 0)
+ send_handle_and_close();
r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
ASSERT(r == 0);
+ ASSERT(closed_handle_write == 1);
+
MAKE_VALGRIND_HAPPY();
return 0;
}
@@ -848,8 +901,6 @@ int ipc_helper_bind_twice(void) {
* over which two handles will be transmitted.
*/
struct sockaddr_in addr;
- uv_write_t write_req;
- uv_write_t write_req2;
int r;
uv_buf_t buf;
@@ -889,3 +940,35 @@ int ipc_helper_bind_twice(void) {
MAKE_VALGRIND_HAPPY();
return 0;
}
+
+int ipc_helper_send_zero(void) {
+ int r;
+ uv_buf_t zero_buf;
+
+ zero_buf = uv_buf_init(0, 0);
+
+ r = uv_pipe_init(uv_default_loop(), &channel, 0);
+ ASSERT(r == 0);
+
+ uv_pipe_open(&channel, 0);
+
+ ASSERT(1 == uv_is_readable((uv_stream_t*) &channel));
+ ASSERT(1 == uv_is_writable((uv_stream_t*) &channel));
+ ASSERT(0 == uv_is_closing((uv_handle_t*) &channel));
+
+ r = uv_write(&write_req,
+ (uv_stream_t*)&channel,
+ &zero_buf,
+ 1,
+ send_zero_write_cb);
+
+ ASSERT(r == 0);
+
+ r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
+ ASSERT(r == 0);
+
+ ASSERT(send_zero_write == 1);
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+} \ No newline at end of file