diff --git a/defines.hpp b/defines.hpp index 75a0189fc3..af46f8f909 100644 --- a/defines.hpp +++ b/defines.hpp @@ -76,6 +76,8 @@ #define GPS_TRACK_FILENAME "gps_track.dat" +#define TRAFFIC_FILE_EXTENSION ".traffic" + #define REPLACED_TAGS_FILE "replaced_tags.txt" #define MIXED_TAGS_FILE "mixed_tags.txt" diff --git a/map/traffic_manager.cpp b/map/traffic_manager.cpp index 975034cec2..33aac76238 100644 --- a/map/traffic_manager.cpp +++ b/map/traffic_manager.cpp @@ -147,13 +147,10 @@ void TrafficManager::ThreadRoutine() { traffic::TrafficInfo info(mwm); - if (mwm.GetInfo()->GetCountryName() == "Russia_Moscow") // TODO: temporary condition - { - if (info.ReceiveTrafficData("Russia_Moscow.traff")) // TODO: temporary name - OnTrafficDataResponse(info); - else - LOG(LDEBUG, ("Traffic request failed. Mwm =", mwm)); - } + if (info.ReceiveTrafficData()) + OnTrafficDataResponse(info); + else + LOG(LWARNING, ("Traffic request failed. Mwm =", mwm)); } mwms.clear(); } diff --git a/traffic/traffic_info.cpp b/traffic/traffic_info.cpp index a77dd9297a..ff62864e68 100644 --- a/traffic/traffic_info.cpp +++ b/traffic/traffic_info.cpp @@ -14,24 +14,41 @@ #include "std/algorithm.hpp" #include "std/string.hpp" +#include "defines.hpp" + #include "private.h" namespace traffic { namespace { - bool ReadRemoteFile(string const & url, vector & result) { platform::HttpClient request(url); if (!request.RunHttpRequest() || request.ErrorCode() != 200) + { + LOG(LINFO, ("Traffic request", url, "failed. HTTP Error:", request.ErrorCode())); return false; + } string const & response = request.ServerResponse(); result.resize(response.size()); for (size_t i = 0; i < response.size(); ++i) result[i] = static_cast(response[i]); return true; } + +string MakeRemoteURL(string const & name, uint64_t version) +{ + if (string(TRAFFIC_DATA_BASE_URL).empty()) + return {}; + + stringstream ss; + ss << TRAFFIC_DATA_BASE_URL; + if (version != 0) + ss << version << "/"; + ss << name << TRAFFIC_FILE_EXTENSION; + return ss.str(); +} } // namespace // TrafficInfo::RoadSegmentId ----------------------------------------------------------------- @@ -45,12 +62,17 @@ TrafficInfo::RoadSegmentId::RoadSegmentId(uint32_t fid, uint16_t idx, uint8_t di // TrafficInfo -------------------------------------------------------------------------------- TrafficInfo::TrafficInfo(MwmSet::MwmId const & mwmId) : m_mwmId(mwmId) {} -bool TrafficInfo::ReceiveTrafficData(string const & fileName) +bool TrafficInfo::ReceiveTrafficData() { - if (strlen(TRAFFIC_DATA_BASE_URL) == 0) + auto const & info = m_mwmId.GetInfo(); + if (!info) + return false; + + string const url = MakeRemoteURL(info->GetCountryName(), info->GetVersion()); + + if (url.empty()) return false; - string const url = string(TRAFFIC_DATA_BASE_URL) + string(fileName); vector contents; if (!ReadRemoteFile(url, contents)) return false; @@ -62,7 +84,8 @@ bool TrafficInfo::ReceiveTrafficData(string const & fileName) } catch (Reader::Exception const & e) { - LOG(LINFO, ("Could not read traffic data received from server.")); + LOG(LINFO, ("Could not read traffic data received from server. MWM:", info->GetCountryName(), + "Version:", info->GetVersion())); return false; } m_coloring.swap(coloring); diff --git a/traffic/traffic_info.hpp b/traffic/traffic_info.hpp index 1db69d7493..b1b5a419c3 100644 --- a/traffic/traffic_info.hpp +++ b/traffic/traffic_info.hpp @@ -59,10 +59,9 @@ public: TrafficInfo(MwmSet::MwmId const & mwmId); // Fetches the latest traffic data from the server and updates the coloring. - // todo(@m, @syershov) Currently a hardcoded path is used. // Construct the url by passing an MwmId. // *NOTE* This method must not be called on the UI thread. - bool ReceiveTrafficData(string const & fileName); + bool ReceiveTrafficData(); // Returns the latest known speed group by a feature segment's id. SpeedGroup GetSpeedGroup(RoadSegmentId const & id) const; diff --git a/traffic/traffic_tests/traffic_info_test.cpp b/traffic/traffic_tests/traffic_info_test.cpp index 3c9af855ea..84d1bcf0cd 100644 --- a/traffic/traffic_tests/traffic_info_test.cpp +++ b/traffic/traffic_tests/traffic_info_test.cpp @@ -3,12 +3,19 @@ #include "traffic/speed_groups.hpp" #include "traffic/traffic_info.hpp" +#include "platform/local_country_file.hpp" +#include "platform/platform_tests_support/writable_dir_changer.hpp" + +#include "indexer/mwm_set.hpp" + #include "std/algorithm.hpp" namespace traffic { namespace { +string const & kMapTestDir = "traffic-test"; + SpeedGroup GetSpeedGroup(TrafficInfo::Coloring const & coloring, TrafficInfo::RoadSegmentId const & fid) { @@ -17,14 +24,49 @@ SpeedGroup GetSpeedGroup(TrafficInfo::Coloring const & coloring, return SpeedGroup::Unknown; return it->second; } + +class TestMwmSet : public MwmSet +{ +protected: + // MwmSet overrides: + unique_ptr CreateInfo(platform::LocalCountryFile const & localFile) const override + { + unique_ptr info(new MwmInfo()); + info->m_version.SetFormat(version::Format::lastFormat); + return info; + } + + unique_ptr CreateValue(MwmInfo &) const override + { + return make_unique(); + } +}; } // namespace UNIT_TEST(TrafficInfo_RemoteFile) { - string const kTestFileName = "traffic_data"; - - TrafficInfo r; - TEST(r.ReceiveTrafficData(kTestFileName), ()); + WritableDirChanger writableDirChanger(kMapTestDir); + { + TestMwmSet mwmSet; + auto const & r = + mwmSet.Register(platform::LocalCountryFile::MakeForTesting("traffic_data_test")); + TrafficInfo trafficInfo(r.first); + TEST(trafficInfo.ReceiveTrafficData(), ()); + } + { + TestMwmSet mwmSet; + auto const & r = + mwmSet.Register(platform::LocalCountryFile::MakeForTesting("traffic_data_test2")); + TrafficInfo trafficInfo(r.first); + TEST(!trafficInfo.ReceiveTrafficData(), ()); + } + { + TestMwmSet mwmSet; + auto const & r = + mwmSet.Register(platform::LocalCountryFile::MakeForTesting("traffic_data_test", 101010)); + TrafficInfo trafficInfo(r.first); + TEST(trafficInfo.ReceiveTrafficData(), ()); + } } UNIT_TEST(TrafficInfo_Serialization)