From 50579f40c73bc8f382e40a3103561688e412e358 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Fri, 11 Sep 2026 20:05:41 +0200 Subject: [PATCH] test: extend coverage of testJobSystem --- tests/testJobSystem.cpp | 86 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/tests/testJobSystem.cpp b/tests/testJobSystem.cpp index d8512a5..2ebe3f4 100644 --- a/tests/testJobSystem.cpp +++ b/tests/testJobSystem.cpp @@ -313,3 +313,89 @@ VF_TEST(highPriorityJobsAreServedBeforeLowOnesOnOneWorker) { JobHandle normal = jobs.submit(record(2), JobPriority::Normal); JobHandle high = jobs.submit(record(1), JobPriority::High); + release.open(); + blocker.wait(); + low.wait(); + normal.wait(); + high.wait(); + jobs.waitAll(); + + CHECK_EQ(order.size(), static_cast(3)); + CHECK_EQ(order[0], 1); + CHECK_EQ(order[1], 2); + CHECK_EQ(order[2], 3); +} + +VF_TEST(statsCountExecutedJobsAndPeakOccupancy) { + JobSystem jobs(4); + JobBatch batch; + for (int i = 0; i < 120; ++i) batch.add(jobs.submit([] {})); + batch.wait(); + jobs.waitAll(); + + JobStats counted = jobs.stats(); + CHECK_EQ(counted.submitted, static_cast(120)); + CHECK_EQ(counted.executed, static_cast(120)); + CHECK_EQ(counted.queuePops, static_cast(120)); + CHECK_EQ(counted.failed, static_cast(0)); + CHECK(counted.peakBusyWorkers >= 1u); + CHECK(counted.peakBusyWorkers <= 4u); + CHECK(counted.peakQueueDepth >= 1u); + + jobs.resetStats(); + CHECK_EQ(jobs.stats().executed, static_cast(0)); +} + +VF_TEST(waitAllReturnsOnlyWithAnEmptyQueue) { + JobSystem jobs(4); + std::atomic done{0}; + for (int i = 0; i < 400; ++i) jobs.submit([&done] { done.fetch_add(1); }); + jobs.waitAll(); + CHECK_EQ(done.load(), 400); + CHECK_EQ(jobs.stats().executed, static_cast(400)); +} + +VF_TEST(destructorDrainsQueuedJobsWithoutHanging) { + std::atomic done{0}; + { + JobSystem jobs(4); + for (int i = 0; i < 500; ++i) jobs.submit([&done] { done.fetch_add(1); }); + } + CHECK_EQ(done.load(), 500); +} + +VF_TEST(jobsSubmittedFromInsideAJobStillGetDrained) { + for (unsigned threads : {0u, 3u}) { + JobSystem jobs(threads); + std::atomic leaves{0}; + for (int i = 0; i < 8; ++i) { + jobs.submit([&jobs, &leaves] { + for (int k = 0; k < 4; ++k) jobs.submit([&leaves] { leaves.fetch_add(1); }); + }); + } + jobs.waitAll(); + CHECK_EQ(leaves.load(), 32); + CHECK_EQ(jobs.stats().executed, static_cast(40)); + } +} + +VF_TEST(topologicalOrderIsAFunctionOfTheGraphAlone) { + JobGraph graph; + for (int i = 0; i < 6; ++i) graph.addNode("n" + std::to_string(i), [] {}); + graph.addDependency(2, 5); + graph.addDependency(3, 2); + graph.addDependency(4, 1); + + std::vector first = graph.topologicalOrder(); + std::vector second = graph.topologicalOrder(); + CHECK_EQ(first.size(), static_cast(6)); + CHECK(first == second); + for (std::size_t i = 0; i < first.size(); ++i) { + for (std::size_t dep : graph.nodeAt(first[i]).dependencies) { + std::size_t depPosition = 0; + for (std::size_t k = 0; k < first.size(); ++k) + if (first[k] == dep) depPosition = k; + CHECK(depPosition < i); + } + } +}