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..0b2d063ff2595f87123914b71f3bb42ef0129b09 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-da39a3ee5e6b4b0d3255bfef95601890afd80709"; |
+const char kAlternativeSettingsDigest[] = |
+ "1-7da4aa4eb38a8bd3e330e3751cc0899924499134"; |
+ |
+void AddSettingsToResponse( |
+ checkin_proto::AndroidCheckinResponse& checkin_response, |
+ const GServicesSettings::SettingsMap& settings, |
+ bool settings_diff) { |
+ for (GServicesSettings::SettingsMap::const_iterator iter = 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 |
@@ -31,23 +49,12 @@ class GServicesSettingsTest : public testing::Test { |
GServicesSettingsTest(); |
virtual ~GServicesSettingsTest(); |
- virtual void SetUp() OVERRIDE; |
- |
void CheckAllSetToDefault(); |
- void CheckAllSetToAlternative(); |
- void SetWithAlternativeSettings( |
- checkin_proto::AndroidCheckinResponse& checkin_response); |
GServicesSettings& settings() { |
return gserivces_settings_; |
} |
- const std::map<std::string, std::string>& alternative_settings() { |
- return alternative_settings_; |
- } |
- |
- std::map<std::string, std::string> alternative_settings_; |
- |
private: |
GServicesSettings gserivces_settings_; |
}; |
@@ -58,159 +65,273 @@ GServicesSettingsTest::GServicesSettingsTest() |
GServicesSettingsTest::~GServicesSettingsTest() {} |
-void GServicesSettingsTest::SetUp() { |
- alternative_settings_["checkin_interval"] = |
- base::Int64ToString(kAlternativeCheckinInterval); |
- alternative_settings_["checkin_url"] = kAlternativeCheckinURL; |
- alternative_settings_["gcm_hostname"] = kAlternativeMCSHostname; |
- alternative_settings_["gcm_secure_port"] = |
- base::IntToString(kAlternativeMCSSecurePort); |
- alternative_settings_["gcm_registration_url"] = kAlternativeRegistrationURL; |
-} |
- |
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()); |
-} |
- |
-void GServicesSettingsTest::CheckAllSetToAlternative() { |
- EXPECT_EQ(base::TimeDelta::FromSeconds(kAlternativeCheckinInterval), |
- settings().checkin_interval()); |
- EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().checkin_url()); |
- EXPECT_EQ(GURL("https://alternative.gcm.host:7777"), |
- settings().mcs_main_endpoint()); |
- EXPECT_EQ(GURL("https://alternative.gcm.host:443"), |
- settings().mcs_fallback_endpoint()); |
- EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().registration_url()); |
-} |
- |
-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); |
- } |
+ settings().GetMCSFallbackEndpoint()); |
+ EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); |
} |
// 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()); |
+ EXPECT_EQ(kDefaultSettingsDigest, |
+ GServicesSettings::CalculateDigest(settings().settings_map())); |
+} |
+ |
+// Verifies digest calculation for the sample provided by protocol owners. |
+TEST_F(GServicesSettingsTest, CalculateDigest) { |
+ GServicesSettings::SettingsMap settings_map; |
+ settings_map["android_id"] = "55XXXXXXXXXXXXXXXX0"; |
+ settings_map["checkin_interval"] = "86400"; |
+ settings_map["checkin_url"] = |
+ "https://fake.address.google.com/canary/checkin"; |
+ settings_map["chrome_device"] = "1"; |
+ settings_map["device_country"] = "us"; |
+ settings_map["gcm_hostname"] = "fake.address.google.com"; |
+ settings_map["gcm_secure_port"] = "443"; |
+ |
+ EXPECT_EQ("1-33381ccd1cf5791dc0e6dfa234266fa9f1259197", |
+ GServicesSettings::CalculateDigest(settings_map)); |
} |
// Verifies that settings are not updated when load result is empty. |
TEST_F(GServicesSettingsTest, UpdateFromEmptyLoadResult) { |
GCMStore::LoadResult result; |
- result.gservices_digest = "digest_value"; |
+ result.gservices_digest = ""; |
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. |
+// Verifies that settings are not when digest value does not match. |
TEST_F(GServicesSettingsTest, UpdateFromLoadResultWithSettingMissing) { |
GCMStore::LoadResult result; |
- result.gservices_settings = alternative_settings(); |
+ result.gservices_settings["checkin_internval"] = "100000"; |
result.gservices_digest = "digest_value"; |
- result.gservices_settings.erase("gcm_hostname"); |
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_settings["checkin_interval"] = |
+ base::Int64ToString(kAlternativeCheckinInterval); |
+ result.gservices_settings["checkin_url"] = kAlternativeCheckinURL; |
+ result.gservices_settings["gcm_hostname"] = kAlternativeMCSHostname; |
+ result.gservices_settings["gcm_secure_port"] = |
+ base::IntToString(kAlternativeMCSSecurePort); |
+ result.gservices_settings["gcm_registration_url"] = |
+ kAlternativeRegistrationURL; |
+ result.gservices_digest = kAlternativeSettingsDigest; |
settings().UpdateFromLoadResult(result); |
- CheckAllSetToAlternative(); |
- EXPECT_EQ("digest_value", settings().digest()); |
+ EXPECT_EQ(base::TimeDelta::FromSeconds(kAlternativeCheckinInterval), |
+ settings().GetCheckinInterval()); |
+ EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().GetCheckinURL()); |
+ EXPECT_EQ(GURL("https://alternative.gcm.host:7777"), |
+ settings().GetMCSMainEndpoint()); |
+ EXPECT_EQ(GURL("https://alternative.gcm.host:443"), |
+ settings().GetMCSFallbackEndpoint()); |
+ EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().GetRegistrationURL()); |
+ EXPECT_EQ(GServicesSettings::CalculateDigest(result.gservices_settings), |
+ settings().digest()); |
} |
-// Verifies that the settings are set correctly after parsing a checkin |
-// response. |
-TEST_F(GServicesSettingsTest, UpdateFromCheckinResponse) { |
+// Verifies that the checkin interval is updated to minimum if the original |
+// value is less than minimum. |
+TEST_F(GServicesSettingsTest, CheckinResponseMinimumCheckinInterval) { |
+ // Setting the checkin interval to less than minimum. |
checkin_proto::AndroidCheckinResponse checkin_response; |
- |
- checkin_response.set_digest("digest_value"); |
- SetWithAlternativeSettings(checkin_response); |
+ GServicesSettings::SettingsMap new_settings; |
+ new_settings["checkin_interval"] = "3600"; |
+ AddSettingsToResponse(checkin_response, new_settings, false); |
EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
- CheckAllSetToAlternative(); |
- EXPECT_EQ(alternative_settings_, settings().GetSettingsMap()); |
- EXPECT_EQ("digest_value", settings().digest()); |
+ EXPECT_EQ(GServicesSettings::MinimumCheckinInterval(), |
+ settings().GetCheckinInterval()); |
+ EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), |
+ settings().digest()); |
} |
-// Verifies that the checkin interval is updated to minimum if the original |
-// value is less than minimum. |
-TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseMinimumCheckinInterval) { |
+// Verifies that default checkin interval can be selectively overwritten. |
+TEST_F(GServicesSettingsTest, CheckinResponseUpdateCheckinInterval) { |
checkin_proto::AndroidCheckinResponse checkin_response; |
+ GServicesSettings::SettingsMap new_settings; |
+ new_settings["checkin_interval"] = "86400"; |
+ AddSettingsToResponse(checkin_response, new_settings, false); |
- checkin_response.set_digest("digest_value"); |
- // Setting the checkin interval to less than minimum. |
- alternative_settings_["checkin_interval"] = base::IntToString(3600); |
- SetWithAlternativeSettings(checkin_response); |
+ EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
+ |
+ // Only the checkin interval was updated: |
+ EXPECT_EQ(base::TimeDelta::FromSeconds(86400), |
+ settings().GetCheckinInterval()); |
+ |
+ // Other settings still set to default. |
+ EXPECT_EQ(GURL("https://mtalk.google.com:5228"), |
+ settings().GetMCSMainEndpoint()); |
+ EXPECT_EQ(GURL("https://mtalk.google.com:443"), |
+ settings().GetMCSFallbackEndpoint()); |
+ EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); |
+ EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); |
+ |
+ EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), |
+ settings().digest()); |
+} |
+ |
+// Verifies that default registration URL can be selectively overwritten. |
+TEST_F(GServicesSettingsTest, CheckinResponseUpdateRegistrationURL) { |
+ checkin_proto::AndroidCheckinResponse checkin_response; |
+ GServicesSettings::SettingsMap new_settings; |
+ new_settings["gcm_registration_url"] = "https://new.registration.url"; |
+ AddSettingsToResponse(checkin_response, new_settings, false); |
EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
- EXPECT_EQ(GServicesSettings::MinimumCheckinInterval(), |
- settings().checkin_interval()); |
- EXPECT_EQ("digest_value", settings().digest()); |
+ // Only the registration URL was updated: |
+ EXPECT_EQ(GURL("https://new.registration.url"), |
+ settings().GetRegistrationURL()); |
+ |
+ // Other settings still set to default. |
+ EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), |
+ settings().GetCheckinInterval()); |
+ EXPECT_EQ(GURL("https://mtalk.google.com:5228"), |
+ settings().GetMCSMainEndpoint()); |
+ EXPECT_EQ(GURL("https://mtalk.google.com:443"), |
+ settings().GetMCSFallbackEndpoint()); |
+ EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); |
+ |
+ EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), |
+ settings().digest()); |
} |
-// Verifies that settings are not updated when one of them is missing. |
-TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseWithSettingMissing) { |
+// Verifies that default checkin URL can be selectively overwritten. |
+TEST_F(GServicesSettingsTest, CheckinResponseUpdateCheckinURL) { |
checkin_proto::AndroidCheckinResponse checkin_response; |
+ GServicesSettings::SettingsMap new_settings; |
+ new_settings["checkin_url"] = "https://new.checkin.url"; |
+ AddSettingsToResponse(checkin_response, new_settings, false); |
- checkin_response.set_digest("digest_value"); |
- alternative_settings_.erase("gcm_hostname"); |
- SetWithAlternativeSettings(checkin_response); |
+ EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
- EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); |
+ // Only the checkin URL was updated: |
+ EXPECT_EQ(GURL("https://new.checkin.url"), settings().GetCheckinURL()); |
- CheckAllSetToDefault(); |
- EXPECT_EQ(std::string(), settings().digest()); |
+ // Other settings still set to default. |
+ EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), |
+ settings().GetCheckinInterval()); |
+ EXPECT_EQ(GURL("https://mtalk.google.com:5228"), |
+ settings().GetMCSMainEndpoint()); |
+ EXPECT_EQ(GURL("https://mtalk.google.com:443"), |
+ settings().GetMCSFallbackEndpoint()); |
+ EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); |
+ |
+ EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), |
+ settings().digest()); |
} |
-// Verifies that no update is done, when a checkin response misses digest. |
-TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseNoDigest) { |
+// Verifies that default MCS hostname can be selectively overwritten. |
+TEST_F(GServicesSettingsTest, CheckinResponseUpdateMCSHostname) { |
checkin_proto::AndroidCheckinResponse checkin_response; |
+ GServicesSettings::SettingsMap new_settings; |
+ new_settings["gcm_hostname"] = "new.gcm.hostname"; |
+ AddSettingsToResponse(checkin_response, new_settings, false); |
- SetWithAlternativeSettings(checkin_response); |
- EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); |
+ EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
- CheckAllSetToDefault(); |
- EXPECT_EQ(std::string(), settings().digest()); |
+ // Only the MCS endpoints were updated: |
+ EXPECT_EQ(GURL("https://new.gcm.hostname:5228"), |
+ settings().GetMCSMainEndpoint()); |
+ EXPECT_EQ(GURL("https://new.gcm.hostname:443"), |
+ settings().GetMCSFallbackEndpoint()); |
+ |
+ // Other settings still set to default. |
+ EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), |
+ settings().GetCheckinInterval()); |
+ EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); |
+ EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); |
+ |
+ EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), |
+ 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_settings = alternative_settings(); |
- settings().UpdateFromLoadResult(load_result); |
+// Verifies that default MCS secure port can be selectively overwritten. |
+TEST_F(GServicesSettingsTest, CheckinResponseUpdateMCSSecurePort) { |
+ checkin_proto::AndroidCheckinResponse checkin_response; |
+ GServicesSettings::SettingsMap new_settings; |
+ new_settings["gcm_secure_port"] = "5229"; |
+ AddSettingsToResponse(checkin_response, new_settings, false); |
+ |
+ EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
+ |
+ // Only the main MCS endpoint was updated: |
+ EXPECT_EQ(GURL("https://mtalk.google.com:5229"), |
+ settings().GetMCSMainEndpoint()); |
+ // Other settings still set to default. |
+ EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), |
+ settings().GetCheckinInterval()); |
+ EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); |
+ EXPECT_EQ(GURL("https://mtalk.google.com:443"), |
+ settings().GetMCSFallbackEndpoint()); |
+ EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); |
+ |
+ EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), |
+ 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("old_digest"); |
- SetWithAlternativeSettings(checkin_response); |
- EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); |
- CheckAllSetToAlternative(); |
- EXPECT_EQ("old_digest", settings().digest()); |
+ // Only the new settings will be included in the response with settings diff. |
+ GServicesSettings::SettingsMap settings_diff; |
+ settings_diff["new_setting_1"] = "new_setting_1_value"; |
+ settings_diff["new_setting_2"] = "new_setting_2_value"; |
+ settings_diff["gcm_secure_port"] = "5229"; |
+ |
+ // Full settings are necessary to calculate digest. |
+ GServicesSettings::SettingsMap full_settings(settings_diff); |
+ std::string digest = GServicesSettings::CalculateDigest(full_settings); |
+ |
+ checkin_response.Clear(); |
+ AddSettingsToResponse(checkin_response, settings_diff, true); |
+ EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
+ EXPECT_EQ(full_settings, settings().settings_map()); |
+ // Default setting overwritten by settings diff. |
+ EXPECT_EQ(GURL("https://mtalk.google.com:5229"), |
+ settings().GetMCSMainEndpoint()); |
+ |
+ // Setting up diff removing some of the values (including default setting). |
+ settings_diff.clear(); |
+ settings_diff["delete_new_setting_1"] = ""; |
+ settings_diff["delete_gcm_secure_port"] = ""; |
+ 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.erase(full_settings.find("gcm_secure_port")); |
+ full_settings["new_setting_3"] = "new_setting_3_value"; |
+ digest = GServicesSettings::CalculateDigest(full_settings); |
+ |
+ checkin_response.Clear(); |
+ AddSettingsToResponse(checkin_response, settings_diff, true); |
+ EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); |
+ EXPECT_EQ(full_settings, settings().settings_map()); |
+ // Default setting back to norm. |
+ EXPECT_EQ(GURL("https://mtalk.google.com:5228"), |
+ settings().GetMCSMainEndpoint()); |
} |
} // namespace gcm |