diff options
author | fgorski@chromium.org <fgorski@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-20 06:53:10 +0000 |
---|---|---|
committer | fgorski@chromium.org <fgorski@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-20 06:53:10 +0000 |
commit | aae544d7d62200fc474c7c41c7eb3fd640af375a (patch) | |
tree | 827e8d144b57950749a55ab5019429131088102a /google_apis | |
parent | 65382427d87ca419b4cb7310887a51ebd2bcc5a0 (diff) | |
download | chromium_src-aae544d7d62200fc474c7c41c7eb3fd640af375a.zip chromium_src-aae544d7d62200fc474c7c41c7eb3fd640af375a.tar.gz chromium_src-aae544d7d62200fc474c7c41c7eb3fd640af375a.tar.bz2 |
G-services settings v3 implementation
G-services settings v3 implementation:
* Adding calculation of settings based on a diff from server
* Adding calculation of settings digest
* Changing internal representation of settings to string->string map
in order to be able to calculate the digest properly.
* Individual settings are calculated when needed.
R=jianli@chromium.org,zea@chromium.org
BUG=359256
Review URL: https://codereview.chromium.org/288433002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@271600 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'google_apis')
-rw-r--r-- | google_apis/gcm/engine/checkin_request.cc | 2 | ||||
-rw-r--r-- | google_apis/gcm/engine/gservices_settings.cc | 381 | ||||
-rw-r--r-- | google_apis/gcm/engine/gservices_settings.h | 43 | ||||
-rw-r--r-- | google_apis/gcm/engine/gservices_settings_unittest.cc | 327 | ||||
-rw-r--r-- | google_apis/gcm/gcm_client_impl.cc | 31 | ||||
-rw-r--r-- | google_apis/gcm/gcm_client_impl_unittest.cc | 48 |
6 files changed, 547 insertions, 285 deletions
diff --git a/google_apis/gcm/engine/checkin_request.cc b/google_apis/gcm/engine/checkin_request.cc index 7b3ff22..e7490e5 100644 --- a/google_apis/gcm/engine/checkin_request.cc +++ b/google_apis/gcm/engine/checkin_request.cc @@ -17,7 +17,7 @@ namespace gcm { namespace { const char kRequestContentType[] = "application/x-protobuf"; -const int kRequestVersionValue = 2; +const int kRequestVersionValue = 3; const int kDefaultUserSerialNumber = 0; // This enum is also used in an UMA histogram (GCMCheckinRequestStatus diff --git a/google_apis/gcm/engine/gservices_settings.cc b/google_apis/gcm/engine/gservices_settings.cc index 55cfa39..4e98972 100644 --- a/google_apis/gcm/engine/gservices_settings.cc +++ b/google_apis/gcm/engine/gservices_settings.cc @@ -5,7 +5,9 @@ #include "google_apis/gcm/engine/gservices_settings.h" #include "base/bind.h" +#include "base/sha1.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" namespace { @@ -28,12 +30,142 @@ const int kDefaultMCSMainSecurePort = 5228; const int kDefaultMCSFallbackSecurePort = 443; const char kDefaultRegistrationURL[] = "https://android.clients.google.com/c2dm/register3"; +// Settings that are to be deleted are marked with this prefix in checkin +// response. +const char kDeleteSettingPrefix[] = "delete_"; +// Settings digest starts with verison number followed by '-'. +const char kDigestVersionPrefix[] = "1-"; const char kMCSEnpointTemplate[] = "https://%s:%d"; +const int kMaxSecurePort = 65535; std::string MakeMCSEndpoint(const std::string& mcs_hostname, int port) { return base::StringPrintf(kMCSEnpointTemplate, mcs_hostname.c_str(), port); } +// Default settings can be omitted, as GServicesSettings class provides +// reasonable defaults. +bool CanBeOmitted(const std::string& settings_name) { + return settings_name == kCheckinIntervalKey || + settings_name == kCheckinURLKey || + settings_name == kMCSHostnameKey || + settings_name == kMCSSecurePortKey || + settings_name == kRegistrationURLKey; +} + +bool VerifyCheckinInterval( + const gcm::GServicesSettings::SettingsMap& settings) { + gcm::GServicesSettings::SettingsMap::const_iterator iter = + settings.find(kCheckinIntervalKey); + if (iter == settings.end()) + return CanBeOmitted(kCheckinIntervalKey); + + int64 checkin_interval = kMinimumCheckinInterval; + if (!base::StringToInt64(iter->second, &checkin_interval)) { + DVLOG(1) << "Failed to parse checkin interval: " << iter->second; + return false; + } + if (checkin_interval == std::numeric_limits<int64>::max()) { + DVLOG(1) << "Checkin interval is too big: " << checkin_interval; + return false; + } + if (checkin_interval < kMinimumCheckinInterval) { + DVLOG(1) << "Checkin interval: " << checkin_interval + << " is less than allowed minimum: " << kMinimumCheckinInterval; + } + + return true; +} + +bool VerifyMCSEndpoint(const gcm::GServicesSettings::SettingsMap& settings) { + std::string mcs_hostname; + gcm::GServicesSettings::SettingsMap::const_iterator iter = + settings.find(kMCSHostnameKey); + if (iter == settings.end()) { + // Because endpoint has 2 parts (hostname and port) we are defaulting and + // moving on with verification. + if (CanBeOmitted(kMCSHostnameKey)) + mcs_hostname = kDefaultMCSHostname; + else + return false; + } else if (iter->second.empty()) { + DVLOG(1) << "Empty MCS hostname provided."; + return false; + } else { + mcs_hostname = iter->second; + } + + int mcs_secure_port = 0; + iter = settings.find(kMCSSecurePortKey); + if (iter == settings.end()) { + // Simlarly we might have to default the port, when only hostname is + // provided. + if (CanBeOmitted(kMCSSecurePortKey)) + mcs_secure_port = kDefaultMCSMainSecurePort; + else + return false; + } else if (!base::StringToInt(iter->second, &mcs_secure_port)) { + DVLOG(1) << "Failed to parse MCS secure port: " << iter->second; + return false; + } + + if (mcs_secure_port < 0 || mcs_secure_port > kMaxSecurePort) { + DVLOG(1) << "Incorrect port value: " << mcs_secure_port; + return false; + } + + GURL mcs_main_endpoint(MakeMCSEndpoint(mcs_hostname, mcs_secure_port)); + if (!mcs_main_endpoint.is_valid()) { + DVLOG(1) << "Invalid main MCS endpoint: " + << mcs_main_endpoint.possibly_invalid_spec(); + return false; + } + GURL mcs_fallback_endpoint( + MakeMCSEndpoint(mcs_hostname, kDefaultMCSFallbackSecurePort)); + if (!mcs_fallback_endpoint.is_valid()) { + DVLOG(1) << "Invalid fallback MCS endpoint: " + << mcs_fallback_endpoint.possibly_invalid_spec(); + return false; + } + + return true; +} + +bool VerifyCheckinURL(const gcm::GServicesSettings::SettingsMap& settings) { + gcm::GServicesSettings::SettingsMap::const_iterator iter = + settings.find(kCheckinURLKey); + if (iter == settings.end()) + return CanBeOmitted(kCheckinURLKey); + + GURL checkin_url(iter->second); + if (!checkin_url.is_valid()) { + DVLOG(1) << "Invalid checkin URL provided: " << iter->second; + return false; + } + + return true; +} + +bool VerifyRegistrationURL( + const gcm::GServicesSettings::SettingsMap& settings) { + gcm::GServicesSettings::SettingsMap::const_iterator iter = + settings.find(kRegistrationURLKey); + if (iter == settings.end()) + return CanBeOmitted(kRegistrationURLKey); + + GURL registration_url(iter->second); + if (!registration_url.is_valid()) { + DVLOG(1) << "Invalid registration URL provided: " << iter->second; + return false; + } + + return true; +} + +bool VerifySettings(const gcm::GServicesSettings::SettingsMap& settings) { + return VerifyCheckinInterval(settings) && VerifyMCSEndpoint(settings) && + VerifyCheckinURL(settings) && VerifyRegistrationURL(settings); +} + } // namespace namespace gcm { @@ -48,152 +180,163 @@ const GURL GServicesSettings::DefaultCheckinURL() { return GURL(kDefaultCheckinURL); } -GServicesSettings::GServicesSettings() - : checkin_interval_(base::TimeDelta::FromSeconds(kDefaultCheckinInterval)), - checkin_url_(kDefaultCheckinURL), - mcs_main_endpoint_(MakeMCSEndpoint(kDefaultMCSHostname, - kDefaultMCSMainSecurePort)), - mcs_fallback_endpoint_(MakeMCSEndpoint(kDefaultMCSHostname, - kDefaultMCSFallbackSecurePort)), - registration_url_(kDefaultRegistrationURL), - weak_ptr_factory_(this) { +// static +std::string GServicesSettings::CalculateDigest(const SettingsMap& settings) { + unsigned char hash[base::kSHA1Length]; + std::string data; + for (SettingsMap::const_iterator iter = settings.begin(); + iter != settings.end(); + ++iter) { + data += iter->first; + data += '\0'; + data += iter->second; + data += '\0'; + } + base::SHA1HashBytes( + reinterpret_cast<const unsigned char*>(&data[0]), data.size(), hash); + std::string digest = + kDigestVersionPrefix + base::HexEncode(hash, base::kSHA1Length); + digest = StringToLowerASCII(digest); + return digest; +} + +GServicesSettings::GServicesSettings() : weak_ptr_factory_(this) { + digest_ = CalculateDigest(settings_); } -GServicesSettings::~GServicesSettings() {} +GServicesSettings::~GServicesSettings() { +} bool GServicesSettings::UpdateFromCheckinResponse( - const checkin_proto::AndroidCheckinResponse& checkin_response) { - if (!checkin_response.has_digest() || - checkin_response.digest() == digest_) { - // There are no changes as digest is the same or no settings provided. + const checkin_proto::AndroidCheckinResponse& checkin_response) { + if (!checkin_response.has_settings_diff()) { + DVLOG(1) << "Field settings_diff not set in response."; return false; } - std::map<std::string, std::string> settings; + bool settings_diff = checkin_response.settings_diff(); + SettingsMap new_settings; + // Only reuse the existing settings, if we are given a settings difference. + if (settings_diff) + new_settings = settings_map(); + for (int i = 0; i < checkin_response.setting_size(); ++i) { std::string name = checkin_response.setting(i).name(); - std::string value = checkin_response.setting(i).value(); - settings[name] = value; - } + if (name.empty()) { + DVLOG(1) << "Setting name is empty"; + return false; + } - // Only update the settings in store and digest, if the settings actually - // passed the verificaiton in update settings. - if (UpdateSettings(settings)) { - digest_ = checkin_response.digest(); - return true; + if (settings_diff && name.find(kDeleteSettingPrefix) == 0) { + std::string setting_to_delete = + name.substr(arraysize(kDeleteSettingPrefix) - 1); + new_settings.erase(setting_to_delete); + DVLOG(1) << "Setting deleted: " << setting_to_delete; + } else { + std::string value = checkin_response.setting(i).value(); + new_settings[name] = value; + DVLOG(1) << "New setting: '" << name << "' : '" << value << "'"; + } } - return false; + if (!VerifySettings(new_settings)) + return false; + + settings_.swap(new_settings); + digest_ = CalculateDigest(settings_); + return true; } void GServicesSettings::UpdateFromLoadResult( const GCMStore::LoadResult& load_result) { - if (UpdateSettings(load_result.gservices_settings)) - digest_ = load_result.gservices_digest; -} + // No need to try to update settings when load_result is empty. + if (load_result.gservices_settings.empty()) + return; + if (!VerifySettings(load_result.gservices_settings)) + return; + std::string digest = CalculateDigest(load_result.gservices_settings); + if (digest != load_result.gservices_digest) { + DVLOG(1) << "G-services settings digest mismatch. " + << "Expected digest: " << load_result.gservices_digest + << ". Calculated digest is: " << digest; + return; + } -std::map<std::string, std::string> GServicesSettings::GetSettingsMap() const { - std::map<std::string, std::string> settings; - settings[kCheckinIntervalKey] = - base::Int64ToString(checkin_interval_.InSeconds()); - settings[kCheckinURLKey] = checkin_url_.spec(); - settings[kMCSHostnameKey] = mcs_main_endpoint_.host(); - settings[kMCSSecurePortKey] = mcs_main_endpoint_.port(); - settings[kRegistrationURLKey] = registration_url_.spec(); - return settings; + settings_ = load_result.gservices_settings; + digest_ = load_result.gservices_digest; } -bool GServicesSettings::UpdateSettings( - const std::map<std::string, std::string>& settings) { - int64 new_checkin_interval = kMinimumCheckinInterval; - std::map<std::string, std::string>::const_iterator iter = - settings.find(kCheckinIntervalKey); - if (iter == settings.end()) { - LOG(ERROR) << "Setting not found: " << kCheckinIntervalKey; - return false; - } - if (!base::StringToInt64(iter->second, &new_checkin_interval)) { - LOG(ERROR) << "Failed to parse checkin interval: " << iter->second; - return false; - } - if (new_checkin_interval < kMinimumCheckinInterval) { - LOG(ERROR) << "Checkin interval: " << new_checkin_interval - << " is less than allowed minimum: " << kMinimumCheckinInterval; - new_checkin_interval = kMinimumCheckinInterval; - } - if (new_checkin_interval == std::numeric_limits<int64>::max()) { - LOG(ERROR) << "Checkin interval is too big: " << new_checkin_interval; - return false; +base::TimeDelta GServicesSettings::GetCheckinInterval() const { + int64 checkin_interval = kMinimumCheckinInterval; + SettingsMap::const_iterator iter = settings_.find(kCheckinIntervalKey); + if (iter == settings_.end() || + !base::StringToInt64(iter->second, &checkin_interval)) { + checkin_interval = kDefaultCheckinInterval; } - std::string new_mcs_hostname; - iter = settings.find(kMCSHostnameKey); - if (iter == settings.end()) { - LOG(ERROR) << "Setting not found: " << kMCSHostnameKey; - return false; - } - new_mcs_hostname = iter->second; - if (new_mcs_hostname.empty()) { - LOG(ERROR) << "Empty MCS hostname provided."; - return false; - } + if (checkin_interval < kMinimumCheckinInterval) + checkin_interval = kMinimumCheckinInterval; - int new_mcs_secure_port = -1; - iter = settings.find(kMCSSecurePortKey); - if (iter == settings.end()) { - LOG(ERROR) << "Setting not found: " << kMCSSecurePortKey; - return false; - } - if (!base::StringToInt(iter->second, &new_mcs_secure_port)) { - LOG(ERROR) << "Failed to parse MCS secure port: " << iter->second; - return false; - } - if (new_mcs_secure_port < 0 || 65535 < new_mcs_secure_port) { - LOG(ERROR) << "Incorrect port value: " << new_mcs_secure_port; - return false; - } + return base::TimeDelta::FromSeconds(checkin_interval); +} - GURL new_mcs_main_endpoint = - GURL(MakeMCSEndpoint(new_mcs_hostname, new_mcs_secure_port)); - GURL new_mcs_fallback_endpoint = - GURL(MakeMCSEndpoint(new_mcs_hostname, kDefaultMCSFallbackSecurePort)); - if (!new_mcs_main_endpoint.is_valid() || - !new_mcs_fallback_endpoint.is_valid()) - return false; +GURL GServicesSettings::GetCheckinURL() const { + SettingsMap::const_iterator iter = settings_.find(kCheckinURLKey); + if (iter == settings_.end() || iter->second.empty()) + return GURL(kDefaultCheckinURL); + return GURL(iter->second); +} - GURL new_checkin_url; - iter = settings.find(kCheckinURLKey); - if (iter == settings.end()) { - LOG(ERROR) << "Setting not found: " << kCheckinURLKey; - return false; - } - new_checkin_url = GURL(iter->second); - if (!new_checkin_url.is_valid()) { - LOG(ERROR) << "Invalid checkin URL provided: " - << new_checkin_url.possibly_invalid_spec(); - return false; - } +GURL GServicesSettings::GetMCSMainEndpoint() const { + // Get alternative hostname or use default. + std::string mcs_hostname; + SettingsMap::const_iterator iter = settings_.find(kMCSHostnameKey); + if (iter != settings_.end() && !iter->second.empty()) + mcs_hostname = iter->second; + else + mcs_hostname = kDefaultMCSHostname; - GURL new_registration_url; - iter = settings.find(kRegistrationURLKey); - if (iter == settings.end()) { - LOG(ERROR) << "Setting not found: " << kRegistrationURLKey; - return false; - } - new_registration_url = GURL(iter->second); - if (!new_registration_url.is_valid()) { - LOG(ERROR) << "Invalid registration URL provided: " - << new_registration_url.possibly_invalid_spec(); - return false; + // Get alternative secure port or use defualt. + int mcs_secure_port = 0; + iter = settings_.find(kMCSSecurePortKey); + if (iter == settings_.end() || iter->second.empty() || + !base::StringToInt(iter->second, &mcs_secure_port)) { + mcs_secure_port = kDefaultMCSMainSecurePort; } - // We only update the settings once all of them are correct. - checkin_interval_ = base::TimeDelta::FromSeconds(new_checkin_interval); - mcs_main_endpoint_ = new_mcs_main_endpoint; - mcs_fallback_endpoint_ = new_mcs_fallback_endpoint; - checkin_url_ = new_checkin_url; - registration_url_ = new_registration_url; - return true; + // If constructed address makes sense use it. + GURL mcs_endpoint(MakeMCSEndpoint(mcs_hostname, mcs_secure_port)); + if (mcs_endpoint.is_valid()) + return mcs_endpoint; + + // Otherwise use default settings. + return GURL(MakeMCSEndpoint(kDefaultMCSHostname, kDefaultMCSMainSecurePort)); +} + +GURL GServicesSettings::GetMCSFallbackEndpoint() const { + // Get alternative hostname or use default. + std::string mcs_hostname; + SettingsMap::const_iterator iter = settings_.find(kMCSHostnameKey); + if (iter != settings_.end() && !iter->second.empty()) + mcs_hostname = iter->second; + else + mcs_hostname = kDefaultMCSHostname; + + // If constructed address makes sense use it. + GURL mcs_endpoint( + MakeMCSEndpoint(mcs_hostname, kDefaultMCSFallbackSecurePort)); + if (mcs_endpoint.is_valid()) + return mcs_endpoint; + + return GURL( + MakeMCSEndpoint(kDefaultMCSHostname, kDefaultMCSFallbackSecurePort)); +} + +GURL GServicesSettings::GetRegistrationURL() const { + SettingsMap::const_iterator iter = settings_.find(kRegistrationURLKey); + if (iter == settings_.end() || iter->second.empty()) + return GURL(kDefaultRegistrationURL); + return GURL(iter->second); } } // namespace gcm diff --git a/google_apis/gcm/engine/gservices_settings.h b/google_apis/gcm/engine/gservices_settings.h index 7961ca2..d3aeeb0 100644 --- a/google_apis/gcm/engine/gservices_settings.h +++ b/google_apis/gcm/engine/gservices_settings.h @@ -21,12 +21,17 @@ namespace gcm { // extracting them from checkin response and storing in GCMStore. class GCM_EXPORT GServicesSettings { public: + typedef std::map<std::string, std::string> SettingsMap; + // Minimum periodic checkin interval in seconds. static const base::TimeDelta MinimumCheckinInterval(); // Default checkin URL. static const GURL DefaultCheckinURL(); + // Calculates digest of provided settings. + static std::string CalculateDigest(const SettingsMap& settings); + GServicesSettings(); ~GServicesSettings(); @@ -38,45 +43,33 @@ class GCM_EXPORT GServicesSettings { // successful, false otherwise. void UpdateFromLoadResult(const GCMStore::LoadResult& load_result); - // Gets the settings as a map of string to string for storing. - std::map<std::string, std::string> GetSettingsMap() const; + SettingsMap settings_map() const { return settings_; } std::string digest() const { return digest_; } - base::TimeDelta checkin_interval() const { return checkin_interval_; } + // Gets the interval at which device should perform a checkin. + base::TimeDelta GetCheckinInterval() const; - GURL checkin_url() const { return checkin_url_; } + // Gets the URL to use when checking in. + GURL GetCheckinURL() const; - GURL mcs_main_endpoint() const { return mcs_main_endpoint_; } + // Gets address of main MCS endpoint. + GURL GetMCSMainEndpoint() const; - GURL mcs_fallback_endpoint() const { return mcs_fallback_endpoint_; } + // Gets address of fallback MCS endpoint. + GURL GetMCSFallbackEndpoint() const; - GURL registration_url() const { return registration_url_; } + // Gets the URL to use when registering or unregistering the apps. + GURL GetRegistrationURL() const; private: - // Parses the |settings| to fill in specific fields. - // TODO(fgorski): Change to a status variable that can be logged to UMA. - bool UpdateSettings(const std::map<std::string, std::string>& settings); - // Digest (hash) of the settings, used to check whether settings need update. // It is meant to be sent with checkin request, instead of sending the whole // settings table. std::string digest_; - // Time delta between periodic checkins. - base::TimeDelta checkin_interval_; - - // URL that should be used for checkins. - GURL checkin_url_; - - // Main MCS endpoint. - GURL mcs_main_endpoint_; - - // Fallback MCS endpoint. - GURL mcs_fallback_endpoint_; - - // URL that should be used for regisrations and unregistrations. - GURL registration_url_; + // G-services settings as provided by checkin response. + SettingsMap settings_; // Factory for creating references in callbacks. base::WeakPtrFactory<GServicesSettings> weak_ptr_factory_; diff --git a/google_apis/gcm/engine/gservices_settings_unittest.cc b/google_apis/gcm/engine/gservices_settings_unittest.cc index 12623e3..0b2d063 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 diff --git a/google_apis/gcm/gcm_client_impl.cc b/google_apis/gcm/gcm_client_impl.cc index 4065d65..3225454 100644 --- a/google_apis/gcm/gcm_client_impl.cc +++ b/google_apis/gcm/gcm_client_impl.cc @@ -271,8 +271,8 @@ void GCMClientImpl::OnLoadCompleted(scoped_ptr<GCMStore::LoadResult> result) { void GCMClientImpl::InitializeMCSClient( scoped_ptr<GCMStore::LoadResult> result) { std::vector<GURL> endpoints; - endpoints.push_back(gservices_settings_.mcs_main_endpoint()); - endpoints.push_back(gservices_settings_.mcs_fallback_endpoint()); + endpoints.push_back(gservices_settings_.GetMCSMainEndpoint()); + endpoints.push_back(gservices_settings_.GetMCSFallbackEndpoint()); connection_factory_ = internals_builder_->BuildConnectionFactory( endpoints, kDefaultBackoffPolicy, @@ -339,7 +339,7 @@ void GCMClientImpl::StartCheckin() { account_ids_, chrome_build_proto_); checkin_request_.reset( - new CheckinRequest(gservices_settings_.checkin_url(), + new CheckinRequest(gservices_settings_.GetCheckinURL(), request_info, kDefaultBackoffPolicy, base::Bind(&GCMClientImpl::OnCheckinCompleted, @@ -378,7 +378,7 @@ void GCMClientImpl::OnCheckinCompleted( // First update G-services settings, as something might have changed. if (gservices_settings_.UpdateFromCheckinResponse(checkin_response)) { gcm_store_->SetGServicesSettings( - gservices_settings_.GetSettingsMap(), + gservices_settings_.settings_map(), gservices_settings_.digest(), base::Bind(&GCMClientImpl::SetGServicesSettingsCallback, weak_ptr_factory_.GetWeakPtr())); @@ -418,7 +418,7 @@ void GCMClientImpl::SchedulePeriodicCheckin() { } base::TimeDelta GCMClientImpl::GetTimeToNextCheckin() const { - return last_checkin_time_ + gservices_settings_.checkin_interval() - + return last_checkin_time_ + gservices_settings_.GetCheckinInterval() - clock_->Now(); } @@ -476,7 +476,7 @@ void GCMClientImpl::Register(const std::string& app_id, DCHECK_EQ(0u, pending_registration_requests_.count(app_id)); RegistrationRequest* registration_request = - new RegistrationRequest(gservices_settings_.registration_url(), + new RegistrationRequest(gservices_settings_.GetRegistrationURL(), request_info, kDefaultBackoffPolicy, base::Bind(&GCMClientImpl::OnRegisterCompleted, @@ -550,16 +550,15 @@ void GCMClientImpl::Unregister(const std::string& app_id) { device_checkin_info_.secret, app_id); - UnregistrationRequest* unregistration_request = - new UnregistrationRequest( - gservices_settings_.registration_url(), - request_info, - kDefaultBackoffPolicy, - base::Bind(&GCMClientImpl::OnUnregisterCompleted, - weak_ptr_factory_.GetWeakPtr(), - app_id), - url_request_context_getter_, - &recorder_); + UnregistrationRequest* unregistration_request = new UnregistrationRequest( + gservices_settings_.GetRegistrationURL(), + request_info, + kDefaultBackoffPolicy, + base::Bind(&GCMClientImpl::OnUnregisterCompleted, + weak_ptr_factory_.GetWeakPtr(), + app_id), + url_request_context_getter_, + &recorder_); pending_unregistration_requests_[app_id] = unregistration_request; unregistration_request->Start(); } diff --git a/google_apis/gcm/gcm_client_impl_unittest.cc b/google_apis/gcm/gcm_client_impl_unittest.cc index 7fc0e49..6280370 100644 --- a/google_apis/gcm/gcm_client_impl_unittest.cc +++ b/google_apis/gcm/gcm_client_impl_unittest.cc @@ -42,7 +42,6 @@ enum LastEvent { const uint64 kDeviceAndroidId = 54321; const uint64 kDeviceSecurityToken = 12345; const int64 kSettingsCheckinInterval = 16 * 60 * 60; -const char kSettingsDefaultDigest[] = "default_digest"; const char kAppId[] = "app_id"; const char kSender[] = "project_id"; const char kSender2[] = "project_id2"; @@ -389,6 +388,7 @@ void GCMClientImplTest::CompleteCheckin( setting->set_name(it->first); setting->set_value(it->second); } + response.set_settings_diff(false); } std::string response_string; @@ -687,8 +687,6 @@ class GCMClientImplCheckinTest : public GCMClientImplTest { virtual ~GCMClientImplCheckinTest(); virtual void SetUp() OVERRIDE; - - std::map<std::string, std::string> GenerateSettings(int64 checkin_interval); }; GCMClientImplCheckinTest::GCMClientImplCheckinTest() { @@ -715,18 +713,20 @@ TEST_F(GCMClientImplCheckinTest, GServicesSettingsAfterInitialCheckin) { settings["gcm_hostname"] = "alternative.gcm.host"; settings["gcm_secure_port"] = "7777"; settings["gcm_registration_url"] = "http://alternative.url/registration"; - CompleteCheckin( - kDeviceAndroidId, kDeviceSecurityToken, kSettingsDefaultDigest, settings); + CompleteCheckin(kDeviceAndroidId, + kDeviceSecurityToken, + GServicesSettings::CalculateDigest(settings), + settings); EXPECT_EQ(base::TimeDelta::FromSeconds(kSettingsCheckinInterval), - gservices_settings().checkin_interval()); + gservices_settings().GetCheckinInterval()); EXPECT_EQ(GURL("http://alternative.url/checkin"), - gservices_settings().checkin_url()); + gservices_settings().GetCheckinURL()); EXPECT_EQ(GURL("http://alternative.url/registration"), - gservices_settings().registration_url()); + gservices_settings().GetRegistrationURL()); EXPECT_EQ(GURL("https://alternative.gcm.host:7777"), - gservices_settings().mcs_main_endpoint()); + gservices_settings().GetMCSMainEndpoint()); EXPECT_EQ(GURL("https://alternative.gcm.host:443"), - gservices_settings().mcs_fallback_endpoint()); + gservices_settings().GetMCSFallbackEndpoint()); } // This test only checks that periodic checkin happens. @@ -737,13 +737,17 @@ TEST_F(GCMClientImplCheckinTest, PeriodicCheckin) { settings["gcm_hostname"] = "alternative.gcm.host"; settings["gcm_secure_port"] = "7777"; settings["gcm_registration_url"] = "http://alternative.url/registration"; - CompleteCheckin( - kDeviceAndroidId, kDeviceSecurityToken, kSettingsDefaultDigest, settings); + CompleteCheckin(kDeviceAndroidId, + kDeviceSecurityToken, + GServicesSettings::CalculateDigest(settings), + settings); EXPECT_EQ(2, clock()->call_count()); PumpLoopUntilIdle(); - CompleteCheckin( - kDeviceAndroidId, kDeviceSecurityToken, kSettingsDefaultDigest, settings); + CompleteCheckin(kDeviceAndroidId, + kDeviceSecurityToken, + GServicesSettings::CalculateDigest(settings), + settings); } TEST_F(GCMClientImplCheckinTest, LoadGSettingsFromStore) { @@ -753,22 +757,24 @@ TEST_F(GCMClientImplCheckinTest, LoadGSettingsFromStore) { settings["gcm_hostname"] = "alternative.gcm.host"; settings["gcm_secure_port"] = "7777"; settings["gcm_registration_url"] = "http://alternative.url/registration"; - CompleteCheckin( - kDeviceAndroidId, kDeviceSecurityToken, kSettingsDefaultDigest, settings); + CompleteCheckin(kDeviceAndroidId, + kDeviceSecurityToken, + GServicesSettings::CalculateDigest(settings), + settings); BuildGCMClient(base::TimeDelta()); InitializeGCMClient(); EXPECT_EQ(base::TimeDelta::FromSeconds(kSettingsCheckinInterval), - gservices_settings().checkin_interval()); + gservices_settings().GetCheckinInterval()); EXPECT_EQ(GURL("http://alternative.url/checkin"), - gservices_settings().checkin_url()); + gservices_settings().GetCheckinURL()); EXPECT_EQ(GURL("http://alternative.url/registration"), - gservices_settings().registration_url()); + gservices_settings().GetRegistrationURL()); EXPECT_EQ(GURL("https://alternative.gcm.host:7777"), - gservices_settings().mcs_main_endpoint()); + gservices_settings().GetMCSMainEndpoint()); EXPECT_EQ(GURL("https://alternative.gcm.host:443"), - gservices_settings().mcs_fallback_endpoint()); + gservices_settings().GetMCSFallbackEndpoint()); } } // namespace gcm |