| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/tracked.h" | |
| 6 #include "base/utf_string_conversions.h" | |
| 7 #include "chrome/browser/sync/internal_api/read_node_mock.h" | |
| 8 #include "chrome/browser/sync/internal_api/syncapi_mock.h" | |
| 9 #include "chrome/browser/sync/glue/autofill_profile_model_associator.h" | |
| 10 #include "chrome/browser/sync/syncable/syncable.h" | |
| 11 #include "chrome/browser/sync/syncable/syncable_mock.h" | |
| 12 #include "testing/gmock/include/gmock/gmock.h" | |
| 13 #include "testing/gtest/include/gtest/gtest.h" | |
| 14 | |
| 15 using ::testing::_; | |
| 16 using ::testing::Return; | |
| 17 using ::testing::DoDefault; | |
| 18 using ::testing::ReturnRef; | |
| 19 using ::testing::Pointee; | |
| 20 using ::testing::Ref; | |
| 21 using ::testing::Invoke; | |
| 22 class AutofillProfile; | |
| 23 | |
| 24 using browser_sync::AutofillProfileModelAssociator; | |
| 25 | |
| 26 // Note this is not a generic mock. This is a mock used to | |
| 27 // test AutofillProfileModelAssociator class itself by mocking | |
| 28 // other functions that are called by the functions we need to test. | |
| 29 class MockAutofillProfileModelAssociator | |
| 30 : public AutofillProfileModelAssociator { | |
| 31 public: | |
| 32 MockAutofillProfileModelAssociator() { | |
| 33 } | |
| 34 virtual ~MockAutofillProfileModelAssociator() {} | |
| 35 bool TraverseAndAssociateChromeAutofillProfilesWrapper( | |
| 36 sync_api::WriteTransaction* write_trans, | |
| 37 const sync_api::ReadNode& autofill_root, | |
| 38 const std::vector<AutofillProfile*>& all_profiles_from_db, | |
| 39 std::set<std::string>* current_profiles, | |
| 40 std::vector<AutofillProfile*>* updated_profiles, | |
| 41 std::vector<AutofillProfile*>* new_profiles, | |
| 42 std::vector<std::string>* profiles_to_delete) { | |
| 43 return TraverseAndAssociateChromeAutofillProfiles(write_trans, | |
| 44 autofill_root, | |
| 45 all_profiles_from_db, | |
| 46 current_profiles, | |
| 47 updated_profiles, | |
| 48 new_profiles, | |
| 49 profiles_to_delete); | |
| 50 } | |
| 51 MOCK_METHOD3(AddNativeProfileIfNeeded, | |
| 52 void(const sync_pb::AutofillProfileSpecifics&, | |
| 53 DataBundle*, | |
| 54 const sync_api::ReadNode&)); | |
| 55 MOCK_METHOD2(OverwriteProfileWithServerData, | |
| 56 bool(AutofillProfile*, | |
| 57 const sync_pb::AutofillProfileSpecifics&)); | |
| 58 MOCK_METHOD6(MakeNewAutofillProfileSyncNodeIfNeeded, | |
| 59 bool(sync_api::WriteTransaction*, | |
| 60 const sync_api::BaseNode&, | |
| 61 const AutofillProfile&, | |
| 62 std::vector<AutofillProfile*>*, | |
| 63 std::set<std::string>*, | |
| 64 std::vector<std::string>*)); | |
| 65 MOCK_METHOD2(Associate, void(const std::string*, int64)); | |
| 66 | |
| 67 bool TraverseAndAssociateAllSyncNodesWrapper( | |
| 68 sync_api::WriteTransaction *trans, | |
| 69 const sync_api::ReadNode &autofill_root, | |
| 70 browser_sync::AutofillProfileModelAssociator::DataBundle *bundle) { | |
| 71 return TraverseAndAssociateAllSyncNodes(trans, autofill_root, bundle); | |
| 72 } | |
| 73 | |
| 74 void AddNativeProfileIfNeededWrapper( | |
| 75 const sync_pb::AutofillProfileSpecifics& profile, | |
| 76 DataBundle* bundle, | |
| 77 const sync_api::ReadNode& node) { | |
| 78 AutofillProfileModelAssociator::AddNativeProfileIfNeeded( | |
| 79 profile, | |
| 80 bundle, | |
| 81 node); | |
| 82 } | |
| 83 }; | |
| 84 | |
| 85 class AutofillProfileModelAssociatorTest : public testing::Test { | |
| 86 public: | |
| 87 AutofillProfileModelAssociatorTest() | |
| 88 : db_thread_(BrowserThread::DB, &message_loop_) {} | |
| 89 | |
| 90 protected: | |
| 91 MessageLoop message_loop_; | |
| 92 BrowserThread db_thread_; | |
| 93 MockAutofillProfileModelAssociator associator_; | |
| 94 }; | |
| 95 | |
| 96 TEST_F(AutofillProfileModelAssociatorTest, | |
| 97 TestAssociateProfileInWebDBWithSyncDB) { | |
| 98 ScopedVector<AutofillProfile> profiles_from_web_db; | |
| 99 std::string guid = "EDC609ED-7EEE-4F27-B00C-423242A9C44B"; | |
| 100 | |
| 101 sync_pb::EntitySpecifics specifics; | |
| 102 MockDirectory mock_directory; | |
| 103 sync_pb::AutofillProfileSpecifics *profile_specifics = | |
| 104 specifics.MutableExtension(sync_pb::autofill_profile); | |
| 105 | |
| 106 profile_specifics->set_guid(guid); | |
| 107 | |
| 108 std::set<std::string> current_profiles; | |
| 109 | |
| 110 // This will be released inside the function | |
| 111 // TraverseAndAssociateChromeAutofillProfiles | |
| 112 AutofillProfile *profile = new AutofillProfile(guid); | |
| 113 | |
| 114 // Set up the entry kernel with what we want. | |
| 115 EntryKernel kernel; | |
| 116 kernel.put(syncable::SPECIFICS, specifics); | |
| 117 kernel.put(syncable::META_HANDLE, 1); | |
| 118 | |
| 119 MockWriteTransaction write_trans(FROM_HERE, &mock_directory); | |
| 120 EXPECT_CALL(mock_directory, GetEntryByClientTag(_)) | |
| 121 .WillOnce(Return(&kernel)); | |
| 122 | |
| 123 sync_api::ReadNode read_node(&write_trans); | |
| 124 | |
| 125 EXPECT_CALL(associator_, Associate(Pointee(guid), 1)); | |
| 126 | |
| 127 profiles_from_web_db.push_back(profile); | |
| 128 | |
| 129 associator_.TraverseAndAssociateChromeAutofillProfilesWrapper(&write_trans, | |
| 130 read_node, | |
| 131 profiles_from_web_db.get(), | |
| 132 ¤t_profiles, | |
| 133 NULL, | |
| 134 NULL, | |
| 135 NULL); | |
| 136 | |
| 137 EXPECT_EQ((unsigned int)1, current_profiles.size()); | |
| 138 } | |
| 139 | |
| 140 TEST_F(AutofillProfileModelAssociatorTest, TestAssociatingMissingWebDBProfile) { | |
| 141 ScopedVector<AutofillProfile> profiles_from_web_db; | |
| 142 MockDirectory mock_directory; | |
| 143 | |
| 144 MockWriteTransaction write_trans(FROM_HERE, &mock_directory); | |
| 145 EXPECT_CALL(mock_directory, | |
| 146 GetEntryByClientTag(_)) | |
| 147 .WillOnce(Return(reinterpret_cast<EntryKernel*>(NULL))); | |
| 148 | |
| 149 sync_api::ReadNode autofill_root(&write_trans); | |
| 150 | |
| 151 std::string guid = "EDC609ED-7EEE-4F27-B00C-423242A9C44A"; | |
| 152 std::set<std::string> current_profiles; | |
| 153 AutofillProfile *profile = new AutofillProfile(guid); | |
| 154 | |
| 155 EXPECT_CALL(associator_, | |
| 156 MakeNewAutofillProfileSyncNodeIfNeeded(&write_trans, | |
| 157 Ref(autofill_root), | |
| 158 Ref(*profile), | |
| 159 _, | |
| 160 ¤t_profiles, | |
| 161 NULL)) | |
| 162 .WillOnce(Return(true)); | |
| 163 | |
| 164 profiles_from_web_db.push_back(profile); | |
| 165 | |
| 166 associator_.TraverseAndAssociateChromeAutofillProfilesWrapper(&write_trans, | |
| 167 autofill_root, | |
| 168 profiles_from_web_db.get(), | |
| 169 ¤t_profiles, | |
| 170 NULL, | |
| 171 NULL, | |
| 172 NULL); | |
| 173 } | |
| 174 | |
| 175 TEST_F(AutofillProfileModelAssociatorTest, | |
| 176 TestAssociateProfileInSyncDBWithWebDB) { | |
| 177 ReadNodeMock autofill_root; | |
| 178 | |
| 179 // The constrcutor itself will initialize the id to root. | |
| 180 syncable::Id root_id; | |
| 181 | |
| 182 sync_pb::EntitySpecifics specifics; | |
| 183 MockDirectory mock_directory; | |
| 184 sync_pb::AutofillProfileSpecifics *profile_specifics = | |
| 185 specifics.MutableExtension(sync_pb::autofill_profile); | |
| 186 | |
| 187 profile_specifics->set_guid("abc"); | |
| 188 | |
| 189 // Set up the entry kernel with what we want. | |
| 190 EntryKernel kernel; | |
| 191 kernel.put(syncable::SPECIFICS, specifics); | |
| 192 kernel.put(syncable::META_HANDLE, 1); | |
| 193 kernel.put(syncable::ID, root_id); | |
| 194 | |
| 195 MockWriteTransaction write_trans(FROM_HERE, &mock_directory); | |
| 196 | |
| 197 browser_sync::AutofillProfileModelAssociator::DataBundle bundle; | |
| 198 | |
| 199 EXPECT_CALL(autofill_root, GetFirstChildId()) | |
| 200 .WillOnce(Return(1)); | |
| 201 | |
| 202 EXPECT_CALL(mock_directory, | |
| 203 GetEntryByHandle(_)) | |
| 204 .WillOnce(Return(&kernel)); | |
| 205 | |
| 206 EXPECT_CALL(associator_, | |
| 207 AddNativeProfileIfNeeded(_, | |
| 208 &bundle, | |
| 209 _)); | |
| 210 | |
| 211 associator_.TraverseAndAssociateAllSyncNodesWrapper(&write_trans, | |
| 212 autofill_root, | |
| 213 &bundle); | |
| 214 } | |
| 215 | |
| 216 TEST_F(AutofillProfileModelAssociatorTest, TestDontNeedToAddNativeProfile) { | |
| 217 ::testing::StrictMock<MockAutofillProfileModelAssociator> associator; | |
| 218 sync_pb::AutofillProfileSpecifics profile_specifics; | |
| 219 ReadNodeMock read_node; | |
| 220 std::string guid = "EDC609ED-7EEE-4F27-B00C-423242A9C44C"; | |
| 221 std::set<std::string> current_profiles; | |
| 222 browser_sync::AutofillProfileModelAssociator::DataBundle bundle; | |
| 223 | |
| 224 profile_specifics.set_guid(guid); | |
| 225 | |
| 226 bundle.current_profiles.insert(guid); | |
| 227 | |
| 228 // We have no expectations to set. We have used a strict mock. | |
| 229 // If the profile is already present no other function | |
| 230 // should be called. | |
| 231 associator.AddNativeProfileIfNeededWrapper(profile_specifics, &bundle, | |
| 232 read_node); | |
| 233 } | |
| 234 | |
| 235 TEST_F(AutofillProfileModelAssociatorTest, TestNeedToAddNativeProfile) { | |
| 236 sync_pb::AutofillProfileSpecifics profile_specifics; | |
| 237 ReadNodeMock read_node; | |
| 238 std::string guid = "EDC609ED-7EEE-4F27-B00C-423242A9C44D"; | |
| 239 std::set<std::string> current_profiles; | |
| 240 browser_sync::AutofillProfileModelAssociator::DataBundle bundle; | |
| 241 std::string first_name = "lingesh"; | |
| 242 | |
| 243 profile_specifics.set_guid(guid); | |
| 244 profile_specifics.set_name_first(first_name); | |
| 245 | |
| 246 EXPECT_CALL(read_node, GetId()) | |
| 247 .WillOnce(Return(1)); | |
| 248 | |
| 249 EXPECT_CALL(associator_, | |
| 250 Associate(Pointee(guid), 1)); | |
| 251 | |
| 252 associator_.AddNativeProfileIfNeededWrapper( | |
| 253 profile_specifics, | |
| 254 &bundle, | |
| 255 read_node); | |
| 256 | |
| 257 EXPECT_EQ(bundle.new_profiles.size(), (unsigned int)1); | |
| 258 EXPECT_EQ(bundle.new_profiles.front()->GetInfo(NAME_FIRST), | |
| 259 UTF8ToUTF16(first_name)); | |
| 260 } | |
| 261 | |
| OLD | NEW |