Commit aae544d7 authored by fgorski@chromium.org's avatar fgorski@chromium.org

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
parent 65382427
......@@ -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
......
......@@ -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_;
......
......@@ -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();
}
......
......@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment