From 73c1f35a3060cd3a9b1ee638d9133852a94656a6 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Fri, 25 Nov 2016 14:35:21 +0300 Subject: [PATCH] flint: add read cancel test --- tests/test_cancel_read.c | 111 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 tests/test_cancel_read.c diff --git a/tests/test_cancel_read.c b/tests/test_cancel_read.c new file mode 100644 index 00000000..20b1f34c --- /dev/null +++ b/tests/test_cancel_read.c @@ -0,0 +1,111 @@ + +/* + * machinarium. + * + * Cooperative multitasking engine. +*/ + +#include +#include +#include + +static void +server(void *arg) +{ + printf("server: started\n"); + + mm_t env = arg; + mmio_t server = mm_io_new(env); + + int rc; + rc = mm_bind(server, "127.0.0.1", 7778); + if (rc < 0) { + printf("server: bind failed\n"); + mm_close(server); + return; + } + + printf("server: waiting for connections (127.0.0.1:7778)\n"); + mmio_t client; + rc = mm_accept(server, 16, &client); + if (rc < 0) { + printf("accept error.\n"); + mm_close(server); + return; + } + + mm_sleep(env, 100 * 1000); + + mm_close(client); + mm_close(server); + printf("server: done\n"); +} + +static void +client(void *arg) +{ + printf("client: started\n"); + + mm_t env = arg; + mmio_t client = mm_io_new(env); + + int rc; + rc = mm_connect(client, "127.0.0.1", 7778, 0); + if (rc < 0) { + printf("client: connect failed\n"); + mm_close(client); + return; + } + + printf("client: connected\n"); + + /* will wait forever */ + rc = mm_read(client, 12, 0); + if (rc < 0) { + if (mm_is_cancel(env)) { + printf("client: read cancelled\n"); + } else { + printf("client: read failed\n"); + } + mm_close(client); + return; + } + + mm_close(client); + + printf("client: done\n"); +} + +static void +runner(void *arg) +{ + mm_t env = arg; + + int server_id = mm_create(env, server, env); + int client_id = mm_create(env, client, env); + + /* switch to server, client */ + mm_sleep(env, 0); + + /* switch to client read */ + mm_sleep(env, 0); + + /* cancel client read */ + mm_cancel(env, client_id); + + mm_sleep(env, 0); + mm_cancel(env, server_id); + mm_sleep(env, 0); + + mm_stop(env); +} + +int +main(int argc, char *argv[]) +{ + mm_t env = mm_new(); + mm_create(env, runner, env); + mm_start(env); + mm_free(env); + return 0; +}