Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(339)

Side by Side Diff: google_apis/gcm/engine/gservices_settings_unittest.cc

Issue 288433002: G-services settings v3 implementation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adding tests for settings diff, addressing CR feedback" Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/strings/string_number_conversions.h" 5 #include "base/strings/string_number_conversions.h"
6 #include "google_apis/gcm/engine/gservices_settings.h" 6 #include "google_apis/gcm/engine/gservices_settings.h"
7 #include "google_apis/gcm/engine/registration_info.h" 7 #include "google_apis/gcm/engine/registration_info.h"
8 #include "google_apis/gcm/gcm_client.h" 8 #include "google_apis/gcm/gcm_client.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 10
11 namespace gcm { 11 namespace gcm {
12 12
13 namespace { 13 namespace {
14 14
15 const int64 kAlternativeCheckinInterval = 16 * 60 * 60; 15 const int64 kAlternativeCheckinInterval = 16 * 60 * 60;
16 const char kAlternativeCheckinURL[] = "http://alternative.url/checkin"; 16 const char kAlternativeCheckinURL[] = "http://alternative.url/checkin";
17 const char kAlternativeMCSHostname[] = "alternative.gcm.host"; 17 const char kAlternativeMCSHostname[] = "alternative.gcm.host";
18 const int kAlternativeMCSSecurePort = 7777; 18 const int kAlternativeMCSSecurePort = 7777;
19 const char kAlternativeRegistrationURL[] = 19 const char kAlternativeRegistrationURL[] =
20 "http://alternative.url/registration"; 20 "http://alternative.url/registration";
21 21
22 const int64 kDefaultCheckinInterval = 2 * 24 * 60 * 60; // seconds = 2 days. 22 const int64 kDefaultCheckinInterval = 2 * 24 * 60 * 60; // seconds = 2 days.
23 const char kDefaultCheckinURL[] = "https://android.clients.google.com/checkin"; 23 const char kDefaultCheckinURL[] = "https://android.clients.google.com/checkin";
24 const char kDefaultRegistrationURL[] = 24 const char kDefaultRegistrationURL[] =
25 "https://android.clients.google.com/c2dm/register3"; 25 "https://android.clients.google.com/c2dm/register3";
26 const char kDefaultSettingsDigest[] =
27 "1-4C598686664FF131F439C522AB7B355A65819B1F";
28 const char kAlternativeSettingsDigest[] =
29 "1-7DA4AA4EB38A8BD3E330E3751CC0899924499134";
30
31 void AddSettingsToResponse(
32 checkin_proto::AndroidCheckinResponse& checkin_response,
33 const std::map<std::string, std::string>& settings,
jianli 2014/05/14 22:04:30 use GServicesSettings::SettingsMap
fgorski 2014/05/16 20:48:47 Done.
34 bool settings_diff) {
35 for (std::map<std::string, std::string>::const_iterator iter =
jianli 2014/05/14 22:04:30 ditto
fgorski 2014/05/16 20:48:47 Done.
36 settings.begin();
37 iter != settings.end(); ++iter) {
38 checkin_proto::GservicesSetting* setting = checkin_response.add_setting();
39 setting->set_name(iter->first);
40 setting->set_value(iter->second);
41 }
42 checkin_response.set_settings_diff(settings_diff);
43 }
26 44
27 } // namespace 45 } // namespace
28 46
29 class GServicesSettingsTest : public testing::Test { 47 class GServicesSettingsTest : public testing::Test {
30 public: 48 public:
31 GServicesSettingsTest(); 49 GServicesSettingsTest();
32 virtual ~GServicesSettingsTest(); 50 virtual ~GServicesSettingsTest();
33 51
34 virtual void SetUp() OVERRIDE; 52 virtual void SetUp() OVERRIDE;
35 53
(...skipping 27 matching lines...) Expand all
63 base::Int64ToString(kAlternativeCheckinInterval); 81 base::Int64ToString(kAlternativeCheckinInterval);
64 alternative_settings_["checkin_url"] = kAlternativeCheckinURL; 82 alternative_settings_["checkin_url"] = kAlternativeCheckinURL;
65 alternative_settings_["gcm_hostname"] = kAlternativeMCSHostname; 83 alternative_settings_["gcm_hostname"] = kAlternativeMCSHostname;
66 alternative_settings_["gcm_secure_port"] = 84 alternative_settings_["gcm_secure_port"] =
67 base::IntToString(kAlternativeMCSSecurePort); 85 base::IntToString(kAlternativeMCSSecurePort);
68 alternative_settings_["gcm_registration_url"] = kAlternativeRegistrationURL; 86 alternative_settings_["gcm_registration_url"] = kAlternativeRegistrationURL;
69 } 87 }
70 88
71 void GServicesSettingsTest::CheckAllSetToDefault() { 89 void GServicesSettingsTest::CheckAllSetToDefault() {
72 EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), 90 EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
73 settings().checkin_interval()); 91 settings().GetCheckinInterval());
74 EXPECT_EQ(GURL(kDefaultCheckinURL), settings().checkin_url()); 92 EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL());
75 EXPECT_EQ(GURL("https://mtalk.google.com:5228"), 93 EXPECT_EQ(GURL("https://mtalk.google.com:5228"),
76 settings().mcs_main_endpoint()); 94 settings().GetMCSMainEndpoint());
77 EXPECT_EQ(GURL("https://mtalk.google.com:443"), 95 EXPECT_EQ(GURL("https://mtalk.google.com:443"),
78 settings().mcs_fallback_endpoint()); 96 settings().GetMCSFallbackEndpoint());
79 EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().registration_url()); 97 EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL());
80 } 98 }
81 99
82 void GServicesSettingsTest::CheckAllSetToAlternative() { 100 void GServicesSettingsTest::CheckAllSetToAlternative() {
83 EXPECT_EQ(base::TimeDelta::FromSeconds(kAlternativeCheckinInterval), 101 EXPECT_EQ(base::TimeDelta::FromSeconds(kAlternativeCheckinInterval),
84 settings().checkin_interval()); 102 settings().GetCheckinInterval());
85 EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().checkin_url()); 103 EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().GetCheckinURL());
86 EXPECT_EQ(GURL("https://alternative.gcm.host:7777"), 104 EXPECT_EQ(GURL("https://alternative.gcm.host:7777"),
87 settings().mcs_main_endpoint()); 105 settings().GetMCSMainEndpoint());
88 EXPECT_EQ(GURL("https://alternative.gcm.host:443"), 106 EXPECT_EQ(GURL("https://alternative.gcm.host:443"),
89 settings().mcs_fallback_endpoint()); 107 settings().GetMCSFallbackEndpoint());
90 EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().registration_url()); 108 EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().GetRegistrationURL());
91 } 109 }
92 110
93 void GServicesSettingsTest::SetWithAlternativeSettings( 111 void GServicesSettingsTest::SetWithAlternativeSettings(
94 checkin_proto::AndroidCheckinResponse& checkin_response) { 112 checkin_proto::AndroidCheckinResponse& checkin_response) {
95 for (std::map<std::string, std::string>::const_iterator iter = 113 AddSettingsToResponse(checkin_response, alternative_settings_, false);
96 alternative_settings_.begin();
97 iter != alternative_settings_.end(); ++iter) {
98 checkin_proto::GservicesSetting* setting = checkin_response.add_setting();
99 setting->set_name(iter->first);
100 setting->set_value(iter->second);
101 }
102 } 114 }
103 115
104 // Verifies default values of the G-services settings and settings digest. 116 // Verifies default values of the G-services settings and settings digest.
105 TEST_F(GServicesSettingsTest, DefaultSettingsAndDigest) { 117 TEST_F(GServicesSettingsTest, DefaultSettingsAndDigest) {
106 CheckAllSetToDefault(); 118 CheckAllSetToDefault();
107 EXPECT_EQ(std::string(), settings().digest()); 119 EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
120 }
121
122 // Verifies digest calculation for default settings.
123 TEST_F(GServicesSettingsTest, CalculateDigestForDefaultSettings) {
124 CheckAllSetToDefault();
125 EXPECT_EQ(kDefaultSettingsDigest,
126 GServicesSettings::CalculateDigest(settings().settings_map()));
127 }
128
129 // Verifies digest calculation for aternative settings.
130 TEST_F(GServicesSettingsTest, CalculateDigestForAternativeSettings) {
131 EXPECT_EQ(kAlternativeSettingsDigest,
132 GServicesSettings::CalculateDigest(alternative_settings_));
108 } 133 }
109 134
110 // Verifies that settings are not updated when load result is empty. 135 // Verifies that settings are not updated when load result is empty.
111 TEST_F(GServicesSettingsTest, UpdateFromEmptyLoadResult) { 136 TEST_F(GServicesSettingsTest, UpdateFromEmptyLoadResult) {
112 GCMStore::LoadResult result; 137 GCMStore::LoadResult result;
113 result.gservices_digest = "digest_value"; 138 result.gservices_digest = "digest_value";
114 settings().UpdateFromLoadResult(result); 139 settings().UpdateFromLoadResult(result);
115 140
116 CheckAllSetToDefault(); 141 CheckAllSetToDefault();
117 EXPECT_EQ(std::string(), settings().digest()); 142 EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
118 } 143 }
119 144
120 // Verifies that settings are not updated when one of them is missing. 145 // Verifies that settings are not updated when one of them is missing.
121 TEST_F(GServicesSettingsTest, UpdateFromLoadResultWithSettingMissing) { 146 TEST_F(GServicesSettingsTest, UpdateFromLoadResultWithSettingMissing) {
122 GCMStore::LoadResult result; 147 GCMStore::LoadResult result;
123 result.gservices_settings = alternative_settings(); 148 result.gservices_settings = alternative_settings();
124 result.gservices_digest = "digest_value"; 149 result.gservices_digest = "digest_value";
125 result.gservices_settings.erase("gcm_hostname"); 150 result.gservices_settings.erase("gcm_hostname");
126 settings().UpdateFromLoadResult(result); 151 settings().UpdateFromLoadResult(result);
127 152
128 CheckAllSetToDefault(); 153 CheckAllSetToDefault();
129 EXPECT_EQ(std::string(), settings().digest()); 154 EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
130 } 155 }
131 156
132 // Verifies that the settings are set correctly based on the load result. 157 // Verifies that the settings are set correctly based on the load result.
133 TEST_F(GServicesSettingsTest, UpdateFromLoadResult) { 158 TEST_F(GServicesSettingsTest, UpdateFromLoadResult) {
134 GCMStore::LoadResult result; 159 GCMStore::LoadResult result;
135 result.gservices_settings = alternative_settings(); 160 result.gservices_settings = alternative_settings();
136 result.gservices_digest = "digest_value"; 161 result.gservices_digest = kAlternativeSettingsDigest;
137 settings().UpdateFromLoadResult(result); 162 settings().UpdateFromLoadResult(result);
138 163
139 CheckAllSetToAlternative(); 164 CheckAllSetToAlternative();
140 EXPECT_EQ("digest_value", settings().digest()); 165 EXPECT_EQ(kAlternativeSettingsDigest, settings().digest());
141 } 166 }
142 167
143 // Verifies that the settings are set correctly after parsing a checkin 168 // Verifies that the settings are set correctly after parsing a checkin
144 // response. 169 // response.
145 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponse) { 170 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponse) {
146 checkin_proto::AndroidCheckinResponse checkin_response; 171 checkin_proto::AndroidCheckinResponse checkin_response;
147 172
148 checkin_response.set_digest("digest_value"); 173 checkin_response.set_digest(kAlternativeSettingsDigest);
149 SetWithAlternativeSettings(checkin_response); 174 SetWithAlternativeSettings(checkin_response);
150 175
151 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 176 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
152 177
153 CheckAllSetToAlternative(); 178 CheckAllSetToAlternative();
154 EXPECT_EQ(alternative_settings_, settings().GetSettingsMap()); 179 EXPECT_EQ(alternative_settings_, settings().settings_map());
155 EXPECT_EQ("digest_value", settings().digest()); 180 EXPECT_EQ(kAlternativeSettingsDigest, settings().digest());
156 } 181 }
157 182
158 // Verifies that the checkin interval is updated to minimum if the original 183 // Verifies that the checkin interval is updated to minimum if the original
159 // value is less than minimum. 184 // value is less than minimum.
160 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseMinimumCheckinInterval) { 185 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseMinimumCheckinInterval) {
161 checkin_proto::AndroidCheckinResponse checkin_response; 186 checkin_proto::AndroidCheckinResponse checkin_response;
162 187
163 checkin_response.set_digest("digest_value"); 188 const char digest[] = "1-436646257E0FAC3F0D20C866B0DA46C21DCD1FA2";
189 checkin_response.set_digest(digest);
164 // Setting the checkin interval to less than minimum. 190 // Setting the checkin interval to less than minimum.
165 alternative_settings_["checkin_interval"] = base::IntToString(3600); 191 alternative_settings_["checkin_interval"] = base::IntToString(3600);
166 SetWithAlternativeSettings(checkin_response); 192 SetWithAlternativeSettings(checkin_response);
167 193
168 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 194 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
169 195
170 EXPECT_EQ(GServicesSettings::MinimumCheckinInterval(), 196 EXPECT_EQ(GServicesSettings::MinimumCheckinInterval(),
171 settings().checkin_interval()); 197 settings().GetCheckinInterval());
172 EXPECT_EQ("digest_value", settings().digest()); 198 EXPECT_EQ(digest, settings().digest());
173 } 199 }
174 200
175 // Verifies that settings are not updated when one of them is missing. 201 // Verifies that settings are not updated when one of them is missing.
176 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseWithSettingMissing) { 202 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseWithSettingMissing) {
177 checkin_proto::AndroidCheckinResponse checkin_response; 203 checkin_proto::AndroidCheckinResponse checkin_response;
178 204
179 checkin_response.set_digest("digest_value"); 205 checkin_response.set_digest(kAlternativeSettingsDigest);
180 alternative_settings_.erase("gcm_hostname"); 206 alternative_settings_.erase("gcm_hostname");
181 SetWithAlternativeSettings(checkin_response); 207 SetWithAlternativeSettings(checkin_response);
182 208
183 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); 209 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response));
184 210
185 CheckAllSetToDefault(); 211 CheckAllSetToDefault();
186 EXPECT_EQ(std::string(), settings().digest()); 212 EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
187 } 213 }
188 214
189 // Verifies that no update is done, when a checkin response misses digest. 215 // Verifies that no update is done, when a checkin response misses digest.
190 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseNoDigest) { 216 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseNoDigest) {
191 checkin_proto::AndroidCheckinResponse checkin_response; 217 checkin_proto::AndroidCheckinResponse checkin_response;
192 218
193 SetWithAlternativeSettings(checkin_response); 219 SetWithAlternativeSettings(checkin_response);
194 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); 220 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response));
195 221
196 CheckAllSetToDefault(); 222 CheckAllSetToDefault();
197 EXPECT_EQ(std::string(), settings().digest()); 223 EXPECT_EQ(kDefaultSettingsDigest, settings().digest());
198 } 224 }
199 225
200 // Verifies that no update is done, when a checkin response digest is the same. 226 // Verifies that no update is done, when a checkin response digest is the same.
201 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseSameDigest) { 227 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseSameDigest) {
202 GCMStore::LoadResult load_result; 228 GCMStore::LoadResult load_result;
203 load_result.gservices_digest = "old_digest"; 229 load_result.gservices_digest = kAlternativeSettingsDigest;
204 load_result.gservices_settings = alternative_settings(); 230 load_result.gservices_settings = alternative_settings();
205 settings().UpdateFromLoadResult(load_result); 231 settings().UpdateFromLoadResult(load_result);
206 232
207 checkin_proto::AndroidCheckinResponse checkin_response; 233 checkin_proto::AndroidCheckinResponse checkin_response;
208 checkin_response.set_digest("old_digest"); 234 checkin_response.set_digest(kAlternativeSettingsDigest);
209 SetWithAlternativeSettings(checkin_response); 235 SetWithAlternativeSettings(checkin_response);
210 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response)); 236 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response));
211 237
212 CheckAllSetToAlternative(); 238 CheckAllSetToAlternative();
213 EXPECT_EQ("old_digest", settings().digest()); 239 EXPECT_EQ(kAlternativeSettingsDigest, settings().digest());
240 }
241
242 // Update from checkin response should also do incremental update for both cases
243 // where some settings are removed or added.
244 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseSettingsDiff) {
245 checkin_proto::AndroidCheckinResponse checkin_response;
246 checkin_response.set_digest(kAlternativeSettingsDigest);
247 SetWithAlternativeSettings(checkin_response);
248 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
249
250 // Only the new settings will be included in the response with settings diff.
251 std::map<std::string, std::string> settings_diff;
252 settings_diff["new_setting_1"] = "new_setting_1_value";
253 settings_diff["new_setting_2"] = "new_setting_2_value";
254
255 // Full settings are necessary to calculate digest.
256 std::map<std::string, std::string> full_settings(alternative_settings());
257 full_settings.insert(settings_diff.begin(), settings_diff.end());
258 std::string digest = GServicesSettings::CalculateDigest(full_settings);
259
260 checkin_response.Clear();
261 AddSettingsToResponse(checkin_response, settings_diff, true);
262 checkin_response.set_digest(digest);
263 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
264 EXPECT_EQ(full_settings, settings().settings_map());
265
266 // Setting up diff removing some of the values.
267 settings_diff.clear();
268 settings_diff["delete_new_setting_1"] = "";
269 settings_diff["new_setting_3"] = "new_setting_3_value";
270
271 // Updating full settings to calculate digest.
272 full_settings.erase(full_settings.find("new_setting_1"));
273 full_settings["new_setting_3"] = "new_setting_3_value";
274 digest = GServicesSettings::CalculateDigest(full_settings);
275
276 checkin_response.Clear();
277 AddSettingsToResponse(checkin_response, settings_diff, true);
278 checkin_response.set_digest(digest);
279 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
280 EXPECT_EQ(full_settings, settings().settings_map());
281 }
282
283 // Update from checkin response should fail when one of the mandatory settings
284 // is deleted.
285 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseRequiredSettings) {
286 checkin_proto::AndroidCheckinResponse checkin_response;
287 checkin_response.set_digest(kAlternativeSettingsDigest);
288 SetWithAlternativeSettings(checkin_response);
289 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
290
291 // Settings diff attempts to remove a mandatory setting.
292 std::map<std::string, std::string> settings_diff;
293 settings_diff["delete_checkin_interval"] = "";
294
295 // Full settings are necessary to calculate digest.
296 std::map<std::string, std::string> full_settings(alternative_settings());
297 full_settings.erase(full_settings.find("checkin_interval"));
298 std::string digest = GServicesSettings::CalculateDigest(full_settings);
299
300 checkin_response.Clear();
301 AddSettingsToResponse(checkin_response, settings_diff, true);
302 checkin_response.set_digest(digest);
303 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response));
304 EXPECT_EQ(alternative_settings(), settings().settings_map());
214 } 305 }
215 306
216 } // namespace gcm 307 } // namespace gcm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698