send_multipart.cpp
Go to the documentation of this file.
1 #include <catch2/catch_all.hpp>
2 #include <zmq_addon.hpp>
3 #ifdef ZMQ_CPP11
4 
5 #include <forward_list>
6 
7 TEST_CASE("send_multipart test", "[send_multipart]")
8 {
9  zmq::context_t context(1);
10  zmq::socket_t output(context, ZMQ_PAIR);
11  zmq::socket_t input(context, ZMQ_PAIR);
12  output.bind("inproc://multipart.test");
13  input.connect("inproc://multipart.test");
14 
15  SECTION("send 0 messages") {
16  std::vector<zmq::message_t> imsgs;
17  auto iret = zmq::send_multipart(input, imsgs);
18  REQUIRE(iret);
19  CHECK(*iret == 0);
20  }
21  SECTION("send 1 message") {
22  std::array<zmq::message_t, 1> imsgs = {zmq::message_t(3)};
23  auto iret = zmq::send_multipart(input, imsgs);
24  REQUIRE(iret);
25  CHECK(*iret == 1);
26 
27  std::vector<zmq::message_t> omsgs;
28  auto oret = zmq::recv_multipart(output, std::back_inserter(omsgs));
29  REQUIRE(oret);
30  CHECK(*oret == 1);
31  REQUIRE(omsgs.size() == 1);
32  CHECK(omsgs[0].size() == 3);
33  }
34  SECTION("send 2 messages") {
35  std::array<zmq::message_t, 2> imsgs = {zmq::message_t(3), zmq::message_t(4)};
36  auto iret = zmq::send_multipart(input, imsgs);
37  REQUIRE(iret);
38  CHECK(*iret == 2);
39 
40  std::vector<zmq::message_t> omsgs;
41  auto oret = zmq::recv_multipart(output, std::back_inserter(omsgs));
42  REQUIRE(oret);
43  CHECK(*oret == 2);
44  REQUIRE(omsgs.size() == 2);
45  CHECK(omsgs[0].size() == 3);
46  CHECK(omsgs[1].size() == 4);
47  }
48  SECTION("send 2 messages, const_buffer") {
49  std::array<zmq::const_buffer, 2> imsgs = {zmq::str_buffer("foo"),
50  zmq::str_buffer("bar!")};
51  auto iret = zmq::send_multipart(input, imsgs);
52  REQUIRE(iret);
53  CHECK(*iret == 2);
54 
55  std::vector<zmq::message_t> omsgs;
56  auto oret = zmq::recv_multipart(output, std::back_inserter(omsgs));
57  REQUIRE(oret);
58  CHECK(*oret == 2);
59  REQUIRE(omsgs.size() == 2);
60  CHECK(omsgs[0].size() == 3);
61  CHECK(omsgs[1].size() == 4);
62  }
63  SECTION("send 2 messages, mutable_buffer") {
64  char buf[4] = {};
65  std::array<zmq::mutable_buffer, 2> imsgs = {
67  auto iret = zmq::send_multipart(input, imsgs);
68  REQUIRE(iret);
69  CHECK(*iret == 2);
70 
71  std::vector<zmq::message_t> omsgs;
72  auto oret = zmq::recv_multipart(output, std::back_inserter(omsgs));
73  REQUIRE(oret);
74  CHECK(*oret == 2);
75  REQUIRE(omsgs.size() == 2);
76  CHECK(omsgs[0].size() == 3);
77  CHECK(omsgs[1].size() == 4);
78  }
79  SECTION("send 2 messages, dontwait") {
80  zmq::socket_t push(context, ZMQ_PUSH);
81  push.bind("inproc://multipart.test.push");
82 
83  std::array<zmq::message_t, 2> imsgs = {zmq::message_t(3), zmq::message_t(4)};
84  auto iret = zmq::send_multipart(push, imsgs, zmq::send_flags::dontwait);
85  REQUIRE_FALSE(iret);
86  }
87  SECTION("send, misc. containers") {
88  std::vector<zmq::message_t> msgs_vec;
89  msgs_vec.emplace_back(3);
90  msgs_vec.emplace_back(4);
91  auto iret = zmq::send_multipart(input, msgs_vec);
92  REQUIRE(iret);
93  CHECK(*iret == 2);
94 
95  std::forward_list<zmq::message_t> msgs_list;
96  msgs_list.emplace_front(4);
97  msgs_list.emplace_front(3);
98  iret = zmq::send_multipart(input, msgs_list);
99  REQUIRE(iret);
100  CHECK(*iret == 2);
101 
102  // init. list
103  const auto msgs_il = {zmq::str_buffer("foo"), zmq::str_buffer("bar!")};
104  iret = zmq::send_multipart(input, msgs_il);
105  REQUIRE(iret);
106  CHECK(*iret == 2);
107  // rvalue
108  iret = zmq::send_multipart(input,
109  std::initializer_list<zmq::const_buffer>{
110  zmq::str_buffer("foo"),
111  zmq::str_buffer("bar!")});
112  REQUIRE(iret);
113  CHECK(*iret == 2);
114  }
115  SECTION("send with invalid socket") {
116  std::vector<zmq::message_t> msgs(1);
117  CHECK_THROWS_AS(zmq::send_multipart(zmq::socket_ref(), msgs),
118  zmq::error_t);
119  }
120 }
121 #endif
TEST_CASE
TEST_CASE("context construct default and destroy", "[context]")
Definition: context.cpp:9
zmq::message_t
Definition: zmq.hpp:409
input
std::string input
Definition: tokenizer_unittest.cc:197
zmq::socket_t
Definition: zmq.hpp:2188
zmq::socket_ref
Definition: zmq.hpp:2114
zmq::context_t
Definition: zmq.hpp:799
buffer
GLuint buffer
Definition: glcorearb.h:2939
ZMQ_PUSH
#define ZMQ_PUSH
Definition: zmq.h:266
size
#define size
Definition: glcorearb.h:2944
CHECK
#define CHECK(x)
Definition: php/ext/google/protobuf/upb.c:8393
msgs
static const upb_msgdef msgs[22]
Definition: ruby/ext/google/protobuf_c/upb.c:7670
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glcorearb.h:4175
ZMQ_PAIR
#define ZMQ_PAIR
Definition: zmq.h:258
push
static void push(tarjan *t, const upb_refcounted *r)
Definition: ruby/ext/google/protobuf_c/upb.c:5890
output
const upb_json_parsermethod const upb_symtab upb_sink * output
Definition: ruby/ext/google/protobuf_c/upb.h:10503
zmq::error_t
Definition: zmq.hpp:290
zmq_addon.hpp


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:58