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

Side by Side Diff: chrome/browser/sync/util/cryptographer_unittest.cc

Issue 8356026: [Sync] Cache encrypted types info in ProfileSyncService (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments (retry) Created 9 years, 1 month 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
« no previous file with comments | « chrome/browser/sync/util/cryptographer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/sync/util/cryptographer.h" 5 #include "chrome/browser/sync/util/cryptographer.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
11 #include "chrome/browser/password_manager/encryptor.h" 11 #include "chrome/browser/password_manager/encryptor.h"
12 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h" 12 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h"
13 #include "chrome/browser/sync/protocol/password_specifics.pb.h" 13 #include "chrome/browser/sync/protocol/password_specifics.pb.h"
14 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
15 16
16 using syncable::ModelTypeSet;
17
18 namespace browser_sync { 17 namespace browser_sync {
19 18
19 using ::testing::Mock;
20 using ::testing::StrictMock;
21 using syncable::ModelTypeSet;
22
23 namespace {
24
25 class MockObserver : public Cryptographer::Observer {
26 public:
27 MOCK_METHOD2(OnEncryptedTypesChanged,
28 void(const syncable::ModelTypeSet&, bool));
29 };
30
31 } // namespace
32
20 TEST(CryptographerTest, EmptyCantDecrypt) { 33 TEST(CryptographerTest, EmptyCantDecrypt) {
21 Cryptographer cryptographer; 34 Cryptographer cryptographer;
22 EXPECT_FALSE(cryptographer.is_ready()); 35 EXPECT_FALSE(cryptographer.is_ready());
23 36
24 sync_pb::EncryptedData encrypted; 37 sync_pb::EncryptedData encrypted;
25 encrypted.set_key_name("foo"); 38 encrypted.set_key_name("foo");
26 encrypted.set_blob("bar"); 39 encrypted.set_blob("bar");
27 40
28 EXPECT_FALSE(cryptographer.CanDecrypt(encrypted)); 41 EXPECT_FALSE(cryptographer.CanDecrypt(encrypted));
29 } 42 }
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 191
179 EXPECT_EQ(expected_user, user_key); 192 EXPECT_EQ(expected_user, user_key);
180 EXPECT_EQ(expected_encryption, encryption_key); 193 EXPECT_EQ(expected_encryption, encryption_key);
181 EXPECT_EQ(expected_mac, mac_key); 194 EXPECT_EQ(expected_mac, mac_key);
182 } 195 }
183 196
184 TEST(CryptographerTest, NigoriEncryptionTypes) { 197 TEST(CryptographerTest, NigoriEncryptionTypes) {
185 Cryptographer cryptographer; 198 Cryptographer cryptographer;
186 Cryptographer cryptographer2; 199 Cryptographer cryptographer2;
187 sync_pb::NigoriSpecifics nigori; 200 sync_pb::NigoriSpecifics nigori;
188 ModelTypeSet encrypted_types;
189 201
190 // Just set the sensitive types. 202 StrictMock<MockObserver> observer;
191 encrypted_types.insert(syncable::PASSWORDS); 203 cryptographer.AddObserver(&observer);
192 encrypted_types.insert(syncable::NIGORI); 204 StrictMock<MockObserver> observer2;
193 cryptographer.SetEncryptedTypes(encrypted_types); 205 cryptographer2.AddObserver(&observer2);
206
207 // Just set the sensitive types (shouldn't trigger any
208 // notifications).
209 ModelTypeSet encrypted_types(Cryptographer::SensitiveTypes());
210 cryptographer.SetEncryptedTypesForTest(encrypted_types);
194 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); 211 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori);
195 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); 212 cryptographer2.UpdateEncryptedTypesFromNigori(nigori);
196 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); 213 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes());
197 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); 214 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes());
198 215
216 Mock::VerifyAndClearExpectations(&observer);
217 Mock::VerifyAndClearExpectations(&observer2);
218
219 EXPECT_CALL(observer,
220 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
221 false));
222 EXPECT_CALL(observer2,
223 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
224 false));
225
199 // Set all encrypted types 226 // Set all encrypted types
200 encrypted_types = syncable::GetAllRealModelTypes(); 227 encrypted_types = syncable::GetAllRealModelTypes();
201 cryptographer.SetEncryptedTypes(encrypted_types); 228 cryptographer.SetEncryptedTypesForTest(encrypted_types);
202 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); 229 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori);
203 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); 230 cryptographer2.UpdateEncryptedTypesFromNigori(nigori);
204 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); 231 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes());
205 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); 232 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes());
206
207 // Ensure encrypted types are never unset.
208 Cryptographer cryptographer3; // Empty cryptographer.
209 encrypted_types.erase(syncable::BOOKMARKS);
210 encrypted_types.erase(syncable::SESSIONS);
211 cryptographer.SetEncryptedTypes(encrypted_types);
212 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori);
213 cryptographer2.UpdateEncryptedTypesFromNigori(nigori);
214 cryptographer3.UpdateEncryptedTypesFromNigori(nigori);
215 encrypted_types = syncable::GetAllRealModelTypes();
216 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes());
217 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes());
218 EXPECT_EQ(encrypted_types, cryptographer3.GetEncryptedTypes());
219 } 233 }
220 234
221 TEST(CryptographerTest, EncryptEverythingExplicit) { 235 TEST(CryptographerTest, EncryptEverythingExplicit) {
222 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); 236 ModelTypeSet real_types = syncable::GetAllRealModelTypes();
223 sync_pb::NigoriSpecifics specifics; 237 sync_pb::NigoriSpecifics specifics;
224 specifics.set_encrypt_everything(true); 238 specifics.set_encrypt_everything(true);
225 239
226 Cryptographer cryptographer; 240 Cryptographer cryptographer;
241 StrictMock<MockObserver> observer;
242 cryptographer.AddObserver(&observer);
243
244 EXPECT_CALL(observer,
245 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
246 true));
247
227 EXPECT_FALSE(cryptographer.encrypt_everything()); 248 EXPECT_FALSE(cryptographer.encrypt_everything());
228 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); 249 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes();
229 for (ModelTypeSet::iterator iter = real_types.begin(); 250 for (ModelTypeSet::iterator iter = real_types.begin();
230 iter != real_types.end(); 251 iter != real_types.end();
231 ++iter) { 252 ++iter) {
232 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) 253 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI)
233 EXPECT_EQ(1U, encrypted_types.count(*iter)); 254 EXPECT_EQ(1U, encrypted_types.count(*iter));
234 else 255 else
235 EXPECT_EQ(0U, encrypted_types.count(*iter)); 256 EXPECT_EQ(0U, encrypted_types.count(*iter));
236 } 257 }
237 258
238 cryptographer.UpdateEncryptedTypesFromNigori(specifics); 259 cryptographer.UpdateEncryptedTypesFromNigori(specifics);
239 260
240 EXPECT_TRUE(cryptographer.encrypt_everything()); 261 EXPECT_TRUE(cryptographer.encrypt_everything());
241 encrypted_types = cryptographer.GetEncryptedTypes(); 262 encrypted_types = cryptographer.GetEncryptedTypes();
242 for (ModelTypeSet::iterator iter = real_types.begin(); 263 for (ModelTypeSet::iterator iter = real_types.begin();
243 iter != real_types.end(); 264 iter != real_types.end();
244 ++iter) { 265 ++iter) {
245 EXPECT_EQ(1U, encrypted_types.count(*iter)); 266 EXPECT_EQ(1U, encrypted_types.count(*iter));
246 } 267 }
268
269 // Shouldn't trigger another notification.
270 specifics.set_encrypt_everything(true);
271
272 cryptographer.RemoveObserver(&observer);
247 } 273 }
248 274
249 TEST(CryptographerTest, EncryptEverythingImplicit) { 275 TEST(CryptographerTest, EncryptEverythingImplicit) {
250 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); 276 ModelTypeSet real_types = syncable::GetAllRealModelTypes();
251 sync_pb::NigoriSpecifics specifics; 277 sync_pb::NigoriSpecifics specifics;
252 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything. 278 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything
253 279
254 Cryptographer cryptographer; 280 Cryptographer cryptographer;
281 StrictMock<MockObserver> observer;
282 cryptographer.AddObserver(&observer);
283
284 EXPECT_CALL(observer,
285 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
286 true));
287
255 EXPECT_FALSE(cryptographer.encrypt_everything()); 288 EXPECT_FALSE(cryptographer.encrypt_everything());
256 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); 289 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes();
257 for (ModelTypeSet::iterator iter = real_types.begin(); 290 for (ModelTypeSet::iterator iter = real_types.begin();
258 iter != real_types.end(); 291 iter != real_types.end();
259 ++iter) { 292 ++iter) {
260 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) 293 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI)
261 EXPECT_EQ(1U, encrypted_types.count(*iter)); 294 EXPECT_EQ(1U, encrypted_types.count(*iter));
262 else 295 else
263 EXPECT_EQ(0U, encrypted_types.count(*iter)); 296 EXPECT_EQ(0U, encrypted_types.count(*iter));
264 } 297 }
265 298
266 cryptographer.UpdateEncryptedTypesFromNigori(specifics); 299 cryptographer.UpdateEncryptedTypesFromNigori(specifics);
267 300
268 EXPECT_TRUE(cryptographer.encrypt_everything()); 301 EXPECT_TRUE(cryptographer.encrypt_everything());
269 encrypted_types = cryptographer.GetEncryptedTypes(); 302 encrypted_types = cryptographer.GetEncryptedTypes();
270 for (ModelTypeSet::iterator iter = real_types.begin(); 303 for (ModelTypeSet::iterator iter = real_types.begin();
271 iter != real_types.end(); 304 iter != real_types.end();
272 ++iter) { 305 ++iter) {
273 EXPECT_EQ(1U, encrypted_types.count(*iter)); 306 EXPECT_EQ(1U, encrypted_types.count(*iter));
274 } 307 }
308
309 // Shouldn't trigger another notification.
310 specifics.set_encrypt_everything(true);
311
312 cryptographer.RemoveObserver(&observer);
275 } 313 }
276 314
277 TEST(CryptographerTest, UnknownSensitiveTypes) { 315 TEST(CryptographerTest, UnknownSensitiveTypes) {
278 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); 316 ModelTypeSet real_types = syncable::GetAllRealModelTypes();
279 sync_pb::NigoriSpecifics specifics; 317 sync_pb::NigoriSpecifics specifics;
280 // Explicitly setting encrypt everything should override logic for implicit 318 // Explicitly setting encrypt everything should override logic for implicit
281 // encrypt everything. 319 // encrypt everything.
282 specifics.set_encrypt_everything(false); 320 specifics.set_encrypt_everything(false);
283 specifics.set_encrypt_bookmarks(true); 321 specifics.set_encrypt_bookmarks(true);
284 322
285 Cryptographer cryptographer; 323 Cryptographer cryptographer;
324 StrictMock<MockObserver> observer;
325 cryptographer.AddObserver(&observer);
326
327 syncable::ModelTypeSet expected_encrypted_types =
328 Cryptographer::SensitiveTypes();
329 expected_encrypted_types.insert(syncable::BOOKMARKS);
330
331 EXPECT_CALL(observer,
332 OnEncryptedTypesChanged(expected_encrypted_types,
333 false));
334
286 EXPECT_FALSE(cryptographer.encrypt_everything()); 335 EXPECT_FALSE(cryptographer.encrypt_everything());
287 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); 336 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes();
288 for (ModelTypeSet::iterator iter = real_types.begin(); 337 for (ModelTypeSet::iterator iter = real_types.begin();
289 iter != real_types.end(); 338 iter != real_types.end();
290 ++iter) { 339 ++iter) {
291 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) 340 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI)
292 EXPECT_EQ(1U, encrypted_types.count(*iter)); 341 EXPECT_EQ(1U, encrypted_types.count(*iter));
293 else 342 else
294 EXPECT_EQ(0U, encrypted_types.count(*iter)); 343 EXPECT_EQ(0U, encrypted_types.count(*iter));
295 } 344 }
296 345
297 cryptographer.UpdateEncryptedTypesFromNigori(specifics); 346 cryptographer.UpdateEncryptedTypesFromNigori(specifics);
298 347
299 EXPECT_FALSE(cryptographer.encrypt_everything()); 348 EXPECT_FALSE(cryptographer.encrypt_everything());
300 encrypted_types = cryptographer.GetEncryptedTypes(); 349 encrypted_types = cryptographer.GetEncryptedTypes();
301 for (ModelTypeSet::iterator iter = real_types.begin(); 350 for (ModelTypeSet::iterator iter = real_types.begin();
302 iter != real_types.end(); 351 iter != real_types.end();
303 ++iter) { 352 ++iter) {
304 if (*iter == syncable::PASSWORDS || 353 if (*iter == syncable::PASSWORDS ||
305 *iter == syncable::NIGORI || 354 *iter == syncable::NIGORI ||
306 *iter == syncable::BOOKMARKS) 355 *iter == syncable::BOOKMARKS)
307 EXPECT_EQ(1U, encrypted_types.count(*iter)); 356 EXPECT_EQ(1U, encrypted_types.count(*iter));
308 else 357 else
309 EXPECT_EQ(0U, encrypted_types.count(*iter)); 358 EXPECT_EQ(0U, encrypted_types.count(*iter));
310 } 359 }
360
361 cryptographer.RemoveObserver(&observer);
311 } 362 }
312 363
313 } // namespace browser_sync 364 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/util/cryptographer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698