| 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 "base/format_macros.h" | 5 #include "base/format_macros.h" |
| 6 #include "base/location.h" | 6 #include "base/location.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
| 9 #include "sync/engine/apply_control_data_updates.h" | 9 #include "sync/engine/apply_control_data_updates.h" |
| 10 #include "sync/engine/syncer.h" | 10 #include "sync/engine/syncer.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 | 60 |
| 61 // Verify that applying a nigori node sets initial sync ended properly, | 61 // Verify that applying a nigori node sets initial sync ended properly, |
| 62 // updates the set of encrypted types, and updates the cryptographer. | 62 // updates the set of encrypted types, and updates the cryptographer. |
| 63 TEST_F(ApplyControlDataUpdatesTest, NigoriUpdate) { | 63 TEST_F(ApplyControlDataUpdatesTest, NigoriUpdate) { |
| 64 // Storing the cryptographer separately is bad, but for this test we | 64 // Storing the cryptographer separately is bad, but for this test we |
| 65 // know it's safe. | 65 // know it's safe. |
| 66 Cryptographer* cryptographer; | 66 Cryptographer* cryptographer; |
| 67 ModelTypeSet encrypted_types; | 67 ModelTypeSet encrypted_types; |
| 68 encrypted_types.PutAll(SyncEncryptionHandler::SensitiveTypes()); | 68 encrypted_types.PutAll(SyncEncryptionHandler::SensitiveTypes()); |
| 69 | 69 |
| 70 // We start with initial_sync_ended == false. This is wrong, since we would | |
| 71 // have no nigori node if that were the case. However, it makes it easier to | |
| 72 // verify that ApplyControlDataUpdates sets initial_sync_ended correctly. | |
| 73 EXPECT_FALSE(directory()->initial_sync_ended_types().Has(NIGORI)); | |
| 74 | |
| 75 { | 70 { |
| 76 syncable::ReadTransaction trans(FROM_HERE, directory()); | 71 syncable::ReadTransaction trans(FROM_HERE, directory()); |
| 77 cryptographer = directory()->GetCryptographer(&trans); | 72 cryptographer = directory()->GetCryptographer(&trans); |
| 78 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) | 73 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) |
| 79 .Equals(encrypted_types)); | 74 .Equals(encrypted_types)); |
| 80 } | 75 } |
| 81 | 76 |
| 82 // Nigori node updates should update the Cryptographer. | 77 // Nigori node updates should update the Cryptographer. |
| 83 Cryptographer other_cryptographer(cryptographer->encryptor()); | 78 Cryptographer other_cryptographer(cryptographer->encryptor()); |
| 84 KeyParams params = {"localhost", "dummy", "foobar"}; | 79 KeyParams params = {"localhost", "dummy", "foobar"}; |
| 85 other_cryptographer.AddKey(params); | 80 other_cryptographer.AddKey(params); |
| 86 | 81 |
| 87 sync_pb::EntitySpecifics specifics; | 82 sync_pb::EntitySpecifics specifics; |
| 88 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); | 83 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); |
| 89 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag()); | 84 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag()); |
| 90 nigori->set_encrypt_everything(true); | 85 nigori->set_encrypt_everything(true); |
| 91 entry_factory_->CreateUnappliedNewItem( | 86 entry_factory_->CreateUnappliedNewItem( |
| 92 ModelTypeToRootTag(NIGORI), specifics, true); | 87 ModelTypeToRootTag(NIGORI), specifics, true); |
| 93 EXPECT_FALSE(cryptographer->has_pending_keys()); | 88 EXPECT_FALSE(cryptographer->has_pending_keys()); |
| 94 | 89 |
| 95 ApplyControlDataUpdates(session()); | 90 ApplyControlDataUpdates(session()); |
| 96 | 91 |
| 97 EXPECT_FALSE(cryptographer->is_ready()); | 92 EXPECT_FALSE(cryptographer->is_ready()); |
| 98 EXPECT_TRUE(cryptographer->has_pending_keys()); | 93 EXPECT_TRUE(cryptographer->has_pending_keys()); |
| 99 { | 94 { |
| 100 syncable::ReadTransaction trans(FROM_HERE, directory()); | 95 syncable::ReadTransaction trans(FROM_HERE, directory()); |
| 101 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) | 96 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) |
| 102 .Equals(ModelTypeSet::All())); | 97 .Equals(ModelTypeSet::All())); |
| 103 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(NIGORI)); | |
| 104 } | 98 } |
| 105 } | 99 } |
| 106 | 100 |
| 107 // Create some local unsynced and unencrypted data. Apply a nigori update that | 101 // Create some local unsynced and unencrypted data. Apply a nigori update that |
| 108 // turns on encryption for the unsynced data. Ensure we properly encrypt the | 102 // turns on encryption for the unsynced data. Ensure we properly encrypt the |
| 109 // data as part of the nigori update. Apply another nigori update with no | 103 // data as part of the nigori update. Apply another nigori update with no |
| 110 // changes. Ensure we ignore already-encrypted unsynced data and that nothing | 104 // changes. Ensure we ignore already-encrypted unsynced data and that nothing |
| 111 // breaks. | 105 // breaks. |
| 112 TEST_F(ApplyControlDataUpdatesTest, EncryptUnsyncedChanges) { | 106 TEST_F(ApplyControlDataUpdatesTest, EncryptUnsyncedChanges) { |
| 113 // Storing the cryptographer separately is bad, but for this test we | 107 // Storing the cryptographer separately is bad, but for this test we |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 370 entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 377 nigori().encryption_keybag())); | 371 nigori().encryption_keybag())); |
| 378 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 372 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 379 nigori().keybag_is_frozen()); | 373 nigori().keybag_is_frozen()); |
| 380 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 374 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 381 nigori().encrypt_everything()); | 375 nigori().encrypt_everything()); |
| 382 { | 376 { |
| 383 syncable::ReadTransaction trans(FROM_HERE, directory()); | 377 syncable::ReadTransaction trans(FROM_HERE, directory()); |
| 384 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) | 378 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) |
| 385 .Equals(ModelTypeSet::All())); | 379 .Equals(ModelTypeSet::All())); |
| 386 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(NIGORI)); | |
| 387 } | 380 } |
| 388 } | 381 } |
| 389 | 382 |
| 390 // Verify we handle a nigori node conflict by merging encryption keys and | 383 // Verify we handle a nigori node conflict by merging encryption keys and |
| 391 // types, but preserve the custom passphrase state of the server. | 384 // types, but preserve the custom passphrase state of the server. |
| 392 // Initial sync ended should be set. | 385 // Initial sync ended should be set. |
| 393 TEST_F(ApplyControlDataUpdatesTest, | 386 TEST_F(ApplyControlDataUpdatesTest, |
| 394 NigoriConflictPendingKeysLocalEncryptEverythingCustom) { | 387 NigoriConflictPendingKeysLocalEncryptEverythingCustom) { |
| 395 Cryptographer* cryptographer; | 388 Cryptographer* cryptographer; |
| 396 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); | 389 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 448 entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 456 nigori().encryption_keybag())); | 449 nigori().encryption_keybag())); |
| 457 EXPECT_FALSE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 450 EXPECT_FALSE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 458 nigori().keybag_is_frozen()); | 451 nigori().keybag_is_frozen()); |
| 459 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 452 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 460 nigori().encrypt_everything()); | 453 nigori().encrypt_everything()); |
| 461 { | 454 { |
| 462 syncable::ReadTransaction trans(FROM_HERE, directory()); | 455 syncable::ReadTransaction trans(FROM_HERE, directory()); |
| 463 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) | 456 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) |
| 464 .Equals(ModelTypeSet::All())); | 457 .Equals(ModelTypeSet::All())); |
| 465 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(NIGORI)); | |
| 466 } | 458 } |
| 467 } | 459 } |
| 468 | 460 |
| 469 // If the conflicting nigori has a subset of the local keys, the conflict | 461 // If the conflicting nigori has a subset of the local keys, the conflict |
| 470 // resolution should preserve the full local keys. Initial sync ended should be | 462 // resolution should preserve the full local keys. Initial sync ended should be |
| 471 // set. | 463 // set. |
| 472 TEST_F(ApplyControlDataUpdatesTest, | 464 TEST_F(ApplyControlDataUpdatesTest, |
| 473 NigoriConflictOldKeys) { | 465 NigoriConflictOldKeys) { |
| 474 Cryptographer* cryptographer; | 466 Cryptographer* cryptographer; |
| 475 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); | 467 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 519 entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 528 nigori().encryption_keybag())); | 520 nigori().encryption_keybag())); |
| 529 EXPECT_FALSE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 521 EXPECT_FALSE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 530 nigori().keybag_is_frozen()); | 522 nigori().keybag_is_frozen()); |
| 531 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 523 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 532 nigori().encrypt_everything()); | 524 nigori().encrypt_everything()); |
| 533 { | 525 { |
| 534 syncable::ReadTransaction trans(FROM_HERE, directory()); | 526 syncable::ReadTransaction trans(FROM_HERE, directory()); |
| 535 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) | 527 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) |
| 536 .Equals(ModelTypeSet::All())); | 528 .Equals(ModelTypeSet::All())); |
| 537 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(NIGORI)); | |
| 538 } | 529 } |
| 539 } | 530 } |
| 540 | 531 |
| 541 // If both nigoris are migrated, but we also set a custom passphrase locally, | 532 // If both nigoris are migrated, but we also set a custom passphrase locally, |
| 542 // the local nigori should be preserved. | 533 // the local nigori should be preserved. |
| 543 TEST_F(ApplyControlDataUpdatesTest, | 534 TEST_F(ApplyControlDataUpdatesTest, |
| 544 NigoriConflictBothMigratedLocalCustom) { | 535 NigoriConflictBothMigratedLocalCustom) { |
| 545 Cryptographer* cryptographer; | 536 Cryptographer* cryptographer; |
| 546 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); | 537 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); |
| 547 KeyParams old_params = {"localhost", "dummy", "old"}; | 538 KeyParams old_params = {"localhost", "dummy", "old"}; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 nigori().keybag_is_frozen()); | 601 nigori().keybag_is_frozen()); |
| 611 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 602 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 612 nigori().encrypt_everything()); | 603 nigori().encrypt_everything()); |
| 613 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE, | 604 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE, |
| 614 entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 605 entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 615 nigori().passphrase_type()); | 606 nigori().passphrase_type()); |
| 616 { | 607 { |
| 617 syncable::ReadTransaction trans(FROM_HERE, directory()); | 608 syncable::ReadTransaction trans(FROM_HERE, directory()); |
| 618 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) | 609 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) |
| 619 .Equals(ModelTypeSet::All())); | 610 .Equals(ModelTypeSet::All())); |
| 620 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(NIGORI)); | |
| 621 } | 611 } |
| 622 } | 612 } |
| 623 | 613 |
| 624 // If both nigoris are migrated, but a custom passphrase with a new key was | 614 // If both nigoris are migrated, but a custom passphrase with a new key was |
| 625 // set remotely, the remote nigori should be preserved. | 615 // set remotely, the remote nigori should be preserved. |
| 626 TEST_F(ApplyControlDataUpdatesTest, | 616 TEST_F(ApplyControlDataUpdatesTest, |
| 627 NigoriConflictBothMigratedServerCustom) { | 617 NigoriConflictBothMigratedServerCustom) { |
| 628 Cryptographer* cryptographer; | 618 Cryptographer* cryptographer; |
| 629 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); | 619 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); |
| 630 KeyParams old_params = {"localhost", "dummy", "old"}; | 620 KeyParams old_params = {"localhost", "dummy", "old"}; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 nigori().keybag_is_frozen()); | 684 nigori().keybag_is_frozen()); |
| 695 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 685 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 696 nigori().encrypt_everything()); | 686 nigori().encrypt_everything()); |
| 697 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE, | 687 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE, |
| 698 entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 688 entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 699 nigori().passphrase_type()); | 689 nigori().passphrase_type()); |
| 700 { | 690 { |
| 701 syncable::ReadTransaction trans(FROM_HERE, directory()); | 691 syncable::ReadTransaction trans(FROM_HERE, directory()); |
| 702 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) | 692 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) |
| 703 .Equals(ModelTypeSet::All())); | 693 .Equals(ModelTypeSet::All())); |
| 704 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(NIGORI)); | |
| 705 } | 694 } |
| 706 } | 695 } |
| 707 | 696 |
| 708 // If the local nigori is migrated but the server is not, preserve the local | 697 // If the local nigori is migrated but the server is not, preserve the local |
| 709 // nigori. | 698 // nigori. |
| 710 TEST_F(ApplyControlDataUpdatesTest, | 699 TEST_F(ApplyControlDataUpdatesTest, |
| 711 NigoriConflictLocalMigrated) { | 700 NigoriConflictLocalMigrated) { |
| 712 Cryptographer* cryptographer; | 701 Cryptographer* cryptographer; |
| 713 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); | 702 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); |
| 714 KeyParams old_params = {"localhost", "dummy", "old"}; | 703 KeyParams old_params = {"localhost", "dummy", "old"}; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 nigori().keybag_is_frozen()); | 763 nigori().keybag_is_frozen()); |
| 775 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 764 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 776 nigori().encrypt_everything()); | 765 nigori().encrypt_everything()); |
| 777 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE, | 766 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE, |
| 778 entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 767 entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 779 nigori().passphrase_type()); | 768 nigori().passphrase_type()); |
| 780 { | 769 { |
| 781 syncable::ReadTransaction trans(FROM_HERE, directory()); | 770 syncable::ReadTransaction trans(FROM_HERE, directory()); |
| 782 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) | 771 EXPECT_TRUE(directory()->GetNigoriHandler()->GetEncryptedTypes(&trans) |
| 783 .Equals(ModelTypeSet::All())); | 772 .Equals(ModelTypeSet::All())); |
| 784 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(NIGORI)); | |
| 785 } | 773 } |
| 786 } | 774 } |
| 787 | 775 |
| 788 // If the server nigori is migrated but the local is not, preserve the server | 776 // If the server nigori is migrated but the local is not, preserve the server |
| 789 // nigori. | 777 // nigori. |
| 790 TEST_F(ApplyControlDataUpdatesTest, | 778 TEST_F(ApplyControlDataUpdatesTest, |
| 791 NigoriConflictServerMigrated) { | 779 NigoriConflictServerMigrated) { |
| 792 Cryptographer* cryptographer; | 780 Cryptographer* cryptographer; |
| 793 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); | 781 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); |
| 794 KeyParams old_params = {"localhost", "dummy", "old"}; | 782 KeyParams old_params = {"localhost", "dummy", "old"}; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 nigori().encryption_keybag())); | 847 nigori().encryption_keybag())); |
| 860 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 848 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 861 nigori().keybag_is_frozen()); | 849 nigori().keybag_is_frozen()); |
| 862 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 850 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 863 nigori().has_keystore_decryptor_token()); | 851 nigori().has_keystore_decryptor_token()); |
| 864 EXPECT_EQ(sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE, | 852 EXPECT_EQ(sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE, |
| 865 entry_factory_->GetLocalSpecificsForItem(nigori_handle). | 853 entry_factory_->GetLocalSpecificsForItem(nigori_handle). |
| 866 nigori().passphrase_type()); | 854 nigori().passphrase_type()); |
| 867 { | 855 { |
| 868 syncable::ReadTransaction trans(FROM_HERE, directory()); | 856 syncable::ReadTransaction trans(FROM_HERE, directory()); |
| 869 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(NIGORI)); | |
| 870 } | 857 } |
| 871 } | 858 } |
| 872 | 859 |
| 873 // Check that we can apply a simple control datatype node successfully. | 860 // Check that we can apply a simple control datatype node successfully. |
| 874 TEST_F(ApplyControlDataUpdatesTest, ControlApply) { | 861 TEST_F(ApplyControlDataUpdatesTest, ControlApply) { |
| 875 EXPECT_FALSE(directory()->initial_sync_ended_types().Has(EXPERIMENTS)); | |
| 876 | |
| 877 std::string experiment_id = "experiment"; | 862 std::string experiment_id = "experiment"; |
| 878 sync_pb::EntitySpecifics specifics; | 863 sync_pb::EntitySpecifics specifics; |
| 879 specifics.mutable_experiments()->mutable_keystore_encryption()-> | 864 specifics.mutable_experiments()->mutable_keystore_encryption()-> |
| 880 set_enabled(true); | 865 set_enabled(true); |
| 881 int64 experiment_handle = entry_factory_->CreateUnappliedNewItem( | 866 int64 experiment_handle = entry_factory_->CreateUnappliedNewItem( |
| 882 experiment_id, specifics, false); | 867 experiment_id, specifics, false); |
| 883 ApplyControlDataUpdates(session()); | 868 ApplyControlDataUpdates(session()); |
| 884 | 869 |
| 885 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(EXPERIMENTS)); | |
| 886 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle)); | 870 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle)); |
| 887 EXPECT_TRUE( | 871 EXPECT_TRUE( |
| 888 entry_factory_->GetLocalSpecificsForItem(experiment_handle). | 872 entry_factory_->GetLocalSpecificsForItem(experiment_handle). |
| 889 experiments().keystore_encryption().enabled()); | 873 experiments().keystore_encryption().enabled()); |
| 890 } | 874 } |
| 891 | 875 |
| 892 // Verify that we apply top level folders before their children. | 876 // Verify that we apply top level folders before their children. |
| 893 TEST_F(ApplyControlDataUpdatesTest, ControlApplyParentBeforeChild) { | 877 TEST_F(ApplyControlDataUpdatesTest, ControlApplyParentBeforeChild) { |
| 894 EXPECT_FALSE(directory()->initial_sync_ended_types().Has(EXPERIMENTS)); | |
| 895 | |
| 896 std::string parent_id = "parent"; | 878 std::string parent_id = "parent"; |
| 897 std::string experiment_id = "experiment"; | 879 std::string experiment_id = "experiment"; |
| 898 sync_pb::EntitySpecifics specifics; | 880 sync_pb::EntitySpecifics specifics; |
| 899 specifics.mutable_experiments()->mutable_keystore_encryption()-> | 881 specifics.mutable_experiments()->mutable_keystore_encryption()-> |
| 900 set_enabled(true); | 882 set_enabled(true); |
| 901 int64 experiment_handle = entry_factory_->CreateUnappliedNewItemWithParent( | 883 int64 experiment_handle = entry_factory_->CreateUnappliedNewItemWithParent( |
| 902 experiment_id, specifics, parent_id); | 884 experiment_id, specifics, parent_id); |
| 903 int64 parent_handle = entry_factory_->CreateUnappliedNewItem( | 885 int64 parent_handle = entry_factory_->CreateUnappliedNewItem( |
| 904 parent_id, specifics, true); | 886 parent_id, specifics, true); |
| 905 ApplyControlDataUpdates(session()); | 887 ApplyControlDataUpdates(session()); |
| 906 | 888 |
| 907 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(EXPERIMENTS)); | |
| 908 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(parent_handle)); | 889 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(parent_handle)); |
| 909 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle)); | 890 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle)); |
| 910 EXPECT_TRUE( | 891 EXPECT_TRUE( |
| 911 entry_factory_->GetLocalSpecificsForItem(experiment_handle). | 892 entry_factory_->GetLocalSpecificsForItem(experiment_handle). |
| 912 experiments().keystore_encryption().enabled()); | 893 experiments().keystore_encryption().enabled()); |
| 913 } | 894 } |
| 914 | 895 |
| 915 // Verify that we handle control datatype conflicts by preserving the server | 896 // Verify that we handle control datatype conflicts by preserving the server |
| 916 // data. | 897 // data. |
| 917 TEST_F(ApplyControlDataUpdatesTest, ControlConflict) { | 898 TEST_F(ApplyControlDataUpdatesTest, ControlConflict) { |
| 918 EXPECT_FALSE(directory()->initial_sync_ended_types().Has(EXPERIMENTS)); | |
| 919 | |
| 920 std::string experiment_id = "experiment"; | 899 std::string experiment_id = "experiment"; |
| 921 sync_pb::EntitySpecifics local_specifics, server_specifics; | 900 sync_pb::EntitySpecifics local_specifics, server_specifics; |
| 922 server_specifics.mutable_experiments()->mutable_keystore_encryption()-> | 901 server_specifics.mutable_experiments()->mutable_keystore_encryption()-> |
| 923 set_enabled(true); | 902 set_enabled(true); |
| 924 local_specifics.mutable_experiments()->mutable_keystore_encryption()-> | 903 local_specifics.mutable_experiments()->mutable_keystore_encryption()-> |
| 925 set_enabled(false); | 904 set_enabled(false); |
| 926 int64 experiment_handle = entry_factory_->CreateSyncedItem( | 905 int64 experiment_handle = entry_factory_->CreateSyncedItem( |
| 927 experiment_id, EXPERIMENTS, false); | 906 experiment_id, EXPERIMENTS, false); |
| 928 entry_factory_->SetServerSpecificsForItem(experiment_handle, | 907 entry_factory_->SetServerSpecificsForItem(experiment_handle, |
| 929 server_specifics); | 908 server_specifics); |
| 930 entry_factory_->SetLocalSpecificsForItem(experiment_handle, | 909 entry_factory_->SetLocalSpecificsForItem(experiment_handle, |
| 931 local_specifics); | 910 local_specifics); |
| 932 ApplyControlDataUpdates(session()); | 911 ApplyControlDataUpdates(session()); |
| 933 | 912 |
| 934 EXPECT_TRUE(directory()->initial_sync_ended_types().Has(EXPERIMENTS)); | |
| 935 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle)); | 913 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle)); |
| 936 EXPECT_TRUE( | 914 EXPECT_TRUE( |
| 937 entry_factory_->GetLocalSpecificsForItem(experiment_handle). | 915 entry_factory_->GetLocalSpecificsForItem(experiment_handle). |
| 938 experiments().keystore_encryption().enabled()); | 916 experiments().keystore_encryption().enabled()); |
| 939 } | 917 } |
| 940 | 918 |
| 941 } // namespace syncer | 919 } // namespace syncer |
| OLD | NEW |