15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/preferences_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/prefs/pref_change_registrar.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/stringprintf.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_test.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_datatype_helper::test;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace preferences_helper {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefService* GetPrefs(int index) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return test()->GetProfile(index)->GetPrefs();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefService* GetVerifierPrefs() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return test()->verifier()->GetPrefs();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChangeBooleanPref(int index, const char* pref_name) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool new_value = !GetPrefs(index)->GetBoolean(pref_name);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPrefs(index)->SetBoolean(pref_name, new_value);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier())
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetVerifierPrefs()->SetBoolean(pref_name, new_value);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChangeIntegerPref(int index, const char* pref_name, int new_value) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPrefs(index)->SetInteger(pref_name, new_value);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier())
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetVerifierPrefs()->SetInteger(pref_name, new_value);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChangeInt64Pref(int index, const char* pref_name, int64 new_value) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPrefs(index)->SetInt64(pref_name, new_value);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier())
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetVerifierPrefs()->SetInt64(pref_name, new_value);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChangeDoublePref(int index, const char* pref_name, double new_value) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPrefs(index)->SetDouble(pref_name, new_value);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier())
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetVerifierPrefs()->SetDouble(pref_name, new_value);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChangeStringPref(int index,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* pref_name,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string& new_value) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPrefs(index)->SetString(pref_name, new_value);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier())
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetVerifierPrefs()->SetString(pref_name, new_value);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChangeFilePathPref(int index,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const char* pref_name,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const base::FilePath& new_value) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPrefs(index)->SetFilePath(pref_name, new_value);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier())
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetVerifierPrefs()->SetFilePath(pref_name, new_value);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChangeListPref(int index,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const char* pref_name,
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    const base::ListValue& new_value) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListPrefUpdate update(GetPrefs(index), pref_name);
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* list = update.Get();
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (base::ListValue::const_iterator it = new_value.begin();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != new_value.end();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++it) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->Append((*it)->DeepCopy());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier()) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListPrefUpdate update_verifier(GetVerifierPrefs(), pref_name);
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* list_verifier = update_verifier.Get();
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (base::ListValue::const_iterator it = new_value.begin();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != new_value.end();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++it) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list_verifier->Append((*it)->DeepCopy());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BooleanPrefMatches(const char* pref_name) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool reference_value;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier()) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetVerifierPrefs()->GetBoolean(pref_name);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetPrefs(0)->GetBoolean(pref_name);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reference_value != GetPrefs(i)->GetBoolean(pref_name)) {
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DVLOG(1) << "Boolean preference " << pref_name << " mismatched in"
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << " profile " << i << ".";
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IntegerPrefMatches(const char* pref_name) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int reference_value;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier()) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetVerifierPrefs()->GetInteger(pref_name);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetPrefs(0)->GetInteger(pref_name);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reference_value != GetPrefs(i)->GetInteger(pref_name)) {
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DVLOG(1) << "Integer preference " << pref_name << " mismatched in"
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << " profile " << i << ".";
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Int64PrefMatches(const char* pref_name) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 reference_value;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier()) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetVerifierPrefs()->GetInt64(pref_name);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetPrefs(0)->GetInt64(pref_name);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reference_value != GetPrefs(i)->GetInt64(pref_name)) {
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DVLOG(1) << "Integer preference " << pref_name << " mismatched in"
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << " profile " << i << ".";
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DoublePrefMatches(const char* pref_name) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double reference_value;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier()) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetVerifierPrefs()->GetDouble(pref_name);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetPrefs(0)->GetDouble(pref_name);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reference_value != GetPrefs(i)->GetDouble(pref_name)) {
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DVLOG(1) << "Double preference " << pref_name << " mismatched in"
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << " profile " << i << ".";
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringPrefMatches(const char* pref_name) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string reference_value;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier()) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetVerifierPrefs()->GetString(pref_name);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetPrefs(0)->GetString(pref_name);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reference_value != GetPrefs(i)->GetString(pref_name)) {
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DVLOG(1) << "String preference " << pref_name << " mismatched in"
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << " profile " << i << ".";
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FilePathPrefMatches(const char* pref_name) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath reference_value;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier()) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetVerifierPrefs()->GetFilePath(pref_name);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetPrefs(0)->GetFilePath(pref_name);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reference_value != GetPrefs(i)->GetFilePath(pref_name)) {
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DVLOG(1) << "base::FilePath preference " << pref_name << " mismatched in"
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << " profile " << i << ".";
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListPrefMatches(const char* pref_name) {
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::ListValue* reference_value;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test()->use_verifier()) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetVerifierPrefs()->GetList(pref_name);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_value = GetPrefs(0)->GetList(pref_name);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!reference_value->Equals(GetPrefs(i)->GetList(pref_name))) {
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DVLOG(1) << "List preference " << pref_name << " mismatched in"
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << " profile " << i << ".";
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
214a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace {
215a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass PrefMatchChecker : public StatusChangeChecker {
217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public:
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit PrefMatchChecker(const char* path);
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~PrefMatchChecker();
220a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // StatusChangeChecker implementation.
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool IsExitConditionSatisfied() = 0;
223a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual std::string GetDebugMessage() const OVERRIDE;
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Wait for condition to become true.
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Wait();
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* GetPath() const;
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
231a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private:
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RegisterPrefListener(PrefService* pref_service);
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedVector<PrefChangeRegistrar> pref_change_registrars_;
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* path_;
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
238116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPrefMatchChecker::PrefMatchChecker(const char* path) : path_(path) {
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
241116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPrefMatchChecker::~PrefMatchChecker() {
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::string PrefMatchChecker::GetDebugMessage() const {
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return base::StringPrintf("Waiting for pref '%s' to match", GetPath());
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrefMatchChecker::Wait() {
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (test()->use_verifier()) {
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RegisterPrefListener(GetVerifierPrefs());
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < test()->num_clients(); ++i) {
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RegisterPrefListener(GetPrefs(i));
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (IsExitConditionSatisfied()) {
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  StartBlockingWait();
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* PrefMatchChecker::GetPath() const {
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return path_;
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrefMatchChecker::RegisterPrefListener(PrefService* pref_service) {
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<PrefChangeRegistrar> registrar(new PrefChangeRegistrar());
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  registrar->Init(pref_service);
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  registrar->Add(path_,
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Bind(&PrefMatchChecker::CheckExitCondition,
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            base::Unretained(this)));
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pref_change_registrars_.push_back(registrar.release());
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Helper class used in the implementation of AwaitListPrefMatches.
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ListPrefMatchChecker : public PrefMatchChecker {
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit ListPrefMatchChecker(const char* path);
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~ListPrefMatchChecker();
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Implementation of PrefMatchChecker.
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool IsExitConditionSatisfied() OVERRIDE;
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
287116680a4aac90f2aa7413d9095a592090648e557Ben MurdochListPrefMatchChecker::ListPrefMatchChecker(const char* path)
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : PrefMatchChecker(path) {
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
291116680a4aac90f2aa7413d9095a592090648e557Ben MurdochListPrefMatchChecker::~ListPrefMatchChecker() {
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ListPrefMatchChecker::IsExitConditionSatisfied() {
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ListPrefMatches(GetPath());
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Helper class used in the implementation of AwaitBooleanPrefMatches.
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass BooleanPrefMatchChecker : public PrefMatchChecker {
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit BooleanPrefMatchChecker(const char* path);
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~BooleanPrefMatchChecker();
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Implementation of PrefMatchChecker.
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool IsExitConditionSatisfied() OVERRIDE;
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
308116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBooleanPrefMatchChecker::BooleanPrefMatchChecker(const char* path)
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : PrefMatchChecker(path) {
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
312116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBooleanPrefMatchChecker::~BooleanPrefMatchChecker() {
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool BooleanPrefMatchChecker::IsExitConditionSatisfied() {
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return BooleanPrefMatches(GetPath());
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Helper class used in the implementation of AwaitIntegerPrefMatches.
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass IntegerPrefMatchChecker : public PrefMatchChecker {
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit IntegerPrefMatchChecker(const char* path);
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~IntegerPrefMatchChecker();
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Implementation of PrefMatchChecker.
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool IsExitConditionSatisfied() OVERRIDE;
327a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
328a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
329116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIntegerPrefMatchChecker::IntegerPrefMatchChecker(const char* path)
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : PrefMatchChecker(path) {
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
333116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIntegerPrefMatchChecker::~IntegerPrefMatchChecker() {
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool IntegerPrefMatchChecker::IsExitConditionSatisfied() {
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return IntegerPrefMatches(GetPath());
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Helper class used in the implementation of AwaitStringPrefMatches.
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass StringPrefMatchChecker : public PrefMatchChecker {
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit StringPrefMatchChecker(const char* path);
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~StringPrefMatchChecker();
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Implementation of PrefMatchChecker.
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool IsExitConditionSatisfied() OVERRIDE;
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
349a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
350116680a4aac90f2aa7413d9095a592090648e557Ben MurdochStringPrefMatchChecker::StringPrefMatchChecker(const char* path)
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : PrefMatchChecker(path) {
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
353a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
354116680a4aac90f2aa7413d9095a592090648e557Ben MurdochStringPrefMatchChecker::~StringPrefMatchChecker() {
355a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
356a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool StringPrefMatchChecker::IsExitConditionSatisfied() {
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return StringPrefMatches(GetPath());
359a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
360a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
361a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  //  namespace
362a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
363a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool AwaitListPrefMatches(const char* pref_name) {
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ListPrefMatchChecker checker(pref_name);
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  checker.Wait();
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return !checker.TimedOut();
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool AwaitBooleanPrefMatches(const char* pref_name) {
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BooleanPrefMatchChecker checker(pref_name);
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  checker.Wait();
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return !checker.TimedOut();
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool AwaitIntegerPrefMatches(const char* pref_name) {
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  IntegerPrefMatchChecker checker(pref_name);
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  checker.Wait();
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return !checker.TimedOut();
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool AwaitStringPrefMatches(const char* pref_name) {
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  StringPrefMatchChecker checker(pref_name);
383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  checker.Wait();
384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return !checker.TimedOut();
385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace preferences_helper
388