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/preferences_helper.h"
      6 
      7 #include "base/prefs/pref_service.h"
      8 #include "base/prefs/scoped_user_pref_update.h"
      9 #include "base/values.h"
     10 #include "chrome/browser/profiles/profile.h"
     11 #include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h"
     12 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
     13 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
     14 #include "chrome/browser/sync/test/integration/sync_test.h"
     15 
     16 using sync_datatype_helper::test;
     17 
     18 namespace preferences_helper {
     19 
     20 PrefService* GetPrefs(int index) {
     21   return test()->GetProfile(index)->GetPrefs();
     22 }
     23 
     24 PrefService* GetVerifierPrefs() {
     25   return test()->verifier()->GetPrefs();
     26 }
     27 
     28 void ChangeBooleanPref(int index, const char* pref_name) {
     29   bool new_value = !GetPrefs(index)->GetBoolean(pref_name);
     30   GetPrefs(index)->SetBoolean(pref_name, new_value);
     31   if (test()->use_verifier())
     32     GetVerifierPrefs()->SetBoolean(pref_name, new_value);
     33 }
     34 
     35 void ChangeIntegerPref(int index, const char* pref_name, int new_value) {
     36   GetPrefs(index)->SetInteger(pref_name, new_value);
     37   if (test()->use_verifier())
     38     GetVerifierPrefs()->SetInteger(pref_name, new_value);
     39 }
     40 
     41 void ChangeInt64Pref(int index, const char* pref_name, int64 new_value) {
     42   GetPrefs(index)->SetInt64(pref_name, new_value);
     43   if (test()->use_verifier())
     44     GetVerifierPrefs()->SetInt64(pref_name, new_value);
     45 }
     46 
     47 void ChangeDoublePref(int index, const char* pref_name, double new_value) {
     48   GetPrefs(index)->SetDouble(pref_name, new_value);
     49   if (test()->use_verifier())
     50     GetVerifierPrefs()->SetDouble(pref_name, new_value);
     51 }
     52 
     53 void ChangeStringPref(int index,
     54                       const char* pref_name,
     55                       const std::string& new_value) {
     56   GetPrefs(index)->SetString(pref_name, new_value);
     57   if (test()->use_verifier())
     58     GetVerifierPrefs()->SetString(pref_name, new_value);
     59 }
     60 
     61 void AppendStringPref(int index,
     62                       const char* pref_name,
     63                       const std::string& append_value) {
     64   ChangeStringPref(index,
     65                    pref_name,
     66                    GetPrefs(index)->GetString(pref_name) + append_value);
     67 }
     68 
     69 void ChangeFilePathPref(int index,
     70                         const char* pref_name,
     71                         const base::FilePath& new_value) {
     72   GetPrefs(index)->SetFilePath(pref_name, new_value);
     73   if (test()->use_verifier())
     74     GetVerifierPrefs()->SetFilePath(pref_name, new_value);
     75 }
     76 
     77 void ChangeListPref(int index,
     78                     const char* pref_name,
     79                     const base::ListValue& new_value) {
     80   {
     81     ListPrefUpdate update(GetPrefs(index), pref_name);
     82     base::ListValue* list = update.Get();
     83     for (base::ListValue::const_iterator it = new_value.begin();
     84          it != new_value.end();
     85          ++it) {
     86       list->Append((*it)->DeepCopy());
     87     }
     88   }
     89 
     90   if (test()->use_verifier()) {
     91     ListPrefUpdate update_verifier(GetVerifierPrefs(), pref_name);
     92     base::ListValue* list_verifier = update_verifier.Get();
     93     for (base::ListValue::const_iterator it = new_value.begin();
     94          it != new_value.end();
     95          ++it) {
     96       list_verifier->Append((*it)->DeepCopy());
     97     }
     98   }
     99 }
    100 
    101 bool BooleanPrefMatches(const char* pref_name) {
    102   bool reference_value;
    103   if (test()->use_verifier()) {
    104     reference_value = GetVerifierPrefs()->GetBoolean(pref_name);
    105   } else {
    106     reference_value = GetPrefs(0)->GetBoolean(pref_name);
    107   }
    108   for (int i = 0; i < test()->num_clients(); ++i) {
    109     if (reference_value != GetPrefs(i)->GetBoolean(pref_name)) {
    110       LOG(ERROR) << "Boolean preference " << pref_name << " mismatched in"
    111                  << " profile " << i << ".";
    112       return false;
    113     }
    114   }
    115   return true;
    116 }
    117 
    118 bool IntegerPrefMatches(const char* pref_name) {
    119   int reference_value;
    120   if (test()->use_verifier()) {
    121     reference_value = GetVerifierPrefs()->GetInteger(pref_name);
    122   } else {
    123     reference_value = GetPrefs(0)->GetInteger(pref_name);
    124   }
    125   for (int i = 0; i < test()->num_clients(); ++i) {
    126     if (reference_value != GetPrefs(i)->GetInteger(pref_name)) {
    127       LOG(ERROR) << "Integer preference " << pref_name << " mismatched in"
    128                  << " profile " << i << ".";
    129       return false;
    130     }
    131   }
    132   return true;
    133 }
    134 
    135 bool Int64PrefMatches(const char* pref_name) {
    136   int64 reference_value;
    137   if (test()->use_verifier()) {
    138     reference_value = GetVerifierPrefs()->GetInt64(pref_name);
    139   } else {
    140     reference_value = GetPrefs(0)->GetInt64(pref_name);
    141   }
    142   for (int i = 0; i < test()->num_clients(); ++i) {
    143     if (reference_value != GetPrefs(i)->GetInt64(pref_name)) {
    144       LOG(ERROR) << "Integer preference " << pref_name << " mismatched in"
    145                  << " profile " << i << ".";
    146       return false;
    147     }
    148   }
    149   return true;
    150 }
    151 
    152 bool DoublePrefMatches(const char* pref_name) {
    153   double reference_value;
    154   if (test()->use_verifier()) {
    155     reference_value = GetVerifierPrefs()->GetDouble(pref_name);
    156   } else {
    157     reference_value = GetPrefs(0)->GetDouble(pref_name);
    158   }
    159   for (int i = 0; i < test()->num_clients(); ++i) {
    160     if (reference_value != GetPrefs(i)->GetDouble(pref_name)) {
    161       LOG(ERROR) << "Double preference " << pref_name << " mismatched in"
    162                  << " profile " << i << ".";
    163       return false;
    164     }
    165   }
    166   return true;
    167 }
    168 
    169 bool StringPrefMatches(const char* pref_name) {
    170   std::string reference_value;
    171   if (test()->use_verifier()) {
    172     reference_value = GetVerifierPrefs()->GetString(pref_name);
    173   } else {
    174     reference_value = GetPrefs(0)->GetString(pref_name);
    175   }
    176   for (int i = 0; i < test()->num_clients(); ++i) {
    177     if (reference_value != GetPrefs(i)->GetString(pref_name)) {
    178       LOG(ERROR) << "String preference " << pref_name << " mismatched in"
    179                  << " profile " << i << ".";
    180       return false;
    181     }
    182   }
    183   return true;
    184 }
    185 
    186 bool FilePathPrefMatches(const char* pref_name) {
    187   base::FilePath reference_value;
    188   if (test()->use_verifier()) {
    189     reference_value = GetVerifierPrefs()->GetFilePath(pref_name);
    190   } else {
    191     reference_value = GetPrefs(0)->GetFilePath(pref_name);
    192   }
    193   for (int i = 0; i < test()->num_clients(); ++i) {
    194     if (reference_value != GetPrefs(i)->GetFilePath(pref_name)) {
    195       LOG(ERROR) << "base::FilePath preference " << pref_name
    196                  << " mismatched in" << " profile " << i << ".";
    197       return false;
    198     }
    199   }
    200   return true;
    201 }
    202 
    203 bool ListPrefMatches(const char* pref_name) {
    204   const base::ListValue* reference_value;
    205   if (test()->use_verifier()) {
    206     reference_value = GetVerifierPrefs()->GetList(pref_name);
    207   } else {
    208     reference_value = GetPrefs(0)->GetList(pref_name);
    209   }
    210   for (int i = 0; i < test()->num_clients(); ++i) {
    211     if (!reference_value->Equals(GetPrefs(i)->GetList(pref_name))) {
    212       LOG(ERROR) << "List preference " << pref_name << " mismatched in"
    213                  << " profile " << i << ".";
    214       return false;
    215     }
    216   }
    217   return true;
    218 }
    219 
    220 
    221 namespace {
    222 
    223 // Helper class used in the implementation of AwaitListPrefMatches.
    224 class ListPrefMatchStatusChecker : public MultiClientStatusChangeChecker {
    225  public:
    226   explicit ListPrefMatchStatusChecker(const char* pref_name);
    227   virtual ~ListPrefMatchStatusChecker();
    228 
    229   virtual bool IsExitConditionSatisfied() OVERRIDE;
    230   virtual std::string GetDebugMessage() const OVERRIDE;
    231  private:
    232   const char* pref_name_;
    233 };
    234 
    235 ListPrefMatchStatusChecker::ListPrefMatchStatusChecker(const char* pref_name)
    236     : MultiClientStatusChangeChecker(
    237         sync_datatype_helper::test()->GetSyncServices()),
    238       pref_name_(pref_name) {}
    239 
    240 ListPrefMatchStatusChecker::~ListPrefMatchStatusChecker() {}
    241 
    242 bool ListPrefMatchStatusChecker::IsExitConditionSatisfied() {
    243   return ListPrefMatches(pref_name_);
    244 }
    245 
    246 std::string ListPrefMatchStatusChecker::GetDebugMessage() const {
    247   return "Waiting for matching preferences";
    248 }
    249 
    250 }  //  namespace
    251 
    252 bool AwaitListPrefMatches(const char* pref_name) {
    253   ListPrefMatchStatusChecker checker(pref_name);
    254   checker.Wait();
    255   return !checker.TimedOut();
    256 }
    257 
    258 }  // namespace preferences_helper
    259