Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright (c) 2015, Intel Corporation
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without modification,
      6  * are permitted provided that the following conditions are met:
      7  *
      8  * 1. Redistributions of source code must retain the above copyright notice, this
      9  * list of conditions and the following disclaimer.
     10  *
     11  * 2. Redistributions in binary form must reproduce the above copyright notice,
     12  * this list of conditions and the following disclaimer in the documentation and/or
     13  * other materials provided with the distribution.
     14  *
     15  * 3. Neither the name of the copyright holder nor the names of its contributors
     16  * may be used to endorse or promote products derived from this software without
     17  * specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
     23  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     26  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 #include <ParameterMgrFullConnector.h>
     31 #include <vector>
     32 #include <utility>
     33 #include <string>
     34 #include <algorithm>
     35 #include <sstream>
     36 #include <iterator>
     37 
     38 namespace parameterFramework
     39 {
     40 
     41 /** Logger that stores all fed log in order retrieve them asynchronously.
     42  *  Compatible with the ParameterFramework::Ilogger api.
     43  *  Usually used in tests to inspect what was logged by a PF instances
     44  *  (eg: test if a warring occurred).
     45  */
     46 class StoreLogger : public CParameterMgrFullConnector::ILogger
     47 {
     48 public:
     49     struct Log
     50     {
     51         enum class Level
     52         {
     53             info,
     54             warning
     55         };
     56         Level level;
     57         std::string msg;
     58         bool operator==(const Log &other) const
     59         {
     60             return level == other.level and msg == other.msg;
     61         }
     62     };
     63     using Logs = std::vector<Log>;
     64 
     65     void warning(const std::string &strLog) override
     66     {
     67         logs.push_back({Log::Level::warning, strLog});
     68     }
     69     void info(const std::string &strLog) override { logs.push_back({Log::Level::info, strLog}); }
     70 
     71     const Logs &getLogs() const { return logs; }
     72 
     73     const Logs filter(Log::Level level) const
     74     {
     75         return filter([&level](const Log &log) { return log.level == level; });
     76     };
     77 
     78     Logs match(const std::string &pattern) const
     79     {
     80         return filter(
     81             [&pattern](const Log &log) { return log.msg.find(pattern) == std::string::npos; });
     82     }
     83 
     84 private:
     85     template <class Predicate>
     86     Logs filter(Predicate predicate) const
     87     {
     88         Logs filtered;
     89         std::copy_if(logs.begin(), logs.end(), std::back_inserter(filtered), predicate);
     90         return filtered;
     91     }
     92 
     93     Logs logs;
     94 };
     95 
     96 /** Overload input stream operator to pretty print a StoreLogger::Log::Level. */
     97 std::ostream &operator<<(std::ostream &os, const StoreLogger::Log::Level &level)
     98 {
     99     auto levelStr = "UNREACHABLE";
    100     using L = StoreLogger::Log::Level;
    101     switch (level) {
    102     case L::info:
    103         levelStr = "Info";
    104         break;
    105     case L::warning:
    106         levelStr = "Warn";
    107         break;
    108     }
    109     return os << levelStr << ": ";
    110 }
    111 
    112 /** Overload input stream operator to pretty print a StoreLogger::Log. */
    113 std::ostream &operator<<(std::ostream &os, const StoreLogger::Log &log)
    114 {
    115     return os << log.level << log.msg << std::endl;
    116 }
    117 
    118 } // parameterFramework
    119