aboutsummaryrefslogtreecommitdiff
path: root/tests/reqrep.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/reqrep.c')
-rw-r--r--tests/reqrep.c289
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();
-})