diff options
| author | Garrett D'Amore <garrett@damore.org> | 2019-12-21 10:20:55 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2019-12-24 00:34:29 -0800 |
| commit | 3f7561417bec08226bcfeb107d94be0dbf71b09e (patch) | |
| tree | 409901d7929df5eeb7295ab971b34c2e1040f507 /tests/reqrep.c | |
| parent | 9e7a4aff25139703bbc375b6dda263d6d42341a8 (diff) | |
| download | nng-3f7561417bec08226bcfeb107d94be0dbf71b09e.tar.gz nng-3f7561417bec08226bcfeb107d94be0dbf71b09e.tar.bz2 nng-3f7561417bec08226bcfeb107d94be0dbf71b09e.zip | |
fixes #1032 Figure out Darwin bustedness
fixes #1035 Convey is awkward -- consider acutest.h
This represents a rather large effort towards cleaning up our
testing and optional configuration infrastructure.
A separate test library is built by default, which is static, and
includes some useful utilities design to make it easier to write
shorter and more robust (not timing dependent) tests. This also means
that we can cover pretty nearly all the tests (protocols etc.) in
every case, even if the shipped image will be minimized.
Subsystems which are optional can now use a few new macros to configure
what they need see nng_sources_if, nng_headers_if, and nng_defines_if.
This goes a long way to making the distributed CMakefiles a lot simpler.
Additionally, tests for different parts of the tree can now be located
outside of the tests/ tree, so that they can be placed next to the code
that they are testing.
Beyond the enabling work, the work has only begun, but these changes
have resolved the most often failing tests for Darwin in the cloud.
Diffstat (limited to 'tests/reqrep.c')
| -rw-r--r-- | tests/reqrep.c | 289 |
1 files changed, 0 insertions, 289 deletions
diff --git a/tests/reqrep.c b/tests/reqrep.c deleted file mode 100644 index 526891ca..00000000 --- a/tests/reqrep.c +++ /dev/null @@ -1,289 +0,0 @@ -// -// Copyright 2018 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 -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -#include <string.h> - -#include <nng/nng.h> -#include <nng/protocol/reqrep0/rep.h> -#include <nng/protocol/reqrep0/req.h> -#include <nng/supplemental/util/platform.h> - -#include "convey.h" -#include "stubs.h" - -TestMain("REQ/REP pattern", { - int rv; - const char *addr = "inproc://test"; - Convey("We can create a REQ socket", { - nng_socket req; - - So(nng_req_open(&req) == 0); - - Reset({ nng_close(req); }); - - Convey("Protocol & peer options match", { - int p; - char *s; - So(nng_getopt_int(req, NNG_OPT_PROTO, &p) == 0); - So(p == 48); - So(nng_getopt_string(req, NNG_OPT_PROTONAME, &s) == 0); - So(strcmp(s, "req") == 0); - nng_strfree(s); - So(nng_getopt_int(req, NNG_OPT_PEER, &p) == 0); - So(p == 49); - So(nng_getopt_string(req, NNG_OPT_PEERNAME, &s) == 0); - So(strcmp(s, "rep") == 0); - nng_strfree(s); - }); - - Convey("Resend time option id works", { - // Set timeout. - So(nng_setopt_ms(req, NNG_OPT_REQ_RESENDTIME, 10) == - 0); - // Check invalid size - So(nng_setopt(req, NNG_OPT_REQ_RESENDTIME, "", 1) == - NNG_EINVAL); - }); - - Convey("Recv with no send fails", { - nng_msg *msg; - rv = nng_recvmsg(req, &msg, 0); - So(rv == NNG_ESTATE); - }); - }); - - Convey("We can create a REP socket", { - nng_socket rep; - So(nng_rep_open(&rep) == 0); - - Reset({ nng_close(rep); }); - - Convey("Protocol & peer options match", { - int p; - char *s; - So(nng_getopt_int(rep, NNG_OPT_PROTO, &p) == 0); - So(p == 49); - So(nng_getopt_string(rep, NNG_OPT_PROTONAME, &s) == 0); - So(strcmp(s, "rep") == 0); - nng_strfree(s); - So(nng_getopt_int(rep, NNG_OPT_PEER, &p) == 0); - So(p == 48); - So(nng_getopt_string(rep, NNG_OPT_PEERNAME, &s) == 0); - So(strcmp(s, "req") == 0); - nng_strfree(s); - }); - - Convey("Send with no recv fails", { - nng_msg *msg; - rv = nng_msg_alloc(&msg, 0); - So(rv == 0); - rv = nng_sendmsg(rep, msg, 0); - So(rv == NNG_ESTATE); - nng_msg_free(msg); - }); - - Convey("Cannot set resend time", { - So(nng_setopt_ms(rep, NNG_OPT_REQ_RESENDTIME, 100) == - NNG_ENOTSUP); - }); - }); - - Convey("We can create a linked REQ/REP pair", { - nng_socket req; - nng_socket rep; - - So(nng_rep_open(&rep) == 0); - - So(nng_req_open(&req) == 0); - - Reset({ - nng_close(rep); - nng_close(req); - }); - - So(nng_listen(rep, addr, NULL, 0) == 0); - So(nng_dial(req, addr, NULL, 0) == 0); - - Convey("They can REQ/REP exchange", { - nng_msg *ping; - nng_msg *pong; - - So(nng_msg_alloc(&ping, 0) == 0); - So(nng_msg_append(ping, "ping", 5) == 0); - So(nng_msg_len(ping) == 5); - So(memcmp(nng_msg_body(ping), "ping", 5) == 0); - So(nng_sendmsg(req, ping, 0) == 0); - pong = NULL; - So(nng_recvmsg(rep, &pong, 0) == 0); - So(pong != NULL); - So(nng_msg_len(pong) == 5); - So(memcmp(nng_msg_body(pong), "ping", 5) == 0); - nng_msg_trim(pong, 5); - So(nng_msg_append(pong, "pong", 5) == 0); - So(nng_sendmsg(rep, pong, 0) == 0); - ping = 0; - So(nng_recvmsg(req, &ping, 0) == 0); - So(ping != NULL); - So(nng_msg_len(ping) == 5); - So(memcmp(nng_msg_body(ping), "pong", 5) == 0); - nng_msg_free(ping); - }); - }); - - Convey("Request cancellation works", { - nng_msg * abc; - nng_msg * def; - nng_msg * cmd; - nng_duration retry = 100; // 100 ms - - nng_socket req; - nng_socket rep; - - So(nng_rep_open(&rep) == 0); - - So(nng_req_open(&req) == 0); - - Reset({ - nng_close(rep); - nng_close(req); - }); - - So(nng_setopt_ms(req, NNG_OPT_REQ_RESENDTIME, retry) == 0); - So(nng_setopt_int(req, NNG_OPT_SENDBUF, 16) == 0); - - So(nng_msg_alloc(&abc, 0) == 0); - So(nng_msg_append(abc, "abc", 4) == 0); - So(nng_msg_alloc(&def, 0) == 0); - So(nng_msg_append(def, "def", 4) == 0); - - So(nng_listen(rep, addr, NULL, 0) == 0); - So(nng_dial(req, addr, NULL, 0) == 0); - - // Send req #1 (abc). - So(nng_sendmsg(req, abc, 0) == 0); - - // Sleep a bit. This is so that we ensure that our - // request gets to the far side. (If we cancel too - // fast, then our outgoing send will be canceled before - // it gets to the wire.) - nng_msleep(20); - - // Send the next next request ("def"). Note that - // the REP side server will have already buffered the receive - // request, and should simply be waiting for us to reply to - // abc. - So(nng_sendmsg(req, def, 0) == 0); - - // Receive the first request (should be abc) on the REP server. - So(nng_recvmsg(rep, &cmd, 0) == 0); - So(nng_msg_len(cmd) == 4); - So(strcmp(nng_msg_body(cmd), "abc") == 0); - - // REP sends the reply to first command. This will be - // discarded by the REQ server. - So(nng_sendmsg(rep, cmd, 0) == 0); - - // Now get the next command from the REP; should be "def". - So(nng_recvmsg(rep, &cmd, 0) == 0); - So(nng_msg_len(cmd) == 4); - So(strcmp(nng_msg_body(cmd), "def") == 0); - - // And send it back to REQ. - So(nng_sendmsg(rep, cmd, 0) == 0); - - // Try a req command. This should give back "def" - So(nng_recvmsg(req, &cmd, 0) == 0); - So(nng_msg_len(cmd) == 4); - So(strcmp(nng_msg_body(cmd), "def") == 0); - nng_msg_free(cmd); - }); - - Convey("Request cancellation aborts pending recv", { - nng_msg * abc; - nng_msg * def; - nng_msg * cmd; - nng_aio * aio; - nng_duration retry = 100; // 100 ms - - nng_socket req; - nng_socket rep; - - So(nng_rep_open(&rep) == 0); - - So(nng_req_open(&req) == 0); - So(nng_aio_alloc(&aio, NULL, NULL) == 0); - - Reset({ - nng_close(rep); - nng_close(req); - nng_aio_free(aio); - }); - - So(nng_setopt_ms(req, NNG_OPT_REQ_RESENDTIME, retry) == 0); - So(nng_setopt_int(req, NNG_OPT_SENDBUF, 16) == 0); - - So(nng_msg_alloc(&abc, 0) == 0); - So(nng_msg_append(abc, "abc", 4) == 0); - So(nng_msg_alloc(&def, 0) == 0); - So(nng_msg_append(def, "def", 4) == 0); - - So(nng_listen(rep, addr, NULL, 0) == 0); - So(nng_dial(req, addr, NULL, 0) == 0); - - // Send req #1 (abc). - So(nng_sendmsg(req, abc, 0) == 0); - - // Sleep a bit. This is so that we ensure that our - // request gets to the far side. (If we cancel too - // fast, then our outgoing send will be canceled before - // it gets to the wire.) - nng_msleep(20); - - nng_aio_set_timeout(aio, 1000); // an entire second - nng_recv_aio(req, aio); - - // Give time for this recv to post properly. - nng_msleep(20); - - // Send the next next request ("def"). Note that - // the REP side server will have already buffered the receive - // request, and should simply be waiting for us to reply to - // abc. - So(nng_sendmsg(req, def, 0) == 0); - - nng_aio_wait(aio); - So(nng_aio_result(aio) == NNG_ECANCELED); - - // Receive the first request (should be abc) on the REP server. - So(nng_recvmsg(rep, &cmd, 0) == 0); - So(nng_msg_len(cmd) == 4); - So(strcmp(nng_msg_body(cmd), "abc") == 0); - - // REP sends the reply to first command. This will be - // discarded by the REQ server. - So(nng_sendmsg(rep, cmd, 0) == 0); - - // Now get the next command from the REP; should be "def". - So(nng_recvmsg(rep, &cmd, 0) == 0); - So(nng_msg_len(cmd) == 4); - So(strcmp(nng_msg_body(cmd), "def") == 0); - - // And send it back to REQ. - So(nng_sendmsg(rep, cmd, 0) == 0); - - // Try a req command. This should give back "def" - So(nng_recvmsg(req, &cmd, 0) == 0); - So(nng_msg_len(cmd) == 4); - So(strcmp(nng_msg_body(cmd), "def") == 0); - nng_msg_free(cmd); - }); - - nng_fini(); -}) |
