recv_multipart.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include <catch.hpp>
  2. #include <zmq_addon.hpp>
  3. #ifdef ZMQ_CPP11
  4. TEST_CASE("recv_multipart test", "[recv_multipart]")
  5. {
  6. zmq::context_t context(1);
  7. zmq::socket_t output(context, ZMQ_PAIR);
  8. zmq::socket_t input(context, ZMQ_PAIR);
  9. output.bind("inproc://multipart.test");
  10. input.connect("inproc://multipart.test");
  11. SECTION("send 1 message") {
  12. input.send(zmq::str_buffer("hello"));
  13. std::vector<zmq::message_t> msgs;
  14. auto ret = zmq::recv_multipart(output, std::back_inserter(msgs));
  15. REQUIRE(ret);
  16. CHECK(*ret == 1);
  17. REQUIRE(msgs.size() == 1);
  18. CHECK(msgs[0].size() == 5);
  19. }
  20. SECTION("send 2 messages") {
  21. input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
  22. input.send(zmq::str_buffer("world!"));
  23. std::vector<zmq::message_t> msgs;
  24. auto ret = zmq::recv_multipart(output, std::back_inserter(msgs));
  25. REQUIRE(ret);
  26. CHECK(*ret == 2);
  27. REQUIRE(msgs.size() == 2);
  28. CHECK(msgs[0].size() == 5);
  29. CHECK(msgs[1].size() == 6);
  30. }
  31. SECTION("send no messages, dontwait") {
  32. std::vector<zmq::message_t> msgs;
  33. auto ret = zmq::recv_multipart(output, std::back_inserter(msgs),
  34. zmq::recv_flags::dontwait);
  35. CHECK_FALSE(ret);
  36. REQUIRE(msgs.size() == 0);
  37. }
  38. SECTION("send 1 partial message, dontwait") {
  39. input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
  40. std::vector<zmq::message_t> msgs;
  41. auto ret = zmq::recv_multipart(output, std::back_inserter(msgs),
  42. zmq::recv_flags::dontwait);
  43. CHECK_FALSE(ret);
  44. REQUIRE(msgs.size() == 0);
  45. }
  46. SECTION("recv with invalid socket") {
  47. std::vector<zmq::message_t> msgs;
  48. CHECK_THROWS_AS(
  49. zmq::recv_multipart(zmq::socket_ref(), std::back_inserter(msgs)),
  50. const zmq::error_t &);
  51. }
  52. }
  53. TEST_CASE("recv_multipart_n test", "[recv_multipart]")
  54. {
  55. zmq::context_t context(1);
  56. zmq::socket_t output(context, ZMQ_PAIR);
  57. zmq::socket_t input(context, ZMQ_PAIR);
  58. output.bind("inproc://multipart.test");
  59. input.connect("inproc://multipart.test");
  60. SECTION("send 1 message") {
  61. input.send(zmq::str_buffer("hello"));
  62. std::array<zmq::message_t, 1> msgs;
  63. auto ret = zmq::recv_multipart_n(output, msgs.data(), msgs.size());
  64. REQUIRE(ret);
  65. CHECK(*ret == 1);
  66. CHECK(msgs[0].size() == 5);
  67. }
  68. SECTION("send 1 message 2") {
  69. input.send(zmq::str_buffer("hello"));
  70. std::array<zmq::message_t, 2> msgs;
  71. auto ret = zmq::recv_multipart_n(output, msgs.data(), msgs.size());
  72. REQUIRE(ret);
  73. CHECK(*ret == 1);
  74. CHECK(msgs[0].size() == 5);
  75. CHECK(msgs[1].size() == 0);
  76. }
  77. SECTION("send 2 messages, recv 1") {
  78. input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
  79. input.send(zmq::str_buffer("world!"));
  80. std::array<zmq::message_t, 1> msgs;
  81. CHECK_THROWS_AS(
  82. zmq::recv_multipart_n(output, msgs.data(), msgs.size()),
  83. const std::runtime_error&);
  84. }
  85. SECTION("recv 0") {
  86. input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
  87. input.send(zmq::str_buffer("world!"));
  88. std::array<zmq::message_t, 1> msgs;
  89. CHECK_THROWS_AS(
  90. zmq::recv_multipart_n(output, msgs.data(), 0),
  91. const std::runtime_error&);
  92. }
  93. SECTION("send 2 messages") {
  94. input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
  95. input.send(zmq::str_buffer("world!"));
  96. std::array<zmq::message_t, 2> msgs;
  97. auto ret = zmq::recv_multipart_n(output, msgs.data(), msgs.size());
  98. REQUIRE(ret);
  99. CHECK(*ret == 2);
  100. CHECK(msgs[0].size() == 5);
  101. CHECK(msgs[1].size() == 6);
  102. }
  103. SECTION("send no messages, dontwait") {
  104. std::array<zmq::message_t, 1> msgs;
  105. auto ret = zmq::recv_multipart_n(output, msgs.data(), msgs.size(),
  106. zmq::recv_flags::dontwait);
  107. CHECK_FALSE(ret);
  108. REQUIRE(msgs[0].size() == 0);
  109. }
  110. SECTION("send 1 partial message, dontwait") {
  111. input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
  112. std::array<zmq::message_t, 1> msgs;
  113. auto ret = zmq::recv_multipart_n(output, msgs.data(), msgs.size(),
  114. zmq::recv_flags::dontwait);
  115. CHECK_FALSE(ret);
  116. REQUIRE(msgs[0].size() == 0);
  117. }
  118. SECTION("recv with invalid socket") {
  119. std::array<zmq::message_t, 1> msgs;
  120. CHECK_THROWS_AS(
  121. zmq::recv_multipart_n(zmq::socket_ref(), msgs.data(), msgs.size()),
  122. const zmq::error_t &);
  123. }
  124. }
  125. #endif