From 45f455064b5704f3d5ed8ecf9f197a18fe72ee59 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Wed, 4 Apr 2018 12:37:34 -0700 Subject: 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. --- tests/device.c | 13 +- tests/pair1.c | 437 +++++++++++++++++++++++++++++---------------------------- tests/pubsub.c | 45 ++++-- tests/reqrep.c | 32 ++++- tests/sock.c | 18 +-- 5 files changed, 298 insertions(+), 247 deletions(-) (limited to 'tests') 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 @@ -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", { -- cgit v1.2.3-70-g09d2