Allow reading/writing generic message types, not just tasks. (#24)

* Allow reading/writing generic message types, not just tasks.

* Allow messages of length 0 to be read/written, and handle closed sockets.

* Address comments.

* Simplify accept_client.

* Allow ports to be reused in bind_ipc_sock.
This commit is contained in:
Robert Nishihara
2016-09-27 18:51:35 -07:00
committed by Philipp Moritz
parent 631de92170
commit 084220b0e7
7 changed files with 99 additions and 72 deletions
+7 -4
View File
@@ -20,20 +20,23 @@ TEST ipc_socket_test(void) {
close(socket_fd);
socket_fd = connect_ipc_sock(socket_pathname);
ASSERT(socket_fd >= 0);
write_string(socket_fd, test_string);
write_bytes(socket_fd, (uint8_t *) test_bytes, strlen(test_bytes));
write_log_message(socket_fd, test_string);
write_message(socket_fd, LOG_MESSAGE, strlen(test_bytes),
(uint8_t *) test_bytes);
close(socket_fd);
exit(0);
} else {
int client_fd = accept_client(socket_fd);
ASSERT(client_fd >= 0);
char *message = read_string(client_fd);
char *message = read_log_message(client_fd);
ASSERT(message != NULL);
ASSERT_STR_EQ(test_string, message);
free(message);
int64_t type;
int64_t len;
uint8_t *bytes;
read_bytes(client_fd, &bytes, &len);
read_message(client_fd, &type, &len, &bytes);
ASSERT(type == LOG_MESSAGE);
ASSERT(memcmp(test_bytes, bytes, len) == 0);
free(bytes);
close(client_fd);
+5 -5
View File
@@ -45,10 +45,10 @@ TEST redis_socket_test(void) {
int client_fd = connect_ipc_sock(socket_pathname);
ASSERT(client_fd >= 0);
write_formatted_string(client_fd, test_set_format, test_key, test_value);
write_formatted_log_message(client_fd, test_set_format, test_key, test_value);
int server_fd = accept_client(socket_fd);
char *cmd = read_string(server_fd);
char *cmd = read_log_message(server_fd);
close(client_fd);
close(server_fd);
close(socket_fd);
@@ -69,7 +69,7 @@ TEST redis_socket_test(void) {
void redis_read_callback(event_loop *loop, int fd, void *context, int events) {
db_handle *db = context;
char *cmd = read_string(fd);
char *cmd = read_log_message(fd);
redisAsyncCommand(db->context, async_redis_socket_test_callback, NULL, cmd,
db->client_id, 0);
free(cmd);
@@ -109,7 +109,7 @@ TEST async_redis_socket_test(void) {
int client_fd = connect_ipc_sock(socket_pathname);
ASSERT(client_fd >= 0);
utarray_push_back(connections, &client_fd);
write_formatted_string(client_fd, test_set_format, test_key, test_value);
write_formatted_log_message(client_fd, test_set_format, test_key, test_value);
event_loop_add_file(loop, client_fd, EVENT_LOOP_READ, redis_read_callback,
db);
@@ -148,7 +148,7 @@ void logging_read_callback(event_loop *loop,
void *context,
int events) {
db_handle *conn = context;
char *cmd = read_string(fd);
char *cmd = read_log_message(fd);
redisAsyncCommand(conn->context, logging_test_callback, NULL, cmd,
conn->client_id, 0);
free(cmd);
+8 -2
View File
@@ -7,6 +7,7 @@
#include "common.h"
#include "test/example_task.h"
#include "task.h"
#include "io.h"
SUITE(task_tests);
@@ -48,8 +49,13 @@ TEST send_task(void) {
*task_return(task, 1) = globally_unique_id();
int fd[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
write_task(fd[0], task);
task_spec *result = read_task(fd[1]);
write_message(fd[0], SUBMIT_TASK, task_size(task), task);
int64_t type;
int64_t length;
uint8_t *message;
read_message(fd[1], &type, &length, &message);
task_spec *result = (task_spec *) message;
ASSERT(type == SUBMIT_TASK);
ASSERT(memcmp(task, result, task_size(task)) == 0);
ASSERT(memcmp(task, result, task_size(result)) == 0);
free(task);