Commit 945aae00 authored by Pieter Noordhuis's avatar Pieter Noordhuis
Browse files

Test reading EOF

parent 0a66b7c0
......@@ -7,16 +7,26 @@
#include <netinet/tcp.h>
#include "net-helper.h"
void accept_and_ignore(void *ptr) {
accept_and_ignore_args *args = ptr;
int fd, rv;
void run_server(void *ptr) {
run_server_args *args = ptr;
int family = args->address.sa_family;
int fd;
int rv;
fd = socket(args->address.sa_family, SOCK_STREAM, 0);
fd = socket(family, SOCK_STREAM, 0);
if (fd == -1) {
fprintf(stderr, "socket: %s\n", strerror(errno));
exit(1);
}
if (family == AF_INET || family == AF_INET6) {
int on = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) {
fprintf(stderr, "setsockopt: %s\n", strerror(errno));
exit(1);
}
}
rv = bind(fd, &args->address.sa_addr.addr, args->address.sa_addrlen);
if (rv == -1) {
fprintf(stderr, "bind: %s\n", strerror(errno));
......@@ -40,6 +50,9 @@ void accept_and_ignore(void *ptr) {
exit(1);
}
/* Ignore the new connection */
/* Execute specified function, if given */
if (args->fn.ptr != NULL) {
args->fn.ptr(rv, args->fn.data);
}
}
}
......@@ -3,12 +3,16 @@
#include "../handle.h"
typedef struct accept_and_ignore_args_s accept_and_ignore_args;
typedef struct run_server_args_s run_server_args;
struct accept_and_ignore_args_s {
struct run_server_args_s {
redis_address address;
struct {
void (*ptr)(int fd, void *data);
void *data;
} fn;
};
void accept_and_ignore(void *ptr);
void run_server(void *ptr);
#endif
......@@ -15,6 +15,9 @@
#include <sys/socket.h>
#include <netdb.h>
/* close */
#include <unistd.h>
/* local */
#include "../context.h"
#include "../object.h"
......@@ -257,10 +260,10 @@ TEST(flush_against_full_kernel_buffer) {
redis_address addr = redis_address_in("127.0.0.1", redis_port() + 1);
accept_and_ignore_args args;
run_server_args args;
args.address = addr;
spawn(accept_and_ignore, &args);
spawn(run_server, &args);
rv = redis_context_connect_in(&c, addr.sa_addr.in);
assert_equal_return(rv, REDIS_OK);
......@@ -282,6 +285,37 @@ TEST(flush_against_full_kernel_buffer) {
assert_equal_int(errno, ETIMEDOUT);
}
void close_after_accept(int fd, void *data) {
close(fd);
}
TEST(read_against_closed_connection) {
SETUP_CONNECT();
redis_address addr = redis_address_in("127.0.0.1", redis_port() + 1);
run_server_args args;
args.address = addr;
args.fn.ptr = close_after_accept;
spawn(run_server, &args);
rv = redis_context_connect_in(&c, addr.sa_addr.in);
assert_equal_return(rv, REDIS_OK);
redis_protocol *reply = NULL;
/* Read should immediately EOF */
rv = redis_context_read(&c, &reply);
assert_equal_return(rv, REDIS_EEOF);
/* ... and should be idempotent... */
rv = redis_context_read(&c, &reply);
assert_equal_return(rv, REDIS_EEOF);
redis_context_destroy(&c);
}
int main(void) {
test_connect_in_refused();
test_connect_in6_refused();
......@@ -297,4 +331,5 @@ int main(void) {
test_call_command();
test_call_command_argv();
test_flush_against_full_kernel_buffer();
test_read_against_closed_connection();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment