diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 48bd810a6..4f146e62a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -22,6 +22,7 @@ foreach( tests_pacing tests_quatexpmap tests_rational + tests_worker ) add_executable(${testname} ${testname}.cpp) diff --git a/tests/tests_worker.cpp b/tests/tests_worker.cpp new file mode 100644 index 000000000..735700d74 --- /dev/null +++ b/tests/tests_worker.cpp @@ -0,0 +1,132 @@ +// Copyright 2022, Collabora, Ltd. +// SPDX-License-Identifier: BSL-1.0 +/*! + * @file + * @brief Thread pool tests. + * @author Ryan Pavlik + */ + +#include + +#include "catch/catch.hpp" + +#include +#include + +using namespace std::chrono_literals; + + +using namespace xrt::auxiliary::util; + +TEST_CASE("TaskCollection") +{ + SharedThreadPool pool{2, 3}; + bool calledA[] = { + false, + false, + false, + }; + + bool calledB[] = { + false, + false, + false, + }; + + std::vector funcsA = { + [&] { calledA[0] = true; }, + [&] { calledA[1] = true; }, + [&] { calledA[2] = true; }, + }; + + std::vector funcsB = { + [&] { calledB[0] = true; }, + [&] { calledB[1] = true; }, + [&] { calledB[2] = true; }, + }; + + SharedThreadGroup groupA{pool}; + SharedThreadGroup groupB{pool}; + + CHECK(!calledA[0]); + CHECK(!calledA[1]); + CHECK(!calledA[2]); + + TaskCollection collectionA{groupA, funcsA}; + + SECTION("Sequential wait") + { + collectionA.waitAll(); + CHECK(calledA[0]); + CHECK(calledA[1]); + CHECK(calledA[2]); + + CHECK(!calledB[0]); + CHECK(!calledB[1]); + CHECK(!calledB[2]); + + { + TaskCollection collectionB{groupB, funcsB}; + } + CHECK(calledB[0]); + CHECK(calledB[1]); + CHECK(calledB[2]); + } + + SECTION("Simultaneous dispatch, reversed wait") + { + CHECK(!calledB[0]); + CHECK(!calledB[1]); + CHECK(!calledB[2]); + + { + TaskCollection collectionB{groupB, funcsB}; + } + + CHECK(calledB[0]); + CHECK(calledB[1]); + CHECK(calledB[2]); + + collectionA.waitAll(); + CHECK(calledA[0]); + CHECK(calledA[1]); + CHECK(calledA[2]); + } + + + SECTION("Simultaneous dispatch, reversed wait") + { + CHECK(!calledB[0]); + CHECK(!calledB[1]); + CHECK(!calledB[2]); + + { + TaskCollection collectionB{ + groupB, + { + [&] { + std::this_thread::sleep_for(500ms); + calledB[0] = true; + }, + [&] { + std::this_thread::sleep_for(500ms); + calledB[1] = true; + }, + [&] { + std::this_thread::sleep_for(500ms); + calledB[2] = true; + }, + }, + }; + } + + CHECK(calledB[0]); + CHECK(calledB[1]); + CHECK(calledB[2]); + + collectionA.waitAll(); + CHECK(calledA[0]); + CHECK(calledA[1]); + CHECK(calledA[2]); + } +}