osrm-backend/third_party/libosmium/test/t/thread/test_pool.cpp
2015-03-04 12:50:42 +01:00

70 lines
1.5 KiB
C++

#include "catch.hpp"
#include <chrono>
#include <stdexcept>
#include <thread>
#include <osmium/thread/pool.hpp>
static std::atomic<int> result;
struct test_job_ok {
void operator()() const {
result = 1;
}
};
struct test_job_with_result {
int operator()() const {
return 42;
}
};
struct test_job_throw {
void operator()() const {
throw std::runtime_error("exception in pool thread");
}
};
TEST_CASE("thread") {
SECTION("can get access to thread pool") {
auto& pool = osmium::thread::Pool::instance();
REQUIRE(pool.queue_empty());
}
SECTION("can send job to thread pool") {
auto& pool = osmium::thread::Pool::instance();
result = 0;
auto future = pool.submit(test_job_ok{});
// wait a bit for the other thread to get a chance to run
std::this_thread::sleep_for(std::chrono::milliseconds(1));
REQUIRE(result == 1);
future.get();
REQUIRE(true);
}
SECTION("can send job to thread pool") {
auto& pool = osmium::thread::Pool::instance();
auto future = pool.submit(test_job_with_result{});
REQUIRE(future.get() == 42);
}
SECTION("can throw from job in thread pool") {
auto& pool = osmium::thread::Pool::instance();
result = 0;
bool got_exception = false;
auto future = pool.submit(test_job_throw{});
REQUIRE_THROWS_AS(future.get(), std::runtime_error);
}
}