~aleteoryx/muditaos

ref: sign_test muditaos/module-services/service-gui/tests/test-ContextPool.cpp -rw-r--r-- 1.6 KiB
a217eeb3 — Dawid Wojtas [BH-2024] Fix lack of alarm directory after updating software 1 year, 5 months 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
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <catch2/catch.hpp>

#include "ContextPool.hpp"
#include "MockedSynchronizationMechanism.hpp"

#include <chrono>
#include <thread>

using namespace service::gui;

TEST_CASE("ContextPoolTests")
{
    const ::gui::Size displaySize{1, 1};
    constexpr auto ContextPoolCapacity = 1;
    constexpr auto ContextPoolFirstId  = 0;
    ContextPool contextPool{displaySize, ContextPoolCapacity, std::make_unique<MockedSynchronizationMechanism>()};
    REQUIRE(!contextPool.isAnyContextLocked());

    SECTION("Borrow context when all are used")
    {
        const auto [contextId, context] = contextPool.borrowContext();
        REQUIRE(contextId == ContextPoolFirstId);
        REQUIRE(contextPool.isAnyContextLocked());

        std::thread thr{[&contextPool, id = contextId]() {
            std::this_thread::sleep_for(std::chrono::milliseconds{500});
            contextPool.returnContext(id);
        }};
        const auto [nextContextId, nextContext] = contextPool.borrowContext();
        REQUIRE(contextId == nextContextId);

        if (thr.joinable()) {
            thr.join();
        }
        contextPool.returnContext(nextContextId);
        REQUIRE(!contextPool.isAnyContextLocked());
    }

    SECTION("Return unused context")
    {
        REQUIRE(!contextPool.isAnyContextLocked());
        REQUIRE_NOTHROW(contextPool.returnContext(0));
    }

    SECTION("Return invalid context id")
    {
        REQUIRE(!contextPool.isAnyContextLocked());
        REQUIRE_NOTHROW(contextPool.returnContext(10));
    }
}