Projekt

Obecné

Profil

Stáhnout (5.39 KB) Statistiky
| Větev: | Tag: | Revize:
1 c137512e Oto Šťáva
#include "QtTestUtil/QtTestUtil.h"
2
#include "QsLog.h"
3
#include "QsLogDest.h"
4
#include <QHash>
5
#include <QSharedPointer>
6
#include <QtGlobal>
7
8
// A destination that tracks log messages
9
class MockDestination : public QsLogging::Destination
10
{
11
public:
12
    virtual void write(const QString &message, QsLogging::Level level)
13
    {
14
        Message m;
15
        m.text = message;
16
        m.level = level;
17
        mMessages.push_back(m);
18
        ++mCountByLevel[level];
19
    }
20
21
    virtual bool isValid()
22
    {
23
        return true;
24
    }
25
26
    struct Message
27
    {
28
        Message() : level(QsLogging::TraceLevel) {}
29
        QString text;
30
        QsLogging::Level level;
31
    };
32
33
    void clear()
34
    {
35
        mMessages.clear();
36
        mCountByLevel.clear();
37
    }
38
39
    int messageCount() const
40
    {
41
        return mMessages.count();
42
    }
43
44
    int messageCountForLevel(QsLogging::Level level) const
45
    {
46
        return mCountByLevel.value(level);
47
    }
48
49
    bool hasMessage(const QString &messageContent, QsLogging::Level level) const
50
    {
51
        Q_FOREACH (const Message &m, mMessages) {
52
            if (m.level == level && m.text.contains(messageContent))
53
                return true;
54
        }
55
56
        return false;
57
    }
58
59
    const Message& messageAt(int index)
60
    {
61
        Q_ASSERT(index >= 0 && index < messageCount());
62
        return mMessages.at(index);
63
    }
64
65
private:
66
    QHash<QsLogging::Level,int> mCountByLevel;
67
    QList<Message> mMessages;
68
};
69
70
// Autotests for QsLog
71
class TestLog : public QObject
72
{
73
    Q_OBJECT
74
public:
75
    TestLog()
76
        : mockDest1(new MockDestination)
77
        , mockDest2(new MockDestination)
78
    {
79
    }
80
81
private slots:
82
    void initTestCase();
83
    void testAllLevels();
84
    void testMessageText();
85
    void testLevelChanges();
86
    void testLevelParsing();
87
    void cleanupTestCase();
88
89
private:
90
    QSharedPointer<MockDestination> mockDest1;
91
    QSharedPointer<MockDestination> mockDest2;
92
};
93
94
void TestLog::initTestCase()
95
{
96
    using namespace QsLogging;
97
    QCOMPARE(Logger::instance().loggingLevel(), InfoLevel);
98
    Logger::instance().setLoggingLevel(TraceLevel);
99
    QCOMPARE(Logger::instance().loggingLevel(), TraceLevel);
100
    Logger::instance().addDestination(mockDest1);
101
    Logger::instance().addDestination(mockDest2);
102
}
103
104
void TestLog::testAllLevels()
105
{
106
    mockDest1->clear();
107
    mockDest2->clear();
108
109
    QLOG_TRACE() << "trace level";
110
    QLOG_DEBUG() << "debug level";
111
    QLOG_INFO() << "info level";
112
    QLOG_WARN() << "warn level";
113
    QLOG_ERROR() << "error level";
114
    QLOG_FATAL() << "fatal level";
115
116
    using namespace QsLogging;
117
    QCOMPARE(mockDest1->messageCount(), 6);
118
    QCOMPARE(mockDest1->messageCountForLevel(TraceLevel), 1);
119
    QCOMPARE(mockDest1->messageCountForLevel(DebugLevel), 1);
120
    QCOMPARE(mockDest1->messageCountForLevel(InfoLevel), 1);
121
    QCOMPARE(mockDest1->messageCountForLevel(WarnLevel), 1);
122
    QCOMPARE(mockDest1->messageCountForLevel(ErrorLevel), 1);
123
    QCOMPARE(mockDest1->messageCountForLevel(FatalLevel), 1);
124
    QCOMPARE(mockDest2->messageCount(), 6);
125
    QCOMPARE(mockDest2->messageCountForLevel(TraceLevel), 1);
126
    QCOMPARE(mockDest2->messageCountForLevel(DebugLevel), 1);
127
    QCOMPARE(mockDest2->messageCountForLevel(InfoLevel), 1);
128
    QCOMPARE(mockDest2->messageCountForLevel(WarnLevel), 1);
129
    QCOMPARE(mockDest2->messageCountForLevel(ErrorLevel), 1);
130
    QCOMPARE(mockDest2->messageCountForLevel(FatalLevel), 1);
131
}
132
133
void TestLog::testMessageText()
134
{
135
    mockDest1->clear();
136
137
    QLOG_DEBUG() << "foobar";
138
    QLOG_WARN() << "eiszeit";
139
    QLOG_FATAL() << "ruh-roh!";
140
    using namespace QsLogging;
141
    QVERIFY(mockDest1->hasMessage("foobar", DebugLevel));
142
    QVERIFY(mockDest1->hasMessage("eiszeit", WarnLevel));
143
    QVERIFY(mockDest1->hasMessage("ruh-roh!", FatalLevel));
144
    QCOMPARE(mockDest1->messageCount(), 3);
145
}
146
147
void TestLog::testLevelChanges()
148
{
149
    mockDest1->clear();
150
    mockDest2->clear();
151
152
    using namespace QsLogging;
153
    Logger::instance().setLoggingLevel(WarnLevel);
154
    QCOMPARE(Logger::instance().loggingLevel(), WarnLevel);
155
156
    QLOG_TRACE() << "one";
157
    QLOG_DEBUG() << "two";
158
    QLOG_INFO() << "three";
159
    QCOMPARE(mockDest1->messageCount(), 0);
160
    QCOMPARE(mockDest2->messageCount(), 0);
161
162
    QLOG_WARN() << "warning";
163
    QLOG_ERROR() << "error";
164
    QLOG_FATAL() << "fatal";
165
    QCOMPARE(mockDest1->messageCountForLevel(WarnLevel), 1);
166
    QCOMPARE(mockDest1->messageCountForLevel(ErrorLevel), 1);
167
    QCOMPARE(mockDest1->messageCountForLevel(FatalLevel), 1);
168
    QCOMPARE(mockDest1->messageCount(), 3);
169
    QCOMPARE(mockDest2->messageCountForLevel(WarnLevel), 1);
170
    QCOMPARE(mockDest2->messageCountForLevel(ErrorLevel), 1);
171
    QCOMPARE(mockDest2->messageCountForLevel(FatalLevel), 1);
172
    QCOMPARE(mockDest2->messageCount(), 3);
173
}
174
175
void TestLog::testLevelParsing()
176
{
177
    mockDest1->clear();
178
179
    QLOG_TRACE() << "one";
180
    QLOG_DEBUG() << "two";
181
    QLOG_INFO() << "three";
182
    QLOG_WARN() << "warning";
183
    QLOG_ERROR() << "error";
184
    QLOG_FATAL() << "fatal";
185
186
    using namespace QsLogging;
187
    for(int i = 0;i < mockDest1->messageCount();++i) {
188
        bool conversionOk = false;
189
        const MockDestination::Message& m = mockDest1->messageAt(i);
190
        QCOMPARE(Logger::levelFromLogMessage(m.text, &conversionOk), m.level);
191
        QCOMPARE(Logger::levelFromLogMessage(m.text), m.level);
192
        QCOMPARE(conversionOk, true);
193
    }
194
}
195
196
void TestLog::cleanupTestCase()
197
{
198
    QsLogging::Logger::destroyInstance();
199
}
200
201
QTTESTUTIL_REGISTER_TEST(TestLog);
202
#include "TestLog.moc"