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