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