From fb14423172b4cb7ac4a86769e4e69e83f4585afa Mon Sep 17 00:00:00 2001 From: Vladimir Byko-Ianko Date: Sun, 24 Jun 2018 12:27:00 +0300 Subject: [PATCH] Moving RoutingSession calls to gui threads in tests and fixing tests. --- .../partners_api_tests/booking_tests.cpp | 6 +- .../partners_api_tests/taxi_engine_tests.cpp | 6 +- .../partners_api_tests/viator_tests.cpp | 4 - .../platform_tests_support/CMakeLists.txt | 1 + .../async_gui_thread.hpp | 7 +- routing/async_router.cpp | 2 +- routing/routing_session.hpp | 2 +- routing/routing_tests/CMakeLists.txt | 1 + routing/routing_tests/async_router_test.cpp | 6 +- .../routing_tests/routing_session_test.cpp | 391 ++++++++++-------- routing/routing_tests/tools.hpp | 18 + .../partners_api.xcodeproj/project.pbxproj | 4 - .../platform.xcodeproj/project.pbxproj | 4 + .../routing/routing.xcodeproj/project.pbxproj | 2 + 14 files changed, 256 insertions(+), 198 deletions(-) rename {partners_api/partners_api_tests => platform/platform_tests_support}/async_gui_thread.hpp (81%) create mode 100644 routing/routing_tests/tools.hpp diff --git a/partners_api/partners_api_tests/booking_tests.cpp b/partners_api/partners_api_tests/booking_tests.cpp index 3f791d51af..72c10f39aa 100644 --- a/partners_api/partners_api_tests/booking_tests.cpp +++ b/partners_api/partners_api_tests/booking_tests.cpp @@ -1,13 +1,13 @@ #include "testing/testing.hpp" -#include "partners_api/partners_api_tests/async_gui_thread.hpp" - #include "partners_api/booking_api.hpp" +#include "platform/platform_tests_support/async_gui_thread.hpp" + #include #include -using namespace partners_api; +using namespace platform::tests_support; using namespace booking; namespace diff --git a/partners_api/partners_api_tests/taxi_engine_tests.cpp b/partners_api/partners_api_tests/taxi_engine_tests.cpp index 952d96ddec..961e92485d 100644 --- a/partners_api/partners_api_tests/taxi_engine_tests.cpp +++ b/partners_api/partners_api_tests/taxi_engine_tests.cpp @@ -1,12 +1,12 @@ #include "testing/testing.hpp" -#include "partners_api/partners_api_tests/async_gui_thread.hpp" - #include "partners_api/maxim_api.hpp" #include "partners_api/taxi_engine.hpp" #include "partners_api/uber_api.hpp" #include "partners_api/yandex_api.hpp" +#include "platform/platform_tests_support/async_gui_thread.hpp" + #include "platform/gui_thread.hpp" #include "geometry/latlon.hpp" @@ -15,7 +15,7 @@ #include "base/stl_add.hpp" #include "base/worker_thread.hpp" -using namespace partners_api; +using namespace platform::tests_support; namespace { diff --git a/partners_api/partners_api_tests/viator_tests.cpp b/partners_api/partners_api_tests/viator_tests.cpp index ef16f5f76f..2a68be8024 100644 --- a/partners_api/partners_api_tests/viator_tests.cpp +++ b/partners_api/partners_api_tests/viator_tests.cpp @@ -1,7 +1,5 @@ #include "testing/testing.hpp" -#include "partners_api/partners_api_tests/async_gui_thread.hpp" - #include "partners_api/viator_api.hpp" #include @@ -11,8 +9,6 @@ #include "3party/jansson/myjansson.hpp" -using namespace partners_api; - namespace { UNIT_TEST(Viator_SortProducts) diff --git a/platform/platform_tests_support/CMakeLists.txt b/platform/platform_tests_support/CMakeLists.txt index ea51584080..2a48c71b47 100644 --- a/platform/platform_tests_support/CMakeLists.txt +++ b/platform/platform_tests_support/CMakeLists.txt @@ -2,6 +2,7 @@ project(platform_tests_support) set( SRC + async_gui_thread.hpp scoped_dir.cpp scoped_dir.hpp scoped_file.cpp diff --git a/partners_api/partners_api_tests/async_gui_thread.hpp b/platform/platform_tests_support/async_gui_thread.hpp similarity index 81% rename from partners_api/partners_api_tests/async_gui_thread.hpp rename to platform/platform_tests_support/async_gui_thread.hpp index 5291edfbb4..ba7625ce13 100644 --- a/partners_api/partners_api_tests/async_gui_thread.hpp +++ b/platform/platform_tests_support/async_gui_thread.hpp @@ -6,7 +6,9 @@ #include "base/stl_add.hpp" #include "base/worker_thread.hpp" -namespace partners_api +namespace platform +{ +namespace tests_support { class AsyncGuiThread { @@ -24,4 +26,5 @@ public: private: Platform::ThreadRunner m_runner; }; -} // namespace partners_api +} // namespace tests_support +} // namespace platform diff --git a/routing/async_router.cpp b/routing/async_router.cpp index 5bd99b8261..be49a4ac16 100644 --- a/routing/async_router.cpp +++ b/routing/async_router.cpp @@ -338,8 +338,8 @@ void AsyncRouter::ThreadFunc() void AsyncRouter::CalculateRoute() { - shared_ptr delegate; Checkpoints checkpoints; + shared_ptr delegate; m2::PointD startDirection; bool adjustToPrevRoute = false; shared_ptr absentFetcher; diff --git a/routing/routing_session.hpp b/routing/routing_session.hpp index a183bb898a..486b207556 100644 --- a/routing/routing_session.hpp +++ b/routing/routing_session.hpp @@ -48,7 +48,7 @@ struct SpeedCameraRestriction /// a special note near a method. class RoutingSession : public traffic::TrafficObserver, public traffic::TrafficCache { - friend void UnitTest_TestFollowRoutePercentTest(); + friend struct UnitClass_AsyncGuiThreadTestWithRoutingSession_TestFollowRoutePercentTest; public: enum State diff --git a/routing/routing_tests/CMakeLists.txt b/routing/routing_tests/CMakeLists.txt index 8f75320e38..13603a191c 100644 --- a/routing/routing_tests/CMakeLists.txt +++ b/routing/routing_tests/CMakeLists.txt @@ -28,6 +28,7 @@ set( routing_algorithm.hpp routing_helpers_tests.cpp routing_session_test.cpp + tools.hpp turns_generator_test.cpp turns_sound_test.cpp turns_tts_text_tests.cpp diff --git a/routing/routing_tests/async_router_test.cpp b/routing/routing_tests/async_router_test.cpp index 69754fad05..21e52bf412 100644 --- a/routing/routing_tests/async_router_test.cpp +++ b/routing/routing_tests/async_router_test.cpp @@ -1,5 +1,7 @@ #include "testing/testing.hpp" +#include "routing/routing_tests/tools.hpp" + #include "routing/async_router.hpp" #include "routing/router.hpp" #include "routing/routing_callbacks.hpp" @@ -108,7 +110,7 @@ struct DummyResultCallback } }; -UNIT_TEST(NeedMoreMapsSignalTest) +UNIT_CLASS_TEST(AsyncGuiThreadTest, NeedMoreMapsSignalTest) { vector const absentData({"test1", "test2"}); unique_ptr fetcher(new DummyFetcher(absentData)); @@ -132,7 +134,7 @@ UNIT_TEST(NeedMoreMapsSignalTest) TEST_EQUAL(resultCallback.m_absent[1], absentData, ()); } -UNIT_TEST(StandardAsyncFogTest) +UNIT_CLASS_TEST(AsyncGuiThreadTest, StandardAsyncFogTest) { unique_ptr fetcher(new DummyFetcher({})); unique_ptr router(new DummyRouter(RouterResultCode::NoError, {})); diff --git a/routing/routing_tests/routing_session_test.cpp b/routing/routing_tests/routing_session_test.cpp index 3ddd1eb75f..810c2f7612 100644 --- a/routing/routing_tests/routing_session_test.cpp +++ b/routing/routing_tests/routing_session_test.cpp @@ -1,5 +1,7 @@ #include "testing/testing.hpp" +#include "routing/routing_tests/tools.hpp" + #include "routing/route.hpp" #include "routing/router.hpp" #include "routing/routing_callbacks.hpp" @@ -13,6 +15,7 @@ #include "std/chrono.hpp" #include "std/mutex.hpp" #include "std/string.hpp" +#include "std/unique_ptr.hpp" #include "std/vector.hpp" namespace routing @@ -21,7 +24,7 @@ namespace routing class DummyRouter : public IRouter { private: - Route & m_route; + Route m_route; RouterResultCode m_code; size_t & m_buildCount; @@ -30,6 +33,7 @@ public: : m_route(route), m_code(code), m_buildCount(buildCounter) { } + string GetName() const override { return "dummy"; } void ClearState() override {} RouterResultCode CalculateRoute(Checkpoints const & /* checkpoints */, @@ -92,214 +96,245 @@ void FillSubroutesInfo(Route & route) {Route::SubrouteAttrs(junctions.front(), junctions.back(), 0, kTestSegments.size())})); } -UNIT_TEST(TestRouteBuilding) +UNIT_CLASS_TEST(AsyncGuiThreadTestWithRoutingSession, TestRouteBuilding) { - RoutingSession session; - session.Init(nullptr, nullptr); - vector routePoints = kTestRoute; - Route masterRoute("dummy", routePoints.begin(), routePoints.end(), 0 /* route id */); - size_t counter = 0; + // Multithreading synchronization note. |counter| and |session| are constructed on the main thread, + // then used on gui thread and then if timeout in timedSignal.WaitUntil() is not reached, + // |counter| is used again. TimedSignal timedSignal; - unique_ptr router = - make_unique(masterRoute, RouterResultCode::NoError, counter); - session.SetRouter(move(router), nullptr); - session.SetReadyCallbacks( - [&timedSignal](Route const &, RouterResultCode) { timedSignal.Signal(); }, - nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, nullptr /* removeRouteCallback */); - session.BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); + size_t counter = 0; + + GetPlatform().RunTask(Platform::Thread::Gui, [&timedSignal, &counter, this]() { + m_session = make_unique(); + m_session->Init(nullptr, nullptr); + Route masterRoute("dummy", kTestRoute.begin(), kTestRoute.end(), 0 /* route id */); + + unique_ptr router = + make_unique(masterRoute, RouterResultCode::NoError, counter); + m_session->SetRouter(move(router), nullptr); + m_session->SetReadyCallbacks( + [&timedSignal](Route const &, RouterResultCode) { + LOG(LINFO, ("Ready")); + timedSignal.Signal(); + }, + nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, nullptr /* removeRouteCallback */); + m_session->BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); + }); + // Manual check of the routeBuilded mutex to avoid spurious results. - auto const time = steady_clock::now() + kRouteBuildingMaxDuration; - TEST(timedSignal.WaitUntil(time), ("Route was not built.")); + TEST(timedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route was not built.")); TEST_EQUAL(counter, 1, ()); } -UNIT_TEST(TestRouteRebuilding) +UNIT_CLASS_TEST(AsyncGuiThreadTestWithRoutingSession, TestRouteRebuilding) { - FrozenDataSource dataSource; - RoutingSession session; - session.Init(nullptr, nullptr); - vector routePoints = kTestRoute; - Route masterRoute("dummy", routePoints.begin(), routePoints.end(), 0 /* route id */); - FillSubroutesInfo(masterRoute); - - size_t counter = 0; - unique_ptr router = - make_unique(masterRoute, RouterResultCode::NoError, counter); - session.SetRouter(move(router), nullptr); - - // Go along the route. - TimedSignal alongTimedSignal; - session.SetReadyCallbacks( - [&alongTimedSignal](Route const &, RouterResultCode) { alongTimedSignal.Signal(); }, - nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, nullptr /* removeRouteCallback */); - session.BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); - // Manual check of the routeBuilded mutex to avoid spurious results. - auto time = steady_clock::now() + kRouteBuildingMaxDuration; - TEST(alongTimedSignal.WaitUntil(time), ("Route was not built.")); - location::GpsInfo info; - info.m_horizontalAccuracy = 0.01; - info.m_verticalAccuracy = 0.01; - info.m_longitude = 0.; - info.m_latitude = 1.; - RoutingSession::State code; - while (info.m_latitude < kTestRoute.back().y) - { - code = session.OnLocationPositionChanged(info, dataSource); - TEST_EQUAL(code, RoutingSession::State::OnRoute, ()); - info.m_latitude += 0.01; - } + FrozenDataSource dataSource; + size_t counter = 0; + + TimedSignal alongTimedSignal; + GetPlatform().RunTask(Platform::Thread::Gui, [&alongTimedSignal, this, &counter]() { + m_session = make_unique(); + m_session->Init(nullptr, nullptr); + Route masterRoute("dummy", kTestRoute.begin(), kTestRoute.end(), 0 /* route id */); + FillSubroutesInfo(masterRoute); + + unique_ptr router = + make_unique(masterRoute, RouterResultCode::NoError, counter); + m_session->SetRouter(move(router), nullptr); + + // Go along the route. + m_session->SetReadyCallbacks( + [&alongTimedSignal](Route const &, RouterResultCode) { alongTimedSignal.Signal(); }, + nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, + nullptr /* removeRouteCallback */); + m_session->BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); + }); + TEST(alongTimedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route was not built.")); TEST_EQUAL(counter, 1, ()); - // Rebuild route and go in opposite direction. So initiate a route rebuilding flag. - time = steady_clock::now() + kRouteBuildingMaxDuration; - counter = 0; TimedSignal oppositeTimedSignal; - session.SetReadyCallbacks( - [&oppositeTimedSignal](Route const &, RouterResultCode) { oppositeTimedSignal.Signal(); }, - nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, nullptr /* removeRouteCallback */); - session.BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); - TEST(oppositeTimedSignal.WaitUntil(time), ("Route was not built.")); + GetPlatform().RunTask(Platform::Thread::Gui, [&oppositeTimedSignal, &info, &dataSource, this]() { + info.m_horizontalAccuracy = 0.01; + info.m_verticalAccuracy = 0.01; + info.m_longitude = 0.; + info.m_latitude = 1.; + RoutingSession::State code; + while (info.m_latitude < kTestRoute.back().y) + { + code = m_session->OnLocationPositionChanged(info, dataSource); + TEST_EQUAL(code, RoutingSession::State::OnRoute, ()); + info.m_latitude += 0.01; + } - info.m_longitude = 0.; - info.m_latitude = 1.; - for (size_t i = 0; i < 10; ++i) - { - code = session.OnLocationPositionChanged(info, dataSource); - info.m_latitude -= 0.1; - } - TEST_EQUAL(code, RoutingSession::State::RouteNeedRebuild, ()); + // Rebuild route and go in opposite direction. So initiate a route rebuilding flag. + m_session->SetReadyCallbacks( + [&oppositeTimedSignal](Route const &, RouterResultCode) { oppositeTimedSignal.Signal(); }, + nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, + nullptr /* removeRouteCallback */); + m_session->BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); + }); + TEST(oppositeTimedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route was not built.")); + + TimedSignal checkTimedSignal; + GetPlatform().RunTask(Platform::Thread::Gui, [&checkTimedSignal, &info, &dataSource, this]() { + info.m_longitude = 0.; + info.m_latitude = 1.; + RoutingSession::State code = RoutingSession::State::RoutingNotActive; + for (size_t i = 0; i < 10; ++i) + { + code = m_session->OnLocationPositionChanged(info, dataSource); + info.m_latitude -= 0.1; + } + TEST_EQUAL(code, RoutingSession::State::RouteNeedRebuild, ()); + checkTimedSignal.Signal(); + }); + TEST(checkTimedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route checking timeout.")); } -UNIT_TEST(TestFollowRouteFlagPersistence) +UNIT_CLASS_TEST(AsyncGuiThreadTestWithRoutingSession, TestFollowRouteFlagPersistence) { - FrozenDataSource dataSource; - RoutingSession session; - session.Init(nullptr, nullptr); - vector routePoints = kTestRoute; - Route masterRoute("dummy", routePoints.begin(), routePoints.end(), 0 /* route id */); - FillSubroutesInfo(masterRoute); - - size_t counter = 0; - unique_ptr router = - make_unique(masterRoute, RouterResultCode::NoError, counter); - session.SetRouter(move(router), nullptr); - - // Go along the route. - TimedSignal alongTimedSignal; - session.SetReadyCallbacks( - [&alongTimedSignal](Route const &, RouterResultCode) { alongTimedSignal.Signal(); }, - nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, nullptr /* removeRouteCallback */); - session.BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); - // Manual check of the routeBuilded mutex to avoid spurious results. - auto time = steady_clock::now() + kRouteBuildingMaxDuration; - TEST(alongTimedSignal.WaitUntil(time), ("Route was not built.")); - - TEST(!session.IsFollowing(), ()); - session.EnableFollowMode(); - TEST(session.IsFollowing(), ()); - location::GpsInfo info; - info.m_horizontalAccuracy = 0.01; - info.m_verticalAccuracy = 0.01; - info.m_longitude = 0.; - info.m_latitude = 1.; - RoutingSession::State code; - while (info.m_latitude < kTestRoute.back().y) - { - session.OnLocationPositionChanged(info, dataSource); - TEST(session.IsOnRoute() , ()); - TEST(session.IsFollowing(), ()); - info.m_latitude += 0.01; - } - TEST_EQUAL(counter, 1, ()); + FrozenDataSource dataSource; + size_t counter = 0; + + TimedSignal alongTimedSignal; + GetPlatform().RunTask(Platform::Thread::Gui, [&alongTimedSignal, this, &counter]() { + m_session = make_unique(); + m_session->Init(nullptr, nullptr); + Route masterRoute("dummy", kTestRoute.begin(), kTestRoute.end(), 0 /* route id */); + FillSubroutesInfo(masterRoute); + unique_ptr router = + make_unique(masterRoute, RouterResultCode::NoError, counter); + m_session->SetRouter(move(router), nullptr); + + // Go along the route. + m_session->SetReadyCallbacks( + [&alongTimedSignal](Route const &, RouterResultCode) { alongTimedSignal.Signal(); }, + nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, + nullptr /* removeRouteCallback */); + m_session->BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); + }); + TEST(alongTimedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route was not built.")); - // Rebuild route and go in opposite direction. So initiate a route rebuilding flag. - time = steady_clock::now() + kRouteBuildingMaxDuration; - counter = 0; TimedSignal oppositeTimedSignal; - session.SetReadyCallbacks( - [&oppositeTimedSignal](Route const &, RouterResultCode) { oppositeTimedSignal.Signal(); }, - nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, nullptr /* removeRouteCallback */); - session.BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); - TEST(oppositeTimedSignal.WaitUntil(time), ("Route was not built.")); + GetPlatform().RunTask(Platform::Thread::Gui, [&oppositeTimedSignal, &info, &dataSource, this, &counter]() { + TEST(!m_session->IsFollowing(), ()); + m_session->EnableFollowMode(); + TEST(m_session->IsFollowing(), ()); - // Manual route building resets the following flag. - TEST(!session.IsFollowing(), ()); - session.EnableFollowMode(); - TEST(session.IsFollowing(), ()); - info.m_longitude = 0.; - info.m_latitude = 1.; - for (size_t i = 0; i < 10; ++i) - { - code = session.OnLocationPositionChanged(info, dataSource); - info.m_latitude -= 0.1; - } - TEST_EQUAL(code, RoutingSession::State::RouteNeedRebuild, ()); - TEST(session.IsFollowing(), ()); + info.m_horizontalAccuracy = 0.01; + info.m_verticalAccuracy = 0.01; + info.m_longitude = 0.; + info.m_latitude = 1.; + while (info.m_latitude < kTestRoute.back().y) + { + m_session->OnLocationPositionChanged(info, dataSource); + TEST(m_session->IsOnRoute(), ()); + TEST(m_session->IsFollowing(), ()); + info.m_latitude += 0.01; + } + TEST_EQUAL(counter, 1, ()); + + // Rebuild route and go in opposite direction. So initiate a route rebuilding flag. + m_session->SetReadyCallbacks( + [&oppositeTimedSignal](Route const &, RouterResultCode) { oppositeTimedSignal.Signal(); }, + nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, + nullptr /* removeRouteCallback */); + m_session->BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); + }); + TEST(oppositeTimedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route was not built.")); TimedSignal rebuildTimedSignal; - session.RebuildRoute( - kTestRoute.front(), - [&rebuildTimedSignal](Route const &, RouterResultCode) { rebuildTimedSignal.Signal(); }, - nullptr /* needMoreMapsCallback */, nullptr /* removeRouteCallback */, 0, RoutingSession::State::RouteBuilding, - false /* adjust */); - TEST(rebuildTimedSignal.WaitUntil(time), ("Route was not built.")); - TEST(session.IsFollowing(), ()); + GetPlatform().RunTask(Platform::Thread::Gui, [&rebuildTimedSignal, &info, &dataSource, this] { + // Manual route building resets the following flag. + TEST(!m_session->IsFollowing(), ()); + m_session->EnableFollowMode(); + TEST(m_session->IsFollowing(), ()); + info.m_longitude = 0.; + info.m_latitude = 1.; + RoutingSession::State code; + for (size_t i = 0; i < 10; ++i) + { + code = m_session->OnLocationPositionChanged(info, dataSource); + info.m_latitude -= 0.1; + } + TEST_EQUAL(code, RoutingSession::State::RouteNeedRebuild, ()); + TEST(m_session->IsFollowing(), ()); + + m_session->RebuildRoute( + kTestRoute.front(), + [&rebuildTimedSignal](Route const &, RouterResultCode) { rebuildTimedSignal.Signal(); }, + nullptr /* needMoreMapsCallback */, nullptr /* removeRouteCallback */, 0, + RoutingSession::State::RouteBuilding, false /* adjust */); + }); + TEST(rebuildTimedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route was not built.")); + + TimedSignal checkTimedSignal; + GetPlatform().RunTask(Platform::Thread::Gui, [&checkTimedSignal, this] { + TEST(m_session->IsFollowing(), ()); + checkTimedSignal.Signal(); + }); + TEST(checkTimedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route checking timeout.")); } -UNIT_TEST(TestFollowRoutePercentTest) +UNIT_CLASS_TEST(AsyncGuiThreadTestWithRoutingSession, TestFollowRoutePercentTest) { FrozenDataSource dataSource; - RoutingSession session; - session.Init(nullptr, nullptr); - vector routePoints = kTestRoute; - Route masterRoute("dummy", routePoints.begin(), routePoints.end(), 0 /* route id */); - FillSubroutesInfo(masterRoute); - - size_t counter = 0; - unique_ptr router = - make_unique(masterRoute, RouterResultCode::NoError, counter); - session.SetRouter(move(router), nullptr); - - // Get completion percent of unexisted route. - TEST_EQUAL(session.GetCompletionPercent(), 0, ()); - // Go along the route. TimedSignal alongTimedSignal; - session.SetReadyCallbacks( - [&alongTimedSignal](Route const &, RouterResultCode) { alongTimedSignal.Signal(); }, - nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, nullptr /* removeRouteCallback */); - session.BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); - // Manual check of the routeBuilded mutex to avoid spurious results. - auto time = steady_clock::now() + kRouteBuildingMaxDuration; - TEST(alongTimedSignal.WaitUntil(time), ("Route was not built.")); + GetPlatform().RunTask(Platform::Thread::Gui, [&alongTimedSignal, this]() { + m_session = make_unique(); + m_session->Init(nullptr, nullptr); + Route masterRoute("dummy", kTestRoute.begin(), kTestRoute.end(), 0 /* route id */); + FillSubroutesInfo(masterRoute); - // Get completion percent of unstarted route. - TEST_EQUAL(session.GetCompletionPercent(), 0, ()); + size_t counter = 0; + unique_ptr router = + make_unique(masterRoute, RouterResultCode::NoError, counter); + m_session->SetRouter(move(router), nullptr); - location::GpsInfo info; - info.m_horizontalAccuracy = 0.01; - info.m_verticalAccuracy = 0.01; + // Get completion percent of unexisted route. + TEST_EQUAL(m_session->GetCompletionPercent(), 0, ()); + // Go along the route. + m_session->SetReadyCallbacks( + [&alongTimedSignal](Route const &, RouterResultCode) { alongTimedSignal.Signal(); }, + nullptr /* rebuildReadyCallback */, nullptr /* needMoreMapsCallback */, + nullptr /* removeRouteCallback */); + m_session->BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0); + }); + TEST(alongTimedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route was not built.")); - // Go through the route. - info.m_longitude = 0.; - info.m_latitude = 1.; - session.OnLocationPositionChanged(info, dataSource); - TEST(my::AlmostEqualAbs(session.GetCompletionPercent(), 0., 0.5), ()); + TimedSignal checkTimedSignal; + GetPlatform().RunTask(Platform::Thread::Gui, [&checkTimedSignal, &dataSource, this] { + // Get completion percent of unstarted route. + TEST_EQUAL(m_session->GetCompletionPercent(), 0, ()); - info.m_longitude = 0.; - info.m_latitude = 2.; - session.OnLocationPositionChanged(info, dataSource); - TEST(my::AlmostEqualAbs(session.GetCompletionPercent(), 33.3, 0.5), ()); + location::GpsInfo info; + info.m_horizontalAccuracy = 0.01; + info.m_verticalAccuracy = 0.01; - info.m_longitude = 0.; - info.m_latitude = 3.; - session.OnLocationPositionChanged(info, dataSource); - TEST(my::AlmostEqualAbs(session.GetCompletionPercent(), 66.6, 0.5), ()); + // Go through the route. + info.m_longitude = 0.; + info.m_latitude = 1.; + m_session->OnLocationPositionChanged(info, dataSource); + TEST(my::AlmostEqualAbs(m_session->GetCompletionPercent(), 0., 0.5), ()); - info.m_longitude = 0.; - info.m_latitude = 3.99; - session.OnLocationPositionChanged(info, dataSource); - TEST(my::AlmostEqualAbs(session.GetCompletionPercent(), 100., 0.5), ()); + info.m_longitude = 0.; + info.m_latitude = 2.; + m_session->OnLocationPositionChanged(info, dataSource); + TEST(my::AlmostEqualAbs(m_session->GetCompletionPercent(), 33.3, 0.5), ()); + + info.m_longitude = 0.; + info.m_latitude = 3.; + m_session->OnLocationPositionChanged(info, dataSource); + TEST(my::AlmostEqualAbs(m_session->GetCompletionPercent(), 66.6, 0.5), ()); + + info.m_longitude = 0.; + info.m_latitude = 3.99; + m_session->OnLocationPositionChanged(info, dataSource); + TEST(my::AlmostEqualAbs(m_session->GetCompletionPercent(), 100., 0.5), ()); + checkTimedSignal.Signal(); + }); + TEST(checkTimedSignal.WaitUntil(steady_clock::now() + kRouteBuildingMaxDuration), ("Route checking timeout.")); } } // namespace routing diff --git a/routing/routing_tests/tools.hpp b/routing/routing_tests/tools.hpp new file mode 100644 index 0000000000..32e092b587 --- /dev/null +++ b/routing/routing_tests/tools.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "platform/platform_tests_support/async_gui_thread.hpp" + +#include "routing/routing_session.hpp" + +#include + +class AsyncGuiThreadTest +{ + platform::tests_support::AsyncGuiThread m_asyncGuiThread; +}; + +class AsyncGuiThreadTestWithRoutingSession : public AsyncGuiThreadTest +{ +public: + std::unique_ptr m_session; +}; diff --git a/xcode/partners_api/partners_api.xcodeproj/project.pbxproj b/xcode/partners_api/partners_api.xcodeproj/project.pbxproj index e68cf257fb..a659429e2c 100644 --- a/xcode/partners_api/partners_api.xcodeproj/project.pbxproj +++ b/xcode/partners_api/partners_api.xcodeproj/project.pbxproj @@ -38,7 +38,6 @@ 3D4E997C1FB439260025B48C /* booking_availability_params.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D4E997A1FB439260025B48C /* booking_availability_params.hpp */; }; 3D4E997D1FB439260025B48C /* booking_availability_params.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D4E997B1FB439260025B48C /* booking_availability_params.cpp */; }; 3D4E997F1FB439300025B48C /* utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D4E997E1FB439300025B48C /* utils.cpp */; }; - 3D7815761F3A14910068B6AC /* async_gui_thread.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D7815751F3A14910068B6AC /* async_gui_thread.hpp */; }; 3DA5713420B57358007BDE27 /* booking_params_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3DA5713320B57358007BDE27 /* booking_params_base.hpp */; }; 3DBC1C541E4B14920016897F /* facebook_ads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3DBC1C521E4B14920016897F /* facebook_ads.cpp */; }; 3DBC1C551E4B14920016897F /* facebook_ads.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3DBC1C531E4B14920016897F /* facebook_ads.hpp */; }; @@ -121,7 +120,6 @@ 3D4E997A1FB439260025B48C /* booking_availability_params.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = booking_availability_params.hpp; sourceTree = ""; }; 3D4E997B1FB439260025B48C /* booking_availability_params.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = booking_availability_params.cpp; sourceTree = ""; }; 3D4E997E1FB439300025B48C /* utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utils.cpp; sourceTree = ""; }; - 3D7815751F3A14910068B6AC /* async_gui_thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = async_gui_thread.hpp; sourceTree = ""; }; 3DA5713320B57358007BDE27 /* booking_params_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = booking_params_base.hpp; sourceTree = ""; }; 3DBC1C501E4B14810016897F /* facebook_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = facebook_tests.cpp; sourceTree = ""; }; 3DBC1C521E4B14920016897F /* facebook_ads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = facebook_ads.cpp; sourceTree = ""; }; @@ -287,7 +285,6 @@ isa = PBXGroup; children = ( 346E889D1E9D088200D4CE9B /* ads_engine_tests.cpp */, - 3D7815751F3A14910068B6AC /* async_gui_thread.hpp */, F6B536451DA5213D0067EEA5 /* booking_tests.cpp */, 3DBC1C501E4B14810016897F /* facebook_tests.cpp */, 3D452AED1EE6D202009EAB9B /* google_tests.cpp */, @@ -346,7 +343,6 @@ files = ( 3DA5713420B57358007BDE27 /* booking_params_base.hpp in Headers */, 346E88971E9D087400D4CE9B /* ads_base.hpp in Headers */, - 3D7815761F3A14910068B6AC /* async_gui_thread.hpp in Headers */, 3DCD415420DAB33700143533 /* booking_block_params.hpp in Headers */, F67E75261DB8F06F00D6741F /* opentable_api.hpp in Headers */, 3D452AF41EE6D20D009EAB9B /* google_ads.hpp in Headers */, diff --git a/xcode/platform/platform.xcodeproj/project.pbxproj b/xcode/platform/platform.xcodeproj/project.pbxproj index fee5c7b6d3..b0087c0e83 100644 --- a/xcode/platform/platform.xcodeproj/project.pbxproj +++ b/xcode/platform/platform.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ 451E32A21F73A8B000964C9F /* secure_storage.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 451E329F1F73A8B000964C9F /* secure_storage.hpp */; }; 4564FA7E2094978D0043CCFB /* remote_file.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 4564FA7C2094978C0043CCFB /* remote_file.hpp */; }; 4564FA7F2094978D0043CCFB /* remote_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4564FA7D2094978D0043CCFB /* remote_file.cpp */; }; + 5661A5CC20DD57DA00C6B1D1 /* async_gui_thread.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 5661A5CB20DD57DA00C6B1D1 /* async_gui_thread.hpp */; }; 56EB1EDC1C6B6E6C0022D831 /* file_logging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 56EB1ED81C6B6E6C0022D831 /* file_logging.cpp */; }; 56EB1EDD1C6B6E6C0022D831 /* file_logging.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 56EB1ED91C6B6E6C0022D831 /* file_logging.hpp */; }; 56EB1EDE1C6B6E6C0022D831 /* mwm_traits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 56EB1EDA1C6B6E6C0022D831 /* mwm_traits.cpp */; }; @@ -141,6 +142,7 @@ 451E329F1F73A8B000964C9F /* secure_storage.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = secure_storage.hpp; sourceTree = ""; }; 4564FA7C2094978C0043CCFB /* remote_file.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = remote_file.hpp; sourceTree = ""; }; 4564FA7D2094978D0043CCFB /* remote_file.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remote_file.cpp; sourceTree = ""; }; + 5661A5CB20DD57DA00C6B1D1 /* async_gui_thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = async_gui_thread.hpp; sourceTree = ""; }; 56EB1ED81C6B6E6C0022D831 /* file_logging.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_logging.cpp; sourceTree = ""; }; 56EB1ED91C6B6E6C0022D831 /* file_logging.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = file_logging.hpp; sourceTree = ""; }; 56EB1EDA1C6B6E6C0022D831 /* mwm_traits.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mwm_traits.cpp; sourceTree = ""; }; @@ -296,6 +298,7 @@ 675340E41C58C43A002CF0D9 /* platform_tests_support */ = { isa = PBXGroup; children = ( + 5661A5CB20DD57DA00C6B1D1 /* async_gui_thread.hpp */, 675E889E1DB7B0F200F8EBDA /* test_socket.cpp */, 675E889F1DB7B0F200F8EBDA /* test_socket.hpp */, 67247FFB1C60BD6500EDE56A /* writable_dir_changer.cpp */, @@ -459,6 +462,7 @@ buildActionMask = 2147483647; files = ( 675341271C58C61D002CF0D9 /* scoped_dir.hpp in Headers */, + 5661A5CC20DD57DA00C6B1D1 /* async_gui_thread.hpp in Headers */, 675341281C58C61D002CF0D9 /* scoped_mwm.hpp in Headers */, F6DF735C1EC9EAE700D8BA0B /* string_storage_base.hpp in Headers */, 675341261C58C616002CF0D9 /* scoped_file.hpp in Headers */, diff --git a/xcode/routing/routing.xcodeproj/project.pbxproj b/xcode/routing/routing.xcodeproj/project.pbxproj index f0fd40f792..1ffc23c8b4 100644 --- a/xcode/routing/routing.xcodeproj/project.pbxproj +++ b/xcode/routing/routing.xcodeproj/project.pbxproj @@ -363,6 +363,7 @@ 56290B85206A3231003892E0 /* routing_algorithm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = routing_algorithm.cpp; sourceTree = ""; }; 56290B86206A3231003892E0 /* routing_algorithm.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = routing_algorithm.hpp; sourceTree = ""; }; 562BDE1F20D14860008EFF6F /* routing_callbacks.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = routing_callbacks.hpp; sourceTree = ""; }; + 5661A5CD20DE51C500C6B1D1 /* tools.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tools.hpp; sourceTree = ""; }; 567059591F3AF96D0062672D /* checkpoint_predictor_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = checkpoint_predictor_test.cpp; sourceTree = ""; }; 5670595B1F3AF97F0062672D /* checkpoint_predictor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = checkpoint_predictor.cpp; sourceTree = ""; }; 5670595C1F3AF97F0062672D /* checkpoint_predictor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = checkpoint_predictor.hpp; sourceTree = ""; }; @@ -643,6 +644,7 @@ 6742ACA01C68A07C009CB89E /* routing_tests */ = { isa = PBXGroup; children = ( + 5661A5CD20DE51C500C6B1D1 /* tools.hpp */, 56290B85206A3231003892E0 /* routing_algorithm.cpp */, 56290B86206A3231003892E0 /* routing_algorithm.hpp */, 567059591F3AF96D0062672D /* checkpoint_predictor_test.cpp */,