[Base] Add more tests for HighResolutionTimer
This commit is contained in:
parent
dbbcd46711
commit
a85fc25040
|
@ -241,8 +241,63 @@ TEST_CASE("HighResolutionTimer") {
|
||||||
REQUIRE(counter2 <= ratio2 + 1);
|
REQUIRE(counter2 <= ratio2 + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(bwrsandman): Check on which thread callbacks are executed when
|
// Test many timers
|
||||||
// spawned from differing threads
|
{
|
||||||
|
const auto interval = 50ms;
|
||||||
|
const size_t timer_count = 128;
|
||||||
|
std::atomic<uint64_t> counter(0);
|
||||||
|
auto cb = [&counter, &timer_thread] {
|
||||||
|
++counter;
|
||||||
|
REQUIRE(Thread::GetCurrentThread() == timer_thread);
|
||||||
|
};
|
||||||
|
std::vector<std::unique_ptr<HighResolutionTimer>> timers;
|
||||||
|
auto start = std::chrono::steady_clock::now();
|
||||||
|
for (size_t i = 0; i < timer_count; i++) {
|
||||||
|
timers.emplace_back(HighResolutionTimer::CreateRepeating(interval, cb));
|
||||||
|
}
|
||||||
|
Sleep(wait_time);
|
||||||
|
timers.clear();
|
||||||
|
auto duration = std::chrono::steady_clock::now() - start;
|
||||||
|
|
||||||
|
REQUIRE(duration.count() >= wait_time.count());
|
||||||
|
auto ratio = static_cast<uint64_t>(timer_count * duration / interval);
|
||||||
|
REQUIRE(counter >= ratio - timer_count);
|
||||||
|
REQUIRE(counter <= ratio + timer_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check timer order
|
||||||
|
{
|
||||||
|
constexpr size_t timer_count = 16;
|
||||||
|
using pair_t = std::pair<std::atomic<uint64_t>,
|
||||||
|
std::chrono::high_resolution_clock::time_point>;
|
||||||
|
std::array<pair_t, timer_count> time_points{};
|
||||||
|
auto start = std::chrono::steady_clock::now();
|
||||||
|
auto gen_callback = [&timer_thread, &time_points](size_t i) {
|
||||||
|
return [&timer_thread, &time_points, i]() {
|
||||||
|
auto& pair = time_points[i];
|
||||||
|
if (pair.first.fetch_add(1) == 1) {
|
||||||
|
pair.second = std::chrono::high_resolution_clock::now();
|
||||||
|
pair.first++;
|
||||||
|
}
|
||||||
|
REQUIRE(Thread::GetCurrentThread() == timer_thread);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
std::vector<std::unique_ptr<HighResolutionTimer>> timers;
|
||||||
|
for (size_t i = 0; i < timer_count; i++) {
|
||||||
|
timers.emplace_back(HighResolutionTimer::CreateRepeating(
|
||||||
|
10ms * (timer_count - i), gen_callback(timer_count - i - 1)));
|
||||||
|
}
|
||||||
|
REQUIRE(spin_wait_for(2s, [&] {
|
||||||
|
return std::all_of(time_points.cbegin(), time_points.cend(),
|
||||||
|
[](auto& pair) { return pair.first >= 3; });
|
||||||
|
}));
|
||||||
|
|
||||||
|
timers.clear();
|
||||||
|
|
||||||
|
REQUIRE(std::is_sorted(
|
||||||
|
time_points.cbegin(), time_points.cend(),
|
||||||
|
[](auto& left, auto& right) { return left.second < right.second; }));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Wait on Multiple Handles", "[wait]") {
|
TEST_CASE("Wait on Multiple Handles", "[wait]") {
|
||||||
|
|
Loading…
Reference in New Issue