Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 // Syncer unit tests. Unfortunately a lot of these tests | 5 // Syncer unit tests. Unfortunately a lot of these tests |
| 6 // are outdated and need to be reworked and updated. | 6 // are outdated and need to be reworked and updated. |
| 7 | 7 |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <list> | 10 #include <list> |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 26 #include "chrome/browser/sync/engine/model_safe_worker.h" | 26 #include "chrome/browser/sync/engine/model_safe_worker.h" |
| 27 #include "chrome/browser/sync/engine/net/server_connection_manager.h" | 27 #include "chrome/browser/sync/engine/net/server_connection_manager.h" |
| 28 #include "chrome/browser/sync/engine/process_updates_command.h" | 28 #include "chrome/browser/sync/engine/process_updates_command.h" |
| 29 #include "chrome/browser/sync/engine/nigori_util.h" | 29 #include "chrome/browser/sync/engine/nigori_util.h" |
| 30 #include "chrome/browser/sync/engine/syncer.h" | 30 #include "chrome/browser/sync/engine/syncer.h" |
| 31 #include "chrome/browser/sync/engine/syncer_proto_util.h" | 31 #include "chrome/browser/sync/engine/syncer_proto_util.h" |
| 32 #include "chrome/browser/sync/engine/syncer_util.h" | 32 #include "chrome/browser/sync/engine/syncer_util.h" |
| 33 #include "chrome/browser/sync/engine/syncproto.h" | 33 #include "chrome/browser/sync/engine/syncproto.h" |
| 34 #include "chrome/browser/sync/protocol/sync.pb.h" | 34 #include "chrome/browser/sync/protocol/sync.pb.h" |
| 35 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" | 35 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" |
| 36 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h" | |
| 36 #include "chrome/browser/sync/sessions/sync_session_context.h" | 37 #include "chrome/browser/sync/sessions/sync_session_context.h" |
| 37 #include "chrome/browser/sync/syncable/directory_manager.h" | 38 #include "chrome/browser/sync/syncable/directory_manager.h" |
| 38 #include "chrome/browser/sync/syncable/model_type.h" | 39 #include "chrome/browser/sync/syncable/model_type.h" |
| 39 #include "chrome/browser/sync/syncable/syncable.h" | 40 #include "chrome/browser/sync/syncable/syncable.h" |
| 40 #include "chrome/browser/sync/test/engine/fake_model_worker.h" | 41 #include "chrome/browser/sync/test/engine/fake_model_worker.h" |
| 41 #include "chrome/browser/sync/test/engine/mock_connection_manager.h" | 42 #include "chrome/browser/sync/test/engine/mock_connection_manager.h" |
| 42 #include "chrome/browser/sync/test/engine/test_directory_setter_upper.h" | 43 #include "chrome/browser/sync/test/engine/test_directory_setter_upper.h" |
| 43 #include "chrome/browser/sync/test/engine/test_id_factory.h" | 44 #include "chrome/browser/sync/test/engine/test_id_factory.h" |
| 44 #include "chrome/browser/sync/test/engine/test_syncable_utils.h" | 45 #include "chrome/browser/sync/test/engine/test_syncable_utils.h" |
| 46 #include "chrome/browser/sync/util/cryptographer.h" | |
| 45 #include "chrome/browser/sync/util/time.h" | 47 #include "chrome/browser/sync/util/time.h" |
| 46 #include "testing/gtest/include/gtest/gtest.h" | 48 #include "testing/gtest/include/gtest/gtest.h" |
| 47 | 49 |
| 48 using base::TimeDelta; | 50 using base::TimeDelta; |
| 49 | 51 |
| 50 using std::map; | 52 using std::map; |
| 51 using std::multimap; | 53 using std::multimap; |
| 52 using std::set; | 54 using std::set; |
| 53 using std::string; | 55 using std::string; |
| 54 | 56 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 190 should_loop = SyncShareAsDelegate(); | 192 should_loop = SyncShareAsDelegate(); |
| 191 } while (should_loop); | 193 } while (should_loop); |
| 192 } | 194 } |
| 193 | 195 |
| 194 virtual void SetUp() { | 196 virtual void SetUp() { |
| 195 syncdb_.SetUp(); | 197 syncdb_.SetUp(); |
| 196 | 198 |
| 197 mock_server_.reset( | 199 mock_server_.reset( |
| 198 new MockConnectionManager(syncdb_.manager(), syncdb_.name())); | 200 new MockConnectionManager(syncdb_.manager(), syncdb_.name())); |
| 199 EnableDatatype(syncable::BOOKMARKS); | 201 EnableDatatype(syncable::BOOKMARKS); |
| 202 EnableDatatype(syncable::NIGORI); | |
| 200 worker_ = new FakeModelWorker(GROUP_PASSIVE); | 203 worker_ = new FakeModelWorker(GROUP_PASSIVE); |
| 201 std::vector<SyncEngineEventListener*> listeners; | 204 std::vector<SyncEngineEventListener*> listeners; |
| 202 listeners.push_back(this); | 205 listeners.push_back(this); |
| 203 context_.reset(new SyncSessionContext(mock_server_.get(), | 206 context_.reset(new SyncSessionContext(mock_server_.get(), |
| 204 syncdb_.manager(), this, listeners, NULL)); | 207 syncdb_.manager(), this, listeners, NULL)); |
| 205 context_->set_account_name(syncdb_.name()); | 208 context_->set_account_name(syncdb_.name()); |
| 206 ASSERT_FALSE(context_->resolver()); | 209 ASSERT_FALSE(context_->resolver()); |
| 207 syncer_ = new Syncer(); | 210 syncer_ = new Syncer(); |
| 208 session_.reset(MakeSession()); | 211 session_.reset(MakeSession()); |
| 209 | 212 |
| (...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 738 ASSERT_TRUE(entryC.good()); | 741 ASSERT_TRUE(entryC.good()); |
| 739 EXPECT_FALSE(entryC.Get(IS_UNSYNCED)); | 742 EXPECT_FALSE(entryC.Get(IS_UNSYNCED)); |
| 740 EXPECT_FALSE(entryC.Get(IS_UNAPPLIED_UPDATE)); | 743 EXPECT_FALSE(entryC.Get(IS_UNAPPLIED_UPDATE)); |
| 741 Entry entryD(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(4)); | 744 Entry entryD(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(4)); |
| 742 ASSERT_TRUE(entryD.good()); | 745 ASSERT_TRUE(entryD.good()); |
| 743 EXPECT_FALSE(entryD.Get(IS_UNSYNCED)); | 746 EXPECT_FALSE(entryD.Get(IS_UNSYNCED)); |
| 744 EXPECT_FALSE(entryD.Get(IS_UNAPPLIED_UPDATE)); | 747 EXPECT_FALSE(entryD.Get(IS_UNAPPLIED_UPDATE)); |
| 745 } | 748 } |
| 746 } | 749 } |
| 747 | 750 |
| 751 TEST_F(SyncerTest, NigoriConflicts) { | |
| 752 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | |
| 753 ASSERT_TRUE(dir.good()); | |
| 754 KeyParams local_key_params = {"localhost", "dummy", "blargle"}; | |
| 755 KeyParams other_key_params = {"localhost", "dummy", "foobar"}; | |
| 756 browser_sync::Cryptographer other_cryptographer; | |
| 757 other_cryptographer.AddKey(other_key_params); | |
| 758 syncable::ModelTypeSet encrypted_types(syncable::PASSWORDS, syncable::NIGORI); | |
| 759 sync_pb::EntitySpecifics initial_nigori_specifics; | |
| 760 initial_nigori_specifics.MutableExtension(sync_pb::nigori); | |
| 761 mock_server_->SetNigori(1, 10, 10, initial_nigori_specifics); | |
| 762 | |
| 763 // Data for testing encryption/decryption. | |
| 764 sync_pb::EntitySpecifics other_encrypted_specifics; | |
| 765 other_encrypted_specifics.MutableExtension(sync_pb::bookmark)-> | |
| 766 set_title("title"); | |
| 767 other_cryptographer.Encrypt( | |
| 768 other_encrypted_specifics, | |
| 769 other_encrypted_specifics.mutable_encrypted()); | |
| 770 sync_pb::EntitySpecifics our_encrypted_specifics; | |
| 771 our_encrypted_specifics.MutableExtension(sync_pb::bookmark)-> | |
| 772 set_title("title2"); | |
| 773 | |
| 774 // Receive the initial nigori node. | |
| 775 SyncShareAsDelegate(); | |
| 776 encrypted_types = syncable::ModelTypeSet::All(); | |
| 777 { | |
| 778 // Local changes with different passphrase and different types. | |
| 779 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); | |
| 780 sync_pb::EntitySpecifics specifics; | |
| 781 sync_pb::NigoriSpecifics* nigori = | |
| 782 specifics.MutableExtension(sync_pb::nigori); | |
| 783 syncdb_.manager()->GetCryptographer(&wtrans)->AddKey(local_key_params); | |
| 784 syncdb_.manager()->GetCryptographer(&wtrans)->Encrypt( | |
| 785 our_encrypted_specifics, | |
| 786 our_encrypted_specifics.mutable_encrypted()); | |
| 787 syncdb_.manager()->GetCryptographer(&wtrans)->GetKeys( | |
| 788 nigori->mutable_encrypted()); | |
| 789 syncdb_.manager()->GetCryptographer(&wtrans)-> | |
| 790 UpdateNigoriFromEncryptedTypes(nigori); | |
| 791 syncdb_.manager()->GetCryptographer(&wtrans)->set_encrypt_everything(); | |
| 792 MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG, | |
| 793 syncable::ModelTypeToRootTag(syncable::NIGORI)); | |
| 794 ASSERT_TRUE(nigori_entry.good()); | |
| 795 nigori_entry.Put(SPECIFICS, specifics); | |
| 796 nigori_entry.Put(IS_UNSYNCED, true); | |
| 797 EXPECT_FALSE(syncdb_.manager()->GetCryptographer(&wtrans)-> | |
| 798 has_pending_keys()); | |
| 799 EXPECT_TRUE(encrypted_types.Equals( | |
| 800 syncdb_.manager()->GetCryptographer(&wtrans)->GetEncryptedTypes())); | |
| 801 } | |
| 802 { | |
| 803 sync_pb::EntitySpecifics specifics; | |
| 804 sync_pb::NigoriSpecifics* nigori = | |
| 805 specifics.MutableExtension(sync_pb::nigori); | |
| 806 other_cryptographer.GetKeys(nigori->mutable_encrypted()); | |
| 807 nigori->set_encrypt_bookmarks(true); | |
| 808 nigori->set_encrypt_preferences(true); | |
| 809 nigori->set_encrypt_everything(false); | |
| 810 mock_server_->SetNigori(1, 20, 20, specifics); | |
| 811 } | |
| 812 | |
| 813 // Will result in downloading the server nigori, which puts the local nigori | |
| 814 // in a state of conflict. This is resolved by merging the local and server | |
| 815 // data (with priority given to the server's encryption keys if they are | |
| 816 // undecryptable), which we then commit. The cryptographer should have pending | |
| 817 // keys and merge the set of encrypted types. | |
| 818 SyncShareAsDelegate(); // Resolve conflict in this cycle. | |
| 819 SyncShareAsDelegate(); // Commit local change in this cycle. | |
| 820 { | |
| 821 // Ensure set of encrypted types merged. | |
| 822 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); | |
| 823 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)-> | |
| 824 has_pending_keys()); | |
| 825 EXPECT_TRUE(encrypted_types.Equals( | |
| 826 syncdb_.manager()->GetCryptographer(&wtrans)->GetEncryptedTypes())); | |
| 827 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)-> | |
| 828 encrypt_everything()); | |
| 829 // Supply the pending keys. Afterwards, we should be able to decrypt both | |
| 830 // our own encrypted data and data encrypted by the other cryptographer, | |
| 831 // but the key provided by the other cryptographer should be the default. | |
| 832 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)-> | |
| 833 DecryptPendingKeys(other_key_params)); | |
| 834 EXPECT_FALSE(syncdb_.manager()->GetCryptographer(&wtrans)-> | |
| 835 has_pending_keys()); | |
| 836 sync_pb::EntitySpecifics specifics; | |
| 837 sync_pb::NigoriSpecifics* nigori = | |
| 838 specifics.MutableExtension(sync_pb::nigori); | |
| 839 syncdb_.manager()->GetCryptographer(&wtrans)->GetKeys( | |
| 840 nigori->mutable_encrypted()); | |
| 841 syncdb_.manager()->GetCryptographer(&wtrans)-> | |
| 842 UpdateNigoriFromEncryptedTypes(nigori); | |
| 843 MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG, | |
| 844 syncable::ModelTypeToRootTag(syncable::NIGORI)); | |
| 845 ASSERT_TRUE(nigori_entry.good()); | |
| 846 EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE)); | |
| 847 EXPECT_FALSE(nigori_entry.Get(IS_UNSYNCED)); | |
| 848 // Normally this would be written as part of SetPassphrase, but we do it | |
| 849 // manually for the test. | |
| 850 nigori_entry.Put(SPECIFICS, specifics); | |
| 851 nigori_entry.Put(IS_UNSYNCED, true); | |
| 852 } | |
| 853 | |
| 854 SyncShareAsDelegate(); | |
| 855 { | |
| 856 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); | |
| 857 MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG, | |
| 858 syncable::ModelTypeToRootTag(syncable::NIGORI)); | |
| 859 ASSERT_TRUE(nigori_entry.good()); | |
| 860 EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE)); | |
| 861 EXPECT_FALSE(nigori_entry.Get(IS_UNSYNCED)); | |
| 862 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)->CanDecrypt( | |
| 863 our_encrypted_specifics.encrypted())); | |
| 864 EXPECT_FALSE(syncdb_.manager()->GetCryptographer(&wtrans)-> | |
| 865 CanDecryptUsingDefaultKey(our_encrypted_specifics.encrypted())); | |
| 866 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)->CanDecrypt( | |
| 867 other_encrypted_specifics.encrypted())); | |
| 868 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)-> | |
| 869 CanDecryptUsingDefaultKey(other_encrypted_specifics.encrypted())); | |
| 870 } | |
| 871 } | |
|
tim (not reviewing)
2011/12/20 17:54:05
I don't see anything for sync_tabs here?
Nicolas Zea
2011/12/20 19:54:10
Done.
| |
| 872 | |
| 873 | |
| 748 // TODO(chron): More corner case unit tests around validation. | 874 // TODO(chron): More corner case unit tests around validation. |
| 749 TEST_F(SyncerTest, TestCommitMetahandleIterator) { | 875 TEST_F(SyncerTest, TestCommitMetahandleIterator) { |
| 750 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 876 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
| 751 ASSERT_TRUE(dir.good()); | 877 ASSERT_TRUE(dir.good()); |
| 752 StatusController* status = session_->mutable_status_controller(); | 878 StatusController* status = session_->mutable_status_controller(); |
| 753 const vector<int64>& unsynced(status->unsynced_handles()); | 879 const vector<int64>& unsynced(status->unsynced_handles()); |
| 754 | 880 |
| 755 { | 881 { |
| 756 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); | 882 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); |
| 757 ScopedSetSessionWriteTransaction set_trans(session_.get(), &wtrans); | 883 ScopedSetSessionWriteTransaction set_trans(session_.get(), &wtrans); |
| (...skipping 4593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5351 Add(low_id_); | 5477 Add(low_id_); |
| 5352 Add(high_id_); | 5478 Add(high_id_); |
| 5353 SyncShareAsDelegate(); | 5479 SyncShareAsDelegate(); |
| 5354 ExpectLocalOrderIsByServerId(); | 5480 ExpectLocalOrderIsByServerId(); |
| 5355 } | 5481 } |
| 5356 | 5482 |
| 5357 const SyncerTest::CommitOrderingTest | 5483 const SyncerTest::CommitOrderingTest |
| 5358 SyncerTest::CommitOrderingTest::LAST_COMMIT_ITEM = {-1, TestIdFactory::root()}; | 5484 SyncerTest::CommitOrderingTest::LAST_COMMIT_ITEM = {-1, TestIdFactory::root()}; |
| 5359 | 5485 |
| 5360 } // namespace browser_sync | 5486 } // namespace browser_sync |
| OLD | NEW |