Temporarily re-enabling SizeAfterPrefChange test with traces.
[chromium-blink-merge.git] / google_apis / gcm / engine / gservices_settings_unittest.cc
blob0b2d063ff2595f87123914b71f3bb42ef0129b09
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/strings/string_number_conversions.h"
6 #include "google_apis/gcm/engine/gservices_settings.h"
7 #include "google_apis/gcm/engine/registration_info.h"
8 #include "google_apis/gcm/gcm_client.h"
9 #include "testing/gtest/include/gtest/gtest.h"
11 namespace gcm {
13 namespace {
15 const int64 kAlternativeCheckinInterval = 16 * 60 * 60;
16 const char kAlternativeCheckinURL[] = "http://alternative.url/checkin";
17 const char kAlternativeMCSHostname[] = "alternative.gcm.host";
18 const int kAlternativeMCSSecurePort = 7777;
19 const char kAlternativeRegistrationURL[] =
20 "http://alternative.url/registration";
22 const int64 kDefaultCheckinInterval = 2 * 24 * 60 * 60; // seconds = 2 days.
23 const char kDefaultCheckinURL[] = "https://android.clients.google.com/checkin";
24 const char kDefaultRegistrationURL[] =
25 "https://android.clients.google.com/c2dm/register3";
26 const char kDefaultSettingsDigest[] =
27 "1-da39a3ee5e6b4b0d3255bfef95601890afd80709";
28 const char kAlternativeSettingsDigest[] =
29 "1-7da4aa4eb38a8bd3e330e3751cc0899924499134";
31 void AddSettingsToResponse(
32 checkin_proto::AndroidCheckinResponse& checkin_response,
33 const GServicesSettings::SettingsMap& settings,
34 bool settings_diff) {
35 for (GServicesSettings::SettingsMap::const_iterator iter = settings.begin();
36 iter != settings.end();
37 ++iter) {
38 checkin_proto::GservicesSetting* setting = checkin_response.add_setting();
39 setting->set_name(iter->first);
40 setting->set_value(iter->second);
42 checkin_response.set_settings_diff(settings_diff);
45 } // namespace
47 class GServicesSettingsTest : public testing::Test {
48 public:
49 GServicesSettingsTest();
50 virtual ~GServicesSettingsTest();
52 void CheckAllSetToDefault();
54 GServicesSettings& settings() {
55 return gserivces_settings_;
58 private:
59 GServicesSettings gserivces_settings_;
62 GServicesSettingsTest::GServicesSettingsTest()
63 : gserivces_settings_() {
66 GServicesSettingsTest::~GServicesSettingsTest() {}
68 void GServicesSettingsTest::CheckAllSetToDefault() {
69 EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
70 settings().GetCheckinInterval());
71 EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
72 EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
73 settings().GetMCSMainEndpoint());
74 EXPECT_EQ(GURL("https://mtalk.google.com:443"),
75 settings().GetMCSFallbackEndpoint());
76 EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
79 // Verifies default values of the G-services settings and settings digest.
80 TEST_F(GServicesSettingsTest, DefaultSettingsAndDigest) {
81 CheckAllSetToDefault();
82 EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
83 EXPECT_EQ(kDefaultSettingsDigest,
84 GServicesSettings::CalculateDigest(settings().settings_map()));
87 // Verifies digest calculation for the sample provided by protocol owners.
88 TEST_F(GServicesSettingsTest, CalculateDigest) {
89 GServicesSettings::SettingsMap settings_map;
90 settings_map["android_id"] = "55XXXXXXXXXXXXXXXX0";
91 settings_map["checkin_interval"] = "86400";
92 settings_map["checkin_url"] =
93 "https://fake.address.google.com/canary/checkin";
94 settings_map["chrome_device"] = "1";
95 settings_map["device_country"] = "us";
96 settings_map["gcm_hostname"] = "fake.address.google.com";
97 settings_map["gcm_secure_port"] = "443";
99 EXPECT_EQ("1-33381ccd1cf5791dc0e6dfa234266fa9f1259197",
100 GServicesSettings::CalculateDigest(settings_map));
103 // Verifies that settings are not updated when load result is empty.
104 TEST_F(GServicesSettingsTest, UpdateFromEmptyLoadResult) {
105 GCMStore::LoadResult result;
106 result.gservices_digest = "";
107 settings().UpdateFromLoadResult(result);
109 CheckAllSetToDefault();
110 EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
113 // Verifies that settings are not when digest value does not match.
114 TEST_F(GServicesSettingsTest, UpdateFromLoadResultWithSettingMissing) {
115 GCMStore::LoadResult result;
116 result.gservices_settings["checkin_internval"] = "100000";
117 result.gservices_digest = "digest_value";
118 settings().UpdateFromLoadResult(result);
120 CheckAllSetToDefault();
121 EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
124 // Verifies that the settings are set correctly based on the load result.
125 TEST_F(GServicesSettingsTest, UpdateFromLoadResult) {
126 GCMStore::LoadResult result;
127 result.gservices_settings["checkin_interval"] =
128 base::Int64ToString(kAlternativeCheckinInterval);
129 result.gservices_settings["checkin_url"] = kAlternativeCheckinURL;
130 result.gservices_settings["gcm_hostname"] = kAlternativeMCSHostname;
131 result.gservices_settings["gcm_secure_port"] =
132 base::IntToString(kAlternativeMCSSecurePort);
133 result.gservices_settings["gcm_registration_url"] =
134 kAlternativeRegistrationURL;
135 result.gservices_digest = kAlternativeSettingsDigest;
136 settings().UpdateFromLoadResult(result);
138 EXPECT_EQ(base::TimeDelta::FromSeconds(kAlternativeCheckinInterval),
139 settings().GetCheckinInterval());
140 EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().GetCheckinURL());
141 EXPECT_EQ(GURL("https://alternative.gcm.host:7777"),
142 settings().GetMCSMainEndpoint());
143 EXPECT_EQ(GURL("https://alternative.gcm.host:443"),
144 settings().GetMCSFallbackEndpoint());
145 EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().GetRegistrationURL());
146 EXPECT_EQ(GServicesSettings::CalculateDigest(result.gservices_settings),
147 settings().digest());
150 // Verifies that the checkin interval is updated to minimum if the original
151 // value is less than minimum.
152 TEST_F(GServicesSettingsTest, CheckinResponseMinimumCheckinInterval) {
153 // Setting the checkin interval to less than minimum.
154 checkin_proto::AndroidCheckinResponse checkin_response;
155 GServicesSettings::SettingsMap new_settings;
156 new_settings["checkin_interval"] = "3600";
157 AddSettingsToResponse(checkin_response, new_settings, false);
159 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
161 EXPECT_EQ(GServicesSettings::MinimumCheckinInterval(),
162 settings().GetCheckinInterval());
163 EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
164 settings().digest());
167 // Verifies that default checkin interval can be selectively overwritten.
168 TEST_F(GServicesSettingsTest, CheckinResponseUpdateCheckinInterval) {
169 checkin_proto::AndroidCheckinResponse checkin_response;
170 GServicesSettings::SettingsMap new_settings;
171 new_settings["checkin_interval"] = "86400";
172 AddSettingsToResponse(checkin_response, new_settings, false);
174 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
176 // Only the checkin interval was updated:
177 EXPECT_EQ(base::TimeDelta::FromSeconds(86400),
178 settings().GetCheckinInterval());
180 // Other settings still set to default.
181 EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
182 settings().GetMCSMainEndpoint());
183 EXPECT_EQ(GURL("https://mtalk.google.com:443"),
184 settings().GetMCSFallbackEndpoint());
185 EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
186 EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
188 EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
189 settings().digest());
192 // Verifies that default registration URL can be selectively overwritten.
193 TEST_F(GServicesSettingsTest, CheckinResponseUpdateRegistrationURL) {
194 checkin_proto::AndroidCheckinResponse checkin_response;
195 GServicesSettings::SettingsMap new_settings;
196 new_settings["gcm_registration_url"] = "https://new.registration.url";
197 AddSettingsToResponse(checkin_response, new_settings, false);
199 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
201 // Only the registration URL was updated:
202 EXPECT_EQ(GURL("https://new.registration.url"),
203 settings().GetRegistrationURL());
205 // Other settings still set to default.
206 EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
207 settings().GetCheckinInterval());
208 EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
209 settings().GetMCSMainEndpoint());
210 EXPECT_EQ(GURL("https://mtalk.google.com:443"),
211 settings().GetMCSFallbackEndpoint());
212 EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
214 EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
215 settings().digest());
218 // Verifies that default checkin URL can be selectively overwritten.
219 TEST_F(GServicesSettingsTest, CheckinResponseUpdateCheckinURL) {
220 checkin_proto::AndroidCheckinResponse checkin_response;
221 GServicesSettings::SettingsMap new_settings;
222 new_settings["checkin_url"] = "https://new.checkin.url";
223 AddSettingsToResponse(checkin_response, new_settings, false);
225 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
227 // Only the checkin URL was updated:
228 EXPECT_EQ(GURL("https://new.checkin.url"), settings().GetCheckinURL());
230 // Other settings still set to default.
231 EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
232 settings().GetCheckinInterval());
233 EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
234 settings().GetMCSMainEndpoint());
235 EXPECT_EQ(GURL("https://mtalk.google.com:443"),
236 settings().GetMCSFallbackEndpoint());
237 EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
239 EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
240 settings().digest());
243 // Verifies that default MCS hostname can be selectively overwritten.
244 TEST_F(GServicesSettingsTest, CheckinResponseUpdateMCSHostname) {
245 checkin_proto::AndroidCheckinResponse checkin_response;
246 GServicesSettings::SettingsMap new_settings;
247 new_settings["gcm_hostname"] = "new.gcm.hostname";
248 AddSettingsToResponse(checkin_response, new_settings, false);
250 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
252 // Only the MCS endpoints were updated:
253 EXPECT_EQ(GURL("https://new.gcm.hostname:5228"),
254 settings().GetMCSMainEndpoint());
255 EXPECT_EQ(GURL("https://new.gcm.hostname:443"),
256 settings().GetMCSFallbackEndpoint());
258 // Other settings still set to default.
259 EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
260 settings().GetCheckinInterval());
261 EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
262 EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
264 EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
265 settings().digest());
268 // Verifies that default MCS secure port can be selectively overwritten.
269 TEST_F(GServicesSettingsTest, CheckinResponseUpdateMCSSecurePort) {
270 checkin_proto::AndroidCheckinResponse checkin_response;
271 GServicesSettings::SettingsMap new_settings;
272 new_settings["gcm_secure_port"] = "5229";
273 AddSettingsToResponse(checkin_response, new_settings, false);
275 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
277 // Only the main MCS endpoint was updated:
278 EXPECT_EQ(GURL("https://mtalk.google.com:5229"),
279 settings().GetMCSMainEndpoint());
281 // Other settings still set to default.
282 EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
283 settings().GetCheckinInterval());
284 EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
285 EXPECT_EQ(GURL("https://mtalk.google.com:443"),
286 settings().GetMCSFallbackEndpoint());
287 EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
289 EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings),
290 settings().digest());
293 // Update from checkin response should also do incremental update for both cases
294 // where some settings are removed or added.
295 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseSettingsDiff) {
296 checkin_proto::AndroidCheckinResponse checkin_response;
298 // Only the new settings will be included in the response with settings diff.
299 GServicesSettings::SettingsMap settings_diff;
300 settings_diff["new_setting_1"] = "new_setting_1_value";
301 settings_diff["new_setting_2"] = "new_setting_2_value";
302 settings_diff["gcm_secure_port"] = "5229";
304 // Full settings are necessary to calculate digest.
305 GServicesSettings::SettingsMap full_settings(settings_diff);
306 std::string digest = GServicesSettings::CalculateDigest(full_settings);
308 checkin_response.Clear();
309 AddSettingsToResponse(checkin_response, settings_diff, true);
310 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
311 EXPECT_EQ(full_settings, settings().settings_map());
312 // Default setting overwritten by settings diff.
313 EXPECT_EQ(GURL("https://mtalk.google.com:5229"),
314 settings().GetMCSMainEndpoint());
316 // Setting up diff removing some of the values (including default setting).
317 settings_diff.clear();
318 settings_diff["delete_new_setting_1"] = "";
319 settings_diff["delete_gcm_secure_port"] = "";
320 settings_diff["new_setting_3"] = "new_setting_3_value";
322 // Updating full settings to calculate digest.
323 full_settings.erase(full_settings.find("new_setting_1"));
324 full_settings.erase(full_settings.find("gcm_secure_port"));
325 full_settings["new_setting_3"] = "new_setting_3_value";
326 digest = GServicesSettings::CalculateDigest(full_settings);
328 checkin_response.Clear();
329 AddSettingsToResponse(checkin_response, settings_diff, true);
330 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
331 EXPECT_EQ(full_settings, settings().settings_map());
332 // Default setting back to norm.
333 EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
334 settings().GetMCSMainEndpoint());
337 } // namespace gcm