diff --git a/test-suite/machinarium_test.c b/test-suite/machinarium_test.c index 5d13b6a5..e0182c52 100644 --- a/test-suite/machinarium_test.c +++ b/test-suite/machinarium_test.c @@ -31,6 +31,8 @@ extern void test_accept_cancel(void); extern void test_client_server(void); extern void test_client_server_readahead(void); +extern void test_read_timeout(void); +extern void test_read_cancel(void); int main(int argc, char *argv[]) @@ -54,5 +56,7 @@ main(int argc, char *argv[]) machinarium_test(test_accept_cancel); machinarium_test(test_client_server); machinarium_test(test_client_server_readahead); + machinarium_test(test_read_timeout); + machinarium_test(test_read_cancel); return 0; } diff --git a/test-suite/machinarium_test.h b/test-suite/machinarium_test.h index dd79f3d8..33c1332e 100644 --- a/test-suite/machinarium_test.h +++ b/test-suite/machinarium_test.h @@ -9,15 +9,17 @@ #define machinarium_test(function) \ do { \ + fprintf(stdout, "%s: ", #function); \ + fflush(stdout); \ (function)(); \ - fprintf(stdout, "%s: ok\n", #function); \ + fprintf(stdout, "ok\n"); \ } while (0); #define test(expression) \ do { \ if (! (expression)) { \ - fprintf(stdout, "%s: fail (%s:%d) %s\n", \ - __func__, __FILE__, __LINE__, #expression); \ + fprintf(stdout, "fail (%s:%d) %s\n", \ + __FILE__, __LINE__, #expression); \ fflush(stdout); \ abort(); \ } \ diff --git a/test-suite/makefile b/test-suite/makefile index 0e067bab..362de4fb 100644 --- a/test-suite/makefile +++ b/test-suite/makefile @@ -23,7 +23,9 @@ OBJECTS = machinarium_test.o \ test_accept_timeout.o \ test_accept_cancel.o \ test_client_server.o \ - test_client_server_readahead.o + test_client_server_readahead.o \ + test_read_timeout.o \ + test_read_cancel.o all: clean $(OBJECTS) machinarium_test machinarium_test: $(CC) $(OBJECTS) $(LFLAGS) -o machinarium_test diff --git a/test-suite/test_read_cancel.c b/test-suite/test_read_cancel.c new file mode 100644 index 00000000..60c8d371 --- /dev/null +++ b/test-suite/test_read_cancel.c @@ -0,0 +1,94 @@ + +/* + * machinarium. + * + * Cooperative multitasking engine. +*/ + +#include +#include + +#include +#include + +static int client_id; + +static void +server(void *arg) +{ + machine_t machine = arg; + machine_io_t server = machine_create_io(machine); + test(server != NULL); + + struct sockaddr_in sa; + sa.sin_family = AF_INET; + sa.sin_addr.s_addr = inet_addr("127.0.0.1"); + sa.sin_port = htons(7778); + int rc; + rc = machine_bind(server, (struct sockaddr*)&sa); + test(rc == 0); + + machine_io_t client; + rc = machine_accept(server, &client, 16, INT_MAX); + test(rc == 0); + + machine_sleep(machine, 0); + rc = machine_cancel(machine, client_id); + test(rc == 0); + + rc = machine_close(client); + test(rc == 0); + machine_free_io(client); + + rc = machine_close(server); + test(rc == 0); + machine_free_io(server); +} + +static void +client(void *arg) +{ + machine_t machine = arg; + machine_io_t client = machine_create_io(machine); + test(client != NULL); + + struct sockaddr_in sa; + sa.sin_family = AF_INET; + sa.sin_addr.s_addr = inet_addr("127.0.0.1"); + sa.sin_port = htons(7778); + int rc; + rc = machine_connect(client, (struct sockaddr*)&sa, INT_MAX); + test(rc == 0); + + char buf[16]; + rc = machine_read(client, buf, 12, INT_MAX); + test(rc == -1); + test(! machine_read_timedout(client)); + test(machine_cancelled(machine)); + + rc = machine_close(client); + test(rc == 0); + machine_free_io(client); + + machine_stop(machine); +} + +void +test_read_cancel(void) +{ + machine_t machine = machine_create(); + test(machine != NULL); + + int rc; + rc = machine_create_fiber(machine, server, machine); + test(rc != -1); + + rc = machine_create_fiber(machine, client, machine); + test(rc != -1); + client_id = rc; + + machine_start(machine); + + rc = machine_free(machine); + test(rc != -1); +} diff --git a/test-suite/test_read_timeout.c b/test-suite/test_read_timeout.c new file mode 100644 index 00000000..2dc90a6d --- /dev/null +++ b/test-suite/test_read_timeout.c @@ -0,0 +1,86 @@ + +/* + * machinarium. + * + * Cooperative multitasking engine. +*/ + +#include +#include + +#include +#include + +static void +server(void *arg) +{ + machine_t machine = arg; + machine_io_t server = machine_create_io(machine); + test(server != NULL); + + struct sockaddr_in sa; + sa.sin_family = AF_INET; + sa.sin_addr.s_addr = inet_addr("127.0.0.1"); + sa.sin_port = htons(7778); + int rc; + rc = machine_bind(server, (struct sockaddr*)&sa); + test(rc == 0); + + machine_io_t client; + rc = machine_accept(server, &client, 16, INT_MAX); + test(rc == 0); + + rc = machine_close(client); + test(rc == 0); + machine_free_io(client); + + rc = machine_close(server); + test(rc == 0); + machine_free_io(server); +} + +static void +client(void *arg) +{ + machine_t machine = arg; + machine_io_t client = machine_create_io(machine); + test(client != NULL); + + struct sockaddr_in sa; + sa.sin_family = AF_INET; + sa.sin_addr.s_addr = inet_addr("127.0.0.1"); + sa.sin_port = htons(7778); + int rc; + rc = machine_connect(client, (struct sockaddr*)&sa, INT_MAX); + test(rc == 0); + + char buf[16]; + rc = machine_read(client, buf, 12, 0); + test(rc == -1); + test(machine_read_timedout(client)); + + rc = machine_close(client); + test(rc == 0); + machine_free_io(client); + + machine_stop(machine); +} + +void +test_read_timeout(void) +{ + machine_t machine = machine_create(); + test(machine != NULL); + + int rc; + rc = machine_create_fiber(machine, server, machine); + test(rc != -1); + + rc = machine_create_fiber(machine, client, machine); + test(rc != -1); + + machine_start(machine); + + rc = machine_free(machine); + test(rc != -1); +}