LCOV - code coverage report
Current view: top level - src/serialize - Serializer.cpp (source / functions) Hit Total Coverage
Test: ad_map_access Lines: 71 74 95.9 %
Date: 2022-10-04 09:48:07 Functions: 10 10 100.0 %
Branches: 64 100 64.0 %

           Branch data     Line data    Source code
       1                 :            : // ----------------- BEGIN LICENSE BLOCK ---------------------------------
       2                 :            : //
       3                 :            : // Copyright (C) 2018-2021 Intel Corporation
       4                 :            : //
       5                 :            : // SPDX-License-Identifier: MIT
       6                 :            : //
       7                 :            : // ----------------- END LICENSE BLOCK -----------------------------------
       8                 :            : 
       9                 :            : #include "ad/map/serialize/Serializer.hpp"
      10                 :            : #include "ad/map/access/Logging.hpp"
      11                 :            : 
      12                 :            : namespace ad {
      13                 :            : namespace map {
      14                 :            : namespace serialize {
      15                 :            : 
      16                 :            : ////////////
      17                 :            : // Constants
      18                 :            : 
      19                 :            : size_t Serializer::MAGIC = 0x03082018;
      20                 :            : size_t Serializer::VERSION_MAJOR = 0;
      21                 :            : size_t Serializer::VERSION_MINOR = 4;
      22                 :            : 
      23                 :            : /////////////////////////
      24                 :            : // Constructor/Destructor
      25                 :            : 
      26                 :        169 : Serializer::Serializer(bool store, bool calc_checksum)
      27                 :        169 :   : ISerializer(store)
      28                 :            : {
      29                 :        169 :   open_ = false;
      30                 :        169 :   calc_checksum_ = calc_checksum;
      31                 :        169 : }
      32                 :            : 
      33                 :        169 : Serializer::~Serializer()
      34                 :            : {
      35                 :        169 : }
      36                 :            : 
      37                 :            : /////////////
      38                 :            : // Operations
      39                 :            : 
      40                 :        171 : bool Serializer::open(std::string const &config, size_t &version_major, size_t &version_minor)
      41                 :            : {
      42         [ +  + ]:        171 :   if (isStoring())
      43                 :            :   {
      44                 :         12 :     version_major = VERSION_MAJOR;
      45                 :         12 :     version_minor = VERSION_MINOR;
      46                 :         12 :     return openForWrite(config);
      47                 :            :   }
      48                 :            :   else
      49                 :            :   {
      50                 :        159 :     return openForRead(config, version_major, version_minor);
      51                 :            :   }
      52                 :            : }
      53                 :            : 
      54                 :        170 : bool Serializer::close()
      55                 :            : {
      56         [ +  + ]:        170 :   if (open_)
      57                 :            :   {
      58         [ +  + ]:        168 :     if (isStoring())
      59                 :            :     {
      60                 :         12 :       return closeForWrite();
      61                 :            :     }
      62                 :            :     else
      63                 :            :     {
      64                 :        156 :       return closeForRead();
      65                 :            :     }
      66                 :            :   }
      67                 :            :   else
      68                 :            :   {
      69         [ +  - ]:          2 :     access::getLogger()->warn("Serializer: Attempt to close already closed stream.");
      70                 :          2 :     return false;
      71                 :            :   }
      72                 :            : }
      73                 :            : 
      74                 :            : //////////////
      75                 :            : // Aux Methods
      76                 :            : 
      77                 :        159 : bool Serializer::openForRead(std::string const &config, size_t &version_major, size_t &version_minor)
      78                 :            : {
      79         [ +  + ]:        159 :   if (doOpenForRead(config))
      80                 :            :   {
      81                 :        158 :     version_major = 0;
      82                 :        158 :     version_minor = 0;
      83                 :        158 :     size_t magic = 0;
      84         [ +  - ]:        158 :     initChecksum();
      85   [ +  -  +  +  :        158 :     if (ISerializer::serialize(magic) && ISerializer::serialize(version_major) && ISerializer::serialize(version_minor))
          +  -  +  -  +  
             -  +  -  +  
                      + ]
      86                 :            :     {
      87         [ +  - ]:        157 :       if (magic == MAGIC)
      88                 :            :       {
      89   [ +  +  +  - ]:        157 :         if (version_major == VERSION_MAJOR && version_minor == VERSION_MINOR)
      90                 :            :         {
      91                 :        156 :           open_ = true;
      92                 :        156 :           return true;
      93                 :            :         }
      94                 :            :         else
      95                 :            :         {
      96   [ +  -  +  - ]:          2 :           access::getLogger()->error(
      97                 :            :             "Serializer: Version mismatch: Expected {}, Found {}", VERSION_MAJOR, version_major);
      98         [ +  - ]:          1 :           throw std::runtime_error("Wrong map version!");
      99                 :            :         }
     100                 :            :       }
     101                 :            :       else
     102                 :            :       {
     103   [ #  #  #  # ]:          0 :         access::getLogger()->error("Serializer: Invalid stream {}", config);
     104                 :            :       }
     105                 :            :     }
     106                 :            :     else
     107                 :            :     {
     108   [ +  -  +  - ]:          2 :       access::getLogger()->error("Serializer: Invalid stream (too short) {}", config);
     109                 :            :     }
     110         [ +  - ]:          1 :     doCloseForRead();
     111                 :            :   }
     112                 :            :   else
     113                 :            :   {
     114         [ +  - ]:          2 :     access::getLogger()->error("Serializer: Cannot open stream for reading {}", config);
     115                 :            :   }
     116                 :          2 :   return false;
     117                 :            : }
     118                 :            : 
     119                 :         12 : bool Serializer::openForWrite(std::string const &config)
     120                 :            : {
     121         [ +  + ]:         12 :   if (doOpenForWrite(config))
     122                 :            :   {
     123                 :         11 :     initChecksum();
     124   [ +  -  +  -  :         11 :     if (ISerializer::serialize(MAGIC) && ISerializer::serialize(VERSION_MAJOR) && ISerializer::serialize(VERSION_MINOR))
             +  -  +  - ]
     125                 :            :     {
     126                 :         11 :       open_ = true;
     127                 :         11 :       return true;
     128                 :            :     }
     129                 :            :     else
     130                 :            :     {
     131         [ #  # ]:          0 :       access::getLogger()->error("Serializer: Cannot write header to steam {}", config);
     132                 :            :     }
     133                 :          0 :     doCloseForWrite();
     134                 :            :   }
     135                 :            :   else
     136                 :            :   {
     137         [ +  - ]:          2 :     access::getLogger()->error("Serializer: Cannot open stream for writing {}", config);
     138                 :            :   }
     139                 :          1 :   return false;
     140                 :            : }
     141                 :            : 
     142                 :        156 : bool Serializer::closeForRead()
     143                 :            : {
     144                 :        156 :   bool ret_val = false;
     145   [ +  -  +  +  :        156 :   if (!calc_checksum_ || checksumOK())
                   +  + ]
     146                 :            :   {
     147                 :        154 :     ret_val = true;
     148                 :            :   }
     149                 :            :   else
     150                 :            :   {
     151         [ +  - ]:          2 :     access::getLogger()->error("Serializer: Checksum mismatch!");
     152                 :            :   }
     153   [ +  +  +  + ]:        156 :   return doCloseForRead() && ret_val;
     154                 :            : }
     155                 :            : 
     156                 :         12 : bool Serializer::closeForWrite()
     157                 :            : {
     158                 :         12 :   bool ret_val = false;
     159   [ +  -  +  +  :         12 :   if (!calc_checksum_ || writeChecksum())
                   +  + ]
     160                 :            :   {
     161                 :         11 :     ret_val = true;
     162                 :            :   }
     163                 :            :   else
     164                 :            :   {
     165         [ +  - ]:          1 :     access::getLogger()->error("Serializer: Unable to write checksum.");
     166                 :            :   }
     167   [ +  +  +  - ]:         12 :   return doCloseForWrite() && ret_val;
     168                 :            : }
     169                 :            : 
     170                 :            : ////////////////////
     171                 :            : // Atomic Operations
     172                 :            : 
     173                 :     175867 : bool Serializer::write(const void *x, size_t bytes)
     174                 :            : {
     175         [ +  + ]:     175867 :   if (doWrite(x, bytes))
     176                 :            :   {
     177         [ +  - ]:     175866 :     if (calc_checksum_)
     178                 :            :     {
     179                 :     175866 :       updateChecksum(x, bytes);
     180                 :            :     }
     181                 :     175866 :     return true;
     182                 :            :   }
     183                 :            :   else
     184                 :            :   {
     185         [ +  - ]:          2 :     access::getLogger()->error("Serializer: Unable to write {} bytes", bytes);
     186                 :          1 :     return false;
     187                 :            :   }
     188                 :            : }
     189                 :            : 
     190                 :   10151200 : bool Serializer::read(void *x, size_t bytes)
     191                 :            : {
     192         [ +  + ]:   10151200 :   if (doRead(x, bytes))
     193                 :            :   {
     194         [ +  - ]:   10151200 :     if (calc_checksum_)
     195                 :            :     {
     196                 :   10151200 :       updateChecksum(x, bytes);
     197                 :            :     }
     198                 :   10151200 :     return true;
     199                 :            :   }
     200                 :            :   else
     201                 :            :   {
     202         [ +  - ]:          4 :     access::getLogger()->error("Serializer: Unable to read {} bytes", bytes);
     203                 :          2 :     return false;
     204                 :            :   }
     205                 :            : }
     206                 :            : 
     207                 :            : } // namespace serialize
     208                 :            : } // namespace map
     209                 :            : } // namespace ad

Generated by: LCOV version 1.14