mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-04-19 06:30:46 -04:00
Gui and Eink services refactor. Displaying frames performance optimization. Critical resources management.
54 lines
1.6 KiB
C++
54 lines
1.6 KiB
C++
// 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));
|
|
}
|
|
}
|