@@ -14,6 +14,7 @@
|
||||
#include <boost/asio/redirect_error.hpp>
|
||||
#include <boost/asio/steady_timer.hpp>
|
||||
#include <boost/asio/use_awaitable.hpp>
|
||||
#include <boost/asio/thread_pool.hpp>
|
||||
|
||||
#include <vamp_zero/errors.hpp>
|
||||
#include <vamp_zero/score_loader.hpp>
|
||||
@@ -93,6 +94,38 @@ BOOST_AUTO_TEST_CASE(score_loader_starts_asynchronously_from_executor_handler) {
|
||||
BOOST_CHECK_EQUAL(*fixture.completions, 1U);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(score_loader_worker_keeps_control_executor_responsive_and_returns_completion) {
|
||||
auto io = boost::asio::io_context{};
|
||||
auto worker = boost::asio::thread_pool{1};
|
||||
auto entered = std::promise<void>{};
|
||||
auto release = std::promise<void>{};
|
||||
auto resume = release.get_future().share();
|
||||
auto completed = false;
|
||||
auto control_thread = std::this_thread::get_id();
|
||||
auto loader = vamp_zero::score_loader{io.get_executor(),
|
||||
[&entered, resume](vamp_zero::score_reference reference) -> boost::asio::awaitable<std::expected<vamp_zero::score_document, modulus::error>> {
|
||||
entered.set_value();
|
||||
resume.wait();
|
||||
co_return vamp_zero::score_document{.id = reference.id};
|
||||
},
|
||||
[&] { completed = true; BOOST_CHECK(std::this_thread::get_id() == control_thread); }, worker.get_executor()};
|
||||
loader.select(std::make_shared<vamp_zero::catalog>(), performance("a"));
|
||||
auto started = entered.get_future().wait_for(std::chrono::seconds{2}) == std::future_status::ready;
|
||||
auto serviced = false;
|
||||
boost::asio::post(io, [&] { serviced = true; });
|
||||
io.poll();
|
||||
BOOST_CHECK(serviced);
|
||||
BOOST_CHECK(!completed);
|
||||
release.set_value();
|
||||
worker.join();
|
||||
io.restart();
|
||||
io.run();
|
||||
BOOST_REQUIRE(started);
|
||||
BOOST_CHECK(completed);
|
||||
BOOST_REQUIRE(loader.snapshot().document);
|
||||
BOOST_CHECK_EQUAL(loader.snapshot().document->id, "a");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(score_loader_coalesces_pending_and_discards_stale_results) {
|
||||
auto fixture = loader_fixture{};
|
||||
fixture.loader.select(fixture.catalog, performance("a"));
|
||||
|
||||
Reference in New Issue
Block a user