diff --git a/data/ugc_migration/test_index/v0/index.json b/data/ugc_migration/test_index/v0/index.json new file mode 100644 index 0000000000..b2199ce049 --- /dev/null +++ b/data/ugc_migration/test_index/v0/index.json @@ -0,0 +1 @@ +[{"matching_type":17922,"y":67.495318707043822,"type":17922,"feature_id":371420,"x":37.592392098846972,"offset":0,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.495624478873793,"type":23682,"feature_id":371358,"x":37.586622667212964,"offset":124,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.891430019523426,"type":17922,"feature_id":215525,"x":37.211488911595126,"offset":370,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow Oblast_West","data_version":171020},{"matching_type":17922,"y":67.539349850560342,"type":17922,"feature_id":400277,"x":37.537559699546989,"offset":460,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.541165706076953,"type":17922,"feature_id":400274,"x":37.535207402223392,"offset":599,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":19748,"y":67.540586348925416,"type":19748,"feature_id":559674,"x":37.535821628092378,"offset":800,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":18596,"y":67.542222496436693,"type":18596,"feature_id":559636,"x":37.533986997112521,"offset":969,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17188,"y":67.544244882049014,"type":17188,"feature_id":564097,"x":37.531983386963475,"offset":1154,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.544877883381218,"type":17922,"feature_id":401987,"x":37.531328927958981,"offset":1199,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23298,"y":67.546739336451424,"type":23298,"feature_id":399270,"x":37.525334190766017,"offset":1236,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":18818,"y":67.552896347290996,"type":18818,"feature_id":254039,"x":37.528287302913412,"offset":1383,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.551001366607863,"type":17922,"feature_id":399304,"x":37.528504561845239,"offset":1503,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.540945764936112,"type":23682,"feature_id":400264,"x":37.532364260646432,"offset":1642,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":20098,"y":75.303677136478399,"type":20098,"feature_id":285644,"x":30.361743944598317,"offset":1679,"deleted":false,"synchronized":true,"mwm_name":"Russia_Saint Petersburg","data_version":171020},{"matching_type":20098,"y":60.657700007093695,"type":20098,"feature_id":170414,"x":36.190036655888235,"offset":1842,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":17922,"y":60.533049706615884,"type":17922,"feature_id":161853,"x":35.674698469599321,"offset":1921,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":20516,"y":60.534637574364524,"type":20516,"feature_id":224099,"x":35.670857546261374,"offset":2080,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":18579,"y":60.534117225811755,"type":2132115,"feature_id":102579,"x":35.662569520343609,"offset":2122,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":18579,"y":60.535123054199843,"type":18579,"feature_id":102917,"x":35.662014303073391,"offset":2442,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":20098,"y":60.537070337959165,"type":20098,"feature_id":161903,"x":35.656577465359703,"offset":2486,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":17922,"y":60.537938032581934,"type":17922,"feature_id":161874,"x":35.646132943377893,"offset":2650,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":17922,"y":60.537982289031021,"type":17922,"feature_id":161906,"x":35.658039269283705,"offset":2816,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":24578,"y":60.535058681182988,"type":24578,"feature_id":102864,"x":35.659753200856983,"offset":2982,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":22530,"y":60.533197228112783,"type":22530,"feature_id":224042,"x":35.661271331170724,"offset":3027,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":22530,"y":60.526381734955166,"type":22530,"feature_id":162063,"x":35.684292731317072,"offset":3259,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":17922,"y":60.527988378167066,"type":17922,"feature_id":162070,"x":35.690325019436528,"offset":3410,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":20644,"y":60.528406802776516,"type":20644,"feature_id":224624,"x":35.697086868413436,"offset":3524,"deleted":false,"synchronized":true,"mwm_name":"Russia_Kursk Oblast","data_version":171020},{"matching_type":23682,"y":67.503746207831398,"type":23682,"feature_id":400675,"x":37.587494385149284,"offset":3759,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.504397984626877,"type":17922,"feature_id":400681,"x":37.588151526362822,"offset":4192,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.504033204198123,"type":23682,"feature_id":400678,"x":37.588569950972271,"offset":4423,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.504355069282326,"type":23682,"feature_id":400680,"x":37.587816250233487,"offset":4595,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":16548,"y":67.502557989228961,"type":16548,"feature_id":400654,"x":37.587320041562009,"offset":4716,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.501525338750525,"type":17922,"feature_id":400648,"x":37.586483192343138,"offset":4856,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.498556133348899,"type":23682,"feature_id":371395,"x":37.585831415547659,"offset":5152,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.502316590415802,"type":23682,"feature_id":400961,"x":37.598579955090429,"offset":5475,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.504403349044935,"type":23682,"feature_id":401001,"x":37.600784730917098,"offset":5637,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.504081483960761,"type":17922,"feature_id":400981,"x":37.600275111200489,"offset":5849,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":18596,"y":67.504623290185805,"type":18596,"feature_id":561862,"x":37.600744497781591,"offset":5959,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.465854640795698,"type":23682,"feature_id":370172,"x":37.599467766280981,"offset":6041,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.465902920558335,"type":17922,"feature_id":370169,"x":37.599312198156952,"offset":6358,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.545076366849798,"type":23682,"feature_id":401988,"x":37.531007062874778,"offset":6699,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.509231325307724,"type":23682,"feature_id":401059,"x":37.599089574807067,"offset":6970,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.487752195356421,"type":17922,"feature_id":371087,"x":37.595133316480627,"offset":7222,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.487819250582305,"type":17922,"feature_id":371088,"x":37.595203053915526,"offset":7384,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.489664610398307,"type":17922,"feature_id":371315,"x":37.594433259922511,"offset":7546,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.473523076426403,"type":17922,"feature_id":385711,"x":37.621078324474979,"offset":7739,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.481312211463688,"type":17922,"feature_id":371767,"x":37.607868444978209,"offset":7948,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.483294363940473,"type":23682,"feature_id":371776,"x":37.607640457210238,"offset":8043,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":20098,"y":67.524782773291946,"type":20098,"feature_id":400158,"x":37.532723676657099,"offset":8141,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":21156,"y":67.524037119180235,"type":21156,"feature_id":257738,"x":37.531117033445213,"offset":8341,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":22948,"y":67.523245867514959,"type":22948,"feature_id":559435,"x":37.534298133360579,"offset":8647,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":69.663238299364139,"type":17922,"feature_id":343327,"x":23.808353571655999,"offset":8924,"deleted":false,"synchronized":true,"mwm_name":"Latvia","data_version":171020},{"matching_type":23682,"y":69.659831893889844,"type":23682,"feature_id":343153,"x":23.797473190706015,"offset":9393,"deleted":false,"synchronized":true,"mwm_name":"Latvia","data_version":171020},{"matching_type":16807,"y":69.613338482479293,"type":16807,"feature_id":216908,"x":24.106821746429958,"offset":9756,"deleted":false,"synchronized":true,"mwm_name":"Latvia","data_version":171020},{"matching_type":23682,"y":15.724430350396261,"type":23682,"feature_id":17962,"x":73.764706058537257,"offset":9848,"deleted":false,"synchronized":true,"mwm_name":"India_Goa","data_version":171020},{"matching_type":23682,"y":15.726672677149423,"type":23682,"feature_id":17970,"x":73.764502210650619,"offset":9977,"deleted":false,"synchronized":true,"mwm_name":"India_Goa","data_version":171020},{"matching_type":23298,"y":58.046438083398613,"type":23298,"feature_id":138017,"x":14.401487070333104,"offset":10100,"deleted":false,"synchronized":true,"mwm_name":"Czech_Praha","data_version":171020},{"matching_type":23682,"y":58.046279833065569,"type":23682,"feature_id":145256,"x":14.417542773615878,"offset":10568,"deleted":false,"synchronized":true,"mwm_name":"Czech_Praha","data_version":171020},{"matching_type":17922,"y":58.047661170718527,"type":17922,"feature_id":145429,"x":14.423660892424436,"offset":10814,"deleted":false,"synchronized":true,"mwm_name":"Czech_Praha","data_version":171020},{"matching_type":164,"y":67.544856425708957,"type":22436,"feature_id":564302,"x":37.536816727644322,"offset":10987,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":16676,"y":67.537238952049904,"type":16676,"feature_id":559754,"x":37.540284823926413,"offset":11144,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.579336222852305,"type":17922,"feature_id":399521,"x":37.497535776328561,"offset":11306,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.582750674953701,"type":17922,"feature_id":399571,"x":37.496924232668619,"offset":11523,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":20098,"y":67.581763622028859,"type":20098,"feature_id":399543,"x":37.496943008131865,"offset":11724,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.581441756944656,"type":17922,"feature_id":399549,"x":37.498037349418098,"offset":11820,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.580138203353727,"type":17922,"feature_id":399537,"x":37.497854959203721,"offset":12053,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23682,"y":67.553817686094476,"type":23682,"feature_id":399257,"x":37.517767679078645,"offset":12179,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":18946,"y":67.504980023987429,"type":18946,"feature_id":640676,"x":37.588663828288503,"offset":12311,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":23204,"y":67.556440886530595,"type":23204,"feature_id":254466,"x":37.527871560513006,"offset":12648,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":17922,"y":67.591086980634088,"type":17922,"feature_id":591044,"x":37.636612338100477,"offset":12786,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":20098,"y":67.598436233389634,"type":20098,"feature_id":417084,"x":37.631141972773833,"offset":12878,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171020},{"matching_type":18946,"y":67.536812480813353,"type":18946,"feature_id":648089,"x":37.540842723405689,"offset":13562,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171117},{"matching_type":18946,"y":67.544231471003826,"type":18946,"feature_id":267217,"x":37.535597663637972,"offset":13691,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171117},{"matching_type":20098,"y":44.65326178560602,"type":20098,"feature_id":169791,"x":23.707650033441553,"offset":14216,"deleted":false,"synchronized":true,"mwm_name":"Greece_Decentralized Administration of Macedonia and Thrace","data_version":171117},{"matching_type":23682,"y":44.653551464181788,"type":23682,"feature_id":169793,"x":23.707741228548741,"offset":14366,"deleted":false,"synchronized":true,"mwm_name":"Greece_Decentralized Administration of Macedonia and Thrace","data_version":171117},{"matching_type":23682,"y":46.757264336625212,"type":23682,"feature_id":76643,"x":18.838218888925155,"offset":14527,"deleted":false,"synchronized":true,"mwm_name":"Montenegro","data_version":171117},{"matching_type":17922,"y":46.756467720541849,"type":17922,"feature_id":76750,"x":18.842946282349118,"offset":14669,"deleted":false,"synchronized":true,"mwm_name":"Montenegro","data_version":171117},{"matching_type":16664,"y":46.735460659380706,"type":16664,"feature_id":35928,"x":18.832501760367322,"offset":14807,"deleted":false,"synchronized":true,"mwm_name":"Montenegro","data_version":171117},{"matching_type":23682,"y":46.970086894706526,"type":23682,"feature_id":77135,"x":18.535656322059452,"offset":14910,"deleted":false,"synchronized":true,"mwm_name":"Montenegro","data_version":171117},{"matching_type":23682,"y":67.533765491349726,"type":23682,"feature_id":404591,"x":37.559779119191916,"offset":15049,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171117},{"matching_type":17922,"y":67.467171605431815,"type":17922,"feature_id":393547,"x":37.660804522490537,"offset":15201,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":171208},{"matching_type":164,"y":58.043844387261913,"type":164,"feature_id":324636,"x":14.416021961093122,"offset":15395,"deleted":false,"synchronized":true,"mwm_name":"Czech_Praha","data_version":180126},{"matching_type":20098,"y":67.550462242591834,"type":20098,"feature_id":418241,"x":37.517451178412529,"offset":15475,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":180209},{"matching_type":18596,"y":67.504081483960761,"type":18596,"feature_id":423939,"x":37.600275111200489,"offset":15612,"deleted":false,"synchronized":true,"mwm_name":"Russia_Moscow","data_version":180316},{"matching_type":164,"y":75.329139346846489,"type":20388,"feature_id":395900,"x":30.32542146984801,"offset":15825,"deleted":false,"synchronized":true,"mwm_name":"Russia_Saint Petersburg","data_version":180316},{"matching_type":23682,"y":34.196398960027096,"type":23682,"feature_id":316398,"x":34.85279988387822,"offset":15971,"deleted":false,"synchronized":true,"mwm_name":"Israel","data_version":180528}] \ No newline at end of file diff --git a/ugc/index_migration/utility.cpp b/ugc/index_migration/utility.cpp index 9d48bbcc1f..98453f2ac7 100644 --- a/ugc/index_migration/utility.cpp +++ b/ugc/index_migration/utility.cpp @@ -19,13 +19,14 @@ using namespace std; namespace { string const kBinExt = ".bin"; +string const kMigrationDirName = "ugc_migration"; using MigrationTable = unordered_map; using MigrationTables = unordered_map; bool GetMigrationTable(int64_t tableVersion, MigrationTable & t) { - auto const fileName = to_string(tableVersion) + kBinExt; + auto const fileName = my::JoinPath(kMigrationDirName, to_string(tableVersion) + kBinExt); try { auto reader = GetPlatform().GetReader(fileName); diff --git a/ugc/storage.cpp b/ugc/storage.cpp index bb1bdba4c1..f224bac351 100644 --- a/ugc/storage.cpp +++ b/ugc/storage.cpp @@ -88,10 +88,9 @@ string SerializeIndexes(ugc::UpdateIndexes const & indexes) template ugc::Storage::SettingResult SetGenericUGCUpdate(UGCUpdate const & ugc, FeatureType const & featureType, - FeatureID const & id, ugc::UpdateIndexes & indexes, size_t & numberOfDeleted, - ugc::Version const version = ugc::Version::Latest) + ugc::Version const version) { if (!ugc.IsValid()) return ugc::Storage::SettingResult::InvalidUGC; @@ -118,6 +117,7 @@ ugc::Storage::SettingResult SetGenericUGCUpdate(UGCUpdate const & ugc, if (!GetUGCFileSize(offset)) offset = 0; + auto const & id = featureType.GetID(); index.m_mercator = mercator; index.m_type = type; index.m_matchingType = c.GetIndexForType(*optMatchingType); @@ -192,7 +192,7 @@ UGCUpdate Storage::GetUGCUpdate(FeatureID const & id) const Storage::SettingResult Storage::SetUGCUpdate(FeatureID const & id, UGCUpdate const & ugc) { auto const feature = GetFeature(id); - return SetGenericUGCUpdate(ugc, *feature, id, m_indexes, m_numberOfDeleted, Version::V1); + return SetGenericUGCUpdate(ugc, *feature, m_indexes, m_numberOfDeleted, Version::V1); } void Storage::Load() @@ -221,7 +221,12 @@ void Storage::Load() ++m_numberOfDeleted; } - // We assume there is no situation when indexes from different version are stored in the vector + Migrate(indexFilePath); +} + +void Storage::Migrate(string const & indexFilePath) +{ + // We assume there is no situation when indexes from different versions are stored in the vector. if (m_indexes.front().m_version == IndexVersion::Latest) return; @@ -234,7 +239,7 @@ void Storage::Load() LOG(LINFO, ("Index migration successful")); auto const newPath = indexFilePath + ".v0"; my::RenameFileX(indexFilePath, newPath); - if (!SaveIndex()) + if (!SaveIndex(indexFilePath)) { my::RenameFileX(newPath, indexFilePath); LOG(LWARNING, ("Saving index file after indexes migration failed")); @@ -243,13 +248,13 @@ void Storage::Load() } } -bool Storage::SaveIndex() const +bool Storage::SaveIndex(std::string const & pathToTargetFile /* = "" */) const { if (m_indexes.empty()) return false; + auto const indexFilePath = pathToTargetFile.empty() ? GetIndexFilePath() : pathToTargetFile; auto const jsonData = SerializeIndexes(m_indexes); - auto const indexFilePath = GetIndexFilePath(); try { FileWriter w(indexFilePath); @@ -443,7 +448,26 @@ Storage::SettingResult Storage::SetUGCUpdateForTesting(FeatureID const & id, v0::UGCUpdate const & ugc) { auto const feature = GetFeature(id); - return SetGenericUGCUpdate(ugc, *feature, id, m_indexes, m_numberOfDeleted, Version::V0); + return SetGenericUGCUpdate(ugc, *feature, m_indexes, m_numberOfDeleted, Version::V0); +} + +void Storage::LoadForTesting(std::string const & testIndexFilePath) +{ + string data; + try + { + FileReader r(testIndexFilePath); + r.ReadAsString(data); + } + catch (FileReader::Exception const & exception) + { + LOG(LWARNING, (exception.what())); + return; + } + + CHECK(!data.empty(), ()); + DeserializeIndexes(data, m_indexes); + Migrate(testIndexFilePath); } } // namespace ugc diff --git a/ugc/storage.hpp b/ugc/storage.hpp index 53d1908bc1..6010f20a55 100644 --- a/ugc/storage.hpp +++ b/ugc/storage.hpp @@ -28,7 +28,7 @@ public: }; SettingResult SetUGCUpdate(FeatureID const & id, UGCUpdate const & ugc); - bool SaveIndex() const; + bool SaveIndex(std::string const & pathToTargetFile = "") const; std::string GetUGCToSend() const; void MarkAllAsSynchronized(); void Defragmentation(); @@ -39,10 +39,12 @@ public: UpdateIndexes const & GetIndexesForTesting() const { return m_indexes; } size_t GetNumberOfDeletedForTesting() const { return m_numberOfDeleted; } SettingResult SetUGCUpdateForTesting(FeatureID const & id, v0::UGCUpdate const & ugc); + void LoadForTesting(std::string const & testIndexFilePath); private: uint64_t UGCSizeAtIndex(size_t const indexPosition) const; std::unique_ptr GetFeature(FeatureID const & id) const; + void Migrate(std::string const & indexFilePath); Index const & m_index; UpdateIndexes m_indexes; diff --git a/ugc/ugc_tests/CMakeLists.txt b/ugc/ugc_tests/CMakeLists.txt index 1918edcc63..1126623722 100644 --- a/ugc/ugc_tests/CMakeLists.txt +++ b/ugc/ugc_tests/CMakeLists.txt @@ -4,8 +4,8 @@ include_directories(${OMIM_ROOT}/3party/jansson/src) set( SRC - serdes_tests.cpp serdes_binary_tests.cpp + serdes_tests.cpp storage_tests.cpp utils.cpp utils.hpp diff --git a/ugc/ugc_tests/storage_tests.cpp b/ugc/ugc_tests/storage_tests.cpp index b6f0d4a6c7..ce10551f3c 100644 --- a/ugc/ugc_tests/storage_tests.cpp +++ b/ugc/ugc_tests/storage_tests.cpp @@ -438,3 +438,32 @@ UNIT_CLASS_TEST(StorageTest, GetNumberOfUnsentSeparately) TEST_EQUAL(lightweight::GetNumberOfUnsentUGC(), 0, ()); TEST(DeleteIndexFile(), ()); } + +UNIT_TEST(UGC_IndexMigrationFromV0ToV1Smoke) +{ + auto & builder = MwmBuilder::Builder(); + builder.Build({}); + auto const versionString = "v0"; + auto const indexFileName = "index.json"; + auto const indexFilePath = my::JoinPath(GetPlatform().WritableDir(), "ugc_migration", "test_index", versionString, + indexFileName); + auto const v0IndexFilePath = indexFilePath + "." + versionString; + + Storage s(builder.GetIndex()); + s.LoadForTesting(indexFilePath); + uint64_t migratedIndexFileSize = 0; + uint64_t v0IndexFileSize = 0; + TEST(my::GetFileSize(indexFilePath, migratedIndexFileSize), ()); + TEST(my::GetFileSize(v0IndexFilePath, v0IndexFileSize), ()); + TEST_GREATER(migratedIndexFileSize, 0, ()); + TEST_GREATER(v0IndexFileSize, 0, ()); + auto const & indexes = s.GetIndexesForTesting(); + for (auto const & i : indexes) + { + TEST_EQUAL(static_cast(i.m_version), static_cast(IndexVersion::Latest), ()); + TEST(!i.m_synchronized, ()); + } + + my::DeleteFileX(indexFilePath); + my::RenameFileX(v0IndexFilePath, indexFilePath); +}