| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "sync/util/cryptographer.h" | 5 #include "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 "sync/internal_api/public/base/model_type_test_util.h" | 11 #include "sync/internal_api/public/base/model_type_test_util.h" |
| 12 #include "sync/protocol/nigori_specifics.pb.h" | 12 #include "sync/protocol/nigori_specifics.pb.h" |
| 13 #include "sync/protocol/password_specifics.pb.h" | 13 #include "sync/protocol/password_specifics.pb.h" |
| 14 #include "sync/test/fake_encryptor.h" | 14 #include "sync/test/fake_encryptor.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 namespace syncer { | 18 namespace syncer { |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 using ::testing::_; | 22 using ::testing::_; |
| 23 using ::testing::Mock; | 23 using ::testing::Mock; |
| 24 using ::testing::StrictMock; | 24 using ::testing::StrictMock; |
| 25 using syncable::ModelTypeSet; | |
| 26 | 25 |
| 27 class MockObserver : public Cryptographer::Observer { | 26 class MockObserver : public Cryptographer::Observer { |
| 28 public: | 27 public: |
| 29 MOCK_METHOD2(OnEncryptedTypesChanged, | 28 MOCK_METHOD2(OnEncryptedTypesChanged, |
| 30 void(syncable::ModelTypeSet, bool)); | 29 void(syncer::ModelTypeSet, bool)); |
| 31 }; | 30 }; |
| 32 | 31 |
| 33 } // namespace | 32 } // namespace |
| 34 | 33 |
| 35 class SyncCryptographerTest : public ::testing::Test { | 34 class SyncCryptographerTest : public ::testing::Test { |
| 36 protected: | 35 protected: |
| 37 SyncCryptographerTest() : cryptographer_(&encryptor_) {} | 36 SyncCryptographerTest() : cryptographer_(&encryptor_) {} |
| 38 | 37 |
| 39 FakeEncryptor encryptor_; | 38 FakeEncryptor encryptor_; |
| 40 Cryptographer cryptographer_; | 39 Cryptographer cryptographer_; |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 cryptographer_.UpdateNigoriFromEncryptedTypes(&nigori); | 237 cryptographer_.UpdateNigoriFromEncryptedTypes(&nigori); |
| 239 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); | 238 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); |
| 240 EXPECT_TRUE(encrypted_types.Equals(cryptographer_.GetEncryptedTypes())); | 239 EXPECT_TRUE(encrypted_types.Equals(cryptographer_.GetEncryptedTypes())); |
| 241 EXPECT_TRUE(encrypted_types.Equals(cryptographer2.GetEncryptedTypes())); | 240 EXPECT_TRUE(encrypted_types.Equals(cryptographer2.GetEncryptedTypes())); |
| 242 | 241 |
| 243 Mock::VerifyAndClearExpectations(&observer); | 242 Mock::VerifyAndClearExpectations(&observer); |
| 244 Mock::VerifyAndClearExpectations(&observer2); | 243 Mock::VerifyAndClearExpectations(&observer2); |
| 245 | 244 |
| 246 EXPECT_CALL(observer, | 245 EXPECT_CALL(observer, |
| 247 OnEncryptedTypesChanged( | 246 OnEncryptedTypesChanged( |
| 248 HasModelTypes(syncable::ModelTypeSet::All()), | 247 HasModelTypes(syncer::ModelTypeSet::All()), |
| 249 false)); | 248 false)); |
| 250 EXPECT_CALL(observer2, | 249 EXPECT_CALL(observer2, |
| 251 OnEncryptedTypesChanged( | 250 OnEncryptedTypesChanged( |
| 252 HasModelTypes(syncable::ModelTypeSet::All()), | 251 HasModelTypes(syncer::ModelTypeSet::All()), |
| 253 false)); | 252 false)); |
| 254 | 253 |
| 255 // Set all encrypted types | 254 // Set all encrypted types |
| 256 encrypted_types = syncable::ModelTypeSet::All(); | 255 encrypted_types = syncer::ModelTypeSet::All(); |
| 257 cryptographer_.MergeEncryptedTypesForTest(encrypted_types); | 256 cryptographer_.MergeEncryptedTypesForTest(encrypted_types); |
| 258 cryptographer_.UpdateNigoriFromEncryptedTypes(&nigori); | 257 cryptographer_.UpdateNigoriFromEncryptedTypes(&nigori); |
| 259 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); | 258 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); |
| 260 EXPECT_TRUE(encrypted_types.Equals(cryptographer_.GetEncryptedTypes())); | 259 EXPECT_TRUE(encrypted_types.Equals(cryptographer_.GetEncryptedTypes())); |
| 261 EXPECT_TRUE(encrypted_types.Equals(cryptographer2.GetEncryptedTypes())); | 260 EXPECT_TRUE(encrypted_types.Equals(cryptographer2.GetEncryptedTypes())); |
| 262 | 261 |
| 263 // Receiving an empty nigori should not reset any encrypted types or trigger | 262 // Receiving an empty nigori should not reset any encrypted types or trigger |
| 264 // an observer notification. | 263 // an observer notification. |
| 265 Mock::VerifyAndClearExpectations(&observer); | 264 Mock::VerifyAndClearExpectations(&observer); |
| 266 nigori = sync_pb::NigoriSpecifics(); | 265 nigori = sync_pb::NigoriSpecifics(); |
| 267 cryptographer_.UpdateEncryptedTypesFromNigori(nigori); | 266 cryptographer_.UpdateEncryptedTypesFromNigori(nigori); |
| 268 EXPECT_TRUE(encrypted_types.Equals(cryptographer_.GetEncryptedTypes())); | 267 EXPECT_TRUE(encrypted_types.Equals(cryptographer_.GetEncryptedTypes())); |
| 269 } | 268 } |
| 270 | 269 |
| 271 TEST_F(SyncCryptographerTest, EncryptEverythingExplicit) { | 270 TEST_F(SyncCryptographerTest, EncryptEverythingExplicit) { |
| 272 ModelTypeSet real_types = syncable::ModelTypeSet::All(); | 271 ModelTypeSet real_types = syncer::ModelTypeSet::All(); |
| 273 sync_pb::NigoriSpecifics specifics; | 272 sync_pb::NigoriSpecifics specifics; |
| 274 specifics.set_encrypt_everything(true); | 273 specifics.set_encrypt_everything(true); |
| 275 | 274 |
| 276 StrictMock<MockObserver> observer; | 275 StrictMock<MockObserver> observer; |
| 277 cryptographer_.AddObserver(&observer); | 276 cryptographer_.AddObserver(&observer); |
| 278 | 277 |
| 279 EXPECT_CALL(observer, | 278 EXPECT_CALL(observer, |
| 280 OnEncryptedTypesChanged( | 279 OnEncryptedTypesChanged( |
| 281 HasModelTypes(syncable::ModelTypeSet::All()), true)); | 280 HasModelTypes(syncer::ModelTypeSet::All()), true)); |
| 282 | 281 |
| 283 EXPECT_FALSE(cryptographer_.encrypt_everything()); | 282 EXPECT_FALSE(cryptographer_.encrypt_everything()); |
| 284 ModelTypeSet encrypted_types = cryptographer_.GetEncryptedTypes(); | 283 ModelTypeSet encrypted_types = cryptographer_.GetEncryptedTypes(); |
| 285 for (ModelTypeSet::Iterator iter = real_types.First(); | 284 for (ModelTypeSet::Iterator iter = real_types.First(); |
| 286 iter.Good(); iter.Inc()) { | 285 iter.Good(); iter.Inc()) { |
| 287 if (iter.Get() == syncable::PASSWORDS || iter.Get() == syncable::NIGORI) | 286 if (iter.Get() == syncer::PASSWORDS || iter.Get() == syncer::NIGORI) |
| 288 EXPECT_TRUE(encrypted_types.Has(iter.Get())); | 287 EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
| 289 else | 288 else |
| 290 EXPECT_FALSE(encrypted_types.Has(iter.Get())); | 289 EXPECT_FALSE(encrypted_types.Has(iter.Get())); |
| 291 } | 290 } |
| 292 | 291 |
| 293 cryptographer_.UpdateEncryptedTypesFromNigori(specifics); | 292 cryptographer_.UpdateEncryptedTypesFromNigori(specifics); |
| 294 | 293 |
| 295 EXPECT_TRUE(cryptographer_.encrypt_everything()); | 294 EXPECT_TRUE(cryptographer_.encrypt_everything()); |
| 296 encrypted_types = cryptographer_.GetEncryptedTypes(); | 295 encrypted_types = cryptographer_.GetEncryptedTypes(); |
| 297 for (ModelTypeSet::Iterator iter = real_types.First(); | 296 for (ModelTypeSet::Iterator iter = real_types.First(); |
| 298 iter.Good(); iter.Inc()) { | 297 iter.Good(); iter.Inc()) { |
| 299 EXPECT_TRUE(encrypted_types.Has(iter.Get())); | 298 EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
| 300 } | 299 } |
| 301 | 300 |
| 302 // Shouldn't trigger another notification. | 301 // Shouldn't trigger another notification. |
| 303 specifics.set_encrypt_everything(true); | 302 specifics.set_encrypt_everything(true); |
| 304 | 303 |
| 305 cryptographer_.RemoveObserver(&observer); | 304 cryptographer_.RemoveObserver(&observer); |
| 306 } | 305 } |
| 307 | 306 |
| 308 TEST_F(SyncCryptographerTest, EncryptEverythingImplicit) { | 307 TEST_F(SyncCryptographerTest, EncryptEverythingImplicit) { |
| 309 ModelTypeSet real_types = syncable::ModelTypeSet::All(); | 308 ModelTypeSet real_types = syncer::ModelTypeSet::All(); |
| 310 sync_pb::NigoriSpecifics specifics; | 309 sync_pb::NigoriSpecifics specifics; |
| 311 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything | 310 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything |
| 312 | 311 |
| 313 StrictMock<MockObserver> observer; | 312 StrictMock<MockObserver> observer; |
| 314 cryptographer_.AddObserver(&observer); | 313 cryptographer_.AddObserver(&observer); |
| 315 | 314 |
| 316 EXPECT_CALL(observer, | 315 EXPECT_CALL(observer, |
| 317 OnEncryptedTypesChanged( | 316 OnEncryptedTypesChanged( |
| 318 HasModelTypes(syncable::ModelTypeSet::All()), true)); | 317 HasModelTypes(syncer::ModelTypeSet::All()), true)); |
| 319 | 318 |
| 320 EXPECT_FALSE(cryptographer_.encrypt_everything()); | 319 EXPECT_FALSE(cryptographer_.encrypt_everything()); |
| 321 ModelTypeSet encrypted_types = cryptographer_.GetEncryptedTypes(); | 320 ModelTypeSet encrypted_types = cryptographer_.GetEncryptedTypes(); |
| 322 for (ModelTypeSet::Iterator iter = real_types.First(); | 321 for (ModelTypeSet::Iterator iter = real_types.First(); |
| 323 iter.Good(); iter.Inc()) { | 322 iter.Good(); iter.Inc()) { |
| 324 if (iter.Get() == syncable::PASSWORDS || iter.Get() == syncable::NIGORI) | 323 if (iter.Get() == syncer::PASSWORDS || iter.Get() == syncer::NIGORI) |
| 325 EXPECT_TRUE(encrypted_types.Has(iter.Get())); | 324 EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
| 326 else | 325 else |
| 327 EXPECT_FALSE(encrypted_types.Has(iter.Get())); | 326 EXPECT_FALSE(encrypted_types.Has(iter.Get())); |
| 328 } | 327 } |
| 329 | 328 |
| 330 cryptographer_.UpdateEncryptedTypesFromNigori(specifics); | 329 cryptographer_.UpdateEncryptedTypesFromNigori(specifics); |
| 331 | 330 |
| 332 EXPECT_TRUE(cryptographer_.encrypt_everything()); | 331 EXPECT_TRUE(cryptographer_.encrypt_everything()); |
| 333 encrypted_types = cryptographer_.GetEncryptedTypes(); | 332 encrypted_types = cryptographer_.GetEncryptedTypes(); |
| 334 for (ModelTypeSet::Iterator iter = real_types.First(); | 333 for (ModelTypeSet::Iterator iter = real_types.First(); |
| 335 iter.Good(); iter.Inc()) { | 334 iter.Good(); iter.Inc()) { |
| 336 EXPECT_TRUE(encrypted_types.Has(iter.Get())); | 335 EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
| 337 } | 336 } |
| 338 | 337 |
| 339 // Shouldn't trigger another notification. | 338 // Shouldn't trigger another notification. |
| 340 specifics.set_encrypt_everything(true); | 339 specifics.set_encrypt_everything(true); |
| 341 | 340 |
| 342 cryptographer_.RemoveObserver(&observer); | 341 cryptographer_.RemoveObserver(&observer); |
| 343 } | 342 } |
| 344 | 343 |
| 345 TEST_F(SyncCryptographerTest, UnknownSensitiveTypes) { | 344 TEST_F(SyncCryptographerTest, UnknownSensitiveTypes) { |
| 346 ModelTypeSet real_types = syncable::ModelTypeSet::All(); | 345 ModelTypeSet real_types = syncer::ModelTypeSet::All(); |
| 347 sync_pb::NigoriSpecifics specifics; | 346 sync_pb::NigoriSpecifics specifics; |
| 348 // Explicitly setting encrypt everything should override logic for implicit | 347 // Explicitly setting encrypt everything should override logic for implicit |
| 349 // encrypt everything. | 348 // encrypt everything. |
| 350 specifics.set_encrypt_everything(false); | 349 specifics.set_encrypt_everything(false); |
| 351 specifics.set_encrypt_bookmarks(true); | 350 specifics.set_encrypt_bookmarks(true); |
| 352 | 351 |
| 353 StrictMock<MockObserver> observer; | 352 StrictMock<MockObserver> observer; |
| 354 cryptographer_.AddObserver(&observer); | 353 cryptographer_.AddObserver(&observer); |
| 355 | 354 |
| 356 syncable::ModelTypeSet expected_encrypted_types = | 355 syncer::ModelTypeSet expected_encrypted_types = |
| 357 Cryptographer::SensitiveTypes(); | 356 Cryptographer::SensitiveTypes(); |
| 358 expected_encrypted_types.Put(syncable::BOOKMARKS); | 357 expected_encrypted_types.Put(syncer::BOOKMARKS); |
| 359 | 358 |
| 360 EXPECT_CALL(observer, | 359 EXPECT_CALL(observer, |
| 361 OnEncryptedTypesChanged( | 360 OnEncryptedTypesChanged( |
| 362 HasModelTypes(expected_encrypted_types), false)); | 361 HasModelTypes(expected_encrypted_types), false)); |
| 363 | 362 |
| 364 EXPECT_FALSE(cryptographer_.encrypt_everything()); | 363 EXPECT_FALSE(cryptographer_.encrypt_everything()); |
| 365 ModelTypeSet encrypted_types = cryptographer_.GetEncryptedTypes(); | 364 ModelTypeSet encrypted_types = cryptographer_.GetEncryptedTypes(); |
| 366 for (ModelTypeSet::Iterator iter = real_types.First(); | 365 for (ModelTypeSet::Iterator iter = real_types.First(); |
| 367 iter.Good(); iter.Inc()) { | 366 iter.Good(); iter.Inc()) { |
| 368 if (iter.Get() == syncable::PASSWORDS || iter.Get() == syncable::NIGORI) | 367 if (iter.Get() == syncer::PASSWORDS || iter.Get() == syncer::NIGORI) |
| 369 EXPECT_TRUE(encrypted_types.Has(iter.Get())); | 368 EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
| 370 else | 369 else |
| 371 EXPECT_FALSE(encrypted_types.Has(iter.Get())); | 370 EXPECT_FALSE(encrypted_types.Has(iter.Get())); |
| 372 } | 371 } |
| 373 | 372 |
| 374 cryptographer_.UpdateEncryptedTypesFromNigori(specifics); | 373 cryptographer_.UpdateEncryptedTypesFromNigori(specifics); |
| 375 | 374 |
| 376 EXPECT_FALSE(cryptographer_.encrypt_everything()); | 375 EXPECT_FALSE(cryptographer_.encrypt_everything()); |
| 377 encrypted_types = cryptographer_.GetEncryptedTypes(); | 376 encrypted_types = cryptographer_.GetEncryptedTypes(); |
| 378 for (ModelTypeSet::Iterator iter = real_types.First(); | 377 for (ModelTypeSet::Iterator iter = real_types.First(); |
| 379 iter.Good(); iter.Inc()) { | 378 iter.Good(); iter.Inc()) { |
| 380 if (iter.Get() == syncable::PASSWORDS || | 379 if (iter.Get() == syncer::PASSWORDS || |
| 381 iter.Get() == syncable::NIGORI || | 380 iter.Get() == syncer::NIGORI || |
| 382 iter.Get() == syncable::BOOKMARKS) | 381 iter.Get() == syncer::BOOKMARKS) |
| 383 EXPECT_TRUE(encrypted_types.Has(iter.Get())); | 382 EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
| 384 else | 383 else |
| 385 EXPECT_FALSE(encrypted_types.Has(iter.Get())); | 384 EXPECT_FALSE(encrypted_types.Has(iter.Get())); |
| 386 } | 385 } |
| 387 | 386 |
| 388 cryptographer_.RemoveObserver(&observer); | 387 cryptographer_.RemoveObserver(&observer); |
| 389 } | 388 } |
| 390 | 389 |
| 391 } // namespace syncer | 390 } // namespace syncer |
| OLD | NEW |