Line data Source code
1 : // Copyright (c) 2012-2024 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/eventdispatcher
4 : // contact@m2osw.com
5 : //
6 : // This program is free software; you can redistribute it and/or modify
7 : // it under the terms of the GNU General Public License as published by
8 : // the Free Software Foundation; either version 2 of the License, or
9 : // (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License along
17 : // with this program; if not, write to the Free Software Foundation, Inc.,
18 : // 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 :
20 : // self
21 : //
22 : #include "catch_main.h"
23 :
24 :
25 : // eventdispatcher
26 : //
27 : #include <eventdispatcher/message.h>
28 :
29 :
30 : // C
31 : //
32 : #include <unistd.h>
33 :
34 :
35 :
36 3 : CATCH_TEST_CASE("message", "[message]")
37 : {
38 3 : CATCH_START_SECTION("Simple message fields")
39 : {
40 1 : ed::message msg;
41 :
42 : // SENT FROM SERVER
43 : //
44 1 : CATCH_REQUIRE(msg.get_sent_from_server().empty());
45 3 : msg.set_sent_from_server("remote");
46 1 : CATCH_REQUIRE_FALSE(msg.get_sent_from_server().empty());
47 1 : CATCH_REQUIRE(msg.get_sent_from_server() == "remote");
48 :
49 : // SENT FROM SERVICE
50 : //
51 1 : CATCH_REQUIRE(msg.get_sent_from_service().empty());
52 3 : msg.set_sent_from_service("firewall");
53 1 : CATCH_REQUIRE_FALSE(msg.get_sent_from_service().empty());
54 1 : CATCH_REQUIRE(msg.get_sent_from_service() == "firewall");
55 :
56 : // SERVER
57 : //
58 1 : CATCH_REQUIRE(msg.get_server().empty());
59 3 : msg.set_server("jungle");
60 1 : CATCH_REQUIRE_FALSE(msg.get_server().empty());
61 1 : CATCH_REQUIRE(msg.get_server() == "jungle");
62 :
63 : // SERVICE
64 : //
65 1 : CATCH_REQUIRE(msg.get_service().empty());
66 3 : msg.set_service("watchdog");
67 1 : CATCH_REQUIRE_FALSE(msg.get_service().empty());
68 1 : CATCH_REQUIRE(msg.get_service() == "watchdog");
69 :
70 : // COMMAND
71 : //
72 1 : CATCH_REQUIRE(msg.get_command().empty());
73 3 : msg.set_command("CONNECT");
74 1 : CATCH_REQUIRE_FALSE(msg.get_command().empty());
75 1 : CATCH_REQUIRE(msg.get_command() == "CONNECT");
76 :
77 : // MESSAGE VERSION
78 : //
79 1 : CATCH_REQUIRE(msg.get_message_version() == ed::MESSAGE_VERSION);
80 1 : msg.add_version_parameter();
81 1 : CATCH_REQUIRE(msg.check_version_parameter());
82 :
83 : // PARAMETER (race)
84 : //
85 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("race"));
86 5 : msg.add_parameter("race", "true");
87 3 : CATCH_REQUIRE(msg.has_parameter("race"));
88 3 : CATCH_REQUIRE(msg.get_parameter("race") == "true");
89 :
90 : // PARAMETER (speed)
91 : //
92 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("speed"));
93 3 : msg.add_parameter("speed", 1078);
94 3 : CATCH_REQUIRE(msg.has_parameter("speed"));
95 3 : CATCH_REQUIRE(msg.get_parameter("speed") == "1078");
96 3 : CATCH_REQUIRE(msg.get_integer_parameter("speed") == 1078);
97 :
98 : // PARAMETER (height)
99 : //
100 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("height"));
101 3 : msg.add_parameter("height", 27U);
102 3 : CATCH_REQUIRE(msg.has_parameter("height"));
103 3 : CATCH_REQUIRE(msg.get_parameter("height") == "27");
104 3 : CATCH_REQUIRE(msg.get_integer_parameter("height") == 27);
105 :
106 : // PARAMETER (huge)
107 : //
108 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("huge"));
109 3 : msg.add_parameter("huge", 7428447997487423361LL);
110 3 : CATCH_REQUIRE(msg.has_parameter("huge"));
111 3 : CATCH_REQUIRE(msg.get_parameter("huge") == "7428447997487423361");
112 3 : CATCH_REQUIRE(msg.get_integer_parameter("huge") == 7428447997487423361LL);
113 :
114 : // PARAMETER (huge #2)
115 : //
116 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("huge2"));
117 3 : msg.add_parameter("huge2", 7428447997487423961ULL);
118 3 : CATCH_REQUIRE(msg.has_parameter("huge2"));
119 3 : CATCH_REQUIRE(msg.get_parameter("huge2") == "7428447997487423961");
120 3 : CATCH_REQUIRE(msg.get_integer_parameter("huge2") == 7428447997487423961ULL);
121 :
122 : // PARAMETER (a64bit)
123 : //
124 1 : std::int64_t const a64bit = 7428447907487423361LL;
125 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("a64bit"));
126 3 : msg.add_parameter("a64bit", a64bit);
127 3 : CATCH_REQUIRE(msg.has_parameter("a64bit"));
128 3 : CATCH_REQUIRE(msg.get_parameter("a64bit") == "7428447907487423361");
129 3 : CATCH_REQUIRE(msg.get_integer_parameter("a64bit") == a64bit);
130 :
131 : // PARAMETER (u64bit)
132 : //
133 1 : std::uint64_t const u64bit = 428447907487423361UL;
134 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("u64bit"));
135 3 : msg.add_parameter("u64bit", u64bit);
136 3 : CATCH_REQUIRE(msg.has_parameter("u64bit"));
137 3 : CATCH_REQUIRE(msg.get_parameter("u64bit") == "428447907487423361");
138 3 : CATCH_REQUIRE(msg.get_integer_parameter("u64bit") == u64bit);
139 :
140 9 : for(auto p : msg.get_all_parameters())
141 : {
142 8 : if(p.first == "huge")
143 : {
144 1 : CATCH_REQUIRE(p.second == "7428447997487423361");
145 : }
146 7 : else if(p.first == "u64bit")
147 : {
148 1 : CATCH_REQUIRE(p.second == "428447907487423361");
149 : }
150 8 : }
151 :
152 : // PARAMETER (timespec)
153 : //
154 1 : snapdev::timespec_ex const now(snapdev::now());
155 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("date"));
156 3 : msg.add_parameter("date", now);
157 3 : CATCH_REQUIRE(msg.has_parameter("date"));
158 1 : std::stringstream ss;
159 1 : ss << now;
160 3 : CATCH_REQUIRE(msg.get_parameter("date") == ss.str());
161 3 : CATCH_REQUIRE(msg.get_timespec_parameter("date") == now);
162 :
163 : // REPLY TO
164 : //
165 1 : ed::message msg2;
166 1 : msg2.reply_to(msg);
167 :
168 1 : CATCH_REQUIRE(msg2.get_sent_from_server().empty());
169 1 : CATCH_REQUIRE(msg2.get_sent_from_service().empty());
170 1 : CATCH_REQUIRE(msg2.get_server() == "remote");
171 1 : CATCH_REQUIRE(msg2.get_service() == "firewall");
172 1 : CATCH_REQUIRE(msg2.get_command().empty());
173 1 : CATCH_REQUIRE(msg2.get_message_version() == ed::MESSAGE_VERSION);
174 3 : CATCH_REQUIRE_FALSE(msg2.has_parameter("race"));
175 3 : CATCH_REQUIRE_FALSE(msg2.has_parameter("speed"));
176 3 : CATCH_REQUIRE_FALSE(msg2.has_parameter("height"));
177 3 : CATCH_REQUIRE_FALSE(msg2.has_parameter("huge"));
178 3 : CATCH_REQUIRE_FALSE(msg2.has_parameter("huge2"));
179 3 : CATCH_REQUIRE_FALSE(msg2.has_parameter("a64bit"));
180 3 : CATCH_REQUIRE_FALSE(msg2.has_parameter("u64bit"));
181 1 : CATCH_REQUIRE(msg2.get_all_parameters().empty());
182 :
183 : //for(auto p : msg2.get_all_parameters())
184 : //{
185 : //std::cerr << "--- " << p.first << "=" << p.second << "\n";
186 : //}
187 :
188 : // make sure the original wasn't modified
189 : //
190 1 : CATCH_REQUIRE(msg.get_sent_from_server() == "remote");
191 1 : CATCH_REQUIRE(msg.get_sent_from_service() == "firewall");
192 1 : CATCH_REQUIRE(msg.get_server() == "jungle");
193 1 : CATCH_REQUIRE(msg.get_service() == "watchdog");
194 1 : }
195 3 : CATCH_END_SECTION()
196 :
197 3 : CATCH_START_SECTION("To & From Messages (simple)")
198 : {
199 1 : ed::message msg;
200 :
201 1 : CATCH_REQUIRE(msg.get_command().empty());
202 3 : msg.set_command("FIRE");
203 1 : CATCH_REQUIRE_FALSE(msg.get_command().empty());
204 1 : CATCH_REQUIRE(msg.get_command() == "FIRE");
205 :
206 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("name"));
207 5 : msg.add_parameter("name", "Charles");
208 3 : CATCH_REQUIRE(msg.has_parameter("name"));
209 3 : CATCH_REQUIRE(msg.get_parameter("name") == "Charles");
210 :
211 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("length"));
212 3 : msg.add_parameter("length", -35);
213 3 : CATCH_REQUIRE(msg.has_parameter("length"));
214 3 : CATCH_REQUIRE(msg.get_parameter("length") == "-35");
215 3 : CATCH_REQUIRE(msg.get_integer_parameter("length") == -35);
216 :
217 : {
218 1 : std::string const m(msg.to_message());
219 :
220 1 : ed::message rcv;
221 :
222 1 : CATCH_REQUIRE(rcv.get_command().empty());
223 3 : CATCH_REQUIRE_FALSE(rcv.has_parameter("name"));
224 3 : CATCH_REQUIRE_FALSE(rcv.has_parameter("length"));
225 :
226 1 : rcv.from_message(m);
227 :
228 1 : CATCH_REQUIRE_FALSE(rcv.get_command().empty());
229 1 : CATCH_REQUIRE(rcv.get_command() == "FIRE");
230 :
231 3 : CATCH_REQUIRE(rcv.has_parameter("name"));
232 3 : CATCH_REQUIRE(rcv.get_parameter("name") == "Charles");
233 :
234 3 : CATCH_REQUIRE(rcv.has_parameter("length"));
235 3 : CATCH_REQUIRE(rcv.get_parameter("length") == "-35");
236 3 : CATCH_REQUIRE(rcv.get_integer_parameter("length") == -35);
237 1 : }
238 :
239 : {
240 1 : std::string const m(msg.to_message(ed::message::format_t::MESSAGE_FORMAT_JSON));
241 :
242 1 : ed::message rcv;
243 :
244 1 : CATCH_REQUIRE(rcv.get_command().empty());
245 3 : CATCH_REQUIRE_FALSE(rcv.has_parameter("name"));
246 3 : CATCH_REQUIRE_FALSE(rcv.has_parameter("length"));
247 :
248 1 : rcv.from_message(m);
249 :
250 1 : CATCH_REQUIRE_FALSE(rcv.get_command().empty());
251 1 : CATCH_REQUIRE(rcv.get_command() == "FIRE");
252 :
253 3 : CATCH_REQUIRE(rcv.has_parameter("name"));
254 3 : CATCH_REQUIRE(rcv.get_parameter("name") == "Charles");
255 :
256 3 : CATCH_REQUIRE(rcv.has_parameter("length"));
257 3 : CATCH_REQUIRE(rcv.get_parameter("length") == "-35");
258 3 : CATCH_REQUIRE(rcv.get_integer_parameter("length") == -35);
259 1 : }
260 1 : }
261 3 : CATCH_END_SECTION()
262 :
263 3 : CATCH_START_SECTION("To & From Messages (full message)")
264 : {
265 1 : ed::message msg;
266 :
267 1 : CATCH_REQUIRE(msg.get_command().empty());
268 3 : msg.set_command("FIRE");
269 1 : CATCH_REQUIRE_FALSE(msg.get_command().empty());
270 1 : CATCH_REQUIRE(msg.get_command() == "FIRE");
271 :
272 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("name"));
273 5 : msg.add_parameter("name", "Charles");
274 3 : CATCH_REQUIRE(msg.has_parameter("name"));
275 3 : CATCH_REQUIRE(msg.get_parameter("name") == "Charles");
276 :
277 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("length"));
278 3 : msg.add_parameter("length", -35);
279 3 : CATCH_REQUIRE(msg.has_parameter("length"));
280 3 : CATCH_REQUIRE(msg.get_parameter("length") == "-35");
281 3 : CATCH_REQUIRE(msg.get_integer_parameter("length") == -35);
282 :
283 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("range"));
284 5 : msg.add_parameter("range", "+101");
285 3 : CATCH_REQUIRE(msg.has_parameter("range"));
286 3 : CATCH_REQUIRE(msg.get_parameter("range") == "+101");
287 3 : CATCH_REQUIRE(msg.get_integer_parameter("range") == 101);
288 :
289 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("valid"));
290 5 : msg.add_parameter("valid", "true");
291 3 : CATCH_REQUIRE(msg.has_parameter("valid"));
292 3 : CATCH_REQUIRE(msg.get_parameter("valid") == "true");
293 :
294 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("correct"));
295 5 : msg.add_parameter("correct", "false");
296 3 : CATCH_REQUIRE(msg.has_parameter("correct"));
297 3 : CATCH_REQUIRE(msg.get_parameter("correct") == "false");
298 :
299 3 : CATCH_REQUIRE_FALSE(msg.has_parameter("void"));
300 5 : msg.add_parameter("void", "");
301 3 : CATCH_REQUIRE(msg.has_parameter("void"));
302 3 : CATCH_REQUIRE(msg.get_parameter("void") == "");
303 :
304 : {
305 1 : std::string const m(msg.to_message());
306 :
307 1 : ed::message rcv;
308 :
309 1 : CATCH_REQUIRE(rcv.get_command().empty());
310 3 : CATCH_REQUIRE_FALSE(rcv.has_parameter("name"));
311 3 : CATCH_REQUIRE_FALSE(rcv.has_parameter("length"));
312 :
313 1 : rcv.from_message(m);
314 :
315 1 : CATCH_REQUIRE_FALSE(rcv.get_command().empty());
316 1 : CATCH_REQUIRE(rcv.get_command() == "FIRE");
317 :
318 3 : CATCH_REQUIRE(rcv.has_parameter("name"));
319 3 : CATCH_REQUIRE(rcv.get_parameter("name") == "Charles");
320 :
321 3 : CATCH_REQUIRE(rcv.has_parameter("length"));
322 3 : CATCH_REQUIRE(rcv.get_parameter("length") == "-35");
323 3 : CATCH_REQUIRE(rcv.get_integer_parameter("length") == -35);
324 :
325 3 : CATCH_REQUIRE(rcv.has_parameter("range"));
326 3 : CATCH_REQUIRE(rcv.get_parameter("range") == "+101");
327 3 : CATCH_REQUIRE(rcv.get_integer_parameter("range") == 101);
328 :
329 3 : CATCH_REQUIRE(rcv.has_parameter("valid"));
330 3 : CATCH_REQUIRE(rcv.get_parameter("valid") == "true");
331 :
332 3 : CATCH_REQUIRE(rcv.has_parameter("correct"));
333 3 : CATCH_REQUIRE(rcv.get_parameter("correct") == "false");
334 :
335 3 : CATCH_REQUIRE(rcv.has_parameter("void"));
336 3 : CATCH_REQUIRE(rcv.get_parameter("void") == "");
337 1 : }
338 :
339 : {
340 1 : std::string const m(msg.to_json());
341 :
342 1 : std::cerr << "JSON [" << m << "]\n";
343 1 : ed::message rcv;
344 :
345 1 : CATCH_REQUIRE(rcv.get_command().empty());
346 3 : CATCH_REQUIRE_FALSE(rcv.has_parameter("name"));
347 3 : CATCH_REQUIRE_FALSE(rcv.has_parameter("length"));
348 :
349 : // this statement prints out an error message
350 1 : CATCH_REQUIRE_FALSE(rcv.from_string(m));
351 :
352 1 : CATCH_REQUIRE(rcv.from_json(m));
353 :
354 1 : CATCH_REQUIRE_FALSE(rcv.get_command().empty());
355 1 : CATCH_REQUIRE(rcv.get_command() == "FIRE");
356 :
357 3 : CATCH_REQUIRE(rcv.has_parameter("name"));
358 3 : CATCH_REQUIRE(rcv.get_parameter("name") == "Charles");
359 :
360 3 : CATCH_REQUIRE(rcv.has_parameter("length"));
361 3 : CATCH_REQUIRE(rcv.get_parameter("length") == "-35");
362 3 : CATCH_REQUIRE(rcv.get_integer_parameter("length") == -35);
363 :
364 3 : CATCH_REQUIRE(rcv.has_parameter("range"));
365 3 : CATCH_REQUIRE(rcv.get_parameter("range") == "101"); // we lose the '+' sign in JSON
366 3 : CATCH_REQUIRE(rcv.get_integer_parameter("range") == 101);
367 :
368 3 : CATCH_REQUIRE(rcv.has_parameter("valid"));
369 3 : CATCH_REQUIRE(rcv.get_parameter("valid") == "true");
370 :
371 3 : CATCH_REQUIRE(rcv.has_parameter("correct"));
372 3 : CATCH_REQUIRE(rcv.get_parameter("correct") == "false");
373 :
374 3 : CATCH_REQUIRE(rcv.has_parameter("void"));
375 3 : CATCH_REQUIRE(rcv.get_parameter("void") == "");
376 1 : }
377 1 : }
378 3 : CATCH_END_SECTION()
379 3 : }
380 :
381 :
382 : // vim: ts=4 sw=4 et
|