12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/test/integration/dictionary_helper.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <algorithm>
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/format_macros.h"
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/stringprintf.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_factory.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_service.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/test/integration/dictionary_load_observer.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_test.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/spellcheck_common.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DictionarySyncIntegrationTestHelper {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same as SpellcheckCustomDictionary::AddWord/RemoveWord, except does not
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // write to disk.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool ApplyChange(
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SpellcheckCustomDictionary* dictionary,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SpellcheckCustomDictionary::Change& change) {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int result = change.Sanitize(dictionary->GetWords());
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dictionary->Apply(change);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dictionary->Notify(change);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dictionary->Sync(change);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return !result;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DictionarySyncIntegrationTestHelper);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace dictionary_helper {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpellcheckCustomDictionary* GetDictionary(int index) {
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return SpellcheckServiceFactory::GetForContext(
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sync_datatype_helper::test()->GetProfile(index))->GetCustomDictionary();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpellcheckCustomDictionary* GetVerifierDictionary() {
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return SpellcheckServiceFactory::GetForContext(
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sync_datatype_helper::test()->verifier())->GetCustomDictionary();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoadDictionary(SpellcheckCustomDictionary* dictionary) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dictionary->IsLoaded())
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::RunLoop run_loop;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DictionaryLoadObserver observer(content::GetQuitTaskForRunLoop(&run_loop));
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dictionary->AddObserver(&observer);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dictionary->Load();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RunThisRunLoop(&run_loop);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dictionary->RemoveObserver(&observer);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(dictionary->IsLoaded());
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoadDictionaries() {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadDictionary(GetDictionary(i));
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sync_datatype_helper::test()->use_verifier())
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadDictionary(GetVerifierDictionary());
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t GetDictionarySize(int index) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetDictionary(index)->GetWords().size();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t GetVerifierDictionarySize() {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetVerifierDictionary()->GetWords().size();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DictionariesMatch() {
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const chrome::spellcheck_common::WordSet& reference =
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      sync_datatype_helper::test()->use_verifier()
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          ? GetVerifierDictionary()->GetWords()
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          : GetDictionary(0)->GetWords();
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) {
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const chrome::spellcheck_common::WordSet& dictionary =
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetDictionary(i)->GetWords();
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (reference.size() != dictionary.size() ||
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        !std::equal(reference.begin(), reference.end(), dictionary.begin())) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace {
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Helper class used in the implementation of AwaitDictionariesMatch.
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass DictionaryMatchStatusChecker : public MultiClientStatusChangeChecker {
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DictionaryMatchStatusChecker();
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~DictionaryMatchStatusChecker();
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool IsExitConditionSatisfied() OVERRIDE;
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual std::string GetDebugMessage() const OVERRIDE;
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochDictionaryMatchStatusChecker::DictionaryMatchStatusChecker()
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : MultiClientStatusChangeChecker(
115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        sync_datatype_helper::test()->GetSyncServices()) {}
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochDictionaryMatchStatusChecker::~DictionaryMatchStatusChecker() {}
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool DictionaryMatchStatusChecker::IsExitConditionSatisfied() {
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return DictionariesMatch();
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string DictionaryMatchStatusChecker::GetDebugMessage() const {
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return "Waiting for matching dictionaries";
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Helper class used in the implementation of AwaitNumDictionaryEntries.
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass NumDictionaryEntriesStatusChecker
129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : public SingleClientStatusChangeChecker {
130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  NumDictionaryEntriesStatusChecker(int index, size_t num_words);
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~NumDictionaryEntriesStatusChecker();
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool IsExitConditionSatisfied() OVERRIDE;
135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual std::string GetDebugMessage() const OVERRIDE;
136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int index_;
138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  size_t num_words_;
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochNumDictionaryEntriesStatusChecker::NumDictionaryEntriesStatusChecker(
142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int index, size_t num_words)
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  : SingleClientStatusChangeChecker(
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      sync_datatype_helper::test()->GetSyncService(index)),
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  index_(index),
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  num_words_(num_words) {}
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochNumDictionaryEntriesStatusChecker::~NumDictionaryEntriesStatusChecker() {}
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool NumDictionaryEntriesStatusChecker::IsExitConditionSatisfied() {
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return GetDictionarySize(index_) == num_words_;
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string NumDictionaryEntriesStatusChecker::GetDebugMessage() const {
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return base::StringPrintf(
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "Waiting for client %d: %" PRIuS " / %" PRIuS " words downloaded",
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      index_, GetDictionarySize(index_), num_words_);
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool AwaitDictionariesMatch() {
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DictionaryMatchStatusChecker checker;
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  checker.Wait();
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return !checker.TimedOut();
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool AwaitNumDictionaryEntries(int index, size_t num_words) {
169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  NumDictionaryEntriesStatusChecker checker(index, num_words);
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  checker.Wait();
171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return !checker.TimedOut();
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DictionaryMatchesVerifier(int index) {
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const chrome::spellcheck_common::WordSet& expected =
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetVerifierDictionary()->GetWords();
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const chrome::spellcheck_common::WordSet& actual =
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetDictionary(index)->GetWords();
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return expected.size() == actual.size() &&
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)         std::equal(expected.begin(), expected.end(), actual.begin());
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AddWord(int index, const std::string& word) {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpellcheckCustomDictionary::Change dictionary_change;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dictionary_change.AddWord(word);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = DictionarySyncIntegrationTestHelper::ApplyChange(
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDictionary(index), dictionary_change);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sync_datatype_helper::test()->use_verifier()) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result &= DictionarySyncIntegrationTestHelper::ApplyChange(
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetVerifierDictionary(), dictionary_change);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RemoveWord(int index, const std::string& word) {
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpellcheckCustomDictionary::Change dictionary_change;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dictionary_change.RemoveWord(word);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = DictionarySyncIntegrationTestHelper::ApplyChange(
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDictionary(index), dictionary_change);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sync_datatype_helper::test()->use_verifier()) {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result &= DictionarySyncIntegrationTestHelper::ApplyChange(
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetVerifierDictionary(), dictionary_change);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace dictionary_helper
208