Code review fixes for guides

This commit is contained in:
Alex Zolotarev 2013-10-28 13:24:08 +03:00 committed by Alex Zolotarev
parent cade0f6a73
commit 35acc28bb5
3 changed files with 36 additions and 35 deletions

View file

@ -84,6 +84,12 @@ string DebugPrint(GuideInfo const & r)
return ss.str();
}
void GuidesManager::RestoreFromParsedData(int version, MapT & guidesInfo)
{
m_version = version;
m_file2Info.swap(guidesInfo);
}
bool GuidesManager::RestoreFromFile()
{
int resourcesVersion = -1, downloadedVersion = -1;
@ -93,7 +99,7 @@ bool GuidesManager::RestoreFromFile()
{
string json;
ReaderPtr<Reader>(pl.GetReader(GetDataFileName(), "r")).ReadAsString(json);
resourcesVersion = ValidateAndParseGuidesData(json, fromResources);
resourcesVersion = ParseGuidesData(json, fromResources);
}
catch (RootException const &)
{
@ -102,7 +108,7 @@ bool GuidesManager::RestoreFromFile()
{
string json;
ReaderPtr<Reader>(pl.GetReader(GetDataFileName(), "w")).ReadAsString(json);
downloadedVersion = ValidateAndParseGuidesData(json, fromDownloaded);
downloadedVersion = ParseGuidesData(json, fromDownloaded);
}
catch (RootException const &)
{
@ -111,14 +117,12 @@ bool GuidesManager::RestoreFromFile()
ASSERT_GREATER(resourcesVersion, 0, ());
if (downloadedVersion > resourcesVersion)
{
m_version = downloadedVersion;
m_file2Info.swap(fromDownloaded);
RestoreFromParsedData(downloadedVersion, fromDownloaded);
return true;
}
else if (resourcesVersion > downloadedVersion || resourcesVersion >= 0)
{
m_version = resourcesVersion;
m_file2Info.swap(fromResources);
RestoreFromParsedData(resourcesVersion, fromResources);
return true;
}
LOG(LWARNING, ("Guides descriptions were not loaded"));
@ -180,7 +184,7 @@ void GuidesManager::OnFinish(downloader::HttpRequest & request)
string const & data = request.Data();
// Sanity check if we forgot to update json version on servers
MapT tmpGuides;
int const downloadedVersion = ValidateAndParseGuidesData(data, tmpGuides);
int const downloadedVersion = ParseGuidesData(data, tmpGuides);
if (downloadedVersion > m_version && !m_file2Info.empty())
{
// Load into the memory even if we fail to save it later
@ -211,7 +215,7 @@ void GuidesManager::OnFinish(downloader::HttpRequest & request)
m_httpRequest.reset();
}
int GuidesManager::ValidateAndParseGuidesData(string const & jsonData, MapT & guidesInfo)
int GuidesManager::ParseGuidesData(string const & jsonData, MapT & guidesInfo)
{
guidesInfo.clear();
// 0 means "version" key is absent in json

View file

@ -36,18 +36,17 @@ string DebugPrint(GuideInfo const & r);
class GuidesManager : private noncopyable
{
/// For unit tests visibility
friend void UnitTest_Guides_SmokeTest();
friend void UnitTest_Guides_CorrectlyParseData();
friend void UnitTest_Guides_SaveRestoreFromFile();
friend void UnitTest_Guides_ComplexNames();
friend void UnitTest_Guides_CheckDataFiles();
/// @name Guides managment
//@{
public:
void UpdateGuidesData();
bool RestoreFromFile();
typedef map<string, GuideInfo> MapT;
/// @param[in] guidesInfo filled with correct info about guides on success
/// @return -1 if failed to parse or json version number otherwise. 0 means version is absent in json.
static int ParseGuidesData(string const & jsonData, MapT & guidesInfo);
void RestoreFromParsedData(int version, MapT & guidesInfo);
static string GetDataFileFullPath();
/// @param[in] id MWM file name without extension as a key.
bool GetGuideInfo(string const & id, GuideInfo & appInfo) const;
@ -59,16 +58,9 @@ public:
//@}
private:
typedef map<string, GuideInfo> MapT;
/// @param[in] guidesInfo filled with correct info about guides on success
/// @return -1 if failed to parse or json version number otherwise. 0 means version is absent in json.
int ValidateAndParseGuidesData(string const & jsonData, MapT & guidesInfo);
void OnFinish(downloader::HttpRequest & request);
static string GetGuidesDataUrl();
static string GetDataFileName();
static string GetDataFileFullPath();
/// Map from mwm file name (key) to guide info.
MapT m_file2Info;

View file

@ -26,13 +26,14 @@ UNIT_TEST(Guides_SmokeTest)
"} }";
GuidesManager::MapT data;
TEST_EQUAL(-1, manager.ValidateAndParseGuidesData("invalidtest", data), ());
TEST_EQUAL(0, manager.ValidateAndParseGuidesData("{}", data), ());
manager.m_file2Info.swap(data);
int version;
TEST_EQUAL(-1, version = manager.ParseGuidesData("invalidtest", data), ());
TEST_EQUAL(0, version = manager.ParseGuidesData("{}", data), ());
manager.RestoreFromParsedData(version, data);
TEST(!manager.GetGuideInfo("Guernsey", info), ());
TEST_EQUAL(2, manager.ValidateAndParseGuidesData(str, data), ());
manager.m_file2Info.swap(data);
TEST_EQUAL(2, version = manager.ParseGuidesData(str, data), ());
manager.RestoreFromParsedData(version, data);
TEST(manager.GetGuideInfo("Guernsey", info), ());
TEST(info.IsValid(), ());
@ -75,8 +76,9 @@ UNIT_TEST(Guides_CorrectlyParseData)
string invalidKeys[] = { "london", "Lond", "Isle", "Man" };
GuidesManager::MapT data;
TEST_EQUAL(2, manager.ValidateAndParseGuidesData(strLondonIsle, data), ());
manager.m_file2Info.swap(data);
int version;
TEST_EQUAL(2, version = manager.ParseGuidesData(strLondonIsle, data), ());
manager.RestoreFromParsedData(version, data);
for (size_t i = 0; i < ARRAY_SIZE(validKeys); ++i)
{
TEST(manager.GetGuideInfo(validKeys[i], info), (i));
@ -125,8 +127,9 @@ UNIT_TEST(Guides_ComplexNames)
string invalidKeys[] = { "Не Беларусь", "Côte_d'IvoireCôte_d'IvoireCôte_d'Ivoire" };
GuidesManager::MapT data;
TEST_EQUAL(123456, manager.ValidateAndParseGuidesData(strLondonIsle, data), ());
manager.m_file2Info.swap(data);
int version;
TEST_EQUAL(123456, version = manager.ParseGuidesData(strLondonIsle, data), ());
manager.RestoreFromParsedData(version, data);
for (size_t i = 0; i < ARRAY_SIZE(validKeys); ++i)
{
TEST(manager.GetGuideInfo(validKeys[i], info), (i));
@ -158,8 +161,9 @@ UNIT_TEST(Guides_SaveRestoreFromFile)
"} }";
GuidesManager::MapT data;
TEST_EQUAL(2, manager.ValidateAndParseGuidesData(strLondonIsle, data), ());
manager.m_file2Info.swap(data);
int version;
TEST_EQUAL(2, version = manager.ParseGuidesData(strLondonIsle, data), ());
manager.RestoreFromParsedData(version, data);
string const path = manager.GetDataFileFullPath();
{
@ -202,8 +206,9 @@ UNIT_TEST(Guides_CheckDataFiles)
reader.ReadAsString(str);
GuidesManager::MapT data;
TEST_LESS(0, manager.ValidateAndParseGuidesData(str, data), ());
manager.m_file2Info.swap(data);
int version;
TEST_LESS(0, version = manager.ParseGuidesData(str, data), ());
manager.RestoreFromParsedData(version, data);
TEST(manager.GetGuideInfo("UK_England", info), ());
TEST(info.IsValid(), ());
}