// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include #include "ContextPool.hpp" #include "MockedSynchronizationMechanism.hpp" #include #include 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()}; 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)); } }