10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/string_number_conversions.h"
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "google_apis/gcm/engine/gservices_settings.h"
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "google_apis/gcm/engine/registration_info.h"
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace gcm {
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int64 kAlternativeCheckinInterval = 16 * 60 * 60;
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kAlternativeCheckinURL[] = "http://alternative.url/checkin";
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kAlternativeMCSHostname[] = "alternative.gcm.host";
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kAlternativeMCSSecurePort = 7777;
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kAlternativeRegistrationURL[] =
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    "http://alternative.url/registration";
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int64 kDefaultCheckinInterval = 2 * 24 * 60 * 60;  // seconds = 2 days.
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kDefaultCheckinURL[] = "https://android.clients.google.com/checkin";
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kDefaultRegistrationURL[] =
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    "https://android.clients.google.com/c2dm/register3";
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kDefaultSettingsDigest[] =
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "1-da39a3ee5e6b4b0d3255bfef95601890afd80709";
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kAlternativeSettingsDigest[] =
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "1-7da4aa4eb38a8bd3e330e3751cc0899924499134";
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AddSettingsToResponse(
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    checkin_proto::AndroidCheckinResponse& checkin_response,
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const GServicesSettings::SettingsMap& settings,
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool settings_diff) {
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (GServicesSettings::SettingsMap::const_iterator iter = settings.begin();
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       iter != settings.end();
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ++iter) {
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    checkin_proto::GservicesSetting* setting = checkin_response.add_setting();
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    setting->set_name(iter->first);
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    setting->set_value(iter->second);
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  checkin_response.set_settings_diff(settings_diff);
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass GServicesSettingsTest : public testing::Test {
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GServicesSettingsTest();
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~GServicesSettingsTest();
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void CheckAllSetToDefault();
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GServicesSettings& settings() {
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return gservices_settings_;
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  GServicesSettings gservices_settings_;
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
610529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochGServicesSettingsTest::GServicesSettingsTest()
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : gservices_settings_() {
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
650529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochGServicesSettingsTest::~GServicesSettingsTest() {}
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid GServicesSettingsTest::CheckAllSetToDefault() {
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetCheckinInterval());
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSMainEndpoint());
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:443"),
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSFallbackEndpoint());
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Verifies default values of the G-services settings and settings digest.
790529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(GServicesSettingsTest, DefaultSettingsAndDigest) {
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CheckAllSetToDefault();
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDefaultSettingsDigest,
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            GServicesSettings::CalculateDigest(settings().settings_map()));
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies digest calculation for the sample provided by protocol owners.
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CalculateDigest) {
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GServicesSettings::SettingsMap settings_map;
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_map["android_id"] = "55XXXXXXXXXXXXXXXX0";
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_map["checkin_interval"] = "86400";
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_map["checkin_url"] =
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "https://fake.address.google.com/canary/checkin";
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_map["chrome_device"] = "1";
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_map["device_country"] = "us";
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_map["gcm_hostname"] = "fake.address.google.com";
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_map["gcm_secure_port"] = "443";
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("1-33381ccd1cf5791dc0e6dfa234266fa9f1259197",
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            GServicesSettings::CalculateDigest(settings_map));
1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Verifies that settings are not updated when load result is empty.
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(GServicesSettingsTest, UpdateFromEmptyLoadResult) {
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GCMStore::LoadResult result;
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.gservices_digest = "";
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  settings().UpdateFromLoadResult(result);
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CheckAllSetToDefault();
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that settings are not when digest value does not match.
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(GServicesSettingsTest, UpdateFromLoadResultWithSettingMissing) {
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GCMStore::LoadResult result;
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.gservices_settings["checkin_internval"] = "100000";
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  result.gservices_digest = "digest_value";
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  settings().UpdateFromLoadResult(result);
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CheckAllSetToDefault();
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Verifies that the settings are set correctly based on the load result.
1240529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(GServicesSettingsTest, UpdateFromLoadResult) {
1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GCMStore::LoadResult result;
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.gservices_settings["checkin_interval"] =
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Int64ToString(kAlternativeCheckinInterval);
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.gservices_settings["checkin_url"] = kAlternativeCheckinURL;
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.gservices_settings["gcm_hostname"] = kAlternativeMCSHostname;
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.gservices_settings["gcm_secure_port"] =
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::IntToString(kAlternativeMCSSecurePort);
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.gservices_settings["gcm_registration_url"] =
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kAlternativeRegistrationURL;
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.gservices_digest = kAlternativeSettingsDigest;
1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  settings().UpdateFromLoadResult(result);
1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromSeconds(kAlternativeCheckinInterval),
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetCheckinInterval());
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().GetCheckinURL());
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://alternative.gcm.host:7777"),
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSMainEndpoint());
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://alternative.gcm.host:443"),
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSFallbackEndpoint());
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().GetRegistrationURL());
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GServicesSettings::CalculateDigest(result.gservices_settings),
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().digest());
1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that the checkin interval is updated to minimum if the original
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// value is less than minimum.
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseMinimumCheckinInterval) {
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Setting the checkin interval to less than minimum.
1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  checkin_proto::AndroidCheckinResponse checkin_response;
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GServicesSettings::SettingsMap new_settings;
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_settings["checkin_interval"] = "3600";
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddSettingsToResponse(checkin_response, new_settings, false);
1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GServicesSettings::MinimumCheckinInterval(),
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetCheckinInterval());
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().digest());
1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default checkin interval can be selectively overwritten.
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateCheckinInterval) {
1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  checkin_proto::AndroidCheckinResponse checkin_response;
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GServicesSettings::SettingsMap new_settings;
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_settings["checkin_interval"] = "86400";
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddSettingsToResponse(checkin_response, new_settings, false);
1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Only the checkin interval was updated:
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromSeconds(86400),
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetCheckinInterval());
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Other settings still set to default.
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSMainEndpoint());
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:443"),
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSFallbackEndpoint());
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().digest());
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default registration URL can be selectively overwritten.
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateRegistrationURL) {
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  checkin_proto::AndroidCheckinResponse checkin_response;
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GServicesSettings::SettingsMap new_settings;
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_settings["gcm_registration_url"] = "https://new.registration.url";
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddSettingsToResponse(checkin_response, new_settings, false);
1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Only the registration URL was updated:
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://new.registration.url"),
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetRegistrationURL());
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Other settings still set to default.
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetCheckinInterval());
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSMainEndpoint());
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:443"),
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSFallbackEndpoint());
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().digest());
2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default checkin URL can be selectively overwritten.
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateCheckinURL) {
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  checkin_proto::AndroidCheckinResponse checkin_response;
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GServicesSettings::SettingsMap new_settings;
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_settings["checkin_url"] = "https://new.checkin.url";
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddSettingsToResponse(checkin_response, new_settings, false);
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Only the checkin URL was updated:
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://new.checkin.url"), settings().GetCheckinURL());
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Other settings still set to default.
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetCheckinInterval());
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSMainEndpoint());
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:443"),
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSFallbackEndpoint());
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().digest());
2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default MCS hostname can be selectively overwritten.
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateMCSHostname) {
2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  checkin_proto::AndroidCheckinResponse checkin_response;
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GServicesSettings::SettingsMap new_settings;
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_settings["gcm_hostname"] = "new.gcm.hostname";
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddSettingsToResponse(checkin_response, new_settings, false);
2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Only the MCS endpoints were updated:
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://new.gcm.hostname:5228"),
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSMainEndpoint());
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://new.gcm.hostname:443"),
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSFallbackEndpoint());
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Other settings still set to default.
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetCheckinInterval());
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().digest());
2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default MCS secure port can be selectively overwritten.
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateMCSSecurePort) {
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  checkin_proto::AndroidCheckinResponse checkin_response;
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GServicesSettings::SettingsMap new_settings;
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_settings["gcm_secure_port"] = "5229";
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddSettingsToResponse(checkin_response, new_settings, false);
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Only the main MCS endpoint was updated:
277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:5229"),
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSMainEndpoint());
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Other settings still set to default.
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetCheckinInterval());
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:443"),
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSFallbackEndpoint());
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().digest());
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Update from checkin response should also do incremental update for both cases
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// where some settings are removed or added.
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseSettingsDiff) {
2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  checkin_proto::AndroidCheckinResponse checkin_response;
2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Only the new settings will be included in the response with settings diff.
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GServicesSettings::SettingsMap settings_diff;
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_diff["new_setting_1"] = "new_setting_1_value";
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_diff["new_setting_2"] = "new_setting_2_value";
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_diff["gcm_secure_port"] = "5229";
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Full settings are necessary to calculate digest.
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GServicesSettings::SettingsMap full_settings(settings_diff);
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string digest = GServicesSettings::CalculateDigest(full_settings);
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  checkin_response.Clear();
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddSettingsToResponse(checkin_response, settings_diff, true);
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(full_settings, settings().settings_map());
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Default setting overwritten by settings diff.
312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:5229"),
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSMainEndpoint());
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Setting up diff removing some of the values (including default setting).
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_diff.clear();
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_diff["delete_new_setting_1"] = "";
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_diff["delete_gcm_secure_port"] = "";
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_diff["new_setting_3"] = "new_setting_3_value";
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Updating full settings to calculate digest.
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  full_settings.erase(full_settings.find("new_setting_1"));
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  full_settings.erase(full_settings.find("gcm_secure_port"));
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  full_settings["new_setting_3"] = "new_setting_3_value";
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  digest = GServicesSettings::CalculateDigest(full_settings);
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  checkin_response.Clear();
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddSettingsToResponse(checkin_response, settings_diff, true);
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(full_settings, settings().settings_map());
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Default setting back to norm.
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            settings().GetMCSMainEndpoint());
3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace gcm
337