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
3 // found in the LICENSE file.
7 #include "base/file_util.h"
8 #include "base/metrics/histogram_samples.h"
9 #include "base/metrics/statistics_recorder.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "chrome/browser/spellchecker/spellcheck_custom_dictionary.h"
12 #include "chrome/browser/spellchecker/spellcheck_factory.h"
13 #include "chrome/browser/spellchecker/spellcheck_host_metrics.h"
14 #include "chrome/browser/spellchecker/spellcheck_service.h"
15 #include "chrome/common/chrome_constants.h"
16 #include "chrome/common/spellcheck_common.h"
17 #include "chrome/test/base/testing_profile.h"
18 #include "content/public/test/test_browser_thread_bundle.h"
19 #include "net/url_request/test_url_fetcher_factory.h"
20 #include "sync/api/sync_change.h"
21 #include "sync/api/sync_change_processor_wrapper_for_test.h"
22 #include "sync/api/sync_data.h"
23 #include "sync/api/sync_error_factory.h"
24 #include "sync/api/sync_error_factory_mock.h"
25 #include "sync/protocol/sync.pb.h"
26 #include "testing/gmock/include/gmock/gmock.h"
27 #include "testing/gtest/include/gtest/gtest.h"
30 // For version specific disabled tests below (http://crbug.com/230534).
31 #include "base/win/windows_version.h"
34 using base::HistogramBase
;
35 using base::HistogramSamples
;
36 using base::StatisticsRecorder
;
37 using chrome::spellcheck_common::WordList
;
38 using chrome::spellcheck_common::WordSet
;
42 // Get all sync data for the custom dictionary without limiting to maximum
43 // number of syncable words.
44 syncer::SyncDataList
GetAllSyncDataNoLimit(
45 const SpellcheckCustomDictionary
* dictionary
) {
46 syncer::SyncDataList data
;
48 const WordSet
& words
= dictionary
->GetWords();
49 for (WordSet::const_iterator it
= words
.begin(); it
!= words
.end(); ++it
) {
51 sync_pb::EntitySpecifics specifics
;
52 specifics
.mutable_dictionary()->set_word(word
);
53 data
.push_back(syncer::SyncData::CreateLocalData(word
, word
, specifics
));
60 static KeyedService
* BuildSpellcheckService(content::BrowserContext
* profile
) {
61 return new SpellcheckService(static_cast<Profile
*>(profile
));
64 class SpellcheckCustomDictionaryTest
: public testing::Test
{
66 virtual void SetUp() OVERRIDE
{
67 // Use SetTestingFactoryAndUse to force creation and initialization.
68 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
69 &profile_
, &BuildSpellcheckService
);
71 StatisticsRecorder::Initialize();
74 // A wrapper around SpellcheckCustomDictionary::LoadDictionaryFile private
75 // function to avoid a large number of FRIEND_TEST declarations in
76 // SpellcheckCustomDictionary.
77 chrome::spellcheck_common::WordList
LoadDictionaryFile(
78 const base::FilePath
& path
) {
79 return SpellcheckCustomDictionary::LoadDictionaryFile(path
);
82 // A wrapper around SpellcheckCustomDictionary::UpdateDictionaryFile private
83 // function to avoid a large number of FRIEND_TEST declarations in
84 // SpellcheckCustomDictionary.
85 void UpdateDictionaryFile(
86 const SpellcheckCustomDictionary::Change
& dictionary_change
,
87 const base::FilePath
& path
) {
88 SpellcheckCustomDictionary::UpdateDictionaryFile(dictionary_change
, path
);
91 // A wrapper around SpellcheckCustomDictionary::OnLoaded private method to
92 // avoid a large number of FRIEND_TEST declarations in
93 // SpellcheckCustomDictionary.
95 SpellcheckCustomDictionary
& dictionary
,
96 const chrome::spellcheck_common::WordList
& custom_words
) {
97 dictionary
.OnLoaded(custom_words
);
100 // A wrapper around SpellcheckCustomDictionary::Apply private method to avoid
101 // a large number of FRIEND_TEST declarations in SpellcheckCustomDictionary.
103 SpellcheckCustomDictionary
& dictionary
,
104 const SpellcheckCustomDictionary::Change
& change
) {
105 return dictionary
.Apply(change
);
108 content::TestBrowserThreadBundle thread_bundle_
;
110 TestingProfile profile_
;
111 net::TestURLFetcherFactory fetcher_factory_
;
114 // An implementation of SyncErrorFactory that does not upload the error message
115 // and updates an outside error counter. This lets us know the number of error
116 // messages in an instance of this class after that instance is deleted.
117 class SyncErrorFactoryStub
: public syncer::SyncErrorFactory
{
119 explicit SyncErrorFactoryStub(int* error_counter
)
120 : error_counter_(error_counter
) {}
121 virtual ~SyncErrorFactoryStub() {}
123 // Overridden from syncer::SyncErrorFactory:
124 virtual syncer::SyncError
CreateAndUploadError(
125 const tracked_objects::Location
& location
,
126 const std::string
& message
) OVERRIDE
{
128 return syncer::SyncError(location
,
129 syncer::SyncError::DATATYPE_ERROR
,
136 DISALLOW_COPY_AND_ASSIGN(SyncErrorFactoryStub
);
139 // Counts the number of notifications for dictionary load and change.
140 class DictionaryObserverCounter
: public SpellcheckCustomDictionary::Observer
{
142 DictionaryObserverCounter() : loads_(0), changes_(0) {}
143 virtual ~DictionaryObserverCounter() {}
145 int loads() const { return loads_
; }
146 int changes() const { return changes_
; }
148 // Overridden from SpellcheckCustomDictionary::Observer:
149 virtual void OnCustomDictionaryLoaded() OVERRIDE
{ loads_
++; }
150 virtual void OnCustomDictionaryChanged(
151 const SpellcheckCustomDictionary::Change
& change
) OVERRIDE
{ changes_
++; }
156 DISALLOW_COPY_AND_ASSIGN(DictionaryObserverCounter
);
159 TEST_F(SpellcheckCustomDictionaryTest
, SaveAndLoad
) {
160 base::FilePath path
=
161 profile_
.GetPath().Append(chrome::kCustomDictionaryFileName
);
162 WordList loaded_custom_words
= LoadDictionaryFile(path
);
164 // The custom word list should be empty now.
166 EXPECT_EQ(expected
, loaded_custom_words
);
168 SpellcheckCustomDictionary::Change change
;
169 change
.AddWord("bar");
170 change
.AddWord("foo");
172 UpdateDictionaryFile(change
, path
);
173 expected
.push_back("bar");
174 expected
.push_back("foo");
176 // The custom word list should include written words.
177 loaded_custom_words
= LoadDictionaryFile(path
);
178 EXPECT_EQ(expected
, loaded_custom_words
);
180 change
= SpellcheckCustomDictionary::Change();
181 change
.RemoveWord("bar");
182 change
.RemoveWord("foo");
183 UpdateDictionaryFile(change
, path
);
184 loaded_custom_words
= LoadDictionaryFile(path
);
186 EXPECT_EQ(expected
, loaded_custom_words
);
189 TEST_F(SpellcheckCustomDictionaryTest
, MultiProfile
) {
190 SpellcheckService
* spellcheck_service
=
191 SpellcheckServiceFactory::GetForContext(&profile_
);
192 SpellcheckCustomDictionary
* custom_dictionary
=
193 spellcheck_service
->GetCustomDictionary();
194 TestingProfile profile2
;
195 SpellcheckService
* spellcheck_service2
=
196 static_cast<SpellcheckService
*>(
197 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
198 &profile2
, &BuildSpellcheckService
));
199 SpellcheckCustomDictionary
* custom_dictionary2
=
200 spellcheck_service2
->GetCustomDictionary();
205 custom_dictionary
->AddWord("foo");
206 custom_dictionary
->AddWord("bar");
207 expected1
.insert("foo");
208 expected1
.insert("bar");
210 custom_dictionary2
->AddWord("hoge");
211 custom_dictionary2
->AddWord("fuga");
212 expected2
.insert("hoge");
213 expected2
.insert("fuga");
215 WordSet actual1
= custom_dictionary
->GetWords();
216 EXPECT_EQ(actual1
, expected1
);
218 WordSet actual2
= custom_dictionary2
->GetWords();
219 EXPECT_EQ(actual2
, expected2
);
222 // Legacy empty dictionary should be converted to new format empty dictionary.
223 TEST_F(SpellcheckCustomDictionaryTest
, LegacyEmptyDictionaryShouldBeConverted
) {
224 base::FilePath path
=
225 profile_
.GetPath().Append(chrome::kCustomDictionaryFileName
);
228 base::WriteFile(path
, content
.c_str(), content
.length());
229 WordList loaded_custom_words
= LoadDictionaryFile(path
);
230 EXPECT_TRUE(loaded_custom_words
.empty());
233 // Legacy dictionary with two words should be converted to new format dictionary
235 TEST_F(SpellcheckCustomDictionaryTest
,
236 LegacyDictionaryWithTwoWordsShouldBeConverted
) {
237 base::FilePath path
=
238 profile_
.GetPath().Append(chrome::kCustomDictionaryFileName
);
240 std::string content
= "foo\nbar\nfoo\n";
241 base::WriteFile(path
, content
.c_str(), content
.length());
242 WordList loaded_custom_words
= LoadDictionaryFile(path
);
244 expected
.push_back("bar");
245 expected
.push_back("foo");
246 EXPECT_EQ(expected
, loaded_custom_words
);
249 // Illegal words should be removed. Leading and trailing whitespace should be
251 TEST_F(SpellcheckCustomDictionaryTest
,
252 IllegalWordsShouldBeRemovedFromDictionary
) {
253 base::FilePath path
=
254 profile_
.GetPath().Append(chrome::kCustomDictionaryFileName
);
256 std::string content
= "foo\n foo bar \n\n \nbar\n"
257 "01234567890123456789012345678901234567890123456789"
258 "01234567890123456789012345678901234567890123456789";
259 base::WriteFile(path
, content
.c_str(), content
.length());
260 WordList loaded_custom_words
= LoadDictionaryFile(path
);
262 expected
.push_back("bar");
263 expected
.push_back("foo");
264 expected
.push_back("foo bar");
265 EXPECT_EQ(expected
, loaded_custom_words
);
268 // Write to dictionary should backup previous version and write the word to the
269 // end of the dictionary. If the dictionary file is corrupted on disk, the
270 // previous version should be reloaded.
271 TEST_F(SpellcheckCustomDictionaryTest
, CorruptedWriteShouldBeRecovered
) {
272 base::FilePath path
=
273 profile_
.GetPath().Append(chrome::kCustomDictionaryFileName
);
275 std::string content
= "foo\nbar";
276 base::WriteFile(path
, content
.c_str(), content
.length());
277 WordList loaded_custom_words
= LoadDictionaryFile(path
);
279 expected
.push_back("bar");
280 expected
.push_back("foo");
281 EXPECT_EQ(expected
, loaded_custom_words
);
283 SpellcheckCustomDictionary::Change change
;
284 change
.AddWord("baz");
285 UpdateDictionaryFile(change
, path
);
287 base::ReadFileToString(path
, &content
);
288 content
.append("corruption");
289 base::WriteFile(path
, content
.c_str(), content
.length());
290 loaded_custom_words
= LoadDictionaryFile(path
);
291 EXPECT_EQ(expected
, loaded_custom_words
);
294 TEST_F(SpellcheckCustomDictionaryTest
,
295 GetAllSyncDataAccuratelyReflectsDictionaryState
) {
296 SpellcheckCustomDictionary
* dictionary
=
297 SpellcheckServiceFactory::GetForContext(
298 &profile_
)->GetCustomDictionary();
300 syncer::SyncDataList data
= dictionary
->GetAllSyncData(syncer::DICTIONARY
);
301 EXPECT_TRUE(data
.empty());
303 EXPECT_TRUE(dictionary
->AddWord("bar"));
304 EXPECT_TRUE(dictionary
->AddWord("foo"));
306 data
= dictionary
->GetAllSyncData(syncer::DICTIONARY
);
307 EXPECT_EQ(2UL, data
.size());
308 std::vector
<std::string
> words
;
309 words
.push_back("bar");
310 words
.push_back("foo");
311 for (size_t i
= 0; i
< data
.size(); i
++) {
312 EXPECT_TRUE(data
[i
].GetSpecifics().has_dictionary());
313 EXPECT_EQ(syncer::DICTIONARY
, data
[i
].GetDataType());
314 EXPECT_EQ(words
[i
], syncer::SyncDataLocal(data
[i
]).GetTag());
315 EXPECT_EQ(words
[i
], data
[i
].GetSpecifics().dictionary().word());
318 EXPECT_TRUE(dictionary
->RemoveWord("bar"));
319 EXPECT_TRUE(dictionary
->RemoveWord("foo"));
321 data
= dictionary
->GetAllSyncData(syncer::DICTIONARY
);
322 EXPECT_TRUE(data
.empty());
325 TEST_F(SpellcheckCustomDictionaryTest
, GetAllSyncDataHasLimit
) {
326 SpellcheckCustomDictionary
* dictionary
=
327 SpellcheckServiceFactory::GetForContext(
328 &profile_
)->GetCustomDictionary();
330 SpellcheckCustomDictionary::Change change
;
332 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
- 1;
334 change
.AddWord("foo" + base::Uint64ToString(i
));
336 Apply(*dictionary
, change
);
337 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
- 1,
338 dictionary
->GetWords().size());
339 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
- 1,
340 dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
342 dictionary
->AddWord("baz");
343 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
344 dictionary
->GetWords().size());
345 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
346 dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
348 dictionary
->AddWord("bar");
349 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1,
350 dictionary
->GetWords().size());
351 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
352 dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
354 dictionary
->AddWord("snafoo");
355 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 2,
356 dictionary
->GetWords().size());
357 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
358 dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
361 TEST_F(SpellcheckCustomDictionaryTest
, ProcessSyncChanges
) {
362 SpellcheckService
* spellcheck_service
=
363 SpellcheckServiceFactory::GetForContext(&profile_
);
364 SpellcheckCustomDictionary
* dictionary
=
365 spellcheck_service
->GetCustomDictionary();
367 dictionary
->AddWord("foo");
368 dictionary
->AddWord("bar");
370 syncer::SyncChangeList changes
;
372 // Add existing word.
373 std::string word
= "foo";
374 sync_pb::EntitySpecifics specifics
;
375 specifics
.mutable_dictionary()->set_word(word
);
376 changes
.push_back(syncer::SyncChange(
378 syncer::SyncChange::ACTION_ADD
,
379 syncer::SyncData::CreateLocalData(word
, word
, specifics
)));
382 // Add invalid word. This word is too long.
383 std::string word
= "01234567890123456789012345678901234567890123456789"
384 "01234567890123456789012345678901234567890123456789";
385 sync_pb::EntitySpecifics specifics
;
386 specifics
.mutable_dictionary()->set_word(word
);
387 changes
.push_back(syncer::SyncChange(
389 syncer::SyncChange::ACTION_ADD
,
390 syncer::SyncData::CreateLocalData(word
, word
, specifics
)));
394 std::string word
= "baz";
395 sync_pb::EntitySpecifics specifics
;
396 specifics
.mutable_dictionary()->set_word(word
);
397 changes
.push_back(syncer::SyncChange(
399 syncer::SyncChange::ACTION_ADD
,
400 syncer::SyncData::CreateLocalData(word
, word
, specifics
)));
403 // Remove missing word.
404 std::string word
= "snafoo";
405 sync_pb::EntitySpecifics specifics
;
406 specifics
.mutable_dictionary()->set_word(word
);
407 changes
.push_back(syncer::SyncChange(
409 syncer::SyncChange::ACTION_DELETE
,
410 syncer::SyncData::CreateLocalData(word
, word
, specifics
)));
413 // Remove existing word.
414 std::string word
= "bar";
415 sync_pb::EntitySpecifics specifics
;
416 specifics
.mutable_dictionary()->set_word(word
);
417 changes
.push_back(syncer::SyncChange(
419 syncer::SyncChange::ACTION_DELETE
,
420 syncer::SyncData::CreateLocalData(word
, word
, specifics
)));
423 EXPECT_FALSE(dictionary
->ProcessSyncChanges(FROM_HERE
, changes
).IsSet());
425 const WordSet
& words
= dictionary
->GetWords();
426 EXPECT_EQ(2UL, words
.size());
427 EXPECT_EQ(0UL, words
.count("bar"));
428 EXPECT_EQ(1UL, words
.count("foo"));
429 EXPECT_EQ(1UL, words
.count("baz"));
432 TEST_F(SpellcheckCustomDictionaryTest
, MergeDataAndStartSyncing
) {
433 SpellcheckService
* spellcheck_service
=
434 SpellcheckServiceFactory::GetForContext(&profile_
);
435 SpellcheckCustomDictionary
* custom_dictionary
=
436 spellcheck_service
->GetCustomDictionary();
437 TestingProfile profile2
;
438 SpellcheckService
* spellcheck_service2
=
439 static_cast<SpellcheckService
*>(
440 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
441 &profile2
, &BuildSpellcheckService
));
442 SpellcheckCustomDictionary
* custom_dictionary2
=
443 spellcheck_service2
->GetCustomDictionary();
445 SpellcheckCustomDictionary::Change change
;
447 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
/ 2;
449 change
.AddWord("foo" + base::Uint64ToString(i
));
451 Apply(*custom_dictionary
, change
);
453 SpellcheckCustomDictionary::Change change2
;
455 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
/ 2;
457 change2
.AddWord("bar" + base::Uint64ToString(i
));
459 Apply(*custom_dictionary2
, change2
);
461 int error_counter
= 0;
463 custom_dictionary
->MergeDataAndStartSyncing(
465 custom_dictionary2
->GetAllSyncData(
467 scoped_ptr
<syncer::SyncChangeProcessor
>(
468 new syncer::SyncChangeProcessorWrapperForTest(
469 custom_dictionary2
)),
470 scoped_ptr
<syncer::SyncErrorFactory
>(
471 new SyncErrorFactoryStub(&error_counter
)))
474 EXPECT_EQ(0, error_counter
);
475 EXPECT_TRUE(custom_dictionary
->IsSyncing());
477 WordSet words
= custom_dictionary
->GetWords();
478 WordSet words2
= custom_dictionary2
->GetWords();
479 EXPECT_EQ(words
.size(), words2
.size());
480 EXPECT_EQ(words
, words2
);
483 TEST_F(SpellcheckCustomDictionaryTest
, DictionaryTooBigBeforeSyncing
) {
484 SpellcheckService
* spellcheck_service
=
485 SpellcheckServiceFactory::GetForContext(&profile_
);
486 SpellcheckCustomDictionary
* custom_dictionary
=
487 spellcheck_service
->GetCustomDictionary();
488 TestingProfile profile2
;
489 SpellcheckService
* spellcheck_service2
=
490 static_cast<SpellcheckService
*>(
491 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
492 &profile2
, &BuildSpellcheckService
));
493 SpellcheckCustomDictionary
* custom_dictionary2
=
494 spellcheck_service2
->GetCustomDictionary();
496 SpellcheckCustomDictionary::Change change
;
498 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1;
500 change
.AddWord("foo" + base::Uint64ToString(i
));
502 Apply(*custom_dictionary
, change
);
504 int error_counter
= 0;
506 custom_dictionary
->MergeDataAndStartSyncing(
508 custom_dictionary2
->GetAllSyncData(
510 scoped_ptr
<syncer::SyncChangeProcessor
>(
511 new syncer::SyncChangeProcessorWrapperForTest(
512 custom_dictionary2
)),
513 scoped_ptr
<syncer::SyncErrorFactory
>(
514 new SyncErrorFactoryStub(&error_counter
)))
517 EXPECT_EQ(0, error_counter
);
518 EXPECT_FALSE(custom_dictionary
->IsSyncing());
520 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1,
521 custom_dictionary
->GetWords().size());
522 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
523 custom_dictionary2
->GetWords().size());
525 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
526 custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
527 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
528 custom_dictionary2
->GetAllSyncData(syncer::DICTIONARY
).size());
531 TEST_F(SpellcheckCustomDictionaryTest
, DictionaryTooBigAndServerFull
) {
532 SpellcheckService
* spellcheck_service
=
533 SpellcheckServiceFactory::GetForContext(&profile_
);
534 SpellcheckCustomDictionary
* custom_dictionary
=
535 spellcheck_service
->GetCustomDictionary();
536 TestingProfile profile2
;
537 SpellcheckService
* spellcheck_service2
=
538 static_cast<SpellcheckService
*>(
539 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
540 &profile2
, &BuildSpellcheckService
));
541 SpellcheckCustomDictionary
* custom_dictionary2
=
542 spellcheck_service2
->GetCustomDictionary();
544 SpellcheckCustomDictionary::Change change
;
545 SpellcheckCustomDictionary::Change change2
;
547 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
;
549 change
.AddWord("foo" + base::Uint64ToString(i
));
550 change2
.AddWord("bar" + base::Uint64ToString(i
));
552 change
.AddWord("foo");
553 Apply(*custom_dictionary
, change
);
554 Apply(*custom_dictionary2
, change2
);
556 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1,
557 custom_dictionary
->GetWords().size());
558 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
559 custom_dictionary2
->GetWords().size());
561 int error_counter
= 0;
563 custom_dictionary
->MergeDataAndStartSyncing(
565 custom_dictionary2
->GetAllSyncData(
567 scoped_ptr
<syncer::SyncChangeProcessor
>(
568 new syncer::SyncChangeProcessorWrapperForTest(
569 custom_dictionary2
)),
570 scoped_ptr
<syncer::SyncErrorFactory
>(
571 new SyncErrorFactoryStub(&error_counter
)))
574 EXPECT_EQ(0, error_counter
);
575 EXPECT_FALSE(custom_dictionary
->IsSyncing());
577 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
* 2 + 1,
578 custom_dictionary
->GetWords().size());
579 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
580 custom_dictionary2
->GetWords().size());
582 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
583 custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
584 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
585 custom_dictionary2
->GetAllSyncData(syncer::DICTIONARY
).size());
588 TEST_F(SpellcheckCustomDictionaryTest
, ServerTooBig
) {
589 SpellcheckService
* spellcheck_service
=
590 SpellcheckServiceFactory::GetForContext(&profile_
);
591 SpellcheckCustomDictionary
* custom_dictionary
=
592 spellcheck_service
->GetCustomDictionary();
593 TestingProfile profile2
;
594 SpellcheckService
* spellcheck_service2
=
595 static_cast<SpellcheckService
*>(
596 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
597 &profile2
, &BuildSpellcheckService
));
598 SpellcheckCustomDictionary
* custom_dictionary2
=
599 spellcheck_service2
->GetCustomDictionary();
601 SpellcheckCustomDictionary::Change change
;
602 SpellcheckCustomDictionary::Change change2
;
604 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1;
606 change
.AddWord("foo" + base::Uint64ToString(i
));
607 change2
.AddWord("bar" + base::Uint64ToString(i
));
609 Apply(*custom_dictionary
, change
);
610 Apply(*custom_dictionary2
, change2
);
612 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1,
613 custom_dictionary
->GetWords().size());
614 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1,
615 custom_dictionary2
->GetWords().size());
617 int error_counter
= 0;
619 custom_dictionary
->MergeDataAndStartSyncing(
621 GetAllSyncDataNoLimit(custom_dictionary2
),
622 scoped_ptr
<syncer::SyncChangeProcessor
>(
623 new syncer::SyncChangeProcessorWrapperForTest(
624 custom_dictionary2
)),
625 scoped_ptr
<syncer::SyncErrorFactory
>(
626 new SyncErrorFactoryStub(&error_counter
)))
629 EXPECT_EQ(0, error_counter
);
630 EXPECT_FALSE(custom_dictionary
->IsSyncing());
632 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
* 2 + 2,
633 custom_dictionary
->GetWords().size());
634 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1,
635 custom_dictionary2
->GetWords().size());
637 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
638 custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
639 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
640 custom_dictionary2
->GetAllSyncData(syncer::DICTIONARY
).size());
643 TEST_F(SpellcheckCustomDictionaryTest
, DictionaryTooBigToStartSyncing
) {
644 SpellcheckService
* spellcheck_service
=
645 SpellcheckServiceFactory::GetForContext(&profile_
);
646 SpellcheckCustomDictionary
* custom_dictionary
=
647 spellcheck_service
->GetCustomDictionary();
648 TestingProfile profile2
;
649 SpellcheckService
* spellcheck_service2
=
650 static_cast<SpellcheckService
*>(
651 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
652 &profile2
, &BuildSpellcheckService
));
653 SpellcheckCustomDictionary
* custom_dictionary2
=
654 spellcheck_service2
->GetCustomDictionary();
656 SpellcheckCustomDictionary::Change change
;
658 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
- 1;
660 change
.AddWord("foo" + base::Uint64ToString(i
));
662 Apply(*custom_dictionary
, change
);
664 custom_dictionary2
->AddWord("bar");
665 custom_dictionary2
->AddWord("baz");
667 int error_counter
= 0;
669 custom_dictionary
->MergeDataAndStartSyncing(
671 custom_dictionary2
->GetAllSyncData(
673 scoped_ptr
<syncer::SyncChangeProcessor
>(
674 new syncer::SyncChangeProcessorWrapperForTest(
675 custom_dictionary2
)),
676 scoped_ptr
<syncer::SyncErrorFactory
>(
677 new SyncErrorFactoryStub(&error_counter
)))
680 EXPECT_EQ(0, error_counter
);
681 EXPECT_FALSE(custom_dictionary
->IsSyncing());
683 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1,
684 custom_dictionary
->GetWords().size());
685 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
686 custom_dictionary2
->GetWords().size());
688 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
689 custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
690 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
691 custom_dictionary2
->GetAllSyncData(syncer::DICTIONARY
).size());
694 TEST_F(SpellcheckCustomDictionaryTest
, DictionaryTooBigToContiueSyncing
) {
695 SpellcheckService
* spellcheck_service
=
696 SpellcheckServiceFactory::GetForContext(&profile_
);
697 SpellcheckCustomDictionary
* custom_dictionary
=
698 spellcheck_service
->GetCustomDictionary();
699 TestingProfile profile2
;
700 SpellcheckService
* spellcheck_service2
=
701 static_cast<SpellcheckService
*>(
702 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
703 &profile2
, &BuildSpellcheckService
));
704 SpellcheckCustomDictionary
* custom_dictionary2
=
705 spellcheck_service2
->GetCustomDictionary();
707 SpellcheckCustomDictionary::Change change
;
709 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
- 1;
711 change
.AddWord("foo" + base::Uint64ToString(i
));
713 Apply(*custom_dictionary
, change
);
715 int error_counter
= 0;
717 custom_dictionary
->MergeDataAndStartSyncing(
719 custom_dictionary2
->GetAllSyncData(
721 scoped_ptr
<syncer::SyncChangeProcessor
>(
722 new syncer::SyncChangeProcessorWrapperForTest(
723 custom_dictionary2
)),
724 scoped_ptr
<syncer::SyncErrorFactory
>(
725 new SyncErrorFactoryStub(&error_counter
)))
728 EXPECT_EQ(0, error_counter
);
729 EXPECT_TRUE(custom_dictionary
->IsSyncing());
731 custom_dictionary
->AddWord("bar");
732 EXPECT_EQ(0, error_counter
);
733 EXPECT_TRUE(custom_dictionary
->IsSyncing());
735 custom_dictionary
->AddWord("baz");
736 EXPECT_EQ(0, error_counter
);
737 EXPECT_FALSE(custom_dictionary
->IsSyncing());
739 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1,
740 custom_dictionary
->GetWords().size());
741 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
742 custom_dictionary2
->GetWords().size());
744 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
745 custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
746 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
747 custom_dictionary2
->GetAllSyncData(syncer::DICTIONARY
).size());
750 TEST_F(SpellcheckCustomDictionaryTest
, LoadAfterSyncStart
) {
751 SpellcheckService
* spellcheck_service
=
752 SpellcheckServiceFactory::GetForContext(&profile_
);
753 SpellcheckCustomDictionary
* custom_dictionary
=
754 spellcheck_service
->GetCustomDictionary();
755 TestingProfile profile2
;
756 SpellcheckService
* spellcheck_service2
=
757 static_cast<SpellcheckService
*>(
758 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
759 &profile2
, &BuildSpellcheckService
));
760 SpellcheckCustomDictionary
* custom_dictionary2
=
761 spellcheck_service2
->GetCustomDictionary();
763 custom_dictionary
->AddWord("foo");
765 int error_counter
= 0;
767 custom_dictionary
->MergeDataAndStartSyncing(
769 custom_dictionary2
->GetAllSyncData(
771 scoped_ptr
<syncer::SyncChangeProcessor
>(
772 new syncer::SyncChangeProcessorWrapperForTest(
773 custom_dictionary2
)),
774 scoped_ptr
<syncer::SyncErrorFactory
>(
775 new SyncErrorFactoryStub(&error_counter
)))
778 EXPECT_EQ(0, error_counter
);
779 EXPECT_TRUE(custom_dictionary
->IsSyncing());
781 WordList custom_words
;
782 custom_words
.push_back("bar");
783 OnLoaded(*custom_dictionary
, custom_words
);
784 EXPECT_TRUE(custom_dictionary
->IsSyncing());
786 EXPECT_EQ(2UL, custom_dictionary
->GetWords().size());
787 EXPECT_EQ(2UL, custom_dictionary2
->GetWords().size());
789 EXPECT_EQ(2UL, custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
790 EXPECT_EQ(2UL, custom_dictionary2
->GetAllSyncData(syncer::DICTIONARY
).size());
793 TEST_F(SpellcheckCustomDictionaryTest
, LoadAfterSyncStartTooBigToSync
) {
794 SpellcheckService
* spellcheck_service
=
795 SpellcheckServiceFactory::GetForContext(&profile_
);
796 SpellcheckCustomDictionary
* custom_dictionary
=
797 spellcheck_service
->GetCustomDictionary();
798 TestingProfile profile2
;
799 SpellcheckService
* spellcheck_service2
=
800 static_cast<SpellcheckService
*>(
801 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
802 &profile2
, &BuildSpellcheckService
));
803 SpellcheckCustomDictionary
* custom_dictionary2
=
804 spellcheck_service2
->GetCustomDictionary();
806 custom_dictionary
->AddWord("foo");
808 int error_counter
= 0;
810 custom_dictionary
->MergeDataAndStartSyncing(
812 custom_dictionary2
->GetAllSyncData(
814 scoped_ptr
<syncer::SyncChangeProcessor
>(
815 new syncer::SyncChangeProcessorWrapperForTest(
816 custom_dictionary2
)),
817 scoped_ptr
<syncer::SyncErrorFactory
>(
818 new SyncErrorFactoryStub(&error_counter
)))
821 EXPECT_EQ(0, error_counter
);
822 EXPECT_TRUE(custom_dictionary
->IsSyncing());
824 WordList custom_words
;
826 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
;
828 custom_words
.push_back("foo" + base::Uint64ToString(i
));
830 OnLoaded(*custom_dictionary
, custom_words
);
831 EXPECT_EQ(0, error_counter
);
832 EXPECT_FALSE(custom_dictionary
->IsSyncing());
834 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
+ 1,
835 custom_dictionary
->GetWords().size());
836 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
837 custom_dictionary2
->GetWords().size());
839 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
840 custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
841 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
842 custom_dictionary2
->GetAllSyncData(syncer::DICTIONARY
).size());
845 TEST_F(SpellcheckCustomDictionaryTest
, LoadDuplicatesAfterSync
) {
846 SpellcheckService
* spellcheck_service
=
847 SpellcheckServiceFactory::GetForContext(&profile_
);
848 SpellcheckCustomDictionary
* custom_dictionary
=
849 spellcheck_service
->GetCustomDictionary();
850 TestingProfile profile2
;
851 SpellcheckService
* spellcheck_service2
=
852 static_cast<SpellcheckService
*>(
853 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
854 &profile2
, &BuildSpellcheckService
));
855 SpellcheckCustomDictionary
* custom_dictionary2
=
856 spellcheck_service2
->GetCustomDictionary();
860 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
/ 2;
862 to_add
.push_back("foo" + base::Uint64ToString(i
));
864 Apply(*custom_dictionary
, SpellcheckCustomDictionary::Change(to_add
));
866 int error_counter
= 0;
868 custom_dictionary
->MergeDataAndStartSyncing(
870 custom_dictionary2
->GetAllSyncData(
872 scoped_ptr
<syncer::SyncChangeProcessor
>(
873 new syncer::SyncChangeProcessorWrapperForTest(
874 custom_dictionary2
)),
875 scoped_ptr
<syncer::SyncErrorFactory
>(
876 new SyncErrorFactoryStub(&error_counter
)))
879 EXPECT_EQ(0, error_counter
);
880 EXPECT_TRUE(custom_dictionary
->IsSyncing());
882 OnLoaded(*custom_dictionary
, to_add
);
883 EXPECT_EQ(0, error_counter
);
884 EXPECT_TRUE(custom_dictionary
->IsSyncing());
886 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
/ 2,
887 custom_dictionary
->GetWords().size());
888 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
/ 2,
889 custom_dictionary2
->GetWords().size());
891 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
/ 2,
892 custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
).size());
893 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
/ 2,
894 custom_dictionary2
->GetAllSyncData(syncer::DICTIONARY
).size());
897 TEST_F(SpellcheckCustomDictionaryTest
, DictionaryLoadNotification
) {
898 SpellcheckService
* spellcheck_service
=
899 SpellcheckServiceFactory::GetForContext(&profile_
);
900 SpellcheckCustomDictionary
* custom_dictionary
=
901 spellcheck_service
->GetCustomDictionary();
903 DictionaryObserverCounter observer
;
904 custom_dictionary
->AddObserver(&observer
);
906 WordList custom_words
;
907 custom_words
.push_back("foo");
908 custom_words
.push_back("bar");
909 OnLoaded(*custom_dictionary
, custom_words
);
911 EXPECT_GE(observer
.loads(), 1);
912 EXPECT_LE(observer
.loads(), 2);
913 EXPECT_EQ(0, observer
.changes());
915 custom_dictionary
->RemoveObserver(&observer
);
918 TEST_F(SpellcheckCustomDictionaryTest
, DictionaryAddWordNotification
) {
919 SpellcheckService
* spellcheck_service
=
920 SpellcheckServiceFactory::GetForContext(&profile_
);
921 SpellcheckCustomDictionary
* custom_dictionary
=
922 spellcheck_service
->GetCustomDictionary();
924 OnLoaded(*custom_dictionary
, WordList());
926 DictionaryObserverCounter observer
;
927 custom_dictionary
->AddObserver(&observer
);
929 EXPECT_TRUE(custom_dictionary
->AddWord("foo"));
930 EXPECT_TRUE(custom_dictionary
->AddWord("bar"));
931 EXPECT_FALSE(custom_dictionary
->AddWord("bar"));
933 EXPECT_EQ(2, observer
.changes());
935 custom_dictionary
->RemoveObserver(&observer
);
938 TEST_F(SpellcheckCustomDictionaryTest
, DictionaryRemoveWordNotification
) {
939 SpellcheckService
* spellcheck_service
=
940 SpellcheckServiceFactory::GetForContext(&profile_
);
941 SpellcheckCustomDictionary
* custom_dictionary
=
942 spellcheck_service
->GetCustomDictionary();
944 OnLoaded(*custom_dictionary
, WordList());
946 EXPECT_TRUE(custom_dictionary
->AddWord("foo"));
947 EXPECT_TRUE(custom_dictionary
->AddWord("bar"));
949 DictionaryObserverCounter observer
;
950 custom_dictionary
->AddObserver(&observer
);
952 EXPECT_TRUE(custom_dictionary
->RemoveWord("foo"));
953 EXPECT_TRUE(custom_dictionary
->RemoveWord("bar"));
954 EXPECT_FALSE(custom_dictionary
->RemoveWord("baz"));
956 EXPECT_EQ(2, observer
.changes());
958 custom_dictionary
->RemoveObserver(&observer
);
961 TEST_F(SpellcheckCustomDictionaryTest
, DictionarySyncNotification
) {
962 SpellcheckService
* spellcheck_service
=
963 SpellcheckServiceFactory::GetForContext(&profile_
);
964 SpellcheckCustomDictionary
* custom_dictionary
=
965 spellcheck_service
->GetCustomDictionary();
966 TestingProfile profile2
;
967 SpellcheckService
* spellcheck_service2
=
968 static_cast<SpellcheckService
*>(
969 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
970 &profile2
, &BuildSpellcheckService
));
971 SpellcheckCustomDictionary
* custom_dictionary2
=
972 spellcheck_service2
->GetCustomDictionary();
974 OnLoaded(*custom_dictionary
, WordList());
975 OnLoaded(*custom_dictionary2
, WordList());
977 custom_dictionary
->AddWord("foo");
978 custom_dictionary
->AddWord("bar");
979 custom_dictionary2
->AddWord("foo");
980 custom_dictionary2
->AddWord("baz");
982 DictionaryObserverCounter observer
;
983 custom_dictionary
->AddObserver(&observer
);
985 DictionaryObserverCounter observer2
;
986 custom_dictionary2
->AddObserver(&observer2
);
988 int error_counter
= 0;
990 custom_dictionary
->MergeDataAndStartSyncing(
992 custom_dictionary2
->GetAllSyncData(
994 scoped_ptr
<syncer::SyncChangeProcessor
>(
995 new syncer::SyncChangeProcessorWrapperForTest(
996 custom_dictionary2
)),
997 scoped_ptr
<syncer::SyncErrorFactory
>(
998 new SyncErrorFactoryStub(&error_counter
)))
1001 EXPECT_EQ(0, error_counter
);
1002 EXPECT_TRUE(custom_dictionary
->IsSyncing());
1004 EXPECT_EQ(1, observer
.changes());
1005 EXPECT_EQ(1, observer2
.changes());
1007 custom_dictionary
->RemoveObserver(&observer
);
1008 custom_dictionary2
->RemoveObserver(&observer2
);
1011 // The server has maximum number of words and the client has maximum number of
1012 // different words before association time. No new words should be pushed to the
1013 // sync server upon association. The client should accept words from the sync
1015 TEST_F(SpellcheckCustomDictionaryTest
, DictionarySyncLimit
) {
1016 TestingProfile server_profile
;
1017 SpellcheckService
* server_spellcheck_service
=
1018 static_cast<SpellcheckService
*>(
1019 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1020 &server_profile
, &BuildSpellcheckService
));
1022 // Here, |server_custom_dictionary| plays the role of the sync server.
1023 SpellcheckCustomDictionary
* server_custom_dictionary
=
1024 server_spellcheck_service
->GetCustomDictionary();
1026 // Upload the maximum number of words to the sync server.
1028 SpellcheckService
* spellcheck_service
=
1029 SpellcheckServiceFactory::GetForContext(&profile_
);
1030 SpellcheckCustomDictionary
* custom_dictionary
=
1031 spellcheck_service
->GetCustomDictionary();
1033 SpellcheckCustomDictionary::Change change
;
1035 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
;
1037 change
.AddWord("foo" + base::Uint64ToString(i
));
1039 Apply(*custom_dictionary
, change
);
1041 int error_counter
= 0;
1044 ->MergeDataAndStartSyncing(
1046 server_custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
),
1047 scoped_ptr
<syncer::SyncChangeProcessor
>(
1048 new syncer::SyncChangeProcessorWrapperForTest(
1049 server_custom_dictionary
)),
1050 scoped_ptr
<syncer::SyncErrorFactory
>(
1051 new SyncErrorFactoryStub(&error_counter
)))
1054 EXPECT_EQ(0, error_counter
);
1055 EXPECT_TRUE(custom_dictionary
->IsSyncing());
1056 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
1057 custom_dictionary
->GetWords().size());
1060 // The sync server now has the maximum number of words.
1061 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
1062 server_custom_dictionary
->GetWords().size());
1064 // Associate the sync server with a client that also has the maximum number of
1065 // words, but all of these words are different from the ones on the sync
1068 TestingProfile client_profile
;
1069 SpellcheckService
* client_spellcheck_service
=
1070 static_cast<SpellcheckService
*>(
1071 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1072 &client_profile
, &BuildSpellcheckService
));
1074 // Here, |client_custom_dictionary| plays the role of the client.
1075 SpellcheckCustomDictionary
* client_custom_dictionary
=
1076 client_spellcheck_service
->GetCustomDictionary();
1078 // Add the maximum number of words to the client. These words are all
1079 // different from those on the server.
1080 SpellcheckCustomDictionary::Change change
;
1082 i
< chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
;
1084 change
.AddWord("bar" + base::Uint64ToString(i
));
1086 Apply(*client_custom_dictionary
, change
);
1088 // Associate the server and the client.
1089 int error_counter
= 0;
1091 client_custom_dictionary
1092 ->MergeDataAndStartSyncing(
1094 server_custom_dictionary
->GetAllSyncData(syncer::DICTIONARY
),
1095 scoped_ptr
<syncer::SyncChangeProcessor
>(
1096 new syncer::SyncChangeProcessorWrapperForTest(
1097 server_custom_dictionary
)),
1098 scoped_ptr
<syncer::SyncErrorFactory
>(
1099 new SyncErrorFactoryStub(&error_counter
)))
1102 EXPECT_EQ(0, error_counter
);
1103 EXPECT_FALSE(client_custom_dictionary
->IsSyncing());
1104 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
* 2,
1105 client_custom_dictionary
->GetWords().size());
1108 // The sync server should not receive more words, because it has the maximum
1109 // number of words already.
1110 EXPECT_EQ(chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS
,
1111 server_custom_dictionary
->GetWords().size());
1114 TEST_F(SpellcheckCustomDictionaryTest
, RecordSizeStatsCorrectly
) {
1116 // Failing consistently on Win7. See crbug.com/230534.
1117 if (base::win::GetVersion() >= base::win::VERSION_VISTA
)
1120 // Record a baseline.
1121 SpellCheckHostMetrics::RecordCustomWordCountStats(123);
1123 // Determine if test failures are due the statistics recorder not being
1124 // available or because the histogram just isn't there: crbug.com/230534.
1125 EXPECT_TRUE(StatisticsRecorder::IsActive());
1127 HistogramBase
* histogram
=
1128 StatisticsRecorder::FindHistogram("SpellCheck.CustomWords");
1129 ASSERT_TRUE(histogram
!= NULL
);
1130 scoped_ptr
<HistogramSamples
> baseline
= histogram
->SnapshotSamples();
1132 // Load the dictionary which should be empty.
1133 base::FilePath path
=
1134 profile_
.GetPath().Append(chrome::kCustomDictionaryFileName
);
1135 WordList loaded_custom_words
= LoadDictionaryFile(path
);
1136 EXPECT_EQ(0u, loaded_custom_words
.size());
1138 // We expect there to be an entry with 0.
1140 StatisticsRecorder::FindHistogram("SpellCheck.CustomWords");
1141 ASSERT_TRUE(histogram
!= NULL
);
1142 scoped_ptr
<HistogramSamples
> samples
= histogram
->SnapshotSamples();
1144 samples
->Subtract(*baseline
);
1145 EXPECT_EQ(0,samples
->sum());
1147 SpellcheckCustomDictionary::Change change
;
1148 change
.AddWord("bar");
1149 change
.AddWord("foo");
1150 UpdateDictionaryFile(change
, path
);
1152 // Load the dictionary again and it should have 2 entries.
1153 loaded_custom_words
= LoadDictionaryFile(path
);
1154 EXPECT_EQ(2u, loaded_custom_words
.size());
1157 StatisticsRecorder::FindHistogram("SpellCheck.CustomWords");
1158 ASSERT_TRUE(histogram
!= NULL
);
1159 scoped_ptr
<HistogramSamples
> samples2
= histogram
->SnapshotSamples();
1161 samples2
->Subtract(*baseline
);
1162 EXPECT_EQ(2,samples2
->sum());
1165 TEST_F(SpellcheckCustomDictionaryTest
, HasWord
) {
1166 SpellcheckService
* spellcheck_service
=
1167 SpellcheckServiceFactory::GetForContext(&profile_
);
1168 SpellcheckCustomDictionary
* custom_dictionary
=
1169 spellcheck_service
->GetCustomDictionary();
1170 OnLoaded(*custom_dictionary
, WordList());
1171 EXPECT_FALSE(custom_dictionary
->HasWord("foo"));
1172 EXPECT_FALSE(custom_dictionary
->HasWord("bar"));
1173 custom_dictionary
->AddWord("foo");
1174 EXPECT_TRUE(custom_dictionary
->HasWord("foo"));
1175 EXPECT_FALSE(custom_dictionary
->HasWord("bar"));