Files
Renderive/render_3D/tests/Gpu_Completion_Service_Tests.cpp
T
2026-08-16 17:53:46 +08:00

46 lines
1.9 KiB
C++

#include "render_3D/detail/Gpu_Completion_Service.h"
#include <gtest/gtest.h>
#include <atomic>
#include <chrono>
#include <thread>
#include <utility>
namespace renderive::render_3d::detail {
namespace {
TEST(GpuCompletionService, UsesOneProcessWideService) {
EXPECT_EQ(&Gpu_Completion_Service::instance(), &Gpu_Completion_Service::instance());
}
TEST(GpuCompletionService, AbandonedReservationDoesNotComplete) {
std::atomic<int> completion_count{};
{
auto prepared = Gpu_Completion_Service::instance().prepare(
[&](Gpu_Completion_Service::Result) {
completion_count.fetch_add(1, std::memory_order_relaxed);
}, [](std::exception_ptr) {}, false);
ASSERT_TRUE(prepared);
}
EXPECT_EQ(completion_count.load(std::memory_order_relaxed), 0);
}
TEST(GpuCompletionService, CanceledReservationWakesIdleService) {
auto& service = Gpu_Completion_Service::instance();
const auto previous_deadline =
std::chrono::steady_clock::now() + std::chrono::milliseconds(100);
while (service.statistics().in_flight != 0 &&
std::chrono::steady_clock::now() < previous_deadline)
std::this_thread::sleep_for(std::chrono::milliseconds(1));
const auto baseline = service.statistics().in_flight;
ASSERT_EQ(baseline, 0U);
{
auto prepared = service.prepare([](Gpu_Completion_Service::Result) {},
[](std::exception_ptr) {}, false);
ASSERT_TRUE(prepared);
EXPECT_EQ(service.statistics().in_flight, baseline + 1);
}
const auto deadline = std::chrono::steady_clock::now() + std::chrono::milliseconds(100);
while (service.statistics().in_flight != baseline &&
std::chrono::steady_clock::now() < deadline)
std::this_thread::sleep_for(std::chrono::milliseconds(1));
EXPECT_EQ(service.statistics().in_flight, baseline);
}
}
}