LCOV - code coverage report
Current view: top level - tests - catch_message.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 226 226
Test Date: 2025-05-30 15:24:13 Functions: 100.0 % 1 1
Legend: Lines: hit not hit

            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
        

Generated by: LCOV version 2.0-1

Snap C++ | List of projects | List of versions