From 676445553c567042033d5fd40b0e44a16922c72d Mon Sep 17 00:00:00 2001 From: Constantin Shalnev Date: Tue, 15 Dec 2015 14:58:40 +0300 Subject: [PATCH] Fixed evicted by Add new points --- map/gps_track.cpp | 2 +- map/gps_track_collection.cpp | 7 ++- map/map_tests/gps_track_storage_test.cpp | 2 +- map/map_tests/gps_track_test.cpp | 60 ++++++++++++++++++++++-- 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/map/gps_track.cpp b/map/gps_track.cpp index 75eadd11b4..a7b93a799f 100644 --- a/map/gps_track.cpp +++ b/map/gps_track.cpp @@ -258,7 +258,7 @@ void GpsTrack::UpdateCollection(hours duration, bool needClear, vector evictedIdsByAdd = make_pair(kInvalidId, kInvalidId); if (!points.empty()) - addedIds = m_collection->Add(points, evictedIds); + addedIds = m_collection->Add(points, evictedIdsByAdd); else addedIds = make_pair(kInvalidId, kInvalidId); diff --git a/map/gps_track_collection.cpp b/map/gps_track_collection.cpp index 06dedee714..1c6b51901e 100644 --- a/map/gps_track_collection.cpp +++ b/map/gps_track_collection.cpp @@ -192,12 +192,15 @@ pair GpsTrackCollection::RemoveExtraItems() // First, try linear search for short distance. It is common case for sliding window // when new items will evict old items. - for (size_t j = 0; j < kLinearSearchCount && !found; ++i, ++j) + for (size_t j = 0; j < kLinearSearchCount; ++i, ++j) { ASSERT(i != m_items.end(), ()); - if (i->m_timestamp >= lowerBound) + if (i->m_timestamp > lowerBound) + { found = true; + break; + } } // If item wasn't found by linear search, since m_items are sorted by timestamp, use lower_bound to find bound diff --git a/map/map_tests/gps_track_storage_test.cpp b/map/map_tests/gps_track_storage_test.cpp index 658fcde498..bd050f1636 100644 --- a/map/map_tests/gps_track_storage_test.cpp +++ b/map/map_tests/gps_track_storage_test.cpp @@ -29,7 +29,7 @@ location::GpsTrackInfo Make(double timestamp, ms::LatLon const & ll, double spee inline string GetGpsTrackFilePath() { - return my::JoinFoldersToPath(GetPlatform().WritableDir(), "gpstrack.bin"); + return my::JoinFoldersToPath(GetPlatform().WritableDir(), "gpstrack_test.bin"); } } // namespace diff --git a/map/map_tests/gps_track_test.cpp b/map/map_tests/gps_track_test.cpp index 7576b45375..c507d08e51 100644 --- a/map/map_tests/gps_track_test.cpp +++ b/map/map_tests/gps_track_test.cpp @@ -15,8 +15,6 @@ #include "std/bind.hpp" #include "std/chrono.hpp" -#include "defines.hpp" - namespace { @@ -33,7 +31,7 @@ inline location::GpsInfo Make(double timestamp, ms::LatLon const & ll, double sp inline string GetGpsTrackFilePath() { - return my::JoinFoldersToPath(GetPlatform().WritableDir(), GPS_TRACK_FILENAME); + return my::JoinFoldersToPath(GetPlatform().WritableDir(), "gpstrack_test.bin"); } class GpsTrackCallback @@ -85,18 +83,19 @@ UNIT_TEST(GpsTrack_Simple) { string const filePath = GetGpsTrackFilePath(); MY_SCOPE_GUARD(gpsTestFileDeleter, bind(FileWriter::DeleteFileX, filePath)); + FileWriter::DeleteFileX(filePath); time_t const t = system_clock::to_time_t(system_clock::now()); double const timestamp = t; LOG(LINFO, ("Timestamp", ctime(&t), timestamp)); size_t const maxItemCount = 100000; - size_t const writeItemCount = 50000; + size_t const writeItemCount = 50000; // less than 24h vector points; points.reserve(writeItemCount); for (size_t i = 0; i < writeItemCount; ++i) - points.emplace_back(Make(timestamp + i, ms::LatLon(-90 + i, -180 + i), 10 + i)); + points.emplace_back(Make(timestamp + i, ms::LatLon(-90.0 + i, -180.0 + i), 10 + i)); // Store points { @@ -146,3 +145,54 @@ UNIT_TEST(GpsTrack_Simple) } } } + +UNIT_TEST(GpsTrack_EvictedByAdd) +{ + string const filePath = GetGpsTrackFilePath(); + MY_SCOPE_GUARD(gpsTestFileDeleter, bind(FileWriter::DeleteFileX, filePath)); + FileWriter::DeleteFileX(filePath); + + time_t const t = system_clock::to_time_t(system_clock::now()); + double const timestamp = t; + LOG(LINFO, ("Timestamp", ctime(&t), timestamp)); + + location::GpsInfo pt1 = Make(timestamp - 25 * 60 * 60, ms::LatLon(30.0, 45.0), 60.0); + location::GpsInfo pt2 = Make(timestamp, ms::LatLon(75.0, 90.0), 110.0); + + GpsTrack track(filePath, 1000, hours(24)); + + GpsTrackCallback callback; + track.SetCallback(bind(&GpsTrackCallback::OnUpdate, &callback, _1, _2)); + + track.AddPoint(pt1); + + TEST(callback.WaitForCallback(kWaitForCallbackTimeout), ()); + + // Check pt1 was added + TEST_EQUAL(1, callback.m_toAdd.size(), ()) + TEST_EQUAL(0, callback.m_toAdd[0].first, ()); + TEST_EQUAL(pt1.m_timestamp, callback.m_toAdd[0].second.m_timestamp, ()); + TEST_EQUAL(pt1.m_speed, callback.m_toAdd[0].second.m_speed, ()); + TEST_EQUAL(pt1.m_latitude, callback.m_toAdd[0].second.m_latitude, ()); + TEST_EQUAL(pt1.m_longitude, callback.m_toAdd[0].second.m_longitude, ()); + // and nothing was evicted + TEST_EQUAL(callback.m_toRemove.first, GpsTrack::kInvalidId, ()); + TEST_EQUAL(callback.m_toRemove.second, GpsTrack::kInvalidId, ()); + + callback.Reset(); + + track.AddPoint(pt2); + + TEST(callback.WaitForCallback(kWaitForCallbackTimeout), ()); + + // Check pt2 was added + TEST_EQUAL(1, callback.m_toAdd.size(), ()) + TEST_EQUAL(1, callback.m_toAdd[0].first, ()); + TEST_EQUAL(pt2.m_timestamp, callback.m_toAdd[0].second.m_timestamp, ()); + TEST_EQUAL(pt2.m_speed, callback.m_toAdd[0].second.m_speed, ()); + TEST_EQUAL(pt2.m_latitude, callback.m_toAdd[0].second.m_latitude, ()); + TEST_EQUAL(pt2.m_longitude, callback.m_toAdd[0].second.m_longitude, ()); + // and pt1 was evicted as old + TEST_EQUAL(callback.m_toRemove.first, 0, ()); + TEST_EQUAL(callback.m_toRemove.second, 0, ()); +}