#include "render_3D/detail/Gpu_Completion_Service.h" #include #include #include #include #include namespace renderive::render_3d::detail { namespace { TEST(GpuCompletionService, UsesOneProcessWideService) { EXPECT_EQ(&Gpu_Completion_Service::instance(), &Gpu_Completion_Service::instance()); } TEST(GpuCompletionService, AbandonedReservationDoesNotComplete) { std::atomic 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); } } }