dictionary_helper.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola// Use of this source code is governed by a BSD-style license that can be 3fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola// found in the LICENSE file. 4fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola 5fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola#include "chrome/browser/sync/test/integration/dictionary_helper.h" 6fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola 7fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola#include <algorithm> 8fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola 9fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola#include "chrome/browser/profiles/profile.h" 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "chrome/browser/spellchecker/spellcheck_factory.h" 11fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola#include "chrome/browser/spellchecker/spellcheck_service.h" 12ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter#include "chrome/browser/sync/profile_sync_service_harness.h" 13320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola#include "chrome/browser/sync/test/integration/dictionary_load_observer.h" 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "chrome/browser/sync/test/integration/sync_datatype_helper.h" 15ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter#include "chrome/browser/sync/test/integration/sync_test.h" 16ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter#include "chrome/common/chrome_switches.h" 17ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter#include "chrome/common/spellcheck_common.h" 18ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter#include "content/public/test/test_utils.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruthclass DictionarySyncIntegrationTestHelper { 21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth public: 22ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter // Same as SpellcheckCustomDictionary::AddWord/RemoveWord, except does not 23ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter // write to disk. 24ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter static bool ApplyChange( 2572e9b6aeb48d9496bac9db8b02c88a618b464588Akira Hatanaka SpellcheckCustomDictionary* dictionary, 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SpellcheckCustomDictionary::Change& change) { 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int result = change.Sanitize(dictionary->GetWords()); 28ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter dictionary->Apply(change); 29fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola dictionary->Notify(change); 30fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola dictionary->Sync(change); 31fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola return !result; 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 34715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly DISALLOW_COPY_AND_ASSIGN(DictionarySyncIntegrationTestHelper); 35715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly}; 36715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly 37715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly 38fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindolanamespace dictionary_helper { 3930116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carternamespace { 4030116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter 412263a2ca72e21206d45a69532004a0b17881e733Vladimir MedicSpellcheckCustomDictionary* GetDictionary(int index) { 4230116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter return SpellcheckServiceFactory::GetForProfile( 432263a2ca72e21206d45a69532004a0b17881e733Vladimir Medic sync_datatype_helper::test()->GetProfile(index))->GetCustomDictionary(); 4430116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter} 45ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter 462263a2ca72e21206d45a69532004a0b17881e733Vladimir MedicSpellcheckCustomDictionary* GetVerifierDictionary() { 472263a2ca72e21206d45a69532004a0b17881e733Vladimir Medic return SpellcheckServiceFactory::GetForProfile( 482263a2ca72e21206d45a69532004a0b17881e733Vladimir Medic sync_datatype_helper::test()->verifier())->GetCustomDictionary(); 4930116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter} 502263a2ca72e21206d45a69532004a0b17881e733Vladimir Medic 512263a2ca72e21206d45a69532004a0b17881e733Vladimir Medicvoid LoadDictionary(SpellcheckCustomDictionary* dictionary) { 522263a2ca72e21206d45a69532004a0b17881e733Vladimir Medic if (dictionary->IsLoaded()) 5330116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter return; 5430116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter base::RunLoop run_loop; 5530116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter DictionaryLoadObserver observer(content::GetQuitTaskForRunLoop(&run_loop)); 5630116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter dictionary->AddObserver(&observer); 5730116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter dictionary->Load(); 5830116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter content::RunThisRunLoop(&run_loop); 5930116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter dictionary->RemoveObserver(&observer); 6030116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter ASSERT_TRUE(dictionary->IsLoaded()); 6130116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter} 62fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola 63320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola} // namespace 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 65320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 66320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolavoid LoadDictionaries() { 67320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) 68ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter LoadDictionary(GetDictionary(i)); 69ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter if (sync_datatype_helper::test()->use_verifier()) 7010d5ff6b1dceec77c23cd200ef200e2e9dec4c85Jack Carter LoadDictionary(GetVerifierDictionary()); 7130116cd2e24a4a2b6c2771ef2665d655de93b984Jack Carter} 7272e9b6aeb48d9496bac9db8b02c88a618b464588Akira Hatanaka 7372e9b6aeb48d9496bac9db8b02c88a618b464588Akira Hatanakasize_t GetDictionarySize(int index) { 7472e9b6aeb48d9496bac9db8b02c88a618b464588Akira Hatanaka return GetDictionary(index)->GetWords().size(); 75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 7784125ca43c758fd21fdab2b05196e0df57c55c96Chad Rosiersize_t GetVerifierDictionarySize() { 78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return GetVerifierDictionary()->GetWords().size(); 79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 81fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindolabool DictionariesMatch() { 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const chrome::spellcheck_common::WordSet& reference = 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines sync_datatype_helper::test()->use_verifier() 84fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola ? GetVerifierDictionary()->GetWords() 85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : GetDictionary(0)->GetWords(); 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) { 87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const chrome::spellcheck_common::WordSet& dictionary = 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines GetDictionary(i)->GetWords(); 89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (reference.size() != dictionary.size() || 90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines !std::equal(reference.begin(), reference.end(), dictionary.begin())) { 91fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola return false; 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 93fddf80459747198d2ee33974c90f6137ea29cbd8Rafael Espindola } 94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 9542d9ca629934d0c20ac19949399ce4faa9a7bbb3Jack Carter} 9642d9ca629934d0c20ac19949399ce4faa9a7bbb3Jack Carter 97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool DictionaryMatchesVerifier(int index) { 98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const chrome::spellcheck_common::WordSet& expected = 9942d9ca629934d0c20ac19949399ce4faa9a7bbb3Jack Carter GetVerifierDictionary()->GetWords(); 10042d9ca629934d0c20ac19949399ce4faa9a7bbb3Jack Carter const chrome::spellcheck_common::WordSet& actual = 101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GetDictionary(index)->GetWords(); 10242d9ca629934d0c20ac19949399ce4faa9a7bbb3Jack Carter return expected.size() == actual.size() && 103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::equal(expected.begin(), expected.end(), actual.begin()); 10442d9ca629934d0c20ac19949399ce4faa9a7bbb3Jack Carter} 105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 106006cff8d7b60ddf632f8642f01693dace7827d8bMatheus Almeidabool AddWord(int index, const std::string& word) { 107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SpellcheckCustomDictionary::Change dictionary_change; 108d59ad8a8013fd76177fb61c741562af3024d34cdVladimir Medic dictionary_change.AddWord(word); 109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool result = DictionarySyncIntegrationTestHelper::ApplyChange( 11095adf91f29980e374bf094e15bc3f2764ef9baf4Matheus Almeida GetDictionary(index), dictionary_change); 111cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (sync_datatype_helper::test()->use_verifier()) { 112c91b5e197bb41ccb2f9f78b6176e61c848df9e15Jack Carter result &= DictionarySyncIntegrationTestHelper::ApplyChange( 113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GetVerifierDictionary(), dictionary_change); 114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return result; 116ec65be84cd630d53233e7a37f0ef9d2303ac5153Jack Carter} 1179d577c861414c28967d77c2a1edf64b68efdeaeeJack Carter 1189d577c861414c28967d77c2a1edf64b68efdeaeeJack Carterbool RemoveWord(int index, const std::string& word) { 119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SpellcheckCustomDictionary::Change dictionary_change; 120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines dictionary_change.RemoveWord(word); 121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool result = DictionarySyncIntegrationTestHelper::ApplyChange( 1222490dc650895149423bb59538dc03ca352222702Jack Carter GetDictionary(index), dictionary_change); 123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (sync_datatype_helper::test()->use_verifier()) { 124cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines result &= DictionarySyncIntegrationTestHelper::ApplyChange( 1252490dc650895149423bb59538dc03ca352222702Jack Carter GetVerifierDictionary(), dictionary_change); 126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return result; 1282f68b311a1b0efb3cafeca3780f5c3d09a762a50Jack Carter} 129cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 130cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} // namespace dictionary_helper 1312f68b311a1b0efb3cafeca3780f5c3d09a762a50Jack Carter