Chromium Code Reviews| Index: google_apis/gcm/engine/gservices_settings_unittest.cc |
| diff --git a/google_apis/gcm/engine/gservices_settings_unittest.cc b/google_apis/gcm/engine/gservices_settings_unittest.cc |
| index 12623e348128c8af6b7ffa78fbdde76bd4749b12..f5466a4fd3a2a03f42de82496f0ef3d85299693a 100644 |
| --- a/google_apis/gcm/engine/gservices_settings_unittest.cc |
| +++ b/google_apis/gcm/engine/gservices_settings_unittest.cc |
| @@ -23,6 +23,24 @@ const int64 kDefaultCheckinInterval = 2 * 24 * 60 * 60; // seconds = 2 days. |
| const char kDefaultCheckinURL[] = "https://android.clients.google.com/checkin"; |
| const char kDefaultRegistrationURL[] = |
| "https://android.clients.google.com/c2dm/register3"; |
| +const char kDefaultSettingsDigest[] = |
| + "1-4C598686664FF131F439C522AB7B355A65819B1F"; |
| +const char kAlternativeSettingsDigest[] = |
| + "1-7DA4AA4EB38A8BD3E330E3751CC0899924499134"; |
| + |
| +void AddSettingsToResponse( |
| + checkin_proto::AndroidCheckinResponse& checkin_response, |
| + const std::map<std::string, std::string>& settings, |
|
jianli
2014/05/14 22:04:30
use GServicesSettings::SettingsMap
fgorski
2014/05/16 20:48:47
Done.
|
| + bool settings_diff) { |
| + for (std::map<std::string, std::string>::const_iterator iter = |
|
jianli
2014/05/14 22:04:30
ditto
fgorski
2014/05/16 20:48:47
Done.
|
| + settings.begin(); |
| + iter != settings.end(); ++iter) { |
| + checkin_proto::GservicesSetting* setting = checkin_response.add_setting(); |
| + setting->set_name(iter->first); |
| + setting->set_value(iter->second); |
| + } |
| + checkin_response.set_settings_diff(settings_diff); |
| +} |
| } // namespace |
| @@ -70,41 +88,48 @@ void GServicesSettingsTest::SetUp() { |
| void GServicesSettingsTest::CheckAllSetToDefault() { |
| EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), |
| - settings().checkin_interval()); |
| - EXPECT_EQ(GURL(kDefaultCheckinURL), settings().checkin_url()); |
| + settings().GetCheckinInterval()); |
| + EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); |
| EXPECT_EQ(GURL("https://mtalk.google.com:5228"), |
| - settings().mcs_main_endpoint()); |
| + settings().GetMCSMainEndpoint()); |
| EXPECT_EQ(GURL("https://mtalk.google.com:443"), |
| - settings().mcs_fallback_endpoint()); |
| - EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().registration_url()); |
| + settings().GetMCSFallbackEndpoint()); |
| + EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); |
| } |
| void GServicesSettingsTest::CheckAllSetToAlternative() { |
| EXPECT_EQ(base::TimeDelta::FromSeconds(kAlternativeCheckinInterval), |
| - settings().checkin_interval()); |
| - EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().checkin_url()); |
| + settings().GetCheckinInterval()); |
| + EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().GetCheckinURL()); |
| EXPECT_EQ(GURL("https://alternative.gcm.host:7777"), |
| - settings().mcs_main_endpoint()); |
| + settings().GetMCSMainEndpoint()); |
| EXPECT_EQ(GURL("https://alternative.gcm.host:443"), |
| - settings().mcs_fallback_endpoint()); |
| - EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().registration_url()); |
| + settings().GetMCSFallbackEndpoint()); |
| + EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().GetRegistrationURL()); |
| } |
| void GServicesSettingsTest::SetWithAlternativeSettings( |
| checkin_proto::AndroidCheckinResponse& checkin_response) { |
| - for (std::map<std::string, std::string>::const_iterator iter = |
| - alternative_settings_.begin(); |
| - iter != alternative_settings_.end(); ++iter) { |
| - checkin_proto::GservicesSetting* setting = checkin_response.add_setting(); |
| - setting->set_name(iter->first); |
| - setting->set_value(iter->second); |
| - } |
| + AddSettingsToResponse(checkin_response, alternative_settings_, false); |
| } |
| // Verifies default values of the G-services settings and settings digest. |
| TEST_F(GServicesSettingsTest, DefaultSettingsAndDigest) { |
| CheckAllSetToDefault(); |
| - EXPECT_EQ(std::string(), settings().digest()); |
| + EXPECT_EQ(kDefaultSettingsDigest, settings().digest()); |
| +} |
| + |
| +// Verifies digest calculation for default settings. |
| +TEST_F(GServicesSettingsTest, CalculateDigestForDefaultSettings) { |
| + CheckAllSetToDefault(); |
| + EXPECT_EQ(kDefaultSettingsDigest, |
| + GServicesSettings::CalculateDigest(settings().settings_map())); |
| +} |
| + |
| +// Verifies digest calculation for aternative settings. |
| +TEST_F(GServicesSettingsTest, CalculateDigestForAternativeSettings) { |
| + EXPECT_EQ(kAlternativeSettingsDigest, |
| + GServicesSettings::CalculateDigest(alternative_settings_)); |
| } |
| // Verifies that settings are not updated when load result is empty. |
| @@ -114,7 +139,7 @@ TEST_F(GServicesSettingsTest, UpdateFromEmptyLoadResult) { |
| settings().UpdateFromLoadResult(result); |
| CheckAllSetToDefault(); |
| - EXPECT_EQ(std::string(), settings().digest()); |
| + EXPECT_EQ(kDefaultSettingsDigest, settings().digest()); |
| } |
| // Verifies that settings are not updated when one of them is missing. |
| @@ -126,18 +151,18 @@ TEST_F(GServicesSettingsTest, UpdateFromLoadResultWithSettingMissing) { |
| settings().UpdateFromLoadResult(result); |
| CheckAllSetToDefault(); |
| - EXPECT_EQ(std::string(), settings().digest()); |
| + EXPECT_EQ(kDefaultSettingsDigest, settings().digest()); |
| } |
| // Verifies that the settings are set correctly based on the load result. |
| TEST_F(GServicesSettingsTest, UpdateFromLoadResult) { |
| GCMStore::LoadResult result; |
| result.gservices_settings = alternative_settings(); |
| - result.gservices_digest = "digest_value"; |
| + result.gservices_digest = kAlternativeSettingsDigest; |
| settings().UpdateFromLoadResult(result); |
| CheckAllSetToAlternative(); |
| - EXPECT_EQ("digest_value", settings().digest()); |
| + EXPECT_EQ(kAlternativeSettingsDigest, settings().digest()); |
| } |
| // Verifies that the settings are set correctly after parsing a checkin |
| @@ -145,14 +170,14 @@ TEST_F(GServicesSettingsTest, UpdateFromLoadResult) { |
| TEST_F(GServicesSettingsTest, UpdateFromCheckinResponse) { |
| checkin_proto::AndroidCheckinResponse checkin_response; |
| - checkin_response.set_digest("digest_value"); |
| + checkin_response.set_digest(kAlternativeSettingsDigest); |
| SetWithAlternativeSettings(checkin_response); |
| EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
| CheckAllSetToAlternative(); |
| - EXPECT_EQ(alternative_settings_, settings().GetSettingsMap()); |
| - EXPECT_EQ("digest_value", settings().digest()); |
| + EXPECT_EQ(alternative_settings_, settings().settings_map()); |
| + EXPECT_EQ(kAlternativeSettingsDigest, settings().digest()); |
| } |
| // Verifies that the checkin interval is updated to minimum if the original |
| @@ -160,7 +185,8 @@ TEST_F(GServicesSettingsTest, UpdateFromCheckinResponse) { |
| TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseMinimumCheckinInterval) { |
| checkin_proto::AndroidCheckinResponse checkin_response; |
| - checkin_response.set_digest("digest_value"); |
| + const char digest[] = "1-436646257E0FAC3F0D20C866B0DA46C21DCD1FA2"; |
| + checkin_response.set_digest(digest); |
| // Setting the checkin interval to less than minimum. |
| alternative_settings_["checkin_interval"] = base::IntToString(3600); |
| SetWithAlternativeSettings(checkin_response); |
| @@ -168,22 +194,22 @@ TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseMinimumCheckinInterval) { |
| EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
| EXPECT_EQ(GServicesSettings::MinimumCheckinInterval(), |
| - settings().checkin_interval()); |
| - EXPECT_EQ("digest_value", settings().digest()); |
| + settings().GetCheckinInterval()); |
| + EXPECT_EQ(digest, settings().digest()); |
| } |
| // Verifies that settings are not updated when one of them is missing. |
| TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseWithSettingMissing) { |
| checkin_proto::AndroidCheckinResponse checkin_response; |
| - checkin_response.set_digest("digest_value"); |
| + checkin_response.set_digest(kAlternativeSettingsDigest); |
| alternative_settings_.erase("gcm_hostname"); |
| SetWithAlternativeSettings(checkin_response); |
| EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); |
| CheckAllSetToDefault(); |
| - EXPECT_EQ(std::string(), settings().digest()); |
| + EXPECT_EQ(kDefaultSettingsDigest, settings().digest()); |
| } |
| // Verifies that no update is done, when a checkin response misses digest. |
| @@ -194,23 +220,88 @@ TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseNoDigest) { |
| EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); |
| CheckAllSetToDefault(); |
| - EXPECT_EQ(std::string(), settings().digest()); |
| + EXPECT_EQ(kDefaultSettingsDigest, settings().digest()); |
| } |
| // Verifies that no update is done, when a checkin response digest is the same. |
| TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseSameDigest) { |
| GCMStore::LoadResult load_result; |
| - load_result.gservices_digest = "old_digest"; |
| + load_result.gservices_digest = kAlternativeSettingsDigest; |
| load_result.gservices_settings = alternative_settings(); |
| settings().UpdateFromLoadResult(load_result); |
| checkin_proto::AndroidCheckinResponse checkin_response; |
| - checkin_response.set_digest("old_digest"); |
| + checkin_response.set_digest(kAlternativeSettingsDigest); |
| SetWithAlternativeSettings(checkin_response); |
| EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); |
| CheckAllSetToAlternative(); |
| - EXPECT_EQ("old_digest", settings().digest()); |
| + EXPECT_EQ(kAlternativeSettingsDigest, settings().digest()); |
| +} |
| + |
| +// Update from checkin response should also do incremental update for both cases |
| +// where some settings are removed or added. |
| +TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseSettingsDiff) { |
| + checkin_proto::AndroidCheckinResponse checkin_response; |
| + checkin_response.set_digest(kAlternativeSettingsDigest); |
| + SetWithAlternativeSettings(checkin_response); |
| + EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
| + |
| + // Only the new settings will be included in the response with settings diff. |
| + std::map<std::string, std::string> settings_diff; |
| + settings_diff["new_setting_1"] = "new_setting_1_value"; |
| + settings_diff["new_setting_2"] = "new_setting_2_value"; |
| + |
| + // Full settings are necessary to calculate digest. |
| + std::map<std::string, std::string> full_settings(alternative_settings()); |
| + full_settings.insert(settings_diff.begin(), settings_diff.end()); |
| + std::string digest = GServicesSettings::CalculateDigest(full_settings); |
| + |
| + checkin_response.Clear(); |
| + AddSettingsToResponse(checkin_response, settings_diff, true); |
| + checkin_response.set_digest(digest); |
| + EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
| + EXPECT_EQ(full_settings, settings().settings_map()); |
| + |
| + // Setting up diff removing some of the values. |
| + settings_diff.clear(); |
| + settings_diff["delete_new_setting_1"] = ""; |
| + settings_diff["new_setting_3"] = "new_setting_3_value"; |
| + |
| + // Updating full settings to calculate digest. |
| + full_settings.erase(full_settings.find("new_setting_1")); |
| + full_settings["new_setting_3"] = "new_setting_3_value"; |
| + digest = GServicesSettings::CalculateDigest(full_settings); |
| + |
| + checkin_response.Clear(); |
| + AddSettingsToResponse(checkin_response, settings_diff, true); |
| + checkin_response.set_digest(digest); |
| + EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
| + EXPECT_EQ(full_settings, settings().settings_map()); |
| +} |
| + |
| +// Update from checkin response should fail when one of the mandatory settings |
| +// is deleted. |
| +TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseRequiredSettings) { |
| + checkin_proto::AndroidCheckinResponse checkin_response; |
| + checkin_response.set_digest(kAlternativeSettingsDigest); |
| + SetWithAlternativeSettings(checkin_response); |
| + EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
| + |
| + // Settings diff attempts to remove a mandatory setting. |
| + std::map<std::string, std::string> settings_diff; |
| + settings_diff["delete_checkin_interval"] = ""; |
| + |
| + // Full settings are necessary to calculate digest. |
| + std::map<std::string, std::string> full_settings(alternative_settings()); |
| + full_settings.erase(full_settings.find("checkin_interval")); |
| + std::string digest = GServicesSettings::CalculateDigest(full_settings); |
| + |
| + checkin_response.Clear(); |
| + AddSettingsToResponse(checkin_response, settings_diff, true); |
| + checkin_response.set_digest(digest); |
| + EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); |
| + EXPECT_EQ(alternative_settings(), settings().settings_map()); |
| } |
| } // namespace gcm |