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

Side by Side Diff: chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc

Issue 11445002: Sync user's custom spellcheck dictionary (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years 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
OLDNEW
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 <vector> 5 #include <vector>
6 6
7 #include "base/file_util.h" 7 #include "base/file_util.h"
8 #include "base/string_number_conversions.h"
8 #include "chrome/browser/spellchecker/spellcheck_custom_dictionary.h" 9 #include "chrome/browser/spellchecker/spellcheck_custom_dictionary.h"
9 #include "chrome/browser/spellchecker/spellcheck_factory.h" 10 #include "chrome/browser/spellchecker/spellcheck_factory.h"
10 #include "chrome/browser/spellchecker/spellcheck_service.h" 11 #include "chrome/browser/spellchecker/spellcheck_service.h"
11 #include "chrome/common/chrome_constants.h" 12 #include "chrome/common/chrome_constants.h"
12 #include "chrome/common/spellcheck_common.h" 13 #include "chrome/common/spellcheck_common.h"
13 #include "chrome/test/base/testing_profile.h" 14 #include "chrome/test/base/testing_profile.h"
14 #include "content/public/test/test_browser_thread.h" 15 #include "content/public/test/test_browser_thread.h"
16 #include "sync/api/sync_change.h"
17 #include "sync/api/sync_data.h"
18 #include "sync/api/sync_error_factory.h"
19 #include "sync/api/sync_error_factory_mock.h"
20 #include "sync/protocol/sync.pb.h"
15 #include "testing/gmock/include/gmock/gmock.h" 21 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
17 23
18 using content::BrowserThread; 24 using content::BrowserThread;
19 using chrome::spellcheck_common::WordList; 25 using chrome::spellcheck_common::WordList;
20 26
27 namespace {
28 const size_t LIMIT = 1300;
groby-ooo-7-16 2012/12/19 22:16:00 Please document. Or use a shared constant.
please use gerrit instead 2012/12/22 03:20:19 Done. Using constant in chrome::spellcheck_common.
29 }
30
21 static ProfileKeyedService* BuildSpellcheckService(Profile* profile) { 31 static ProfileKeyedService* BuildSpellcheckService(Profile* profile) {
22 return new SpellcheckService(profile); 32 return new SpellcheckService(profile);
23 } 33 }
24 34
25 class SpellcheckCustomDictionaryTest : public testing::Test { 35 class SpellcheckCustomDictionaryTest : public testing::Test {
26 protected: 36 protected:
27 SpellcheckCustomDictionaryTest() 37 SpellcheckCustomDictionaryTest()
28 : ui_thread_(BrowserThread::UI, &message_loop_), 38 : ui_thread_(BrowserThread::UI, &message_loop_),
29 file_thread_(BrowserThread::FILE, &message_loop_), 39 file_thread_(BrowserThread::FILE, &message_loop_),
30 profile_(new TestingProfile()) { 40 profile_(new TestingProfile) {
31 } 41 }
32 42
33 void SetUp() OVERRIDE { 43 void SetUp() OVERRIDE {
34 // Use SetTestingFactoryAndUse to force creation and initialization. 44 // Use SetTestingFactoryAndUse to force creation and initialization.
35 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse( 45 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
36 profile_.get(), &BuildSpellcheckService); 46 profile_.get(), &BuildSpellcheckService);
37 } 47 }
38 48
39 void TearDown() OVERRIDE { 49 void TearDown() OVERRIDE {
40 MessageLoop::current()->RunUntilIdle(); 50 MessageLoop::current()->RunUntilIdle();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 expected.push_back("bar"); 87 expected.push_back("bar");
78 EXPECT_EQ(custom_dictionary->GetWords(), expected); 88 EXPECT_EQ(custom_dictionary->GetWords(), expected);
79 89
80 custom_dictionary->CustomWordRemovedLocally("foo"); 90 custom_dictionary->CustomWordRemovedLocally("foo");
81 custom_dictionary->CustomWordRemovedLocally("bar"); 91 custom_dictionary->CustomWordRemovedLocally("bar");
82 expected.clear(); 92 expected.clear();
83 EXPECT_EQ(custom_dictionary->GetWords(), expected); 93 EXPECT_EQ(custom_dictionary->GetWords(), expected);
84 } 94 }
85 95
86 TEST_F(SpellcheckCustomDictionaryTest, SaveAndLoad) { 96 TEST_F(SpellcheckCustomDictionaryTest, SaveAndLoad) {
87 SpellcheckService* spellcheck_service = 97 FilePath path = profile_->GetPath().Append(chrome::kCustomDictionaryFileName);
88 SpellcheckServiceFactory::GetForProfile(profile_.get());
89 SpellcheckCustomDictionary* custom_dictionary =
90 spellcheck_service->GetCustomDictionary();
91
92 WordList loaded_custom_words; 98 WordList loaded_custom_words;
93 custom_dictionary->LoadDictionaryIntoCustomWordList(&loaded_custom_words); 99 SpellcheckCustomDictionary::LoadDictionaryIntoCustomWordList(
100 &loaded_custom_words, path);
94 101
95 // The custom word list should be empty now. 102 // The custom word list should be empty now.
96 WordList expected; 103 WordList expected;
97 EXPECT_EQ(loaded_custom_words, expected); 104 EXPECT_EQ(loaded_custom_words, expected);
98 105
99 custom_dictionary->WriteWordToCustomDictionary("foo"); 106 SpellcheckCustomDictionary::WriteWordToCustomDictionary("foo", path);
100 expected.push_back("foo"); 107 expected.push_back("foo");
101 108
102 custom_dictionary->WriteWordToCustomDictionary("bar"); 109 SpellcheckCustomDictionary::WriteWordToCustomDictionary("bar", path);
103 expected.push_back("bar"); 110 expected.push_back("bar");
104 111
105 // The custom word list should include written words. 112 // The custom word list should include written words.
106 custom_dictionary->LoadDictionaryIntoCustomWordList(&loaded_custom_words); 113 SpellcheckCustomDictionary::LoadDictionaryIntoCustomWordList(
114 &loaded_custom_words, path);
107 std::sort(expected.begin(), expected.end()); 115 std::sort(expected.begin(), expected.end());
108 EXPECT_EQ(loaded_custom_words, expected); 116 EXPECT_EQ(loaded_custom_words, expected);
109 117
110 // Load in another instance of SpellCheckService. 118 SpellcheckCustomDictionary::EraseWordFromCustomDictionary("foo", path);
111 // The result should be the same. 119 SpellcheckCustomDictionary::EraseWordFromCustomDictionary("bar", path);
112 SpellcheckService spellcheck_service2(profile_.get()); 120 SpellcheckCustomDictionary::LoadDictionaryIntoCustomWordList(
113 WordList loaded_custom_words2; 121 &loaded_custom_words, path);
114 spellcheck_service2.GetCustomDictionary()->
115 LoadDictionaryIntoCustomWordList(&loaded_custom_words2);
116 EXPECT_EQ(loaded_custom_words2, expected);
117
118 custom_dictionary->EraseWordFromCustomDictionary("foo");
119 custom_dictionary->EraseWordFromCustomDictionary("bar");
120 custom_dictionary->LoadDictionaryIntoCustomWordList(&loaded_custom_words);
121 expected.clear(); 122 expected.clear();
122 EXPECT_EQ(loaded_custom_words, expected); 123 EXPECT_EQ(loaded_custom_words, expected);
123 124
124 // Flush the loop now to prevent service init tasks from being run during 125 // Flush the loop now to prevent service init tasks from being run during
125 // TearDown(); 126 // TearDown();
126 MessageLoop::current()->RunUntilIdle(); 127 MessageLoop::current()->RunUntilIdle();
127 } 128 }
128 129
129 TEST_F(SpellcheckCustomDictionaryTest, MultiProfile) { 130 TEST_F(SpellcheckCustomDictionaryTest, MultiProfile) {
130 SpellcheckService* spellcheck_service = 131 SpellcheckService* spellcheck_service =
131 SpellcheckServiceFactory::GetForProfile(profile_.get()); 132 SpellcheckServiceFactory::GetForProfile(profile_.get());
132 SpellcheckCustomDictionary* custom_dictionary = 133 SpellcheckCustomDictionary* custom_dictionary =
133 spellcheck_service->GetCustomDictionary(); 134 spellcheck_service->GetCustomDictionary();
134 TestingProfile profile2; 135 TestingProfile profile2;
135 SpellcheckService* spellcheck_service2 = 136 SpellcheckService* spellcheck_service2 =
136 static_cast<SpellcheckService*>( 137 static_cast<SpellcheckService*>(
137 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse( 138 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
138 &profile2, &BuildSpellcheckService)); 139 &profile2, &BuildSpellcheckService));
139 SpellcheckCustomDictionary* custom_dictionary2 = 140 SpellcheckCustomDictionary* custom_dictionary2 =
140 spellcheck_service2->GetCustomDictionary(); 141 spellcheck_service2->GetCustomDictionary();
141 142
142 WordList expected1; 143 WordList expected1;
143 WordList expected2; 144 WordList expected2;
144 145
145 custom_dictionary->WriteWordToCustomDictionary("foo"); 146 custom_dictionary->CustomWordAddedLocally("foo");
146 custom_dictionary->WriteWordToCustomDictionary("bar"); 147 custom_dictionary->CustomWordAddedLocally("bar");
147 expected1.push_back("foo"); 148 expected1.push_back("foo");
148 expected1.push_back("bar"); 149 expected1.push_back("bar");
149 150
150 custom_dictionary2->WriteWordToCustomDictionary("hoge"); 151 custom_dictionary2->CustomWordAddedLocally("hoge");
151 custom_dictionary2->WriteWordToCustomDictionary("fuga"); 152 custom_dictionary2->CustomWordAddedLocally("fuga");
152 expected2.push_back("hoge"); 153 expected2.push_back("hoge");
153 expected2.push_back("fuga"); 154 expected2.push_back("fuga");
154 155
155 WordList actual1; 156 WordList actual1 = custom_dictionary->GetWords();
156 custom_dictionary->LoadDictionaryIntoCustomWordList(&actual1); 157 std::sort(actual1.begin(), actual1.end());
157 std::sort(expected1.begin(), expected1.end()); 158 std::sort(expected1.begin(), expected1.end());
158 EXPECT_EQ(actual1, expected1); 159 EXPECT_EQ(actual1, expected1);
159 160
160 WordList actual2; 161 WordList actual2 = custom_dictionary2->GetWords();
161 custom_dictionary2->LoadDictionaryIntoCustomWordList(&actual2); 162 std::sort(actual2.begin(), actual2.end());
162 std::sort(expected2.begin(), expected2.end()); 163 std::sort(expected2.begin(), expected2.end());
163 EXPECT_EQ(actual2, expected2); 164 EXPECT_EQ(actual2, expected2);
164 165
165 // Flush the loop now to prevent service init tasks from being run during 166 // Flush the loop now to prevent service init tasks from being run during
166 // TearDown(); 167 // TearDown();
167 MessageLoop::current()->RunUntilIdle(); 168 MessageLoop::current()->RunUntilIdle();
168 } 169 }
169 170
170 // Legacy empty dictionary should be converted to new format empty dicitonary. 171 // Legacy empty dictionary should be converted to new format empty dictionary.
171 TEST_F(SpellcheckCustomDictionaryTest, LegacyEmptyDictionaryShouldBeConverted) { 172 TEST_F(SpellcheckCustomDictionaryTest, LegacyEmptyDictionaryShouldBeConverted) {
172 FilePath dictionary_path( 173 FilePath path = profile_->GetPath().Append(chrome::kCustomDictionaryFileName);
173 profile_->GetPath().Append(chrome::kCustomDictionaryFileName));
174 SpellcheckService* spellcheck_service =
175 SpellcheckServiceFactory::GetForProfile(profile_.get());
176 SpellcheckCustomDictionary* custom_dictionary =
177 spellcheck_service->GetCustomDictionary();
178 WordList loaded_custom_words; 174 WordList loaded_custom_words;
179 175
180 std::string content; 176 std::string content;
181 file_util::WriteFile(dictionary_path, content.c_str(), content.length()); 177 file_util::WriteFile(path, content.c_str(), content.length());
182 custom_dictionary->LoadDictionaryIntoCustomWordList(&loaded_custom_words); 178 SpellcheckCustomDictionary::LoadDictionaryIntoCustomWordList(
179 &loaded_custom_words, path);
183 EXPECT_TRUE(loaded_custom_words.empty()); 180 EXPECT_TRUE(loaded_custom_words.empty());
184 181
185 // Flush the loop now to prevent service init tasks from being run during 182 // Flush the loop now to prevent service init tasks from being run during
186 // TearDown(); 183 // TearDown();
187 MessageLoop::current()->RunUntilIdle(); 184 MessageLoop::current()->RunUntilIdle();
188 } 185 }
189 186
190 // Legacy dictionary with two words should be converted to new format dictionary 187 // Legacy dictionary with two words should be converted to new format dictionary
191 // with two words. 188 // with two words.
192 TEST_F(SpellcheckCustomDictionaryTest, 189 TEST_F(SpellcheckCustomDictionaryTest,
193 LegacyDictionaryWithTwoWordsShouldBeConverted) { 190 LegacyDictionaryWithTwoWordsShouldBeConverted) {
194 FilePath dictionary_path( 191 FilePath path = profile_->GetPath().Append(chrome::kCustomDictionaryFileName);
195 profile_->GetPath().Append(chrome::kCustomDictionaryFileName));
196 SpellcheckService* spellcheck_service =
197 SpellcheckServiceFactory::GetForProfile(profile_.get());
198 SpellcheckCustomDictionary* custom_dictionary =
199 spellcheck_service->GetCustomDictionary();
200 WordList loaded_custom_words; 192 WordList loaded_custom_words;
201 WordList expected; 193 WordList expected;
202 194
203 std::string content = "foo\nbar"; 195 std::string content = "foo\nbar";
204 file_util::WriteFile(dictionary_path, content.c_str(), content.length()); 196 file_util::WriteFile(path, content.c_str(), content.length());
205 custom_dictionary->LoadDictionaryIntoCustomWordList(&loaded_custom_words); 197 SpellcheckCustomDictionary::LoadDictionaryIntoCustomWordList(
198 &loaded_custom_words, path);
206 expected.push_back("bar"); 199 expected.push_back("bar");
207 expected.push_back("foo"); 200 expected.push_back("foo");
208 EXPECT_EQ(expected, loaded_custom_words); 201 EXPECT_EQ(expected, loaded_custom_words);
209 202
210 // Flush the loop now to prevent service init tasks from being run during 203 // Flush the loop now to prevent service init tasks from being run during
211 // TearDown(); 204 // TearDown();
212 MessageLoop::current()->RunUntilIdle(); 205 MessageLoop::current()->RunUntilIdle();
213 } 206 }
214 207
215 // Words with spaces are illegal and should be removed. 208 // Words with spaces are illegal and should be removed.
216 TEST_F(SpellcheckCustomDictionaryTest, 209 TEST_F(SpellcheckCustomDictionaryTest,
217 IllegalWordsShouldBeRemovedFromDictionary) { 210 IllegalWordsShouldBeRemovedFromDictionary) {
218 FilePath dictionary_path( 211 FilePath path = profile_->GetPath().Append(chrome::kCustomDictionaryFileName);
219 profile_->GetPath().Append(chrome::kCustomDictionaryFileName));
220 SpellcheckService* spellcheck_service =
221 SpellcheckServiceFactory::GetForProfile(profile_.get());
222 SpellcheckCustomDictionary* custom_dictionary =
223 spellcheck_service->GetCustomDictionary();
224 WordList loaded_custom_words; 212 WordList loaded_custom_words;
225 WordList expected; 213 WordList expected;
226 214
227 std::string content = "foo\nfoo bar\nbar\nfoo bar"; 215 std::string content = "foo\nfoo bar\nbar\nfoo bar";
228 file_util::WriteFile(dictionary_path, content.c_str(), content.length()); 216 file_util::WriteFile(path, content.c_str(), content.length());
229 custom_dictionary->LoadDictionaryIntoCustomWordList(&loaded_custom_words); 217 SpellcheckCustomDictionary::LoadDictionaryIntoCustomWordList(
218 &loaded_custom_words, path);
230 expected.push_back("bar"); 219 expected.push_back("bar");
231 expected.push_back("foo"); 220 expected.push_back("foo");
232 EXPECT_EQ(expected, loaded_custom_words); 221 EXPECT_EQ(expected, loaded_custom_words);
233 222
234 // Flush the loop now to prevent service init tasks from being run during 223 // Flush the loop now to prevent service init tasks from being run during
235 // TearDown(); 224 // TearDown();
236 MessageLoop::current()->RunUntilIdle(); 225 MessageLoop::current()->RunUntilIdle();
237 } 226 }
238 227
239 // Write to dicitonary should backup previous version and write the word to the 228 // Write to dictionary should backup previous version and write the word to the
240 // end of the dictionary. If the dictionary file is corrupted on disk, the 229 // end of the dictionary. If the dictionary file is corrupted on disk, the
241 // previous version should be reloaded. 230 // previous version should be reloaded.
242 TEST_F(SpellcheckCustomDictionaryTest, CorruptedWriteShouldBeRecovered) { 231 TEST_F(SpellcheckCustomDictionaryTest, CorruptedWriteShouldBeRecovered) {
243 FilePath dictionary_path( 232 FilePath path = profile_->GetPath().Append(chrome::kCustomDictionaryFileName);
244 profile_->GetPath().Append(chrome::kCustomDictionaryFileName)); 233 WordList loaded_custom_words;
234 WordList expected;
235
236 std::string content = "foo\nbar";
237 file_util::WriteFile(path, content.c_str(), content.length());
238 SpellcheckCustomDictionary::LoadDictionaryIntoCustomWordList(
239 &loaded_custom_words, path);
240 expected.push_back("bar");
241 expected.push_back("foo");
242 EXPECT_EQ(expected, loaded_custom_words);
243
244 SpellcheckCustomDictionary::WriteWordToCustomDictionary("baz", path);
245 content.clear();
246 file_util::ReadFileToString(path, &content);
247 content.append("corruption");
248 file_util::WriteFile(path, content.c_str(), content.length());
249 SpellcheckCustomDictionary::LoadDictionaryIntoCustomWordList(
250 &loaded_custom_words, path);
251 EXPECT_EQ(expected, loaded_custom_words);
252
253 // Flush the loop now to prevent service init tasks from being run during
254 // TearDown();
255 MessageLoop::current()->RunUntilIdle();
256 }
257
258 TEST_F(SpellcheckCustomDictionaryTest,
259 GetAllSyncDataAccuratelyReflectsDictionaryState) {
260 SpellcheckCustomDictionary* dictionary =
261 SpellcheckServiceFactory::GetForProfile(
262 profile_.get())->GetCustomDictionary();
263
264 syncer::SyncDataList data = dictionary->GetAllSyncData(syncer::DICTIONARY);
265 EXPECT_TRUE(data.empty());
266
267 EXPECT_TRUE(dictionary->CustomWordAddedLocally("foo"));
268 EXPECT_TRUE(dictionary->CustomWordAddedLocally("bar"));
269 data = dictionary->GetAllSyncData(syncer::DICTIONARY);
270 EXPECT_EQ(2UL, data.size());
271 std::vector<std::string> words;
272 words.push_back("foo");
273 words.push_back("bar");
274 for (size_t i = 0; i < data.size(); i++) {
275 EXPECT_TRUE(data[i].GetSpecifics().has_dictionary());
276 EXPECT_EQ(syncer::DICTIONARY, data[i].GetDataType());
277 EXPECT_EQ(words[i], data[i].GetTag());
278 EXPECT_EQ(words[i], data[i].GetSpecifics().dictionary().word());
279 }
280
281 EXPECT_TRUE(dictionary->CustomWordRemovedLocally("foo"));
282 EXPECT_TRUE(dictionary->CustomWordRemovedLocally("bar"));
283 data = dictionary->GetAllSyncData(syncer::DICTIONARY);
284 EXPECT_TRUE(data.empty());
285
286 // Flush the loop now to prevent service init tasks from being run during
287 // TearDown();
288 MessageLoop::current()->RunUntilIdle();
groby-ooo-7-16 2012/12/19 22:16:00 Why not run them during TearDown()? It seems _ever
please use gerrit instead 2012/12/22 03:20:19 We need to run RunUntilIdle here before the spellc
289 }
290
291 TEST_F(SpellcheckCustomDictionaryTest, GetAllSyncDataHasLimit) {
292 SpellcheckCustomDictionary* dictionary =
293 SpellcheckServiceFactory::GetForProfile(
294 profile_.get())->GetCustomDictionary();
295
296 for (size_t i = 0; i < LIMIT - 1; i++) {
297 EXPECT_TRUE(dictionary->CustomWordAddedLocally(
298 "foo" + base::Uint64ToString(i)));
299 }
300 EXPECT_EQ(LIMIT - 1, dictionary->GetWords().size());
301 EXPECT_EQ(LIMIT - 1, dictionary->GetAllSyncData(syncer::DICTIONARY).size());
302
303 EXPECT_TRUE(dictionary->CustomWordAddedLocally("baz"));
304 EXPECT_EQ(LIMIT, dictionary->GetWords().size());
305 EXPECT_EQ(LIMIT, dictionary->GetAllSyncData(syncer::DICTIONARY).size());
306
307 EXPECT_TRUE(dictionary->CustomWordAddedLocally("bar"));
308 EXPECT_EQ(LIMIT + 1, dictionary->GetWords().size());
309 EXPECT_EQ(LIMIT, dictionary->GetAllSyncData(syncer::DICTIONARY).size());
310
311 EXPECT_TRUE(dictionary->CustomWordAddedLocally("snafoo"));
312 EXPECT_EQ(LIMIT + 2, dictionary->GetWords().size());
313 EXPECT_EQ(LIMIT, dictionary->GetAllSyncData(syncer::DICTIONARY).size());
314
315 // Flush the loop now to prevent service init tasks from being run during
316 // TearDown();
317 MessageLoop::current()->RunUntilIdle();
318 }
319
320 TEST_F(SpellcheckCustomDictionaryTest, ProcessSyncChanges) {
321 SpellcheckService* spellcheck_service =
322 SpellcheckServiceFactory::GetForProfile(profile_.get());
323 SpellcheckCustomDictionary* dictionary =
324 spellcheck_service->GetCustomDictionary();
325
326 dictionary->CustomWordAddedLocally("foo");
327 dictionary->CustomWordAddedLocally("bar");
328
329 syncer::SyncChangeList changes;
330 {
331 // Add existing word.
332 std::string word = "foo";
333 sync_pb::EntitySpecifics specifics;
334 specifics.mutable_dictionary()->set_word(word);
335 changes.push_back(syncer::SyncChange(
336 FROM_HERE,
337 syncer::SyncChange::ACTION_ADD,
338 syncer::SyncData::CreateLocalData(word, word, specifics)));
339 }
340 {
341 // Add invalid word.
342 std::string word = "foo bar";
343 sync_pb::EntitySpecifics specifics;
344 specifics.mutable_dictionary()->set_word(word);
345 changes.push_back(syncer::SyncChange(
346 FROM_HERE,
347 syncer::SyncChange::ACTION_ADD,
348 syncer::SyncData::CreateLocalData(word, word, specifics)));
349 }
350 {
351 // Add valid word.
352 std::string word = "baz";
353 sync_pb::EntitySpecifics specifics;
354 specifics.mutable_dictionary()->set_word(word);
355 changes.push_back(syncer::SyncChange(
356 FROM_HERE,
357 syncer::SyncChange::ACTION_ADD,
358 syncer::SyncData::CreateLocalData(word, word, specifics)));
359 }
360 {
361 // Remove missing word.
362 std::string word = "snafoo";
363 sync_pb::EntitySpecifics specifics;
364 specifics.mutable_dictionary()->set_word(word);
365 changes.push_back(syncer::SyncChange(
366 FROM_HERE,
367 syncer::SyncChange::ACTION_DELETE,
368 syncer::SyncData::CreateLocalData(word, word, specifics)));
369 }
370 {
371 // Remove existing word.
372 std::string word = "bar";
373 sync_pb::EntitySpecifics specifics;
374 specifics.mutable_dictionary()->set_word(word);
375 changes.push_back(syncer::SyncChange(
376 FROM_HERE,
377 syncer::SyncChange::ACTION_DELETE,
378 syncer::SyncData::CreateLocalData(word, word, specifics)));
379 }
380
381 EXPECT_FALSE(dictionary->ProcessSyncChanges(FROM_HERE, changes).IsSet());
382
383 const chrome::spellcheck_common::WordList& words = dictionary->GetWords();
384 EXPECT_EQ(2UL, words.size());
385 EXPECT_EQ(words.end(), std::find(words.begin(), words.end(), "bar"));
386 EXPECT_NE(words.end(), std::find(words.begin(), words.end(), "foo"));
387 EXPECT_NE(words.end(), std::find(words.begin(), words.end(), "baz"));
388
389 // Flush the loop now to prevent service init tasks from being run during
390 // TearDown();
391 MessageLoop::current()->RunUntilIdle();
392 }
393
394 TEST_F(SpellcheckCustomDictionaryTest, MergeDataAndStartSyncing) {
245 SpellcheckService* spellcheck_service = 395 SpellcheckService* spellcheck_service =
246 SpellcheckServiceFactory::GetForProfile(profile_.get()); 396 SpellcheckServiceFactory::GetForProfile(profile_.get());
247 SpellcheckCustomDictionary* custom_dictionary = 397 SpellcheckCustomDictionary* custom_dictionary =
248 spellcheck_service->GetCustomDictionary(); 398 spellcheck_service->GetCustomDictionary();
249 WordList loaded_custom_words; 399 TestingProfile profile2;
250 WordList expected; 400 SpellcheckService* spellcheck_service2 =
251 401 static_cast<SpellcheckService*>(
252 std::string content = "foo\nbar"; 402 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
253 file_util::WriteFile(dictionary_path, content.c_str(), content.length()); 403 &profile2, &BuildSpellcheckService));
254 custom_dictionary->LoadDictionaryIntoCustomWordList(&loaded_custom_words); 404 SpellcheckCustomDictionary* custom_dictionary2 =
255 expected.push_back("bar"); 405 spellcheck_service2->GetCustomDictionary();
256 expected.push_back("foo"); 406
257 EXPECT_EQ(expected, loaded_custom_words); 407 custom_dictionary->AddWord("foo");
258 408 custom_dictionary2->AddWord("bar");
259 custom_dictionary->WriteWordToCustomDictionary("baz"); 409 custom_dictionary2->AddWord("baz");
260 content.clear(); 410
261 file_util::ReadFileToString(dictionary_path, &content); 411 EXPECT_FALSE(custom_dictionary->MergeDataAndStartSyncing(
262 content.append("corruption"); 412 syncer::DICTIONARY,
263 file_util::WriteFile(dictionary_path, content.c_str(), content.length()); 413 custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
264 custom_dictionary->LoadDictionaryIntoCustomWordList(&loaded_custom_words); 414 scoped_ptr<syncer::SyncChangeProcessor>(custom_dictionary2),
265 EXPECT_EQ(expected, loaded_custom_words); 415 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock)).
266 416 error().IsSet());
267 // Flush the loop now to prevent service init tasks from being run during 417 custom_dictionary->StopSyncingForTesting();
268 // TearDown(); 418
269 MessageLoop::current()->RunUntilIdle(); 419 WordList words = custom_dictionary->GetWords();
270 } 420 WordList words2 = custom_dictionary2->GetWords();
421 EXPECT_EQ(words.size(), words2.size());
422
423 std::sort(words.begin(), words.end());
424 std::sort(words2.begin(), words2.end());
425 for (size_t i = 0; i < words.size(); ++i)
426 EXPECT_EQ(words[i], words2[i]);
427
428 // Flush the loop now to prevent service init tasks from being run during
429 // TearDown();
430 MessageLoop::current()->RunUntilIdle();
431 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698