1
0
Fork 0
mirror of https://gitlab.com/niansa/libcrosscoro.git synced 2025-03-06 20:53:32 +01:00
libcrosscoro/test/test_latch.cpp
Josh Baldwin 80fea9c49a
io_scheduler uses thread pool to schedule work (#42)
* io_scheduler uses thread pool to schedule work

fixes #41

* use task_container in bench tcp server test

* adjust benchmark for github actions CI

* fix io_scheduler tests cross thread memory boundaries

* more memory barriers

* sprinkle some shutdowns in there

* update readme
2021-01-24 19:34:39 -07:00

100 lines
2.1 KiB
C++

#include "catch.hpp"
#include <coro/coro.hpp>
#include <chrono>
#include <thread>
TEST_CASE("latch count=0", "[latch]")
{
coro::latch l{0};
auto task = [&]() -> coro::task<uint64_t> {
co_await l;
co_return 42;
}();
task.resume();
REQUIRE(task.is_ready()); // The latch never waits due to zero count.
REQUIRE(task.promise().return_value() == 42);
}
TEST_CASE("latch count=1", "[latch]")
{
coro::latch l{1};
auto task = [&]() -> coro::task<uint64_t> {
auto workers = l.remaining();
co_await l;
co_return workers;
}();
task.resume();
REQUIRE_FALSE(task.is_ready());
l.count_down();
REQUIRE(task.is_ready());
REQUIRE(task.promise().return_value() == 1);
}
TEST_CASE("latch count=1 count_down=5", "[latch]")
{
coro::latch l{1};
auto task = [&]() -> coro::task<uint64_t> {
auto workers = l.remaining();
co_await l;
co_return workers;
}();
task.resume();
REQUIRE_FALSE(task.is_ready());
l.count_down(5);
REQUIRE(task.is_ready());
REQUIRE(task.promise().return_value() == 1);
}
TEST_CASE("latch count=5 count_down=1 x5", "[latch]")
{
coro::latch l{5};
auto task = [&]() -> coro::task<uint64_t> {
auto workers = l.remaining();
co_await l;
co_return workers;
}();
task.resume();
REQUIRE_FALSE(task.is_ready());
l.count_down(1);
REQUIRE_FALSE(task.is_ready());
l.count_down(1);
REQUIRE_FALSE(task.is_ready());
l.count_down(1);
REQUIRE_FALSE(task.is_ready());
l.count_down(1);
REQUIRE_FALSE(task.is_ready());
l.count_down(1);
REQUIRE(task.is_ready());
REQUIRE(task.promise().return_value() == 5);
}
TEST_CASE("latch count=5 count_down=5", "[latch]")
{
coro::latch l{5};
auto task = [&]() -> coro::task<uint64_t> {
auto workers = l.remaining();
co_await l;
co_return workers;
}();
task.resume();
REQUIRE_FALSE(task.is_ready());
l.count_down(5);
REQUIRE(task.is_ready());
REQUIRE(task.promise().return_value() == 5);
}