~aleteoryx/muditaos

ref: 8109062f8dc3db5d7151bd73e88f8f0398e14e50 muditaos/module-utils/log/tests/test_LoggerBuffer.cpp -rw-r--r-- 7.1 KiB
8109062f — rrandomsky [MOS-723] Fix for french translation for SIM cards 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <catch2/catch.hpp>

#include "RandomStringGenerator.hpp"
#include "LoggerBuffer.hpp"
#include <string>
#include <vector>

using namespace std;

void TestBuffer(const LoggerBuffer &buffer, size_t capacity, size_t numOfMsgs)
{
    const bool isEmpty = buffer.isEmpty();
    REQUIRE((numOfMsgs == 0 ? isEmpty : !isEmpty));
    const bool isFull = buffer.isFull();
    REQUIRE((capacity > 0 && capacity == numOfMsgs ? isFull : !isFull));
    REQUIRE(buffer.getCapacity() == capacity);
    REQUIRE(buffer.getSize() == numOfMsgs);
}

size_t GetNumOfBytes(vector<string>::const_iterator startIt, vector<string>::const_iterator endIt)
{
    size_t numOfBytes = 0;
    for (; startIt != endIt; ++startIt) {
        numOfBytes += startIt->length();
    }
    return numOfBytes;
}

TEST_CASE("LoggerBuffer tests")
{
    const size_t capacity = 100;
    LoggerBuffer buffer(capacity);

    RandomStringGenerator randomStringGenerator;

    auto putMsgFunc = [&](const auto &msg) { buffer.put(msg); };
    auto getMsgFunc = [&](const auto &originalMsg) {
        const auto [result, msg] = buffer.get();
        REQUIRE(result);
        REQUIRE(msg == originalMsg);
    };
    auto putAllMsgsFunc = [&](const vector<string> &msgs) { for_each(msgs.begin(), msgs.end(), putMsgFunc); };
    auto getAllMsgsFunc = [&](const vector<string> &msgs) { for_each(msgs.begin(), msgs.end(), getMsgFunc); };
    auto checkLostBytes = [&](size_t numOfBytes, const string &originalMsg) {
        const auto [result, msg] = buffer.get();
        REQUIRE(result);
        REQUIRE(msg.find(originalMsg) != string::npos);
        REQUIRE(msg.find(to_string(numOfBytes)) != string::npos);
        REQUIRE(msg.find(LoggerBuffer::lostBytesMessage) != string::npos);
    };

    SECTION("calling get on empty buffer should return false")
    {
        const auto [result, _] = buffer.get();
        REQUIRE(!result);
        TestBuffer(buffer, capacity, 0);
    }

    SECTION("after putting one msg in buffer, get should return this msg")
    {
        const string originalMsg = randomStringGenerator.getRandomString();
        buffer.put(originalMsg);
        TestBuffer(buffer, capacity, 1);
        const auto [result, msg] = buffer.get();
        REQUIRE(result);
        REQUIRE(msg == originalMsg);
        TestBuffer(buffer, capacity, 0);
    }

    SECTION("after filling whole buffer with msgs, caliling get repeatedly should return all these msgs back")
    {
        const auto msgs = randomStringGenerator.createRandomStringVector(capacity);
        putAllMsgsFunc(msgs);
        TestBuffer(buffer, capacity, msgs.size());
        getAllMsgsFunc(msgs);
        TestBuffer(buffer, capacity, 0);
    }

    SECTION("buffer should be empty after resetting it")
    {
        const auto msgs = randomStringGenerator.createRandomStringVector(capacity);
        putAllMsgsFunc(msgs);
        TestBuffer(buffer, capacity, msgs.size());
        buffer.reset();
        TestBuffer(buffer, capacity, 0);
    }

    SECTION("when more msgs are put into buffer than its capacity, only last msgs should be returned with get and "
            "first msg should contain lost bytes message")
    {
        const size_t numOfMsgsAboveCapacity = 13;
        const auto msgs = randomStringGenerator.createRandomStringVector(capacity + numOfMsgsAboveCapacity);
        putAllMsgsFunc(msgs);
        auto firstLostMsgIt       = msgs.begin();
        auto firstMsgInBufferIt   = firstLostMsgIt + numOfMsgsAboveCapacity;
        const auto numOfLostBytes = GetNumOfBytes(firstLostMsgIt, firstMsgInBufferIt);
        checkLostBytes(numOfLostBytes, *firstMsgInBufferIt);
        for_each(firstMsgInBufferIt + 1, msgs.end(), getMsgFunc);
        TestBuffer(buffer, capacity, 0);
    }

    SECTION("each get should reduce number of msgs in buffer")
    {
        size_t numOfMsgsInBuffer = capacity;
        const auto msgs          = randomStringGenerator.createRandomStringVector(capacity);

        auto getStartIt = msgs.begin();

        putAllMsgsFunc(msgs);
        TestBuffer(buffer, capacity, capacity);

        size_t numOfMsgsToGet = 15;
        for_each(getStartIt, getStartIt + numOfMsgsToGet, getMsgFunc);
        numOfMsgsInBuffer -= numOfMsgsToGet;
        TestBuffer(buffer, capacity, numOfMsgsInBuffer);
        getStartIt += numOfMsgsToGet;

        numOfMsgsToGet = 34;
        for_each(getStartIt, getStartIt + numOfMsgsToGet, getMsgFunc);
        numOfMsgsInBuffer -= numOfMsgsToGet;
        TestBuffer(buffer, capacity, numOfMsgsInBuffer);
        getStartIt += numOfMsgsToGet;

        for_each(getStartIt, msgs.end(), getMsgFunc);
        TestBuffer(buffer, capacity, 0);
    }

    SECTION("put get put get")
    {
        const auto msgs = randomStringGenerator.createRandomStringVector(capacity);

        auto putStartIt = msgs.begin();
        auto getStartIt = msgs.begin();

        size_t numOfMsgsToPut = 37;
        for_each(putStartIt, putStartIt + numOfMsgsToPut, putMsgFunc);
        putStartIt += numOfMsgsToPut;
        size_t numOfMsgsInBuffer = numOfMsgsToPut;
        TestBuffer(buffer, capacity, numOfMsgsInBuffer);

        size_t numOfMsgsToGet = 25;
        for_each(getStartIt, getStartIt + numOfMsgsToGet, getMsgFunc);
        getStartIt += numOfMsgsToGet;
        numOfMsgsInBuffer -= numOfMsgsToGet;
        TestBuffer(buffer, capacity, numOfMsgsInBuffer);

        numOfMsgsToPut = msgs.end() - putStartIt;
        for_each(putStartIt, msgs.end(), putMsgFunc);
        numOfMsgsInBuffer += numOfMsgsToPut;
        TestBuffer(buffer, capacity, numOfMsgsInBuffer);

        for_each(getStartIt, msgs.end(), getMsgFunc);
        TestBuffer(buffer, capacity, 0);
    }

    SECTION("put get put get - with buffer overflow")
    {
        const size_t numOfMsgsAboveCapacity = 43;
        const auto msgs = randomStringGenerator.createRandomStringVector(capacity + numOfMsgsAboveCapacity);

        auto putStartIt = msgs.begin();
        auto getStartIt = msgs.begin();

        size_t numOfMsgsToPut = 77;
        for_each(putStartIt, putStartIt + numOfMsgsToPut, putMsgFunc);
        putStartIt += numOfMsgsToPut;
        size_t numOfMsgsInBuffer = numOfMsgsToPut;
        TestBuffer(buffer, capacity, numOfMsgsInBuffer);

        size_t numOfMsgsToGet = 15;
        for_each(getStartIt, getStartIt + numOfMsgsToGet, getMsgFunc);
        getStartIt += numOfMsgsToGet;
        numOfMsgsInBuffer -= numOfMsgsToGet;
        TestBuffer(buffer, capacity, numOfMsgsInBuffer);

        numOfMsgsToPut = msgs.end() - putStartIt; // put rest of msgs - more than buffer can hold
        for_each(putStartIt, msgs.end(), putMsgFunc);
        numOfMsgsInBuffer = capacity;
        TestBuffer(buffer, capacity, numOfMsgsInBuffer);

        auto firstLostMsgIt       = getStartIt;
        auto firstMsgInBufferIt   = firstLostMsgIt + numOfMsgsAboveCapacity - numOfMsgsToGet;
        const auto numOfLostBytes = GetNumOfBytes(firstLostMsgIt, firstMsgInBufferIt);
        checkLostBytes(numOfLostBytes, *firstMsgInBufferIt);
        for_each(firstMsgInBufferIt + 1, msgs.end(), getMsgFunc);
        TestBuffer(buffer, capacity, 0);
    }
}