summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-04-04 12:37:34 -0700
committerGarrett D'Amore <garrett@damore.org>2018-04-04 13:13:24 -0700
commit45f455064b5704f3d5ed8ecf9f197a18fe72ee59 (patch)
tree76a626029f3a5a818b113b7e4342efaf6220a03f /tests
parent505a9bce029e51540739c853a6c9eef0ecfb2e90 (diff)
downloadnng-45f455064b5704f3d5ed8ecf9f197a18fe72ee59.tar.gz
nng-45f455064b5704f3d5ed8ecf9f197a18fe72ee59.tar.bz2
nng-45f455064b5704f3d5ed8ecf9f197a18fe72ee59.zip
fixes #331 replace NNG_OPT_RAW option with constructor
This makes the raw mode something that is immutable, determined at socket construction. This is an enabling change for the separate context support coming soon. As a result, this is an API breaking change for users of the raw mode option (NNG_OPT_RAW). There aren't many of them out there. Cooked mode is entirely unaffected. There are changes to tests and documentation included.
Diffstat (limited to 'tests')
-rw-r--r--tests/device.c13
-rw-r--r--tests/pair1.c437
-rw-r--r--tests/pubsub.c45
-rw-r--r--tests/reqrep.c32
-rw-r--r--tests/sock.c18
5 files changed, 298 insertions, 247 deletions
diff --git a/tests/device.c b/tests/device.c
index c177a2e5..b1f97123 100644
--- a/tests/device.c
+++ b/tests/device.c
@@ -42,6 +42,12 @@ Main({
const char *addr1 = "inproc://dev1";
const char *addr2 = "inproc://dev2";
+ Convey("We cannot create cooked mode device", {
+ nng_socket s1;
+ So(nng_pair1_open(&s1) == 0);
+ Reset({ nng_close(s1); });
+ So(nng_device(s1, s1) == NNG_EINVAL);
+ });
Convey("We can create a PAIRv1 device", {
nng_socket dev1;
nng_socket dev2;
@@ -51,11 +57,8 @@ Main({
nng_msg * msg;
nng_thread * thr;
- So(nng_pair1_open(&dev1) == 0);
- So(nng_pair1_open(&dev2) == 0);
-
- So(nng_setopt_bool(dev1, NNG_OPT_RAW, true) == 0);
- So(nng_setopt_bool(dev2, NNG_OPT_RAW, true) == 0);
+ So(nng_pair1_open_raw(&dev1) == 0);
+ So(nng_pair1_open_raw(&dev2) == 0);
struct dev_data ddata;
ddata.s1 = dev1;
diff --git a/tests/pair1.c b/tests/pair1.c
index bff6a44b..ef3fe263 100644
--- a/tests/pair1.c
+++ b/tests/pair1.c
@@ -101,14 +101,8 @@ TestMain("PAIRv1 protocol", {
});
Convey("Cannot set raw mode after connect", {
- So(nng_listen(s1, addr, NULL, 0) == 0);
- So(nng_dial(c1, addr, NULL, 0) == 0);
- nng_msleep(100);
-
So(nng_setopt_bool(s1, NNG_OPT_RAW, true) ==
- NNG_ESTATE);
- So(nng_setopt_bool(c1, NNG_OPT_RAW, false) ==
- NNG_ESTATE);
+ NNG_EREADONLY);
});
Convey("Polyamorous mode is best effort", {
@@ -176,150 +170,6 @@ TestMain("PAIRv1 protocol", {
NNG_ESTATE);
});
- Convey("Monogamous raw mode works", {
- nng_msg *msg;
- uint32_t hops;
-
- So(nng_setopt_bool(s1, NNG_OPT_RAW, true) == 0);
- So(nng_setopt_bool(c1, NNG_OPT_RAW, true) == 0);
- So(nng_setopt_bool(c2, NNG_OPT_RAW, true) == 0);
-
- So(nng_listen(s1, addr, NULL, 0) == 0);
- So(nng_dial(c1, addr, NULL, 0) == 0);
- nng_msleep(20);
-
- 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);
- nng_msg_free(msg);
- });
-
- 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);
- nng_msg_free(msg);
- });
- });
-
- Convey("TTL is honored", {
- int ttl;
-
- So(nng_setopt_int(s1, NNG_OPT_MAXTTL, 4) == 0);
- So(nng_getopt_int(s1, NNG_OPT_MAXTTL, &ttl) ==
- 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);
- nng_msg_free(msg);
- });
-
- Convey("Large TTL passes", {
- ttl = 0xff;
- So(nng_setopt_int(
- s1, NNG_OPT_MAXTTL, 0xff) == 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);
- nng_msg_free(msg);
- });
-
- Convey("Max TTL fails", {
- ttl = 0xff;
- So(nng_setopt_int(
- s1, NNG_OPT_MAXTTL, 0xff) == 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);
- });
- });
- });
-
Convey("We cannot set insane TTLs", {
int ttl;
@@ -428,94 +278,253 @@ TestMain("PAIRv1 protocol", {
CHECKSTR(msg, "AGAIN");
nng_msg_free(msg);
});
+ });
- Convey("Polyamorous raw mode works", {
- nng_msg *msg;
- bool v;
- uint32_t hops;
- nng_pipe p1;
- nng_pipe p2;
+ Convey("Monogamous raw mode works", {
+ nng_msg *msg;
+ uint32_t hops;
- So(nng_getopt_bool(s1, NNG_OPT_PAIR1_POLY, &v) == 0);
- So(v == 0);
+ So(nng_pair1_open_raw(&s1) == 0);
+ So(nng_pair1_open_raw(&c1) == 0);
+ So(nng_pair1_open_raw(&c2) == 0);
- So(nng_setopt_bool(s1, NNG_OPT_PAIR1_POLY, true) == 0);
- So(nng_getopt_bool(s1, NNG_OPT_PAIR1_POLY, &v) == 0);
- So(v == true);
+ Reset({
+ nng_close(s1);
+ nng_close(c1);
+ nng_close(c2);
+ });
- v = false;
- So(nng_setopt_bool(s1, NNG_OPT_RAW, true) == 0);
- So(nng_getopt_bool(s1, NNG_OPT_RAW, &v) == 0);
- So(v == true);
+ tmo = MILLISECOND(300);
+ So(nng_setopt_ms(s1, NNG_OPT_RECVTIMEO, tmo) == 0);
+ So(nng_setopt_ms(c1, NNG_OPT_RECVTIMEO, tmo) == 0);
+ So(nng_setopt_ms(c2, NNG_OPT_RECVTIMEO, tmo) == 0);
+ tmo = 0;
+ So(nng_getopt_ms(s1, NNG_OPT_RECVTIMEO, &tmo) == 0);
+ So(tmo == MILLISECOND(300));
- So(nng_listen(s1, addr, NULL, 0) == 0);
- So(nng_dial(c1, addr, NULL, 0) == 0);
- So(nng_dial(c2, addr, NULL, 0) == 0);
- nng_msleep(20);
+ So(nng_listen(s1, addr, NULL, 0) == 0);
+ So(nng_dial(c1, addr, NULL, 0) == 0);
+ nng_msleep(20);
+
+ 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);
+ nng_msg_free(msg);
+ });
- Convey("Send/recv works", {
+ Convey("Reserved bits in raw header", {
+
+ Convey("Nonzero bits fail", {
So(nng_msg_alloc(&msg, 0) == 0);
- APPENDSTR(msg, "ONE");
+ So(nng_msg_header_append_u32(
+ msg, 0xDEAD0000) == 0);
So(nng_sendmsg(c1, msg, 0) == 0);
- So(nng_recvmsg(s1, &msg, 0) == 0);
- CHECKSTR(msg, "ONE");
- p1 = nng_msg_get_pipe(msg);
- So(p1 != 0);
- So(nng_msg_header_trim_u32(msg, &hops) == 0);
- So(hops == 1);
- nng_msg_free(msg);
-
+ So(nng_recvmsg(s1, &msg, 0) == NNG_ETIMEDOUT);
+ });
+ Convey("Zero bits pass", {
So(nng_msg_alloc(&msg, 0) == 0);
- APPENDSTR(msg, "TWO");
- So(nng_sendmsg(c2, 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);
- CHECKSTR(msg, "TWO");
- p2 = nng_msg_get_pipe(msg);
- So(p2 != 0);
- So(nng_msg_header_trim_u32(msg, &hops) == 0);
- So(hops == 1);
+ So(nng_msg_trim_u32(msg, &v) == 0);
+ So(v == 0xFEEDFACE);
nng_msg_free(msg);
+ });
+ });
- So(p1 != p2);
+ Convey("TTL is honored", {
+ int ttl;
+ So(nng_setopt_int(s1, NNG_OPT_MAXTTL, 4) == 0);
+ So(nng_getopt_int(s1, NNG_OPT_MAXTTL, &ttl) == 0);
+ So(ttl == 4);
+ Convey("Bad TTL bounces", {
So(nng_msg_alloc(&msg, 0) == 0);
- nng_msg_set_pipe(msg, p1);
- APPENDSTR(msg, "UNO");
- 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, "UNO");
- nng_msg_free(msg);
-
+ 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);
- nng_msg_set_pipe(msg, p2);
- APPENDSTR(msg, "DOS");
- So(nng_msg_header_append_u32(msg, 1) == 0);
- So(nng_sendmsg(s1, msg, 0) == 0);
- So(nng_recvmsg(c2, &msg, 0) == 0);
- CHECKSTR(msg, "DOS");
+ 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);
nng_msg_free(msg);
});
- Convey("Closed pipes don't work", {
+ Convey("Large TTL passes", {
+ ttl = 0xff;
+ So(nng_setopt_int(s1, NNG_OPT_MAXTTL, 0xff) ==
+ 0);
So(nng_msg_alloc(&msg, 0) == 0);
- APPENDSTR(msg, "ONE");
+ 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);
- CHECKSTR(msg, "ONE");
- p1 = nng_msg_get_pipe(msg);
- So(p1 != 0);
+ So(nng_msg_trim_u32(msg, &v) == 0);
+ So(v == 1234);
+ So(nng_msg_header_trim_u32(msg, &v) == 0);
+ So(v == 0xff);
nng_msg_free(msg);
+ });
- nng_close(c1);
-
+ Convey("Max TTL fails", {
+ ttl = 0xff;
+ So(nng_setopt_int(s1, NNG_OPT_MAXTTL, 0xff) ==
+ 0);
So(nng_msg_alloc(&msg, 0) == 0);
- nng_msg_set_pipe(msg, p1);
- APPENDSTR(msg, "EIN");
- So(nng_msg_header_append_u32(msg, 1) == 0);
- So(nng_sendmsg(s1, msg, 0) == 0);
- So(nng_recvmsg(c2, &msg, 0) == NNG_ETIMEDOUT);
+ So(nng_msg_header_append_u32(msg, 0xff) == 0);
+ So(nng_sendmsg(c1, msg, 0) == 0);
+ So(nng_recvmsg(s1, &msg, 0) == NNG_ETIMEDOUT);
});
});
});
+
+ Convey("Polyamorous raw mode works", {
+ nng_msg *msg;
+ bool v;
+ uint32_t hops;
+ nng_pipe p1;
+ nng_pipe p2;
+
+ So(nng_pair1_open_raw(&s1) == 0);
+ So(nng_pair1_open(&c1) == 0);
+ So(nng_pair1_open(&c2) == 0);
+
+ Reset({
+ nng_close(s1);
+ nng_close(c1);
+ nng_close(c2);
+ });
+
+ tmo = MILLISECOND(300);
+ So(nng_setopt_ms(s1, NNG_OPT_RECVTIMEO, tmo) == 0);
+ So(nng_setopt_ms(c1, NNG_OPT_RECVTIMEO, tmo) == 0);
+ So(nng_setopt_ms(c2, NNG_OPT_RECVTIMEO, tmo) == 0);
+ tmo = 0;
+ So(nng_getopt_ms(s1, NNG_OPT_RECVTIMEO, &tmo) == 0);
+ So(tmo == MILLISECOND(300));
+
+ So(nng_getopt_bool(s1, NNG_OPT_PAIR1_POLY, &v) == 0);
+ So(v == 0);
+
+ So(nng_setopt_bool(s1, NNG_OPT_PAIR1_POLY, true) == 0);
+ So(nng_getopt_bool(s1, NNG_OPT_PAIR1_POLY, &v) == 0);
+ So(v == true);
+
+ v = false;
+ So(nng_getopt_bool(s1, NNG_OPT_RAW, &v) == 0);
+ So(v == true);
+
+ So(nng_listen(s1, addr, NULL, 0) == 0);
+ So(nng_dial(c1, addr, NULL, 0) == 0);
+ So(nng_dial(c2, addr, NULL, 0) == 0);
+ nng_msleep(20);
+
+ Convey("Send/recv works", {
+ 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");
+ p1 = nng_msg_get_pipe(msg);
+ So(p1 != 0);
+ So(nng_msg_header_trim_u32(msg, &hops) == 0);
+ So(hops == 1);
+ 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) == 0);
+ CHECKSTR(msg, "TWO");
+ p2 = nng_msg_get_pipe(msg);
+ So(p2 != 0);
+ So(nng_msg_header_trim_u32(msg, &hops) == 0);
+ So(hops == 1);
+ nng_msg_free(msg);
+
+ So(p1 != p2);
+
+ So(nng_msg_alloc(&msg, 0) == 0);
+ nng_msg_set_pipe(msg, p1);
+ APPENDSTR(msg, "UNO");
+ 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, "UNO");
+ nng_msg_free(msg);
+
+ So(nng_msg_alloc(&msg, 0) == 0);
+ nng_msg_set_pipe(msg, p2);
+ APPENDSTR(msg, "DOS");
+ So(nng_msg_header_append_u32(msg, 1) == 0);
+ So(nng_sendmsg(s1, msg, 0) == 0);
+ So(nng_recvmsg(c2, &msg, 0) == 0);
+ CHECKSTR(msg, "DOS");
+ nng_msg_free(msg);
+ });
+
+ Convey("Closed pipes don't work", {
+ 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");
+ p1 = nng_msg_get_pipe(msg);
+ So(p1 != 0);
+ nng_msg_free(msg);
+
+ nng_close(c1);
+
+ So(nng_msg_alloc(&msg, 0) == 0);
+ nng_msg_set_pipe(msg, p1);
+ APPENDSTR(msg, "EIN");
+ So(nng_msg_header_append_u32(msg, 1) == 0);
+ So(nng_sendmsg(s1, msg, 0) == 0);
+ So(nng_recvmsg(c2, &msg, 0) == NNG_ETIMEDOUT);
+ });
+ });
})
diff --git a/tests/pubsub.c b/tests/pubsub.c
index bd0d7f56..2151611d 100644
--- a/tests/pubsub.c
+++ b/tests/pubsub.c
@@ -146,19 +146,44 @@ TestMain("PUB/SUB pattern", {
So(nng_recvmsg(sub, &msg, 0) == NNG_ETIMEDOUT);
});
- Convey("Subs in raw receive", {
+ });
- nng_msg *msg;
+ Convey("Subs in raw receive", {
- So(nng_setopt_ms(sub, NNG_OPT_RECVTIMEO, 90) == 0);
- So(nng_setopt_bool(sub, NNG_OPT_RAW, true) == 0);
+ nng_msg * msg;
+ nng_socket pub;
+ nng_socket sub;
+ bool raw;
- So(nng_msg_alloc(&msg, 0) == 0);
- APPENDSTR(msg, "/some/like/it/raw");
- So(nng_sendmsg(pub, msg, 0) == 0);
- So(nng_recvmsg(sub, &msg, 0) == 0);
- CHECKSTR(msg, "/some/like/it/raw");
- nng_msg_free(msg);
+ So(nng_pub_open(&pub) == 0);
+
+ So(nng_sub_open_raw(&sub) == 0);
+
+ Reset({
+ nng_close(pub);
+ nng_close(sub);
});
+
+ // Most applications will usually have the pub listen,
+ // and the sub dial. However, this creates a problem
+ // for our tests, since we can wind up trying to push
+ // data before the pipe is fully registered (the accept
+ // runs asynchronously.)
+ So(nng_listen(sub, addr, NULL, 0) == 0);
+ So(nng_dial(pub, addr, NULL, 0) == 0);
+
+ nng_msleep(20); // give time for connecting threads
+
+ So(nng_setopt_ms(sub, NNG_OPT_RECVTIMEO, 90) == 0);
+ So(nng_getopt_bool(sub, NNG_OPT_RAW, &raw) == 0);
+ So(raw == true);
+
+ So(nng_msg_alloc(&msg, 0) == 0);
+ APPENDSTR(msg, "/some/like/it/raw");
+ So(nng_sendmsg(pub, msg, 0) == 0);
+ So(nng_recvmsg(sub, &msg, 0) == 0);
+ CHECKSTR(msg, "/some/like/it/raw");
+ nng_msg_free(msg);
});
+
})
diff --git a/tests/reqrep.c b/tests/reqrep.c
index 4e837c34..97ed371a 100644
--- a/tests/reqrep.c
+++ b/tests/reqrep.c
@@ -13,6 +13,7 @@
#include "protocol/reqrep0/rep.h"
#include "protocol/reqrep0/req.h"
#include "stubs.h"
+#include "supplemental/util/platform.h"
#include <string.h>
@@ -135,19 +136,44 @@ TestMain("REQ/REP pattern", {
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(cmd != NULL);
+ 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);
- So(nng_recvmsg(req, &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(memcmp(nng_msg_body(cmd), "def", 4) == 0);
+ So(strcmp(nng_msg_body(cmd), "def") == 0);
nng_msg_free(cmd);
});
+
nng_fini();
})
diff --git a/tests/sock.c b/tests/sock.c
index a5b9bdc1..c4de6ad4 100644
--- a/tests/sock.c
+++ b/tests/sock.c
@@ -128,11 +128,6 @@ TestMain("Socket Operations", {
So(nng_getopt_bool(s1, NNG_OPT_RAW, &raw) ==
0);
So(raw == false);
- So(nng_setopt_bool(s1, NNG_OPT_RAW, true) ==
- 0);
- So(nng_getopt_bool(s1, NNG_OPT_RAW, &raw) ==
- 0);
- So(raw == true);
});
Convey("URL option works", {
@@ -255,16 +250,9 @@ TestMain("Socket Operations", {
sz) == NNG_EINVAL);
});
- Convey("Bogus raw fails", {
- // Bool type is 1 byte.
- So(nng_setopt_int(s1, NNG_OPT_RAW, 42) ==
- NNG_EBADTYPE);
- So(nng_setopt_int(s1, NNG_OPT_RAW, -42) ==
- NNG_EBADTYPE);
- So(nng_setopt_int(s1, NNG_OPT_RAW, 0) ==
- NNG_EBADTYPE);
- So(nng_setopt(s1, NNG_OPT_RAW, "abcd", 4) ==
- NNG_EINVAL);
+ Convey("Cannot set raw", {
+ So(nng_setopt_bool(s1, NNG_OPT_RAW, true) ==
+ NNG_EREADONLY);
});
Convey("Unsupported options fail", {