Home | History | Annotate | Download | only in integration
      1 // Copyright (c) 2011 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.
      4 
      5 #include "chrome/browser/sync/test/integration/dictionary_helper.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "chrome/browser/profiles/profile.h"
     10 #include "chrome/browser/spellchecker/spellcheck_factory.h"
     11 #include "chrome/browser/spellchecker/spellcheck_service.h"
     12 #include "chrome/browser/sync/profile_sync_service_harness.h"
     13 #include "chrome/browser/sync/test/integration/dictionary_load_observer.h"
     14 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
     15 #include "chrome/browser/sync/test/integration/sync_test.h"
     16 #include "chrome/common/chrome_switches.h"
     17 #include "chrome/common/spellcheck_common.h"
     18 #include "content/public/test/test_utils.h"
     19 
     20 class DictionarySyncIntegrationTestHelper {
     21  public:
     22   // Same as SpellcheckCustomDictionary::AddWord/RemoveWord, except does not
     23   // write to disk.
     24   static bool ApplyChange(
     25       SpellcheckCustomDictionary* dictionary,
     26       SpellcheckCustomDictionary::Change& change) {
     27     int result = change.Sanitize(dictionary->GetWords());
     28     dictionary->Apply(change);
     29     dictionary->Notify(change);
     30     dictionary->Sync(change);
     31     return !result;
     32   }
     33 
     34   DISALLOW_COPY_AND_ASSIGN(DictionarySyncIntegrationTestHelper);
     35 };
     36 
     37 
     38 namespace dictionary_helper {
     39 namespace {
     40 
     41 SpellcheckCustomDictionary* GetDictionary(int index) {
     42   return SpellcheckServiceFactory::GetForProfile(
     43       sync_datatype_helper::test()->GetProfile(index))->GetCustomDictionary();
     44 }
     45 
     46 SpellcheckCustomDictionary* GetVerifierDictionary() {
     47   return SpellcheckServiceFactory::GetForProfile(
     48       sync_datatype_helper::test()->verifier())->GetCustomDictionary();
     49 }
     50 
     51 void LoadDictionary(SpellcheckCustomDictionary* dictionary) {
     52   if (dictionary->IsLoaded())
     53     return;
     54   base::RunLoop run_loop;
     55   DictionaryLoadObserver observer(content::GetQuitTaskForRunLoop(&run_loop));
     56   dictionary->AddObserver(&observer);
     57   dictionary->Load();
     58   content::RunThisRunLoop(&run_loop);
     59   dictionary->RemoveObserver(&observer);
     60   ASSERT_TRUE(dictionary->IsLoaded());
     61 }
     62 
     63 }  // namespace
     64 
     65 
     66 void LoadDictionaries() {
     67   for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i)
     68     LoadDictionary(GetDictionary(i));
     69   if (sync_datatype_helper::test()->use_verifier())
     70     LoadDictionary(GetVerifierDictionary());
     71 }
     72 
     73 size_t GetDictionarySize(int index) {
     74   return GetDictionary(index)->GetWords().size();
     75 }
     76 
     77 size_t GetVerifierDictionarySize() {
     78   return GetVerifierDictionary()->GetWords().size();
     79 }
     80 
     81 bool DictionariesMatch() {
     82   const chrome::spellcheck_common::WordSet& reference =
     83       sync_datatype_helper::test()->use_verifier()
     84           ? GetVerifierDictionary()->GetWords()
     85           : GetDictionary(0)->GetWords();
     86   for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) {
     87     const chrome::spellcheck_common::WordSet& dictionary =
     88         GetDictionary(i)->GetWords();
     89     if (reference.size() != dictionary.size() ||
     90         !std::equal(reference.begin(), reference.end(), dictionary.begin())) {
     91       return false;
     92     }
     93   }
     94   return true;
     95 }
     96 
     97 bool DictionaryMatchesVerifier(int index) {
     98   const chrome::spellcheck_common::WordSet& expected =
     99       GetVerifierDictionary()->GetWords();
    100   const chrome::spellcheck_common::WordSet& actual =
    101       GetDictionary(index)->GetWords();
    102   return expected.size() == actual.size() &&
    103          std::equal(expected.begin(), expected.end(), actual.begin());
    104 }
    105 
    106 bool AddWord(int index, const std::string& word) {
    107   SpellcheckCustomDictionary::Change dictionary_change;
    108   dictionary_change.AddWord(word);
    109   bool result = DictionarySyncIntegrationTestHelper::ApplyChange(
    110       GetDictionary(index), dictionary_change);
    111   if (sync_datatype_helper::test()->use_verifier()) {
    112     result &= DictionarySyncIntegrationTestHelper::ApplyChange(
    113         GetVerifierDictionary(), dictionary_change);
    114   }
    115   return result;
    116 }
    117 
    118 bool RemoveWord(int index, const std::string& word) {
    119   SpellcheckCustomDictionary::Change dictionary_change;
    120   dictionary_change.RemoveWord(word);
    121   bool result = DictionarySyncIntegrationTestHelper::ApplyChange(
    122       GetDictionary(index), dictionary_change);
    123   if (sync_datatype_helper::test()->use_verifier()) {
    124     result &= DictionarySyncIntegrationTestHelper::ApplyChange(
    125         GetVerifierDictionary(), dictionary_change);
    126   }
    127   return result;
    128 }
    129 
    130 }  // namespace dictionary_helper
    131