recv_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 TEST_CASE("recv_multipart test", "[recv_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 
13  SECTION("send 1 message") {
14  input.send(zmq::str_buffer("hello"));
15 
16  std::vector<zmq::message_t> msgs;
17  auto ret = zmq::recv_multipart(output, std::back_inserter(msgs));
18  REQUIRE(ret);
19  CHECK(*ret == 1);
20  REQUIRE(msgs.size() == 1);
21  CHECK(msgs[0].size() == 5);
22  }
23  SECTION("send 2 messages") {
24  input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
25  input.send(zmq::str_buffer("world!"));
26 
27  std::vector<zmq::message_t> msgs;
28  auto ret = zmq::recv_multipart(output, std::back_inserter(msgs));
29  REQUIRE(ret);
30  CHECK(*ret == 2);
31  REQUIRE(msgs.size() == 2);
32  CHECK(msgs[0].size() == 5);
33  CHECK(msgs[1].size() == 6);
34  }
35  SECTION("send no messages, dontwait") {
36  std::vector<zmq::message_t> msgs;
37  auto ret = zmq::recv_multipart(output, std::back_inserter(msgs),
38  zmq::recv_flags::dontwait);
39  CHECK_FALSE(ret);
40  REQUIRE(msgs.size() == 0);
41  }
42  SECTION("send 1 partial message, dontwait") {
43  input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
44 
45  std::vector<zmq::message_t> msgs;
46  auto ret = zmq::recv_multipart(output, std::back_inserter(msgs),
47  zmq::recv_flags::dontwait);
48  CHECK_FALSE(ret);
49  REQUIRE(msgs.size() == 0);
50  }
51  SECTION("recv with invalid socket") {
52  std::vector<zmq::message_t> msgs;
53  CHECK_THROWS_AS(
54  zmq::recv_multipart(zmq::socket_ref(), std::back_inserter(msgs)),
55  zmq::error_t);
56  }
57 }
58 
59 TEST_CASE("recv_multipart_n test", "[recv_multipart]")
60 {
61  zmq::context_t context(1);
62  zmq::socket_t output(context, ZMQ_PAIR);
63  zmq::socket_t input(context, ZMQ_PAIR);
64  output.bind("inproc://multipart.test");
65  input.connect("inproc://multipart.test");
66 
67  SECTION("send 1 message") {
68  input.send(zmq::str_buffer("hello"));
69 
70  std::array<zmq::message_t, 1> 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  }
76  SECTION("send 1 message 2") {
77  input.send(zmq::str_buffer("hello"));
78 
79  std::array<zmq::message_t, 2> msgs;
80  auto ret = zmq::recv_multipart_n(output, msgs.data(), msgs.size());
81  REQUIRE(ret);
82  CHECK(*ret == 1);
83  CHECK(msgs[0].size() == 5);
84  CHECK(msgs[1].size() == 0);
85  }
86  SECTION("send 2 messages, recv 1") {
87  input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
88  input.send(zmq::str_buffer("world!"));
89 
90  std::array<zmq::message_t, 1> msgs;
91  CHECK_THROWS_AS(
92  zmq::recv_multipart_n(output, msgs.data(), msgs.size()),
93  std::runtime_error);
94  }
95  SECTION("recv 0") {
96  input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
97  input.send(zmq::str_buffer("world!"));
98 
99  std::array<zmq::message_t, 1> msgs;
100  CHECK_THROWS_AS(
101  zmq::recv_multipart_n(output, msgs.data(), 0),
102  std::runtime_error);
103  }
104  SECTION("send 2 messages") {
105  input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
106  input.send(zmq::str_buffer("world!"));
107 
108  std::array<zmq::message_t, 2> msgs;
109  auto ret = zmq::recv_multipart_n(output, msgs.data(), msgs.size());
110  REQUIRE(ret);
111  CHECK(*ret == 2);
112  CHECK(msgs[0].size() == 5);
113  CHECK(msgs[1].size() == 6);
114  }
115  SECTION("send no messages, dontwait") {
116  std::array<zmq::message_t, 1> msgs;
117  auto ret = zmq::recv_multipart_n(output, msgs.data(), msgs.size(),
118  zmq::recv_flags::dontwait);
119  CHECK_FALSE(ret);
120  REQUIRE(msgs[0].size() == 0);
121  }
122  SECTION("send 1 partial message, dontwait") {
123  input.send(zmq::str_buffer("hello"), zmq::send_flags::sndmore);
124 
125  std::array<zmq::message_t, 1> msgs;
126  auto ret = zmq::recv_multipart_n(output, msgs.data(), msgs.size(),
127  zmq::recv_flags::dontwait);
128  CHECK_FALSE(ret);
129  REQUIRE(msgs[0].size() == 0);
130  }
131  SECTION("recv with invalid socket") {
132  std::array<zmq::message_t, 1> msgs;
133  CHECK_THROWS_AS(
134  zmq::recv_multipart_n(zmq::socket_ref(), msgs.data(), msgs.size()),
135  zmq::error_t);
136  }
137 }
138 
139 #endif
TEST_CASE
TEST_CASE("context construct default and destroy", "[context]")
Definition: context.cpp:9
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
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
ZMQ_PAIR
#define ZMQ_PAIR
Definition: zmq.h:258
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