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
38namespace 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 */
46class StoreLogger : public CParameterMgrFullConnector::ILogger
47{
48public:
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
84private:
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. */
97std::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. */
113std::ostream &operator<<(std::ostream &os, const StoreLogger::Log &log)
114{
115    return os << log.level << log.msg << std::endl;
116}
117
118} // parameterFramework
119