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

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: Revert to synchronous notifications Created 9 years, 2 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 (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 MOCK_METHOD0(OnEncryptionComplete, void());
30 };
31
32 } // namespace
33
20 TEST(CryptographerTest, EmptyCantDecrypt) { 34 TEST(CryptographerTest, EmptyCantDecrypt) {
21 Cryptographer cryptographer; 35 Cryptographer cryptographer;
22 EXPECT_FALSE(cryptographer.is_ready()); 36 EXPECT_FALSE(cryptographer.is_ready());
23 37
24 sync_pb::EncryptedData encrypted; 38 sync_pb::EncryptedData encrypted;
25 encrypted.set_key_name("foo"); 39 encrypted.set_key_name("foo");
26 encrypted.set_blob("bar"); 40 encrypted.set_blob("bar");
27 41
28 EXPECT_FALSE(cryptographer.CanDecrypt(encrypted)); 42 EXPECT_FALSE(cryptographer.CanDecrypt(encrypted));
29 } 43 }
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 EXPECT_NE(static_cast<Nigori*>(NULL), unpacked.get()); 188 EXPECT_NE(static_cast<Nigori*>(NULL), unpacked.get());
175 189
176 std::string user_key, encryption_key, mac_key; 190 std::string user_key, encryption_key, mac_key;
177 ASSERT_TRUE(unpacked->ExportKeys(&user_key, &encryption_key, &mac_key)); 191 ASSERT_TRUE(unpacked->ExportKeys(&user_key, &encryption_key, &mac_key));
178 192
179 EXPECT_EQ(expected_user, user_key); 193 EXPECT_EQ(expected_user, user_key);
180 EXPECT_EQ(expected_encryption, encryption_key); 194 EXPECT_EQ(expected_encryption, encryption_key);
181 EXPECT_EQ(expected_mac, mac_key); 195 EXPECT_EQ(expected_mac, mac_key);
182 } 196 }
183 197
198 TEST(CryptographerTest, MarkEncryptionComplete) {
199 Cryptographer cryptographer;
200 StrictMock<MockObserver> observer;
201 cryptographer.AddObserver(&observer);
202 EXPECT_CALL(observer,
203 OnEncryptedTypesChanged(Cryptographer::SensitiveTypes(),
204 false));
205 EXPECT_CALL(observer, OnEncryptionComplete());
206
207 cryptographer.MarkEncryptionComplete();
208 }
209
184 TEST(CryptographerTest, NigoriEncryptionTypes) { 210 TEST(CryptographerTest, NigoriEncryptionTypes) {
185 Cryptographer cryptographer; 211 Cryptographer cryptographer;
186 Cryptographer cryptographer2; 212 Cryptographer cryptographer2;
187 sync_pb::NigoriSpecifics nigori; 213 sync_pb::NigoriSpecifics nigori;
188 ModelTypeSet encrypted_types; 214 ModelTypeSet encrypted_types;
189 215
216 StrictMock<MockObserver> observer;
217 cryptographer.AddObserver(&observer);
218 StrictMock<MockObserver> observer2;
219 cryptographer2.AddObserver(&observer2);
220
221 EXPECT_CALL(observer,
222 OnEncryptedTypesChanged(Cryptographer::SensitiveTypes(),
223 false));
224 EXPECT_CALL(observer2,
225 OnEncryptedTypesChanged(Cryptographer::SensitiveTypes(),
226 false));
227
190 // Just set the sensitive types. 228 // Just set the sensitive types.
191 encrypted_types.insert(syncable::PASSWORDS); 229 encrypted_types.insert(syncable::PASSWORDS);
192 encrypted_types.insert(syncable::NIGORI); 230 encrypted_types.insert(syncable::NIGORI);
193 cryptographer.SetEncryptedTypes(encrypted_types); 231 cryptographer.SetEncryptedTypes(encrypted_types);
194 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); 232 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori);
195 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); 233 cryptographer2.UpdateEncryptedTypesFromNigori(nigori);
196 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); 234 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes());
197 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); 235 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes());
198 236
237 Mock::VerifyAndClearExpectations(&observer);
238 Mock::VerifyAndClearExpectations(&observer2);
239
240 EXPECT_CALL(observer,
241 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
242 false));
243 EXPECT_CALL(observer2,
244 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
245 false));
246
199 // Set all encrypted types 247 // Set all encrypted types
200 encrypted_types = syncable::GetAllRealModelTypes(); 248 encrypted_types = syncable::GetAllRealModelTypes();
201 cryptographer.SetEncryptedTypes(encrypted_types); 249 cryptographer.SetEncryptedTypes(encrypted_types);
202 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); 250 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori);
203 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); 251 cryptographer2.UpdateEncryptedTypesFromNigori(nigori);
204 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); 252 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes());
205 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); 253 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes());
206 254
255 Mock::VerifyAndClearExpectations(&observer);
256 Mock::VerifyAndClearExpectations(&observer2);
257
207 // Ensure encrypted types are never unset. 258 // Ensure encrypted types are never unset.
208 Cryptographer cryptographer3; // Empty cryptographer. 259 Cryptographer cryptographer3; // Empty cryptographer.
260 StrictMock<MockObserver> observer3;
261 cryptographer3.AddObserver(&observer3);
262
263 EXPECT_CALL(observer,
264 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
265 false));
266 EXPECT_CALL(observer2,
267 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
268 false));
269 EXPECT_CALL(observer3,
270 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
271 false));
272
209 encrypted_types.erase(syncable::BOOKMARKS); 273 encrypted_types.erase(syncable::BOOKMARKS);
210 encrypted_types.erase(syncable::SESSIONS); 274 encrypted_types.erase(syncable::SESSIONS);
211 cryptographer.SetEncryptedTypes(encrypted_types); 275 cryptographer.SetEncryptedTypes(encrypted_types);
212 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); 276 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori);
213 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); 277 cryptographer2.UpdateEncryptedTypesFromNigori(nigori);
214 cryptographer3.UpdateEncryptedTypesFromNigori(nigori); 278 cryptographer3.UpdateEncryptedTypesFromNigori(nigori);
215 encrypted_types = syncable::GetAllRealModelTypes(); 279 encrypted_types = syncable::GetAllRealModelTypes();
216 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); 280 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes());
217 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); 281 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes());
218 EXPECT_EQ(encrypted_types, cryptographer3.GetEncryptedTypes()); 282 EXPECT_EQ(encrypted_types, cryptographer3.GetEncryptedTypes());
283
284 cryptographer3.RemoveObserver(&observer3);
285 cryptographer2.RemoveObserver(&observer2);
286 cryptographer.RemoveObserver(&observer);
219 } 287 }
220 288
221 TEST(CryptographerTest, EncryptEverythingExplicit) { 289 TEST(CryptographerTest, EncryptEverythingExplicit) {
222 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); 290 ModelTypeSet real_types = syncable::GetAllRealModelTypes();
223 sync_pb::NigoriSpecifics specifics; 291 sync_pb::NigoriSpecifics specifics;
224 specifics.set_encrypt_everything(true); 292 specifics.set_encrypt_everything(true);
225 293
226 Cryptographer cryptographer; 294 Cryptographer cryptographer;
295 StrictMock<MockObserver> observer;
296 cryptographer.AddObserver(&observer);
297
298 EXPECT_CALL(observer,
299 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
300 true));
301
227 EXPECT_FALSE(cryptographer.encrypt_everything()); 302 EXPECT_FALSE(cryptographer.encrypt_everything());
228 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); 303 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes();
229 for (ModelTypeSet::iterator iter = real_types.begin(); 304 for (ModelTypeSet::iterator iter = real_types.begin();
230 iter != real_types.end(); 305 iter != real_types.end();
231 ++iter) { 306 ++iter) {
232 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) 307 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI)
233 EXPECT_EQ(1U, encrypted_types.count(*iter)); 308 EXPECT_EQ(1U, encrypted_types.count(*iter));
234 else 309 else
235 EXPECT_EQ(0U, encrypted_types.count(*iter)); 310 EXPECT_EQ(0U, encrypted_types.count(*iter));
236 } 311 }
237 312
238 cryptographer.UpdateEncryptedTypesFromNigori(specifics); 313 cryptographer.UpdateEncryptedTypesFromNigori(specifics);
239 314
240 EXPECT_TRUE(cryptographer.encrypt_everything()); 315 EXPECT_TRUE(cryptographer.encrypt_everything());
241 encrypted_types = cryptographer.GetEncryptedTypes(); 316 encrypted_types = cryptographer.GetEncryptedTypes();
242 for (ModelTypeSet::iterator iter = real_types.begin(); 317 for (ModelTypeSet::iterator iter = real_types.begin();
243 iter != real_types.end(); 318 iter != real_types.end();
244 ++iter) { 319 ++iter) {
245 EXPECT_EQ(1U, encrypted_types.count(*iter)); 320 EXPECT_EQ(1U, encrypted_types.count(*iter));
246 } 321 }
322
323 cryptographer.RemoveObserver(&observer);
247 } 324 }
248 325
249 TEST(CryptographerTest, EncryptEverythingImplicit) { 326 TEST(CryptographerTest, EncryptEverythingImplicit) {
250 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); 327 ModelTypeSet real_types = syncable::GetAllRealModelTypes();
251 sync_pb::NigoriSpecifics specifics; 328 sync_pb::NigoriSpecifics specifics;
252 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything. 329 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything
253 330
254 Cryptographer cryptographer; 331 Cryptographer cryptographer;
332 StrictMock<MockObserver> observer;
333 cryptographer.AddObserver(&observer);
334
335 EXPECT_CALL(observer,
336 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
337 true));
338
255 EXPECT_FALSE(cryptographer.encrypt_everything()); 339 EXPECT_FALSE(cryptographer.encrypt_everything());
256 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); 340 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes();
257 for (ModelTypeSet::iterator iter = real_types.begin(); 341 for (ModelTypeSet::iterator iter = real_types.begin();
258 iter != real_types.end(); 342 iter != real_types.end();
259 ++iter) { 343 ++iter) {
260 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) 344 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI)
261 EXPECT_EQ(1U, encrypted_types.count(*iter)); 345 EXPECT_EQ(1U, encrypted_types.count(*iter));
262 else 346 else
263 EXPECT_EQ(0U, encrypted_types.count(*iter)); 347 EXPECT_EQ(0U, encrypted_types.count(*iter));
264 } 348 }
265 349
266 cryptographer.UpdateEncryptedTypesFromNigori(specifics); 350 cryptographer.UpdateEncryptedTypesFromNigori(specifics);
267 351
268 EXPECT_TRUE(cryptographer.encrypt_everything()); 352 EXPECT_TRUE(cryptographer.encrypt_everything());
269 encrypted_types = cryptographer.GetEncryptedTypes(); 353 encrypted_types = cryptographer.GetEncryptedTypes();
270 for (ModelTypeSet::iterator iter = real_types.begin(); 354 for (ModelTypeSet::iterator iter = real_types.begin();
271 iter != real_types.end(); 355 iter != real_types.end();
272 ++iter) { 356 ++iter) {
273 EXPECT_EQ(1U, encrypted_types.count(*iter)); 357 EXPECT_EQ(1U, encrypted_types.count(*iter));
274 } 358 }
359
360 cryptographer.RemoveObserver(&observer);
275 } 361 }
276 362
277 TEST(CryptographerTest, UnknownSensitiveTypes) { 363 TEST(CryptographerTest, UnknownSensitiveTypes) {
278 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); 364 ModelTypeSet real_types = syncable::GetAllRealModelTypes();
279 sync_pb::NigoriSpecifics specifics; 365 sync_pb::NigoriSpecifics specifics;
280 // Explicitly setting encrypt everything should override logic for implicit 366 // Explicitly setting encrypt everything should override logic for implicit
281 // encrypt everything. 367 // encrypt everything.
282 specifics.set_encrypt_everything(false); 368 specifics.set_encrypt_everything(false);
283 specifics.set_encrypt_bookmarks(true); 369 specifics.set_encrypt_bookmarks(true);
284 370
285 Cryptographer cryptographer; 371 Cryptographer cryptographer;
372 StrictMock<MockObserver> observer;
373 cryptographer.AddObserver(&observer);
374
375 syncable::ModelTypeSet expected_encrypted_types =
376 Cryptographer::SensitiveTypes();
377 expected_encrypted_types.insert(syncable::BOOKMARKS);
378
379 EXPECT_CALL(observer,
380 OnEncryptedTypesChanged(expected_encrypted_types,
381 false));
382
286 EXPECT_FALSE(cryptographer.encrypt_everything()); 383 EXPECT_FALSE(cryptographer.encrypt_everything());
287 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); 384 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes();
288 for (ModelTypeSet::iterator iter = real_types.begin(); 385 for (ModelTypeSet::iterator iter = real_types.begin();
289 iter != real_types.end(); 386 iter != real_types.end();
290 ++iter) { 387 ++iter) {
291 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) 388 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI)
292 EXPECT_EQ(1U, encrypted_types.count(*iter)); 389 EXPECT_EQ(1U, encrypted_types.count(*iter));
293 else 390 else
294 EXPECT_EQ(0U, encrypted_types.count(*iter)); 391 EXPECT_EQ(0U, encrypted_types.count(*iter));
295 } 392 }
296 393
297 cryptographer.UpdateEncryptedTypesFromNigori(specifics); 394 cryptographer.UpdateEncryptedTypesFromNigori(specifics);
298 395
299 EXPECT_FALSE(cryptographer.encrypt_everything()); 396 EXPECT_FALSE(cryptographer.encrypt_everything());
300 encrypted_types = cryptographer.GetEncryptedTypes(); 397 encrypted_types = cryptographer.GetEncryptedTypes();
301 for (ModelTypeSet::iterator iter = real_types.begin(); 398 for (ModelTypeSet::iterator iter = real_types.begin();
302 iter != real_types.end(); 399 iter != real_types.end();
303 ++iter) { 400 ++iter) {
304 if (*iter == syncable::PASSWORDS || 401 if (*iter == syncable::PASSWORDS ||
305 *iter == syncable::NIGORI || 402 *iter == syncable::NIGORI ||
306 *iter == syncable::BOOKMARKS) 403 *iter == syncable::BOOKMARKS)
307 EXPECT_EQ(1U, encrypted_types.count(*iter)); 404 EXPECT_EQ(1U, encrypted_types.count(*iter));
308 else 405 else
309 EXPECT_EQ(0U, encrypted_types.count(*iter)); 406 EXPECT_EQ(0U, encrypted_types.count(*iter));
310 } 407 }
408
409 cryptographer.RemoveObserver(&observer);
311 } 410 }
312 411
313 } // namespace browser_sync 412 } // namespace browser_sync
OLDNEW
« chrome/browser/sync/util/cryptographer.cc ('K') | « chrome/browser/sync/util/cryptographer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698