From 7ee36342d0f6a663051702a3837de5b6e5729ff0 Mon Sep 17 00:00:00 2001 From: Lev Dragunov Date: Wed, 11 Nov 2015 18:05:26 +0300 Subject: [PATCH] Rewrite routing session tests sync to condition variable. --- .../routing_tests/routing_session_test.cpp | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/routing/routing_tests/routing_session_test.cpp b/routing/routing_tests/routing_session_test.cpp index 1dd95aed98..c5bd3aa258 100644 --- a/routing/routing_tests/routing_session_test.cpp +++ b/routing/routing_tests/routing_session_test.cpp @@ -8,8 +8,8 @@ #include "base/logging.hpp" -#include "std/atomic.hpp" #include "std/chrono.hpp" +#include "std/mutex.hpp" #include "std/string.hpp" #include "std/vector.hpp" @@ -42,7 +42,7 @@ public: }; static vector kTestRoute = {{0., 1.}, {0., 2.}, {0., 3.}, {0., 4.}}; -static auto kTestMaxDuration = seconds(30); +static auto kRouteBuildingMaxDuration = seconds(30); UNIT_TEST(TestRouteBuilding) { @@ -51,21 +51,24 @@ UNIT_TEST(TestRouteBuilding) vector routePoints = kTestRoute; Route masterRoute("dummy", routePoints.begin(), routePoints.end()); size_t counter = 0; - atomic routeBuilded(false); + bool routeBuilt(false); + mutex waitingMutex; + unique_lock lock(waitingMutex); + condition_variable cv; unique_ptr router = make_unique(masterRoute, DummyRouter::NoError, counter); session.SetRouter(move(router), nullptr); session.BuildRoute(kTestRoute.front(), kTestRoute.back(), - [&routeBuilded](Route const &, IRouter::ResultCode) + [&routeBuilt, &waitingMutex, &cv](Route const &, IRouter::ResultCode) { - routeBuilded = true; + lock_guard guard(waitingMutex); + routeBuilt = true; + cv.notify_one(); }, nullptr, 0); // Manual check of the routeBuilded mutex to avoid spurious results. - auto time = steady_clock::now() + kTestMaxDuration; - while (steady_clock::now() < time && !routeBuilded) - { - } - TEST(routeBuilded, ("Route was not built.")); + auto const time = steady_clock::now() + kRouteBuildingMaxDuration; + cv.wait_until(lock, time, [&routeBuilt, &time]{return routeBuilt || steady_clock::now() > time;}); + TEST(routeBuilt, ("Route was not built.")); TEST_EQUAL(counter, 1, ()); } @@ -77,10 +80,15 @@ UNIT_TEST(TestRouteRebuilding) vector routePoints = kTestRoute; Route masterRoute("dummy", routePoints.begin(), routePoints.end()); size_t counter = 0; - atomic routeBuilded(false); - auto fn = [&routeBuilded](Route const &, IRouter::ResultCode) + bool routeBuilt(false); + mutex waitingMutex; + unique_lock lock(waitingMutex); + condition_variable cv; + auto fn = [&routeBuilt, &waitingMutex, &cv](Route const &, IRouter::ResultCode) { - routeBuilded = true; + lock_guard guard(waitingMutex); + routeBuilt = true; + cv.notify_one(); }; unique_ptr router = make_unique(masterRoute, DummyRouter::NoError, counter); session.SetRouter(move(router), nullptr); @@ -88,11 +96,9 @@ UNIT_TEST(TestRouteRebuilding) // Go along the route. session.BuildRoute(kTestRoute.front(), kTestRoute.back(), fn, nullptr, 0); // Manual check of the routeBuilded mutex to avoid spurious results. - auto time = steady_clock::now() + kTestMaxDuration; - while (steady_clock::now() < time && !routeBuilded) - { - } - TEST(routeBuilded, ("Route was not built.")); + auto time = steady_clock::now() + kRouteBuildingMaxDuration; + cv.wait_until(lock, time, [&routeBuilt, &time]{return routeBuilt || steady_clock::now() > time;}); + TEST(routeBuilt, ("Route was not built.")); location::GpsInfo info; info.m_horizontalAccuracy = 0.01; @@ -110,13 +116,12 @@ UNIT_TEST(TestRouteRebuilding) TEST_EQUAL(counter, 1, ()); // Rebuild route and go in opposite direction. So initiate a route rebuilding flag. + time = steady_clock::now() + kRouteBuildingMaxDuration; counter = 0; - routeBuilded = false; + routeBuilt = false; session.BuildRoute(kTestRoute.front(), kTestRoute.back(), fn, nullptr, 0); - while (steady_clock::now() < time && !routeBuilded) - { - } - TEST(routeBuilded, ("Route was not built.")); + cv.wait_until(lock, time, [&routeBuilt, &time]{return routeBuilt || steady_clock::now() > time;}); + TEST(routeBuilt, ("Route was not built.")); info.m_longitude = 0.; info.m_latitude = 1.;