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 1 : 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 1 : 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 1 : 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 1 : 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 1 : 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 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("race")); 86 1 : msg.add_parameter("race", "true"); 87 1 : CATCH_REQUIRE(msg.has_parameter("race")); 88 1 : CATCH_REQUIRE(msg.get_parameter("race") == "true"); 89 : 90 : // PARAMETER (speed) 91 : // 92 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("speed")); 93 1 : msg.add_parameter("speed", 1078); 94 1 : CATCH_REQUIRE(msg.has_parameter("speed")); 95 1 : CATCH_REQUIRE(msg.get_parameter("speed") == "1078"); 96 1 : CATCH_REQUIRE(msg.get_integer_parameter("speed") == 1078); 97 : 98 : // PARAMETER (height) 99 : // 100 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("height")); 101 1 : msg.add_parameter("height", 27U); 102 1 : CATCH_REQUIRE(msg.has_parameter("height")); 103 1 : CATCH_REQUIRE(msg.get_parameter("height") == "27"); 104 1 : CATCH_REQUIRE(msg.get_integer_parameter("height") == 27); 105 : 106 : // PARAMETER (huge) 107 : // 108 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("huge")); 109 1 : msg.add_parameter("huge", 7428447997487423361LL); 110 1 : CATCH_REQUIRE(msg.has_parameter("huge")); 111 1 : CATCH_REQUIRE(msg.get_parameter("huge") == "7428447997487423361"); 112 1 : CATCH_REQUIRE(msg.get_integer_parameter("huge") == 7428447997487423361LL); 113 : 114 : // PARAMETER (huge #2) 115 : // 116 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("huge2")); 117 1 : msg.add_parameter("huge2", 7428447997487423961ULL); 118 1 : CATCH_REQUIRE(msg.has_parameter("huge2")); 119 1 : CATCH_REQUIRE(msg.get_parameter("huge2") == "7428447997487423961"); 120 1 : CATCH_REQUIRE(msg.get_integer_parameter("huge2") == 7428447997487423961ULL); 121 : 122 : // PARAMETER (a64bit) 123 : // 124 1 : std::int64_t const a64bit = 7428447907487423361LL; 125 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("a64bit")); 126 1 : msg.add_parameter("a64bit", a64bit); 127 1 : CATCH_REQUIRE(msg.has_parameter("a64bit")); 128 1 : CATCH_REQUIRE(msg.get_parameter("a64bit") == "7428447907487423361"); 129 1 : CATCH_REQUIRE(msg.get_integer_parameter("a64bit") == a64bit); 130 : 131 : // PARAMETER (u64bit) 132 : // 133 1 : std::uint64_t const u64bit = 428447907487423361UL; 134 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("u64bit")); 135 1 : msg.add_parameter("u64bit", u64bit); 136 1 : CATCH_REQUIRE(msg.has_parameter("u64bit")); 137 1 : CATCH_REQUIRE(msg.get_parameter("u64bit") == "428447907487423361"); 138 1 : 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 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("date")); 156 1 : msg.add_parameter("date", now); 157 1 : CATCH_REQUIRE(msg.has_parameter("date")); 158 1 : std::stringstream ss; 159 1 : ss << now; 160 1 : CATCH_REQUIRE(msg.get_parameter("date") == ss.str()); 161 1 : 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 1 : CATCH_REQUIRE_FALSE(msg2.has_parameter("race")); 175 1 : CATCH_REQUIRE_FALSE(msg2.has_parameter("speed")); 176 1 : CATCH_REQUIRE_FALSE(msg2.has_parameter("height")); 177 1 : CATCH_REQUIRE_FALSE(msg2.has_parameter("huge")); 178 1 : CATCH_REQUIRE_FALSE(msg2.has_parameter("huge2")); 179 1 : CATCH_REQUIRE_FALSE(msg2.has_parameter("a64bit")); 180 1 : 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 1 : msg.set_command("FIRE"); 203 1 : CATCH_REQUIRE_FALSE(msg.get_command().empty()); 204 1 : CATCH_REQUIRE(msg.get_command() == "FIRE"); 205 : 206 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("name")); 207 1 : msg.add_parameter("name", "Charles"); 208 1 : CATCH_REQUIRE(msg.has_parameter("name")); 209 1 : CATCH_REQUIRE(msg.get_parameter("name") == "Charles"); 210 : 211 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("length")); 212 1 : msg.add_parameter("length", -35); 213 1 : CATCH_REQUIRE(msg.has_parameter("length")); 214 1 : CATCH_REQUIRE(msg.get_parameter("length") == "-35"); 215 1 : 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 1 : CATCH_REQUIRE_FALSE(rcv.has_parameter("name")); 224 1 : 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 1 : CATCH_REQUIRE(rcv.has_parameter("name")); 232 1 : CATCH_REQUIRE(rcv.get_parameter("name") == "Charles"); 233 : 234 1 : CATCH_REQUIRE(rcv.has_parameter("length")); 235 1 : CATCH_REQUIRE(rcv.get_parameter("length") == "-35"); 236 1 : 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 1 : CATCH_REQUIRE_FALSE(rcv.has_parameter("name")); 246 1 : 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 1 : CATCH_REQUIRE(rcv.has_parameter("name")); 254 1 : CATCH_REQUIRE(rcv.get_parameter("name") == "Charles"); 255 : 256 1 : CATCH_REQUIRE(rcv.has_parameter("length")); 257 1 : CATCH_REQUIRE(rcv.get_parameter("length") == "-35"); 258 1 : 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 1 : msg.set_command("FIRE"); 269 1 : CATCH_REQUIRE_FALSE(msg.get_command().empty()); 270 1 : CATCH_REQUIRE(msg.get_command() == "FIRE"); 271 : 272 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("name")); 273 1 : msg.add_parameter("name", "Charles"); 274 1 : CATCH_REQUIRE(msg.has_parameter("name")); 275 1 : CATCH_REQUIRE(msg.get_parameter("name") == "Charles"); 276 : 277 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("length")); 278 1 : msg.add_parameter("length", -35); 279 1 : CATCH_REQUIRE(msg.has_parameter("length")); 280 1 : CATCH_REQUIRE(msg.get_parameter("length") == "-35"); 281 1 : CATCH_REQUIRE(msg.get_integer_parameter("length") == -35); 282 : 283 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("range")); 284 1 : msg.add_parameter("range", "+101"); 285 1 : CATCH_REQUIRE(msg.has_parameter("range")); 286 1 : CATCH_REQUIRE(msg.get_parameter("range") == "+101"); 287 1 : CATCH_REQUIRE(msg.get_integer_parameter("range") == 101); 288 : 289 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("valid")); 290 1 : msg.add_parameter("valid", "true"); 291 1 : CATCH_REQUIRE(msg.has_parameter("valid")); 292 1 : CATCH_REQUIRE(msg.get_parameter("valid") == "true"); 293 : 294 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("correct")); 295 1 : msg.add_parameter("correct", "false"); 296 1 : CATCH_REQUIRE(msg.has_parameter("correct")); 297 1 : CATCH_REQUIRE(msg.get_parameter("correct") == "false"); 298 : 299 1 : CATCH_REQUIRE_FALSE(msg.has_parameter("void")); 300 1 : msg.add_parameter("void", ""); 301 1 : CATCH_REQUIRE(msg.has_parameter("void")); 302 1 : 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 1 : CATCH_REQUIRE_FALSE(rcv.has_parameter("name")); 311 1 : 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 1 : CATCH_REQUIRE(rcv.has_parameter("name")); 319 1 : CATCH_REQUIRE(rcv.get_parameter("name") == "Charles"); 320 : 321 1 : CATCH_REQUIRE(rcv.has_parameter("length")); 322 1 : CATCH_REQUIRE(rcv.get_parameter("length") == "-35"); 323 1 : CATCH_REQUIRE(rcv.get_integer_parameter("length") == -35); 324 : 325 1 : CATCH_REQUIRE(rcv.has_parameter("range")); 326 1 : CATCH_REQUIRE(rcv.get_parameter("range") == "+101"); 327 1 : CATCH_REQUIRE(rcv.get_integer_parameter("range") == 101); 328 : 329 1 : CATCH_REQUIRE(rcv.has_parameter("valid")); 330 1 : CATCH_REQUIRE(rcv.get_parameter("valid") == "true"); 331 : 332 1 : CATCH_REQUIRE(rcv.has_parameter("correct")); 333 1 : CATCH_REQUIRE(rcv.get_parameter("correct") == "false"); 334 : 335 1 : CATCH_REQUIRE(rcv.has_parameter("void")); 336 1 : 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 1 : CATCH_REQUIRE_FALSE(rcv.has_parameter("name")); 347 1 : 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 1 : CATCH_REQUIRE(rcv.has_parameter("name")); 358 1 : CATCH_REQUIRE(rcv.get_parameter("name") == "Charles"); 359 : 360 1 : CATCH_REQUIRE(rcv.has_parameter("length")); 361 1 : CATCH_REQUIRE(rcv.get_parameter("length") == "-35"); 362 1 : CATCH_REQUIRE(rcv.get_integer_parameter("length") == -35); 363 : 364 1 : CATCH_REQUIRE(rcv.has_parameter("range")); 365 1 : CATCH_REQUIRE(rcv.get_parameter("range") == "101"); // we lose the '+' sign in JSON 366 1 : CATCH_REQUIRE(rcv.get_integer_parameter("range") == 101); 367 : 368 1 : CATCH_REQUIRE(rcv.has_parameter("valid")); 369 1 : CATCH_REQUIRE(rcv.get_parameter("valid") == "true"); 370 : 371 1 : CATCH_REQUIRE(rcv.has_parameter("correct")); 372 1 : CATCH_REQUIRE(rcv.get_parameter("correct") == "false"); 373 : 374 1 : CATCH_REQUIRE(rcv.has_parameter("void")); 375 1 : 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