aboutsummaryrefslogtreecommitdiff
path: root/tests/survey.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-04-20 20:52:32 -0700
committerGarrett D'Amore <garrett@damore.org>2018-04-24 15:06:33 -0700
commitfdefff742662ed4eb476bf19b9dda245f86bc406 (patch)
treea4e132716debd64e434478f8814f368db052cbc6 /tests/survey.c
parente0b47b12d3d1462d07c5038e4f34f5282eeec675 (diff)
downloadnng-fdefff742662ed4eb476bf19b9dda245f86bc406.tar.gz
nng-fdefff742662ed4eb476bf19b9dda245f86bc406.tar.bz2
nng-fdefff742662ed4eb476bf19b9dda245f86bc406.zip
fixes #342 Want Surveyor/Respondent context support
fixes #360 core should nng_aio_begin before nng_aio_finish_error fixes #361 nng_send_aio should check for NULL message fixes #362 nni_msgq does not signal pollable on certain events This adds support for contexts for both sides of the surveyor pattern. Prior to this commit, the raw mode was completely broken, and there were numerous other bugs found and fixed. This integration includes *much* deeper validation of this pattern. Some changes to the core and other patterns have been made, where it was obvioius that we could make such improvements. (The obviousness stemming from the fact that RESPONDENT in particular is very closely derived from REP.)
Diffstat (limited to 'tests/survey.c')
-rw-r--r--tests/survey.c217
1 files changed, 217 insertions, 0 deletions
diff --git a/tests/survey.c b/tests/survey.c
index a3a7ba1d..ed73b3dd 100644
--- a/tests/survey.c
+++ b/tests/survey.c
@@ -14,6 +14,7 @@
#include "protocol/survey0/respond.h"
#include "protocol/survey0/survey.h"
#include "stubs.h"
+#include "supplemental/util/platform.h"
#include <string.h>
@@ -114,5 +115,221 @@ TestMain("SURVEY pattern", {
So(nng_recvmsg(surv, &msg, 0) == NNG_ESTATE);
});
});
+
+ Convey("Second send cancels pending recv", {
+ nng_msg *msg;
+ nng_aio *aio;
+
+ So(nng_aio_alloc(&aio, NULL, NULL) == 0);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ APPENDSTR(msg, "one");
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ msg = NULL;
+ nng_recv_aio(surv, aio);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ APPENDSTR(msg, "two");
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ nng_aio_wait(aio);
+ So(nng_aio_result(aio) == NNG_ECANCELED);
+ });
+
+ Convey("Sending a NULL message does not panic", {
+ nng_aio *aio;
+
+ So(nng_aio_alloc(&aio, NULL, NULL) == 0);
+ Reset({ nng_aio_free(aio); });
+ So(nng_sendmsg(surv, NULL, 0) == NNG_EINVAL);
+ nng_send_aio(surv, aio);
+ nng_aio_wait(aio);
+ So(nng_aio_result(aio) == NNG_EINVAL);
+ });
+
+ Convey("Disconnecting before getting response", {
+ nng_msg *msg;
+
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ So(nng_recvmsg(resp, &msg, 0) == 0);
+ nng_close(surv);
+ nng_msleep(100);
+ So(nng_sendmsg(resp, msg, 0) == 0);
+ });
+ });
+
+ Convey("Bad backtrace survey is ignored", {
+ nng_socket surv;
+ nng_socket resp;
+ nng_msg * msg;
+ So(nng_surveyor0_open_raw(&surv) == 0);
+ So(nng_respondent0_open(&resp) == 0);
+ Reset({
+ nng_close(surv);
+ nng_close(resp);
+ });
+ So(nng_listen(resp, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_dial(surv, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_setopt_ms(resp, NNG_OPT_RECVTIMEO, 200) == 0);
+ nng_msleep(100);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_header_append_u32(msg, 1) ==
+ 0); // high order bit not set!
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ So(nng_recvmsg(resp, &msg, 0) == NNG_ETIMEDOUT);
+ });
+
+ Convey("Bad backtrace survey is ignored (raw)", {
+ nng_socket surv;
+ nng_socket resp;
+ nng_msg * msg;
+ So(nng_surveyor0_open_raw(&surv) == 0);
+ So(nng_respondent0_open_raw(&resp) == 0);
+ Reset({
+ nng_close(surv);
+ nng_close(resp);
+ });
+ So(nng_listen(resp, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_dial(surv, "inproc://badsurvback", NULL, 0) == 0);
+ nng_msleep(100);
+ So(nng_setopt_ms(resp, NNG_OPT_RECVTIMEO, 200) == 0);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_header_append_u32(msg, 1) ==
+ 0); // high order bit not set!
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ So(nng_recvmsg(resp, &msg, 0) == NNG_ETIMEDOUT);
+ });
+
+ Convey("Missing backtrace survey is ignored", {
+ nng_socket surv;
+ nng_socket resp;
+ nng_msg * msg;
+ So(nng_surveyor0_open_raw(&surv) == 0);
+ So(nng_respondent0_open(&resp) == 0);
+ Reset({
+ nng_close(surv);
+ nng_close(resp);
+ });
+ So(nng_listen(resp, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_dial(surv, "inproc://badsurvback", NULL, 0) == 0);
+ nng_msleep(100);
+ So(nng_setopt_ms(resp, NNG_OPT_RECVTIMEO, 200) == 0);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ So(nng_recvmsg(resp, &msg, 0) == NNG_ETIMEDOUT);
+ });
+
+ Convey("Missing backtrace survey is ignored (raw)", {
+ nng_socket surv;
+ nng_socket resp;
+ nng_msg * msg;
+ So(nng_surveyor0_open_raw(&surv) == 0);
+ So(nng_respondent0_open_raw(&resp) == 0);
+ Reset({
+ nng_close(surv);
+ nng_close(resp);
+ });
+ So(nng_listen(resp, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_dial(surv, "inproc://badsurvback", NULL, 0) == 0);
+ nng_msleep(100);
+ So(nng_setopt_ms(resp, NNG_OPT_RECVTIMEO, 200) == 0);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ So(nng_recvmsg(resp, &msg, 0) == NNG_ETIMEDOUT);
+ });
+
+ Convey("Bad backtrace response is ignored", {
+ nng_socket surv;
+ nng_socket resp;
+ nng_msg * msg;
+ So(nng_surveyor0_open(&surv) == 0);
+ So(nng_respondent0_open_raw(&resp) == 0);
+ Reset({
+ nng_close(surv);
+ nng_close(resp);
+ });
+ So(nng_listen(resp, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_dial(surv, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_setopt_ms(resp, NNG_OPT_RECVTIMEO, 200) == 0);
+ So(nng_setopt_ms(surv, NNG_OPT_RECVTIMEO, 200) == 0);
+ nng_msleep(100);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ So(nng_recvmsg(resp, &msg, 0) == 0);
+ nng_msg_header_clear(msg);
+ nng_msg_header_append_u32(msg, 1);
+ So(nng_sendmsg(resp, msg, 0) == 0);
+ So(nng_recvmsg(surv, &msg, 0) == NNG_ETIMEDOUT);
});
+
+ Convey("Bad backtrace response is ignored (raw)", {
+ nng_socket surv;
+ nng_socket resp;
+ nng_msg * msg;
+ So(nng_surveyor0_open_raw(&surv) == 0);
+ So(nng_respondent0_open_raw(&resp) == 0);
+ Reset({
+ nng_close(surv);
+ nng_close(resp);
+ });
+ So(nng_listen(resp, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_dial(surv, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_setopt_ms(resp, NNG_OPT_RECVTIMEO, 200) == 0);
+ So(nng_setopt_ms(surv, NNG_OPT_RECVTIMEO, 200) == 0);
+ nng_msleep(100);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_header_append_u32(msg, 0x80000000) == 0);
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ So(nng_recvmsg(resp, &msg, 0) == 0);
+ nng_msg_header_clear(msg);
+ nng_msg_header_append_u32(msg, 1);
+ So(nng_sendmsg(resp, msg, 0) == 0);
+ So(nng_recvmsg(surv, &msg, 0) == NNG_ETIMEDOUT);
+ });
+
+ Convey("Missing backtrace response is ignored", {
+ nng_socket surv;
+ nng_socket resp;
+ nng_msg * msg;
+ So(nng_surveyor0_open(&surv) == 0);
+ So(nng_respondent0_open_raw(&resp) == 0);
+ Reset({
+ nng_close(surv);
+ nng_close(resp);
+ });
+ So(nng_listen(resp, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_dial(surv, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_setopt_ms(resp, NNG_OPT_RECVTIMEO, 200) == 0);
+ So(nng_setopt_ms(surv, NNG_OPT_RECVTIMEO, 200) == 0);
+ nng_msleep(100);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ So(nng_recvmsg(resp, &msg, 0) == 0);
+ nng_msg_header_clear(msg);
+ So(nng_sendmsg(resp, msg, 0) == 0);
+ So(nng_recvmsg(surv, &msg, 0) == NNG_ETIMEDOUT);
+ });
+
+ Convey("Missing backtrace response is ignored (raw)", {
+ nng_socket surv;
+ nng_socket resp;
+ nng_msg * msg;
+ So(nng_surveyor0_open_raw(&surv) == 0);
+ So(nng_respondent0_open_raw(&resp) == 0);
+ Reset({
+ nng_close(surv);
+ nng_close(resp);
+ });
+ So(nng_listen(resp, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_dial(surv, "inproc://badsurvback", NULL, 0) == 0);
+ So(nng_setopt_ms(resp, NNG_OPT_RECVTIMEO, 200) == 0);
+ So(nng_setopt_ms(surv, NNG_OPT_RECVTIMEO, 200) == 0);
+ nng_msleep(100);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_header_append_u32(msg, 0x80000000) == 0);
+ So(nng_sendmsg(surv, msg, 0) == 0);
+ So(nng_recvmsg(resp, &msg, 0) == 0);
+ nng_msg_header_clear(msg);
+ So(nng_sendmsg(resp, msg, 0) == 0);
+ So(nng_recvmsg(surv, &msg, 0) == NNG_ETIMEDOUT);
+ });
+
});