send_multipart.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include <catch.hpp>
  2. #include <zmq_addon.hpp>
  3. #ifdef ZMQ_CPP11
  4. #include <forward_list>
  5. TEST_CASE("send_multipart test", "[send_multipart]")
  6. {
  7. zmq::context_t context(1);
  8. zmq::socket_t output(context, ZMQ_PAIR);
  9. zmq::socket_t input(context, ZMQ_PAIR);
  10. output.bind("inproc://multipart.test");
  11. input.connect("inproc://multipart.test");
  12. SECTION("send 0 messages") {
  13. std::vector<zmq::message_t> imsgs;
  14. auto iret = zmq::send_multipart(input, imsgs);
  15. REQUIRE(iret);
  16. CHECK(*iret == 0);
  17. }
  18. SECTION("send 1 message") {
  19. std::array<zmq::message_t, 1> imsgs = {zmq::message_t(3)};
  20. auto iret = zmq::send_multipart(input, imsgs);
  21. REQUIRE(iret);
  22. CHECK(*iret == 1);
  23. std::vector<zmq::message_t> omsgs;
  24. auto oret = zmq::recv_multipart(output, std::back_inserter(omsgs));
  25. REQUIRE(oret);
  26. CHECK(*oret == 1);
  27. REQUIRE(omsgs.size() == 1);
  28. CHECK(omsgs[0].size() == 3);
  29. }
  30. SECTION("send 2 messages") {
  31. std::array<zmq::message_t, 2> imsgs = {zmq::message_t(3), zmq::message_t(4)};
  32. auto iret = zmq::send_multipart(input, imsgs);
  33. REQUIRE(iret);
  34. CHECK(*iret == 2);
  35. std::vector<zmq::message_t> omsgs;
  36. auto oret = zmq::recv_multipart(output, std::back_inserter(omsgs));
  37. REQUIRE(oret);
  38. CHECK(*oret == 2);
  39. REQUIRE(omsgs.size() == 2);
  40. CHECK(omsgs[0].size() == 3);
  41. CHECK(omsgs[1].size() == 4);
  42. }
  43. SECTION("send 2 messages, const_buffer") {
  44. std::array<zmq::const_buffer, 2> imsgs = {zmq::str_buffer("foo"),
  45. zmq::str_buffer("bar!")};
  46. auto iret = zmq::send_multipart(input, imsgs);
  47. REQUIRE(iret);
  48. CHECK(*iret == 2);
  49. std::vector<zmq::message_t> omsgs;
  50. auto oret = zmq::recv_multipart(output, std::back_inserter(omsgs));
  51. REQUIRE(oret);
  52. CHECK(*oret == 2);
  53. REQUIRE(omsgs.size() == 2);
  54. CHECK(omsgs[0].size() == 3);
  55. CHECK(omsgs[1].size() == 4);
  56. }
  57. SECTION("send 2 messages, mutable_buffer") {
  58. char buf[4] = {};
  59. std::array<zmq::mutable_buffer, 2> imsgs = {
  60. zmq::buffer(buf, 3), zmq::buffer(buf)};
  61. auto iret = zmq::send_multipart(input, imsgs);
  62. REQUIRE(iret);
  63. CHECK(*iret == 2);
  64. std::vector<zmq::message_t> omsgs;
  65. auto oret = zmq::recv_multipart(output, std::back_inserter(omsgs));
  66. REQUIRE(oret);
  67. CHECK(*oret == 2);
  68. REQUIRE(omsgs.size() == 2);
  69. CHECK(omsgs[0].size() == 3);
  70. CHECK(omsgs[1].size() == 4);
  71. }
  72. SECTION("send 2 messages, dontwait") {
  73. zmq::socket_t push(context, ZMQ_PUSH);
  74. push.bind("inproc://multipart.test.push");
  75. std::array<zmq::message_t, 2> imsgs = {zmq::message_t(3), zmq::message_t(4)};
  76. auto iret = zmq::send_multipart(push, imsgs, zmq::send_flags::dontwait);
  77. REQUIRE_FALSE(iret);
  78. }
  79. SECTION("send, misc. containers") {
  80. std::vector<zmq::message_t> msgs_vec;
  81. msgs_vec.emplace_back(3);
  82. msgs_vec.emplace_back(4);
  83. auto iret = zmq::send_multipart(input, msgs_vec);
  84. REQUIRE(iret);
  85. CHECK(*iret == 2);
  86. std::forward_list<zmq::message_t> msgs_list;
  87. msgs_list.emplace_front(4);
  88. msgs_list.emplace_front(3);
  89. iret = zmq::send_multipart(input, msgs_list);
  90. REQUIRE(iret);
  91. CHECK(*iret == 2);
  92. // init. list
  93. const auto msgs_il = {zmq::str_buffer("foo"), zmq::str_buffer("bar!")};
  94. iret = zmq::send_multipart(input, msgs_il);
  95. REQUIRE(iret);
  96. CHECK(*iret == 2);
  97. // rvalue
  98. iret = zmq::send_multipart(input,
  99. std::initializer_list<zmq::const_buffer>{
  100. zmq::str_buffer("foo"),
  101. zmq::str_buffer("bar!")});
  102. REQUIRE(iret);
  103. CHECK(*iret == 2);
  104. }
  105. SECTION("send with invalid socket") {
  106. std::vector<zmq::message_t> msgs(1);
  107. CHECK_THROWS_AS(zmq::send_multipart(zmq::socket_ref(), msgs),
  108. const zmq::error_t &);
  109. }
  110. }
  111. #endif