diff options
Diffstat (limited to 'tests/aio.c')
| -rw-r--r-- | tests/aio.c | 377 |
1 files changed, 208 insertions, 169 deletions
diff --git a/tests/aio.c b/tests/aio.c index 9bb7de19..fdc68cb8 100644 --- a/tests/aio.c +++ b/tests/aio.c @@ -1,5 +1,5 @@ // -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2019 Staysail Systems, Inc. <info@staysail.tech> // Copyright 2018 Capitar IT Group BV <info@capitar.com> // // This software is supplied under the terms of the MIT License, a @@ -14,13 +14,7 @@ #include <nng/protocol/pair1/pair.h> #include <nng/supplemental/util/platform.h> -#include "convey.h" -#include "stubs.h" - -#define APPENDSTR(m, s) nng_msg_append(m, s, strlen(s)) -#define CHECKSTR(m, s) \ - So(nng_msg_len(m) == strlen(s)); \ - So(memcmp(nng_msg_body(m), s, strlen(s)) == 0) +#include "acutest.h" void cbdone(void *p) @@ -41,164 +35,209 @@ cancelfn(nng_aio *aio, void *arg, int rv) nng_aio_finish(aio, rv); } -Main({ - Test("AIO operations", { - const char *addr = "inproc://aio"; - - Convey("Sleep works", { - nng_time start = 0; - nng_time end = 0; - nng_aio *saio; - So(nng_aio_alloc(&saio, sleepdone, &end) == 0); - start = nng_clock(); - nng_sleep_aio(200, saio); - nng_aio_wait(saio); - So(nng_aio_result(saio) == 0); - So(end != 0); - So((end - start) >= 200); - So((end - start) <= 1000); - So((nng_clock() - start) >= 200); - So((nng_clock() - start) <= 1000); - nng_aio_free(saio); - }); - - Convey("Sleep timeout works", { - nng_time start = 0; - nng_time end = 0; - nng_aio *saio; - So(nng_aio_alloc(&saio, sleepdone, &end) == 0); - nng_aio_set_timeout(saio, 100); - start = nng_clock(); - nng_sleep_aio(2000, saio); - nng_aio_wait(saio); - So(nng_aio_result(saio) == NNG_ETIMEDOUT); - So(end != 0); - So((end - start) >= 100); - So((end - start) <= 1000); - So((nng_clock() - start) >= 100); - So((nng_clock() - start) <= 1000); - nng_aio_free(saio); - }); - - Convey("Given a connected pair of sockets", { - nng_socket s1; - nng_socket s2; - nng_aio * txaio; - nng_aio * rxaio; - int txdone = 0; - int rxdone = 0; - nng_msg * m; - - So(nng_pair1_open(&s1) == 0); - So(nng_pair1_open(&s2) == 0); - - So(nng_listen(s1, addr, NULL, 0) == 0); - So(nng_dial(s2, addr, NULL, 0) == 0); - - So(nng_aio_alloc(&rxaio, cbdone, &rxdone) == 0); - So(nng_aio_alloc(&txaio, cbdone, &txdone) == 0); - - Reset({ - nng_aio_free(rxaio); - nng_aio_free(txaio); - nng_close(s1); - nng_close(s2); - }); - - nng_aio_set_timeout(rxaio, 100); - nng_aio_set_timeout(txaio, 100); - - So(nng_msg_alloc(&m, 0) == 0); - APPENDSTR(m, "hello"); - - nng_recv_aio(s2, rxaio); - - nng_aio_set_msg(txaio, m); - nng_send_aio(s1, txaio); - - nng_aio_wait(txaio); - nng_aio_wait(rxaio); - - So(nng_aio_result(rxaio) == 0); - So(nng_aio_result(txaio) == 0); - - So((m = nng_aio_get_msg(rxaio)) != NULL); - CHECKSTR(m, "hello"); - - nng_msg_free(m); - - So(rxdone == 1); - So(txdone == 1); - }); - - Convey("Failure modes work", { - nng_socket s; - nng_aio * a; - int done = 0; - - So(nng_pair1_open(&s) == 0); - - So(nng_aio_alloc(&a, cbdone, &done) == 0); - - Reset({ - nng_aio_free(a); - nng_close(s); - }); - - Convey("Explicit timeout works", { - nng_aio_set_timeout(a, 40); - nng_recv_aio(s, a); - nng_aio_wait(a); - So(done == 1); - So(nng_aio_result(a) == NNG_ETIMEDOUT); - }); - Convey("Default timeout works", { - So(nng_setopt_ms(s, NNG_OPT_RECVTIMEO, 40) == - 0); - nng_recv_aio(s, a); - nng_aio_wait(a); - So(done == 1); - So(nng_aio_result(a) == NNG_ETIMEDOUT); - }); - Convey("Zero timeout works", { - nng_aio_set_timeout(a, NNG_DURATION_ZERO); - nng_recv_aio(s, a); - nng_aio_wait(a); - So(done == 1); - So(nng_aio_result(a) == NNG_ETIMEDOUT); - }); - Convey("Cancellation works", { - nng_aio_set_timeout(a, NNG_DURATION_INFINITE); - nng_recv_aio(s, a); - nng_aio_cancel(a); - nng_aio_wait(a); - So(done == 1); - So(nng_aio_result(a) == NNG_ECANCELED); - }) - }); - - Convey("We cannot set insane IOVs", { - nng_aio *aio; - nng_iov iov; - - So(nng_aio_alloc(&aio, NULL, NULL) == 0); - So(nng_aio_set_iov(aio, 1024, &iov) == NNG_EINVAL); - nng_aio_free(aio); - }); - - Convey("Provider cancellation works", { - nng_aio *aio; - int rv = 0; - // We fake an empty provider that does not do anything. - So(nng_aio_alloc(&aio, NULL, NULL) == 0); - So(nng_aio_begin(aio) == true); - nng_aio_defer(aio, cancelfn, &rv); - nng_aio_cancel(aio); - nng_aio_wait(aio); - So(rv == NNG_ECANCELED); - nng_aio_free(aio); - }); - }); - - nng_fini(); -}) +void +test_sleep(void) +{ + nng_time start = 0; + nng_time end = 0; + nng_aio *saio; + + TEST_CHECK(nng_aio_alloc(&saio, sleepdone, &end) == 0); + start = nng_clock(); + nng_sleep_aio(200, saio); + nng_aio_wait(saio); + TEST_CHECK(nng_aio_result(saio) == 0); + TEST_CHECK(end != 0); + TEST_CHECK((end - start) >= 200); + TEST_CHECK((end - start) <= 1000); + TEST_CHECK((nng_clock() - start) >= 200); + TEST_CHECK((nng_clock() - start) <= 1000); + nng_aio_free(saio); +} + +void +test_sleep_timeout(void) +{ + nng_time start = 0; + nng_time end = 0; + nng_aio *saio; + TEST_CHECK(nng_aio_alloc(&saio, sleepdone, &end) == 0); + nng_aio_set_timeout(saio, 100); + start = nng_clock(); + nng_sleep_aio(2000, saio); + nng_aio_wait(saio); + TEST_CHECK(nng_aio_result(saio) == NNG_ETIMEDOUT); + TEST_CHECK(end != 0); + TEST_CHECK((end - start) >= 100); + TEST_CHECK((end - start) <= 1000); + TEST_CHECK((nng_clock() - start) >= 100); + TEST_CHECK((nng_clock() - start) <= 1000); + nng_aio_free(saio); +} + +void +test_insane_niov(void) +{ + nng_aio *aio; + nng_iov iov; + + TEST_CHECK(nng_aio_alloc(&aio, NULL, NULL) == 0); + TEST_CHECK(nng_aio_set_iov(aio, 1024, &iov) == NNG_EINVAL); + nng_aio_free(aio); +} + +void +test_provider_cancel(void) +{ + nng_aio *aio; + int rv = 0; + // We fake an empty provider that does not do anything. + TEST_CHECK(nng_aio_alloc(&aio, NULL, NULL) == 0); + TEST_CHECK(nng_aio_begin(aio) == true); + nng_aio_defer(aio, cancelfn, &rv); + nng_aio_cancel(aio); + nng_aio_wait(aio); + TEST_CHECK(rv == NNG_ECANCELED); + nng_aio_free(aio); +} + +void +test_consumer_cancel(void) +{ + nng_aio * a; + nng_socket s1; + int done = 0; + + TEST_CHECK(nng_pair1_open(&s1) == 0); + TEST_CHECK(nng_aio_alloc(&a, cbdone, &done) == 0); + + nng_aio_set_timeout(a, NNG_DURATION_INFINITE); + nng_recv_aio(s1, a); + nng_aio_cancel(a); + nng_aio_wait(a); + TEST_CHECK(done == 1); + TEST_CHECK(nng_aio_result(a) == NNG_ECANCELED); + + nng_aio_free(a); + TEST_CHECK(nng_close(s1) == 0); +} + +void +test_traffic(void) +{ + nng_socket s1; + nng_socket s2; + nng_aio * txaio; + nng_aio * rxaio; + int txdone = 0; + int rxdone = 0; + nng_msg * m; + char * addr = "inproc://traffic"; + + TEST_CHECK(nng_pair1_open(&s1) == 0); + TEST_CHECK(nng_pair1_open(&s2) == 0); + + TEST_CHECK(nng_listen(s1, addr, NULL, 0) == 0); + TEST_CHECK(nng_dial(s2, addr, NULL, 0) == 0); + + TEST_CHECK(nng_aio_alloc(&rxaio, cbdone, &rxdone) == 0); + TEST_CHECK(nng_aio_alloc(&txaio, cbdone, &txdone) == 0); + + nng_aio_set_timeout(rxaio, 1000); + nng_aio_set_timeout(txaio, 1000); + + TEST_CHECK(nng_msg_alloc(&m, 0) == 0); + TEST_CHECK(nng_msg_append(m, "hello", strlen("hello")) == 0); + + nng_recv_aio(s2, rxaio); + + nng_aio_set_msg(txaio, m); + nng_send_aio(s1, txaio); + + nng_aio_wait(txaio); + nng_aio_wait(rxaio); + + TEST_CHECK(nng_aio_result(rxaio) == 0); + TEST_CHECK(nng_aio_result(txaio) == 0); + + TEST_CHECK((m = nng_aio_get_msg(rxaio)) != NULL); + TEST_CHECK(nng_msg_len(m) == strlen("hello")); + TEST_CHECK(memcmp(nng_msg_body(m), "hello", strlen("hello")) == 0); + + nng_msg_free(m); + + TEST_CHECK(rxdone == 1); + TEST_CHECK(txdone == 1); + + nng_aio_free(rxaio); + nng_aio_free(txaio); + TEST_CHECK(nng_close(s1) == 0); + TEST_CHECK(nng_close(s2) == 0); +} + +void +test_explicit_timeout(void) +{ + nng_socket s; + nng_aio * a; + int done = 0; + + TEST_CHECK(nng_pair1_open(&s) == 0); + TEST_CHECK(nng_aio_alloc(&a, cbdone, &done) == 0); + nng_aio_set_timeout(a, 40); + nng_recv_aio(s, a); + nng_aio_wait(a); + TEST_CHECK(done == 1); + TEST_CHECK(nng_aio_result(a) == NNG_ETIMEDOUT); + nng_aio_free(a); + TEST_CHECK(nng_close(s) == 0); +} + +void +test_inherited_timeout(void) +{ + nng_socket s; + nng_aio * a; + int done = 0; + + TEST_CHECK(nng_pair1_open(&s) == 0); + TEST_CHECK(nng_aio_alloc(&a, cbdone, &done) == 0); + TEST_CHECK(nng_setopt_ms(s, NNG_OPT_RECVTIMEO, 40) == 0); + nng_recv_aio(s, a); + nng_aio_wait(a); + TEST_CHECK(done == 1); + TEST_CHECK(nng_aio_result(a) == NNG_ETIMEDOUT); + nng_aio_free(a); + TEST_CHECK(nng_close(s) == 0); +} + +void +test_zero_timeout(void) +{ + nng_socket s; + nng_aio * a; + int done = 0; + + TEST_CHECK(nng_pair1_open(&s) == 0); + TEST_CHECK(nng_aio_alloc(&a, cbdone, &done) == 0); + nng_aio_set_timeout(a, NNG_DURATION_ZERO); + nng_recv_aio(s, a); + nng_aio_wait(a); + TEST_CHECK(done == 1); + TEST_CHECK(nng_aio_result(a) == NNG_ETIMEDOUT); + nng_aio_free(a); + TEST_CHECK(nng_close(s) == 0); +} + +TEST_LIST = { + { "sleep", test_sleep }, + { "sleep timeout", test_sleep_timeout }, + { "insane niov", test_insane_niov }, + { "provider cancel", test_provider_cancel }, + { "consumer cancel", test_consumer_cancel }, + { "traffic", test_traffic }, + { "explicit timeout", test_explicit_timeout }, + { "inherited timeout", test_inherited_timeout }, + { "zero timeout", test_zero_timeout }, + { NULL, NULL }, +};
\ No newline at end of file |
