Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: chrome/browser/sync/glue/autofill_profile_model_associator_unittest.cc

Issue 7819002: Migrate AutofillProfile sync to new API. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 &current_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 &current_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 &current_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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698