Skip to content

Commit 70e45c2

Browse files
authored
Merge pull request #852 from redboltz/test_multi_client
Supported combi test with multi clients.
2 parents ce46634 + ab8b1d4 commit 70e45c2

23 files changed

+507
-309
lines changed

test/system/combi_test.hpp

+98-33
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <thread>
1111
#include <future>
12+
#include <vector>
1213

1314
#include <mqtt/broker/broker.hpp>
1415

@@ -36,6 +37,7 @@ template <typename ClientCreator, typename Test>
3637
inline void do_test(
3738
ClientCreator const& cc,
3839
Test const& test,
40+
std::size_t clients,
3941
MQTT_NS::optional<MQTT_NS::protocol_version> v = MQTT_NS::nullopt) {
4042
boost::asio::io_context iocb;
4143
MQTT_NS::broker::broker_t b(iocb);
@@ -51,18 +53,26 @@ inline void do_test(
5153
);
5254
f.wait();
5355
boost::asio::io_context ioc;
54-
auto c =
56+
auto cs =
5557
[&] {
58+
BOOST_ASSERT(clients > 0);
59+
std::vector<decltype(cc(ioc, broker_url, broker_notls_port))> cs;
60+
cs.reserve(clients);
5661
if (v) {
57-
return cc(ioc, broker_url, broker_notls_port, v.value());
62+
for (std::size_t i = 0; i != clients; ++i) {
63+
cs.push_back(cc(ioc, broker_url, broker_notls_port, v.value()));
64+
}
5865
}
5966
else {
60-
return cc(ioc, broker_url, broker_notls_port);
67+
for (std::size_t i = 0; i != clients; ++i) {
68+
cs.push_back(cc(ioc, broker_url, broker_notls_port));
69+
}
6170
}
71+
return cs;
6272
} ();
6373
test(
6474
ioc,
65-
c,
75+
cs,
6676
[&] {
6777
as::post(
6878
iocb,
@@ -90,6 +100,7 @@ template <typename ClientCreator, typename Test>
90100
inline void do_tls_test(
91101
ClientCreator const& cc,
92102
Test const& test,
103+
std::size_t clients,
93104
MQTT_NS::optional<MQTT_NS::protocol_version> v = MQTT_NS::nullopt) {
94105
boost::asio::io_context iocb;
95106
MQTT_NS::broker::broker_t b(iocb);
@@ -105,22 +116,32 @@ inline void do_tls_test(
105116
);
106117
f.wait();
107118
boost::asio::io_context ioc;
108-
auto c =
119+
auto cs =
109120
[&] {
121+
BOOST_ASSERT(clients > 0);
122+
std::vector<decltype(cc(ioc, broker_url, broker_tls_port))> cs;
123+
cs.reserve(clients);
110124
if (v) {
111-
return cc(ioc, broker_url, broker_tls_port, v.value());
125+
for (std::size_t i = 0; i != clients; ++i) {
126+
cs.push_back(cc(ioc, broker_url, broker_tls_port, v.value()));
127+
}
112128
}
113129
else {
114-
return cc(ioc, broker_url, broker_tls_port);
130+
for (std::size_t i = 0; i != clients; ++i) {
131+
cs.push_back(cc(ioc, broker_url, broker_tls_port));
132+
}
115133
}
134+
return cs;
116135
} ();
117136
std::string path = boost::unit_test::framework::master_test_suite().argv[0];
118137
std::size_t pos = path.find_last_of("/\\");
119138
std::string base = (pos == std::string::npos) ? "" : path.substr(0, pos + 1);
120-
c->get_ssl_context().load_verify_file(base + "cacert.pem");
139+
for (auto& c : cs) {
140+
c->get_ssl_context().load_verify_file(base + "cacert.pem");
141+
}
121142
test(
122143
ioc,
123-
c,
144+
cs,
124145
[&] {
125146
as::post(
126147
iocb,
@@ -144,6 +165,7 @@ template <typename ClientCreator, typename Test>
144165
inline void do_ws_test(
145166
ClientCreator const& cc,
146167
Test const& test,
168+
std::size_t clients,
147169
MQTT_NS::optional<MQTT_NS::protocol_version> v = MQTT_NS::nullopt) {
148170
boost::asio::io_context iocb;
149171
MQTT_NS::broker::broker_t b(iocb);
@@ -159,18 +181,26 @@ inline void do_ws_test(
159181
);
160182
f.wait();
161183
boost::asio::io_context ioc;
162-
auto c =
184+
auto cs =
163185
[&] {
186+
BOOST_ASSERT(clients > 0);
187+
std::vector<decltype(cc(ioc, broker_url, broker_notls_ws_port))> cs;
188+
cs.reserve(clients);
164189
if (v) {
165-
return cc(ioc, broker_url, broker_notls_ws_port, "/", v.value());
190+
for (std::size_t i = 0; i != clients; ++i) {
191+
cs.push_back(cc(ioc, broker_url, broker_notls_ws_port, "/", v.value()));
192+
}
166193
}
167194
else {
168-
return cc(ioc, broker_url, broker_notls_ws_port);
195+
for (std::size_t i = 0; i != clients; ++i) {
196+
cs.push_back(cc(ioc, broker_url, broker_notls_ws_port));
197+
}
169198
}
199+
return cs;
170200
} ();
171201
test(
172202
ioc,
173-
c,
203+
cs,
174204
[&] {
175205
as::post(
176206
iocb,
@@ -192,6 +222,7 @@ template <typename ClientCreator, typename Test>
192222
inline void do_tls_ws_test(
193223
ClientCreator const& cc,
194224
Test const& test,
225+
std::size_t clients,
195226
MQTT_NS::optional<MQTT_NS::protocol_version> v = MQTT_NS::nullopt) {
196227
boost::asio::io_context iocb;
197228
MQTT_NS::broker::broker_t b(iocb);
@@ -207,22 +238,32 @@ inline void do_tls_ws_test(
207238
);
208239
f.wait();
209240
boost::asio::io_context ioc;
210-
auto c =
241+
auto cs =
211242
[&] {
243+
BOOST_ASSERT(clients > 0);
244+
std::vector<decltype(cc(ioc, broker_url, broker_tls_ws_port))> cs;
245+
cs.reserve(clients);
212246
if (v) {
213-
return cc(ioc, broker_url, broker_tls_ws_port, "/", v.value());
247+
for (std::size_t i = 0; i != clients; ++i) {
248+
cs.push_back(cc(ioc, broker_url, broker_tls_ws_port, "/", v.value()));
249+
}
214250
}
215251
else {
216-
return cc(ioc, broker_url, broker_tls_ws_port);
252+
for (std::size_t i = 0; i != clients; ++i) {
253+
cs.push_back(cc(ioc, broker_url, broker_tls_ws_port));
254+
}
217255
}
256+
return cs;
218257
} ();
219258
std::string path = boost::unit_test::framework::master_test_suite().argv[0];
220259
std::size_t pos = path.find_last_of("/\\");
221260
std::string base = (pos == std::string::npos) ? "" : path.substr(0, pos + 1);
222-
c->get_ssl_context().load_verify_file(base + "cacert.pem");
261+
for (auto& c : cs) {
262+
c->get_ssl_context().load_verify_file(base + "cacert.pem");
263+
}
223264
test(
224265
ioc,
225-
c,
266+
cs,
226267
[&] {
227268
as::post(
228269
iocb,
@@ -243,137 +284,161 @@ inline void do_tls_ws_test(
243284

244285

245286
template <typename Test>
246-
inline void do_combi_test(Test const& test) {
287+
inline void do_combi_test(Test const& test, std::size_t clients = 1) {
247288
do_test(
248289
[&](auto&&... args) { return MQTT_NS::make_client(std::forward<decltype(args)>(args)...); },
249-
test
290+
test,
291+
clients
250292
);
251293
do_test(
252294
[&](auto&&... args) { return MQTT_NS::make_client(std::forward<decltype(args)>(args)...); },
253295
test,
296+
clients,
254297
MQTT_NS::protocol_version::v5
255298
);
256299
#if defined(MQTT_USE_TLS)
257300
do_tls_test(
258301
[&](auto&&... args) { return MQTT_NS::make_tls_client(std::forward<decltype(args)>(args)...); },
259-
test
302+
test,
303+
clients
260304
);
261305
do_tls_test(
262306
[&](auto&&... args) { return MQTT_NS::make_tls_client(std::forward<decltype(args)>(args)...); },
263307
test,
308+
clients,
264309
MQTT_NS::protocol_version::v5
265310
);
266311
#endif // defined(MQTT_USE_TLS)
267312
#if defined(MQTT_USE_WS)
268313
do_ws_test(
269314
[&](auto&&... args) { return MQTT_NS::make_client_ws(std::forward<decltype(args)>(args)...); },
270-
test
315+
test,
316+
clients
271317
);
272318
do_ws_test(
273319
[&](auto&&... args) { return MQTT_NS::make_client_ws(std::forward<decltype(args)>(args)...); },
274320
test,
321+
clients,
275322
MQTT_NS::protocol_version::v5
276323
);
277324
#if defined(MQTT_USE_TLS)
278325
do_tls_ws_test(
279326
[&](auto&&... args) { return MQTT_NS::make_tls_client_ws(std::forward<decltype(args)>(args)...); },
280-
test
327+
test,
328+
clients
281329
);
282330
do_tls_ws_test(
283331
[&](auto&&... args) { return MQTT_NS::make_tls_client_ws(std::forward<decltype(args)>(args)...); },
284332
test,
333+
clients,
285334
MQTT_NS::protocol_version::v5
286335
);
287336
#endif // defined(MQTT_USE_TLS)
288337
#endif // defined(MQTT_USE_WS)
289338
}
290339

291340
template <typename Test>
292-
inline void do_combi_test_sync(Test const& test) {
341+
inline void do_combi_test_sync(Test const& test, std::size_t clients = 1) {
293342
do_test(
294343
[&](auto&&... args) { return MQTT_NS::make_sync_client(std::forward<decltype(args)>(args)...); },
295-
test
344+
test,
345+
clients
296346
);
297347
do_test(
298348
[&](auto&&... args) { return MQTT_NS::make_sync_client(std::forward<decltype(args)>(args)...); },
299349
test,
350+
clients,
300351
MQTT_NS::protocol_version::v5
301352
);
302353
#if defined(MQTT_USE_TLS)
303354
do_tls_test(
304355
[&](auto&&... args) { return MQTT_NS::make_tls_sync_client(std::forward<decltype(args)>(args)...); },
305-
test
356+
test,
357+
clients
306358
);
307359
do_tls_test(
308360
[&](auto&&... args) { return MQTT_NS::make_tls_sync_client(std::forward<decltype(args)>(args)...); },
309361
test,
362+
clients,
310363
MQTT_NS::protocol_version::v5
311364
);
312365
#endif // defined(MQTT_USE_TLS)
313366
#if defined(MQTT_USE_WS)
314367
do_ws_test(
315368
[&](auto&&... args) { return MQTT_NS::make_sync_client_ws(std::forward<decltype(args)>(args)...); },
316-
test
369+
test,
370+
clients
317371
);
318372
do_ws_test(
319373
[&](auto&&... args) { return MQTT_NS::make_sync_client_ws(std::forward<decltype(args)>(args)...); },
320374
test,
375+
clients,
321376
MQTT_NS::protocol_version::v5
322377
);
323378
#if defined(MQTT_USE_TLS)
324379
do_tls_ws_test(
325380
[&](auto&&... args) { return MQTT_NS::make_tls_sync_client_ws(std::forward<decltype(args)>(args)...); },
326-
test
381+
test,
382+
clients
327383
);
328384
do_tls_ws_test(
329385
[&](auto&&... args) { return MQTT_NS::make_tls_sync_client_ws(std::forward<decltype(args)>(args)...); },
330386
test,
387+
clients,
331388
MQTT_NS::protocol_version::v5
332389
);
333390
#endif // defined(MQTT_USE_TLS)
334391
#endif // defined(MQTT_USE_WS)
335392
}
336393

337394
template <typename Test>
338-
inline void do_combi_test_async(Test const& test) {
395+
inline void do_combi_test_async(Test const& test, std::size_t clients = 1) {
339396
do_test(
340397
[&](auto&&... args) { return MQTT_NS::make_async_client(std::forward<decltype(args)>(args)...); },
341-
test
398+
test,
399+
clients
342400
);
343401
do_test(
344402
[&](auto&&... args) { return MQTT_NS::make_async_client(std::forward<decltype(args)>(args)...); },
345403
test,
404+
clients,
346405
MQTT_NS::protocol_version::v5
347406
);
348407
#if defined(MQTT_USE_TLS)
349408
do_tls_test(
350409
[&](auto&&... args) { return MQTT_NS::make_tls_async_client(std::forward<decltype(args)>(args)...); },
351-
test
410+
test,
411+
clients
352412
);
353413
do_tls_test(
354414
[&](auto&&... args) { return MQTT_NS::make_tls_async_client(std::forward<decltype(args)>(args)...); },
355415
test,
416+
clients,
356417
MQTT_NS::protocol_version::v5
357418
);
358419
#endif // defined(MQTT_USE_TLS)
359420
#if defined(MQTT_USE_WS)
360421
do_ws_test(
361422
[&](auto&&... args) { return MQTT_NS::make_async_client_ws(std::forward<decltype(args)>(args)...); },
362-
test
423+
test,
424+
clients
363425
);
364426
do_ws_test(
365427
[&](auto&&... args) { return MQTT_NS::make_async_client_ws(std::forward<decltype(args)>(args)...); },
366428
test,
429+
clients,
367430
MQTT_NS::protocol_version::v5
368431
);
369432
#if defined(MQTT_USE_TLS)
370433
do_tls_ws_test(
371434
[&](auto&&... args) { return MQTT_NS::make_tls_async_client_ws(std::forward<decltype(args)>(args)...); },
372-
test
435+
test,
436+
clients
373437
);
374438
do_tls_ws_test(
375439
[&](auto&&... args) { return MQTT_NS::make_tls_async_client_ws(std::forward<decltype(args)>(args)...); },
376440
test,
441+
clients,
377442
MQTT_NS::protocol_version::v5
378443
);
379444
#endif // defined(MQTT_USE_TLS)

0 commit comments

Comments
 (0)