multipart.cpp
Go to the documentation of this file.
1 #include <catch2/catch_all.hpp>
2 #include <zmq_addon.hpp>
3 
4 #ifdef ZMQ_HAS_RVALUE_REFS
5 
6 #ifdef ZMQ_CPP17
7 static_assert(std::is_invocable<decltype(&zmq::multipart_t::send),
8  zmq::multipart_t *,
10  int>::value,
11  "Can't multipart_t::send with socket_ref");
12 static_assert(std::is_invocable<decltype(&zmq::multipart_t::recv),
13  zmq::multipart_t *,
15  int>::value,
16  "Can't multipart_t::recv with socket_ref");
17 #endif
19  "Can't construct with socket_ref");
20 
23 TEST_CASE("multipart legacy test", "[multipart]")
24 {
25  using namespace zmq;
26 
27  bool ok = true;
28  (void) ok;
29  float num = 0;
30  (void) num;
31  std::string str = "";
32  message_t msg;
33 
34  // Create two PAIR sockets and connect over inproc
35  context_t context(1);
36  socket_t output(context, ZMQ_PAIR);
37  socket_t input(context, ZMQ_PAIR);
38  output.bind("inproc://multipart.test");
39  input.connect("inproc://multipart.test");
40 
41  // Test send and receive of single-frame message
42  multipart_t multipart;
43  assert(multipart.empty());
44 
45  multipart.push(message_t("Hello", 5));
46  assert(multipart.size() == 1);
47 
48  ok = multipart.send(output);
49  assert(multipart.empty());
50  assert(ok);
51 
52  ok = multipart.recv(input);
53  assert(multipart.size() == 1);
54  assert(ok);
55 
56  msg = multipart.pop();
57  assert(multipart.empty());
58  assert(std::string(msg.data<char>(), msg.size()) == "Hello");
59 
60  // Test send and receive of multi-frame message
61  multipart.addstr("A");
62  multipart.addstr("BB");
63  multipart.addstr("CCC");
64  assert(multipart.size() == 3);
65 
66  multipart_t copy = multipart.clone();
67  assert(copy.size() == 3);
68 
69  ok = copy.send(output);
70  assert(copy.empty());
71  assert(ok);
72 
73  ok = copy.recv(input);
74  assert(copy.size() == 3);
75  assert(ok);
76  assert(copy.equal(&multipart));
77 
78  // Test equality operators
79  assert(copy == multipart);
80  assert(multipart == copy);
81 
82  multipart.pop();
83 
84  assert(copy != multipart);
85  assert(multipart != copy);
86 
87  multipart_t emptyMessage1 {};
88  multipart_t emptyMessage2 {};
89 
90  assert(emptyMessage1 == emptyMessage2);
91  assert(emptyMessage2 == emptyMessage1);
92 
93  multipart.clear();
94  assert(multipart.empty());
95 
96  // Test message frame manipulation
97  multipart.add(message_t("Frame5", 6));
98  multipart.addstr("Frame6");
99  multipart.addstr("Frame7");
100  multipart.addtyp(8.0f);
101  multipart.addmem("Frame9", 6);
102  multipart.push(message_t("Frame4", 6));
103  multipart.pushstr("Frame3");
104  multipart.pushstr("Frame2");
105  multipart.pushtyp(1.0f);
106  multipart.pushmem("Frame0", 6);
107  assert(multipart.size() == 10);
108 
109  const message_t &front_msg = multipart.front();
110  assert(multipart.size() == 10);
111  assert(std::string(front_msg.data<char>(), front_msg.size()) == "Frame0");
112 
113  const message_t &back_msg = multipart.back();
114  assert(multipart.size() == 10);
115  assert(std::string(back_msg.data<char>(), back_msg.size()) == "Frame9");
116 
117  msg = multipart.remove();
118  assert(multipart.size() == 9);
119  assert(std::string(msg.data<char>(), msg.size()) == "Frame9");
120 
121  msg = multipart.pop();
122  assert(multipart.size() == 8);
123  assert(std::string(msg.data<char>(), msg.size()) == "Frame0");
124 
125  num = multipart.poptyp<float>();
126  assert(multipart.size() == 7);
127  assert(num == 1.0f);
128 
129  str = multipart.popstr();
130  assert(multipart.size() == 6);
131  assert(str == "Frame2");
132 
133  str = multipart.popstr();
134  assert(multipart.size() == 5);
135  assert(str == "Frame3");
136 
137  str = multipart.popstr();
138  assert(multipart.size() == 4);
139  assert(str == "Frame4");
140 
141  str = multipart.popstr();
142  assert(multipart.size() == 3);
143  assert(str == "Frame5");
144 
145  str = multipart.popstr();
146  assert(multipart.size() == 2);
147  assert(str == "Frame6");
148 
149  str = multipart.popstr();
150  assert(multipart.size() == 1);
151  assert(str == "Frame7");
152 
153  num = multipart.poptyp<float>();
154  assert(multipart.empty());
155  assert(num == 8.0f);
156 
157  // Test message constructors and concatenation
158  multipart_t head("One", 3);
159  head.addstr("Two");
160  assert(head.size() == 2);
161 
162  multipart_t tail(std::string("One-hundred"));
163  tail.pushstr("Ninety-nine");
164  assert(tail.size() == 2);
165 
166  multipart_t tmp(message_t("Fifty", 5));
167  assert(tmp.size() == 1);
168 
169  multipart_t mid = multipart_t::create(49.0f);
170  mid.append(std::move(tmp));
171  assert(mid.size() == 2);
172  assert(tmp.empty());
173 
174  multipart_t merged(std::move(mid));
175  merged.prepend(std::move(head));
176  merged.append(std::move(tail));
177  assert(merged.size() == 6);
178  assert(head.empty());
179  assert(tail.empty());
180 
181  ok = merged.send(output);
182  assert(merged.empty());
183  assert(ok);
184 
185  multipart_t received(input);
186  assert(received.size() == 6);
187 
188  str = received.popstr();
189  assert(received.size() == 5);
190  assert(str == "One");
191 
192  str = received.popstr();
193  assert(received.size() == 4);
194  assert(str == "Two");
195 
196  num = received.poptyp<float>();
197  assert(received.size() == 3);
198  assert(num == 49.0f);
199 
200  str = received.popstr();
201  assert(received.size() == 2);
202  assert(str == "Fifty");
203 
204  str = received.popstr();
205  assert(received.size() == 1);
206  assert(str == "Ninety-nine");
207 
208  str = received.popstr();
209  assert(received.empty());
210  assert(str == "One-hundred");
211 }
212 #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
merged
static bool merged(const upb_refcounted *r, const upb_refcounted *r2)
Definition: ruby/ext/google/protobuf_c/upb.c:6184
zmq::socket_t
Definition: zmq.hpp:2188
zmq::message_t::data
void * data() ZMQ_NOTHROW
Definition: zmq.hpp:594
string
GLsizei const GLchar *const * string
Definition: glcorearb.h:3083
send
void send(fd_t fd_, const char(&data_)[N])
Definition: test_security_curve.cpp:209
zmq::socket_ref
Definition: zmq.hpp:2114
ok
ROSCPP_DECL bool ok()
zmq
Definition: zmq.hpp:229
zmq::context_t
Definition: zmq.hpp:799
update_failure_list.str
str
Definition: update_failure_list.py:41
void
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
ZMQ_PAIR
#define ZMQ_PAIR
Definition: zmq.h:258
f
GLfloat f
Definition: glcorearb.h:3964
value
GLsizei const GLfloat * value
Definition: glcorearb.h:3093
output
const upb_json_parsermethod const upb_symtab upb_sink * output
Definition: ruby/ext/google/protobuf_c/upb.h:10503
zmq::message_t::size
size_t size() const ZMQ_NOTHROW
Definition: zmq.hpp:601
zmq_addon.hpp


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