|
|
|
@ -48,6 +48,8 @@ |
|
|
|
|
#include "test/core/util/test_config.h" |
|
|
|
|
#include "test/core/iomgr/endpoint_tests.h" |
|
|
|
|
|
|
|
|
|
static grpc_pollset g_pollset; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
General test notes: |
|
|
|
|
|
|
|
|
@ -114,8 +116,6 @@ static size_t fill_socket_partial(int fd, size_t bytes) { |
|
|
|
|
|
|
|
|
|
struct read_socket_state { |
|
|
|
|
grpc_endpoint *ep; |
|
|
|
|
gpr_mu mu; |
|
|
|
|
gpr_cv cv; |
|
|
|
|
ssize_t read_bytes; |
|
|
|
|
ssize_t target_read_bytes; |
|
|
|
|
}; |
|
|
|
@ -145,18 +145,18 @@ static void read_cb(void *user_data, gpr_slice *slices, size_t nslices, |
|
|
|
|
|
|
|
|
|
GPR_ASSERT(error == GRPC_ENDPOINT_CB_OK); |
|
|
|
|
|
|
|
|
|
gpr_mu_lock(&state->mu); |
|
|
|
|
gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
current_data = state->read_bytes % 256; |
|
|
|
|
read_bytes = count_and_unref_slices(slices, nslices, ¤t_data); |
|
|
|
|
state->read_bytes += read_bytes; |
|
|
|
|
gpr_log(GPR_INFO, "Read %d bytes of %d", read_bytes, |
|
|
|
|
state->target_read_bytes); |
|
|
|
|
if (state->read_bytes >= state->target_read_bytes) { |
|
|
|
|
gpr_cv_signal(&state->cv); |
|
|
|
|
/* empty */ |
|
|
|
|
} else { |
|
|
|
|
grpc_endpoint_notify_on_read(state->ep, read_cb, state); |
|
|
|
|
} |
|
|
|
|
gpr_mu_unlock(&state->mu); |
|
|
|
|
gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Write to a socket, then read from it using the grpc_tcp API. */ |
|
|
|
@ -173,31 +173,25 @@ static void read_test(ssize_t num_bytes, ssize_t slice_size) { |
|
|
|
|
create_sockets(sv); |
|
|
|
|
|
|
|
|
|
ep = grpc_tcp_create(grpc_fd_create(sv[1]), slice_size); |
|
|
|
|
grpc_endpoint_add_to_pollset(ep, &g_pollset); |
|
|
|
|
|
|
|
|
|
written_bytes = fill_socket_partial(sv[0], num_bytes); |
|
|
|
|
gpr_log(GPR_INFO, "Wrote %d bytes", written_bytes); |
|
|
|
|
|
|
|
|
|
gpr_mu_init(&state.mu); |
|
|
|
|
gpr_cv_init(&state.cv); |
|
|
|
|
state.ep = ep; |
|
|
|
|
state.read_bytes = 0; |
|
|
|
|
state.target_read_bytes = written_bytes; |
|
|
|
|
|
|
|
|
|
grpc_endpoint_notify_on_read(ep, read_cb, &state); |
|
|
|
|
|
|
|
|
|
gpr_mu_lock(&state.mu); |
|
|
|
|
for (;;) { |
|
|
|
|
GPR_ASSERT(gpr_cv_wait(&state.cv, &state.mu, deadline) == 0); |
|
|
|
|
if (state.read_bytes >= state.target_read_bytes) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
while (state.read_bytes < state.target_read_bytes) { |
|
|
|
|
grpc_pollset_work(&g_pollset, deadline); |
|
|
|
|
} |
|
|
|
|
GPR_ASSERT(state.read_bytes == state.target_read_bytes); |
|
|
|
|
gpr_mu_unlock(&state.mu); |
|
|
|
|
gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
|
|
|
|
|
grpc_endpoint_destroy(ep); |
|
|
|
|
|
|
|
|
|
gpr_mu_destroy(&state.mu); |
|
|
|
|
gpr_cv_destroy(&state.cv); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Write to a socket until it fills up, then read from it using the grpc_tcp
|
|
|
|
@ -214,37 +208,28 @@ static void large_read_test(ssize_t slice_size) { |
|
|
|
|
create_sockets(sv); |
|
|
|
|
|
|
|
|
|
ep = grpc_tcp_create(grpc_fd_create(sv[1]), slice_size); |
|
|
|
|
grpc_endpoint_add_to_pollset(ep, &g_pollset); |
|
|
|
|
written_bytes = fill_socket(sv[0]); |
|
|
|
|
gpr_log(GPR_INFO, "Wrote %d bytes", written_bytes); |
|
|
|
|
|
|
|
|
|
gpr_mu_init(&state.mu); |
|
|
|
|
gpr_cv_init(&state.cv); |
|
|
|
|
state.ep = ep; |
|
|
|
|
state.read_bytes = 0; |
|
|
|
|
state.target_read_bytes = written_bytes; |
|
|
|
|
|
|
|
|
|
grpc_endpoint_notify_on_read(ep, read_cb, &state); |
|
|
|
|
|
|
|
|
|
gpr_mu_lock(&state.mu); |
|
|
|
|
for (;;) { |
|
|
|
|
GPR_ASSERT(gpr_cv_wait(&state.cv, &state.mu, deadline) == 0); |
|
|
|
|
if (state.read_bytes >= state.target_read_bytes) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
while (state.read_bytes < state.target_read_bytes) { |
|
|
|
|
grpc_pollset_work(&g_pollset, deadline); |
|
|
|
|
} |
|
|
|
|
GPR_ASSERT(state.read_bytes == state.target_read_bytes); |
|
|
|
|
gpr_mu_unlock(&state.mu); |
|
|
|
|
gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
|
|
|
|
|
grpc_endpoint_destroy(ep); |
|
|
|
|
|
|
|
|
|
gpr_mu_destroy(&state.mu); |
|
|
|
|
gpr_cv_destroy(&state.cv); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct write_socket_state { |
|
|
|
|
grpc_endpoint *ep; |
|
|
|
|
gpr_mu mu; |
|
|
|
|
gpr_cv cv; |
|
|
|
|
int write_done; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -275,11 +260,11 @@ static void write_done(void *user_data /* write_socket_state */, |
|
|
|
|
grpc_endpoint_cb_status error) { |
|
|
|
|
struct write_socket_state *state = (struct write_socket_state *)user_data; |
|
|
|
|
gpr_log(GPR_INFO, "Write done callback called"); |
|
|
|
|
gpr_mu_lock(&state->mu); |
|
|
|
|
gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
gpr_log(GPR_INFO, "Signalling write done"); |
|
|
|
|
state->write_done = 1; |
|
|
|
|
gpr_cv_signal(&state->cv); |
|
|
|
|
gpr_mu_unlock(&state->mu); |
|
|
|
|
grpc_pollset_kick(&g_pollset); |
|
|
|
|
gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void drain_socket_blocking(int fd, size_t num_bytes, size_t read_size) { |
|
|
|
@ -294,6 +279,9 @@ void drain_socket_blocking(int fd, size_t num_bytes, size_t read_size) { |
|
|
|
|
GPR_ASSERT(fcntl(fd, F_SETFL, flags & ~O_NONBLOCK) == 0); |
|
|
|
|
|
|
|
|
|
for (;;) { |
|
|
|
|
gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
grpc_pollset_work(&g_pollset, GRPC_TIMEOUT_MILLIS_TO_DEADLINE(10)); |
|
|
|
|
gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
do { |
|
|
|
|
bytes_read = |
|
|
|
|
read(fd, buf, bytes_left > read_size ? read_size : bytes_left); |
|
|
|
@ -351,9 +339,8 @@ static void write_test(ssize_t num_bytes, ssize_t slice_size) { |
|
|
|
|
create_sockets(sv); |
|
|
|
|
|
|
|
|
|
ep = grpc_tcp_create(grpc_fd_create(sv[1]), GRPC_TCP_DEFAULT_READ_SLICE_SIZE); |
|
|
|
|
grpc_endpoint_add_to_pollset(ep, &g_pollset); |
|
|
|
|
|
|
|
|
|
gpr_mu_init(&state.mu); |
|
|
|
|
gpr_cv_init(&state.cv); |
|
|
|
|
state.ep = ep; |
|
|
|
|
state.write_done = 0; |
|
|
|
|
|
|
|
|
@ -366,19 +353,17 @@ static void write_test(ssize_t num_bytes, ssize_t slice_size) { |
|
|
|
|
GPR_ASSERT(read_bytes == num_bytes); |
|
|
|
|
} else { |
|
|
|
|
drain_socket_blocking(sv[0], num_bytes, num_bytes); |
|
|
|
|
gpr_mu_lock(&state.mu); |
|
|
|
|
gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
for (;;) { |
|
|
|
|
if (state.write_done) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
GPR_ASSERT(gpr_cv_wait(&state.cv, &state.mu, deadline) == 0); |
|
|
|
|
grpc_pollset_work(&g_pollset, deadline); |
|
|
|
|
} |
|
|
|
|
gpr_mu_unlock(&state.mu); |
|
|
|
|
gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_endpoint_destroy(ep); |
|
|
|
|
gpr_mu_destroy(&state.mu); |
|
|
|
|
gpr_cv_destroy(&state.cv); |
|
|
|
|
gpr_free(slices); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -407,10 +392,9 @@ static void write_error_test(ssize_t num_bytes, ssize_t slice_size) { |
|
|
|
|
create_sockets(sv); |
|
|
|
|
|
|
|
|
|
ep = grpc_tcp_create(grpc_fd_create(sv[1]), GRPC_TCP_DEFAULT_READ_SLICE_SIZE); |
|
|
|
|
grpc_endpoint_add_to_pollset(ep, &g_pollset); |
|
|
|
|
close(sv[0]); |
|
|
|
|
|
|
|
|
|
gpr_mu_init(&state.mu); |
|
|
|
|
gpr_cv_init(&state.cv); |
|
|
|
|
state.ep = ep; |
|
|
|
|
state.write_done = 0; |
|
|
|
|
|
|
|
|
@ -423,20 +407,18 @@ static void write_error_test(ssize_t num_bytes, ssize_t slice_size) { |
|
|
|
|
break; |
|
|
|
|
case GRPC_ENDPOINT_WRITE_PENDING: |
|
|
|
|
grpc_endpoint_notify_on_read(ep, read_done_for_write_error, NULL); |
|
|
|
|
gpr_mu_lock(&state.mu); |
|
|
|
|
gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
for (;;) { |
|
|
|
|
if (state.write_done) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
GPR_ASSERT(gpr_cv_wait(&state.cv, &state.mu, deadline) == 0); |
|
|
|
|
grpc_pollset_work(&g_pollset, deadline); |
|
|
|
|
} |
|
|
|
|
gpr_mu_unlock(&state.mu); |
|
|
|
|
gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_endpoint_destroy(ep); |
|
|
|
|
gpr_mu_destroy(&state.mu); |
|
|
|
|
gpr_cv_destroy(&state.cv); |
|
|
|
|
free(slices); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -475,6 +457,8 @@ static grpc_endpoint_test_fixture create_fixture_tcp_socketpair( |
|
|
|
|
create_sockets(sv); |
|
|
|
|
f.client_ep = grpc_tcp_create(grpc_fd_create(sv[0]), slice_size); |
|
|
|
|
f.server_ep = grpc_tcp_create(grpc_fd_create(sv[1]), slice_size); |
|
|
|
|
grpc_endpoint_add_to_pollset(f.client_ep, &g_pollset); |
|
|
|
|
grpc_endpoint_add_to_pollset(f.server_ep, &g_pollset); |
|
|
|
|
|
|
|
|
|
return f; |
|
|
|
|
} |
|
|
|
@ -483,11 +467,17 @@ static grpc_endpoint_test_config configs[] = { |
|
|
|
|
{"tcp/tcp_socketpair", create_fixture_tcp_socketpair, clean_up}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void destroy_pollset(void *p) { |
|
|
|
|
grpc_pollset_destroy(p); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv) { |
|
|
|
|
grpc_test_init(argc, argv); |
|
|
|
|
grpc_init(); |
|
|
|
|
grpc_pollset_init(&g_pollset); |
|
|
|
|
run_tests(); |
|
|
|
|
grpc_endpoint_tests(configs[0]); |
|
|
|
|
grpc_endpoint_tests(configs[0], &g_pollset); |
|
|
|
|
grpc_pollset_shutdown(&g_pollset, destroy_pollset, &g_pollset); |
|
|
|
|
grpc_shutdown(); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|