aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-08-11 15:42:34 -0700
committerGarrett D'Amore <garrett@damore.org>2017-08-11 15:42:34 -0700
commitd325e73b53c44e87ea4a2f2f91c9e84f61f7e889 (patch)
tree3202b07ce2a3cb21781c848e6b75bdfdccc6edab
parent4d68401997ba4a13d4fc12f24b49dabd9ed170ea (diff)
downloadnng-d325e73b53c44e87ea4a2f2f91c9e84f61f7e889.tar.gz
nng-d325e73b53c44e87ea4a2f2f91c9e84f61f7e889.tar.bz2
nng-d325e73b53c44e87ea4a2f2f91c9e84f61f7e889.zip
Fix TTL handling for pair1 protocol; more tests.
-rw-r--r--src/protocol/pair/pair_v1.c4
-rw-r--r--tests/pair1.c220
2 files changed, 195 insertions, 29 deletions
diff --git a/src/protocol/pair/pair_v1.c b/src/protocol/pair/pair_v1.c
index 6951088e..b76eecbb 100644
--- a/src/protocol/pair/pair_v1.c
+++ b/src/protocol/pair/pair_v1.c
@@ -224,7 +224,7 @@ pair1_pipe_recv_cb(void *arg)
// If we bounced too many times, discard the message, but
// keep getting more.
- if (hdr >= (unsigned) s->ttl) {
+ if (hdr > (unsigned) s->ttl) {
nni_msg_free(msg);
nni_pipe_recv(npipe, &p->aio_recv);
return;
@@ -403,7 +403,7 @@ pair1_sock_setopt(void *arg, int opt, const void *buf, size_t sz)
}
break;
case NNG_OPT_MAXTTL:
- rv = nni_setopt_int(&s->ttl, buf, sz, 0, 255);
+ rv = nni_setopt_int(&s->ttl, buf, sz, 1, 255);
break;
default:
rv = NNG_ENOTSUP;
diff --git a/tests/pair1.c b/tests/pair1.c
index 2ccbe2e7..bba36708 100644
--- a/tests/pair1.c
+++ b/tests/pair1.c
@@ -27,6 +27,8 @@ TestMain("PAIRv1 protocol", {
nng_socket c1 = 0;
nng_socket c2 = 0;
uint64_t tmo;
+ uint32_t v;
+ size_t sz;
Reset({
nng_close(s1);
@@ -41,7 +43,7 @@ TestMain("PAIRv1 protocol", {
So(nng_pair1_open(&c1) == 0);
So(nng_pair1_open(&c2) == 0);
- tmo = 500000;
+ tmo = 300000;
So(nng_setopt(s1, NNG_OPT_RCVTIMEO, &tmo, sizeof(tmo)) == 0);
So(nng_setopt(c1, NNG_OPT_RCVTIMEO, &tmo, sizeof(tmo)) == 0);
So(nng_setopt(c2, NNG_OPT_RCVTIMEO, &tmo, sizeof(tmo)) == 0);
@@ -67,9 +69,50 @@ TestMain("PAIRv1 protocol", {
nng_msg_free(msg);
});
- Convey("Monogamous mode rejects new conns", {
- So(nng_dial(c2, addr, NULL, NNG_FLAG_SYNCH) ==
- NNG_ECONNREFUSED);
+ Convey("Monogamous mode ignores new conns", {
+ int rv;
+ nng_msg *msg;
+
+ So(nng_listen(s1, addr, NULL, NNG_FLAG_SYNCH) == 0);
+ So(nng_dial(c1, addr, NULL, NNG_FLAG_SYNCH) == 0);
+ nng_usleep(100000);
+ So(nng_dial(c2, addr, NULL, NNG_FLAG_SYNCH) == 0);
+
+ So(nng_msg_alloc(&msg, 0) == 0);
+ APPENDSTR(msg, "ONE");
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) == 0);
+ CHECKSTR(msg, "ONE");
+ nng_msg_free(msg);
+
+ So(nng_msg_alloc(&msg, 0) == 0);
+ APPENDSTR(msg, "TWO");
+ So(nng_sendmsg(c2, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) == NNG_ETIMEDOUT);
+ });
+
+ Convey("Cannot set raw mode after connect", {
+ int r = 1;
+ So(nng_listen(s1, addr, NULL, NNG_FLAG_SYNCH) == 0);
+ So(nng_dial(c1, addr, NULL, NNG_FLAG_SYNCH) == 0);
+ nng_usleep(100000);
+
+ So(nng_setopt(s1, NNG_OPT_RAW, &r, sizeof(r)) ==
+ NNG_ESTATE);
+ So(nng_setopt(c1, NNG_OPT_RAW, &r, sizeof(r)) ==
+ NNG_ESTATE);
+ });
+
+ Convey("Cannot set polyamorous mode after connect", {
+ int r = 1;
+ So(nng_listen(s1, addr, NULL, NNG_FLAG_SYNCH) == 0);
+ So(nng_dial(c1, addr, NULL, NNG_FLAG_SYNCH) == 0);
+ nng_usleep(100000);
+
+ So(nng_setopt(s1, NNG_OPT_POLYAMOROUS, &r,
+ sizeof(r)) == NNG_ESTATE);
+ So(nng_setopt(c1, NNG_OPT_POLYAMOROUS, &r,
+ sizeof(r)) == NNG_ESTATE);
});
Convey("Monogamous raw mode works", {
@@ -84,30 +127,153 @@ TestMain("PAIRv1 protocol", {
So(nng_listen(s1, addr, NULL, NNG_FLAG_SYNCH) == 0);
So(nng_dial(c1, addr, NULL, NNG_FLAG_SYNCH) == 0);
- So(nng_msg_alloc(&msg, 0) == 0);
- APPENDSTR(msg, "GAMMA");
- So(nng_msg_header_append_u32(msg, 1) == 0);
- So(nng_msg_header_len(msg) == sizeof(uint32_t));
- So(nng_sendmsg(c1, msg, 0) == 0);
- So(nng_recvmsg(s1, &msg, 0) == 0);
- So(nng_msg_get_pipe(msg) != 0);
- CHECKSTR(msg, "GAMMA");
- So(nng_msg_header_len(msg) == sizeof(uint32_t));
- So(nng_msg_header_trim_u32(msg, &hops) == 0);
- So(hops == 2);
- nng_msg_free(msg);
+ Convey("Send/recv work", {
+ So(nng_msg_alloc(&msg, 0) == 0);
+ APPENDSTR(msg, "GAMMA");
+ So(nng_msg_header_append_u32(msg, 1) == 0);
+ So(nng_msg_header_len(msg) ==
+ sizeof(uint32_t));
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) == 0);
+ So(nng_msg_get_pipe(msg) != 0);
+ CHECKSTR(msg, "GAMMA");
+ So(nng_msg_header_len(msg) ==
+ sizeof(uint32_t));
+ So(nng_msg_header_trim_u32(msg, &hops) == 0);
+ So(hops == 2);
+ nng_msg_free(msg);
+
+ So(nng_msg_alloc(&msg, 0) == 0);
+ APPENDSTR(msg, "EPSILON");
+ So(nng_msg_header_append_u32(msg, 1) == 0);
+ So(nng_sendmsg(s1, msg, 0) == 0);
+ So(nng_recvmsg(c1, &msg, 0) == 0);
+ CHECKSTR(msg, "EPSILON");
+ So(nng_msg_header_len(msg) ==
+ sizeof(uint32_t));
+ So(nng_msg_header_trim_u32(msg, &hops) == 0);
+ So(nng_msg_get_pipe(msg) != 0);
+ So(hops == 2);
+ nng_msg_free(msg);
+ });
+
+ Convey("Missing raw header fails", {
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) == NNG_ETIMEDOUT);
+
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_append_u32(msg, 0xFEEDFACE) == 0);
+ So(nng_msg_header_append_u32(msg, 1) == 0);
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) == 0);
+ So(nng_msg_trim_u32(msg, &v) == 0);
+ So(v == 0xFEEDFACE);
+ });
+
+ Convey("Reserved bits in raw header", {
+
+ Convey("Nonzero bits fail", {
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_header_append_u32(
+ msg, 0xDEAD0000) == 0);
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) ==
+ NNG_ETIMEDOUT);
+ });
+ Convey("Zero bits pass", {
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_append_u32(
+ msg, 0xFEEDFACE) == 0);
+ So(nng_msg_header_append_u32(msg, 1) ==
+ 0);
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) == 0);
+ So(nng_msg_trim_u32(msg, &v) == 0);
+ So(v == 0xFEEDFACE);
+ });
+ });
+
+ Convey("TTL is honored", {
+ int ttl = 4;
+
+ sz = sizeof(ttl);
+ So(nng_setopt(s1, NNG_OPT_MAXTTL, &ttl, sz) ==
+ 0);
+ ttl = 0;
+ So(nng_getopt(s1, NNG_OPT_MAXTTL, &ttl, &sz) ==
+ 0);
+ So(ttl == 4);
+ Convey("Bad TTL bounces", {
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_header_append_u32(msg, 4) ==
+ 0);
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) ==
+ NNG_ETIMEDOUT);
+ });
+ Convey("Good TTL passes", {
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_append_u32(
+ msg, 0xFEEDFACE) == 0);
+ So(nng_msg_header_append_u32(msg, 3) ==
+ 0);
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) == 0);
+ So(nng_msg_trim_u32(msg, &v) == 0);
+ So(v == 0xFEEDFACE);
+ So(nng_msg_header_trim_u32(msg, &v) ==
+ 0);
+ So(v == 4);
+ });
+ Convey("Large TTL passes", {
+ ttl = 0xff;
+ So(nng_setopt(s1, NNG_OPT_MAXTTL, &ttl,
+ sz) == 0);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_append_u32(msg, 1234) == 0);
+ So(nng_msg_header_append_u32(
+ msg, 0xfe) == 0);
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) == 0);
+ So(nng_msg_trim_u32(msg, &v) == 0);
+ So(v == 1234);
+ So(nng_msg_header_trim_u32(msg, &v) ==
+ 0);
+ So(v == 0xff);
+ });
+ Convey("Max TTL fails", {
+ ttl = 0xff;
+ So(nng_setopt(s1, NNG_OPT_MAXTTL, &ttl,
+ sz) == 0);
+ So(nng_msg_alloc(&msg, 0) == 0);
+ So(nng_msg_header_append_u32(
+ msg, 0xff) == 0);
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) ==
+ NNG_ETIMEDOUT);
+ });
+ });
+ });
- So(nng_msg_alloc(&msg, 0) == 0);
- APPENDSTR(msg, "EPSILON");
- So(nng_msg_header_append_u32(msg, 1) == 0);
- So(nng_sendmsg(s1, msg, 0) == 0);
- So(nng_recvmsg(c1, &msg, 0) == 0);
- CHECKSTR(msg, "EPSILON");
- So(nng_msg_header_len(msg) == sizeof(uint32_t));
- So(nng_msg_header_trim_u32(msg, &hops) == 0);
- So(nng_msg_get_pipe(msg) != 0);
- So(hops == 2);
- nng_msg_free(msg);
+ Convey("We cannot set insane TTLs", {
+ int ttl;
+
+ ttl = 0;
+ sz = sizeof(ttl);
+ So(nng_setopt(s1, NNG_OPT_MAXTTL, &ttl, sz) ==
+ NNG_EINVAL);
+
+ ttl = 1000;
+ sz = sizeof(ttl);
+ So(nng_setopt(s1, NNG_OPT_MAXTTL, &ttl, sz) ==
+ NNG_EINVAL);
+
+ sz = 1;
+ ttl = 8;
+
+ So(nng_setopt(s1, NNG_OPT_MAXTTL, &ttl, sz) ==
+ NNG_EINVAL);
});
Convey("Polyamorous cooked mode works", {