#include "chrome/browser/sync/test/integration/preferences_helper.h"
+#include "base/prefs/pref_change_registrar.h"
#include "base/prefs/pref_service.h"
#include "base/prefs/scoped_user_pref_update.h"
-#include "base/values.h"
+#include "base/strings/stringprintf.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h"
#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
GetVerifierPrefs()->SetString(pref_name, new_value);
}
-void AppendStringPref(int index,
- const char* pref_name,
- const std::string& append_value) {
- ChangeStringPref(index,
- pref_name,
- GetPrefs(index)->GetString(pref_name) + append_value);
-}
-
void ChangeFilePathPref(int index,
const char* pref_name,
const base::FilePath& new_value) {
}
for (int i = 0; i < test()->num_clients(); ++i) {
if (reference_value != GetPrefs(i)->GetBoolean(pref_name)) {
- LOG(ERROR) << "Boolean preference " << pref_name << " mismatched in"
- << " profile " << i << ".";
+ DVLOG(1) << "Boolean preference " << pref_name << " mismatched in"
+ << " profile " << i << ".";
return false;
}
}
}
for (int i = 0; i < test()->num_clients(); ++i) {
if (reference_value != GetPrefs(i)->GetInteger(pref_name)) {
- LOG(ERROR) << "Integer preference " << pref_name << " mismatched in"
- << " profile " << i << ".";
+ DVLOG(1) << "Integer preference " << pref_name << " mismatched in"
+ << " profile " << i << ".";
return false;
}
}
}
for (int i = 0; i < test()->num_clients(); ++i) {
if (reference_value != GetPrefs(i)->GetInt64(pref_name)) {
- LOG(ERROR) << "Integer preference " << pref_name << " mismatched in"
- << " profile " << i << ".";
+ DVLOG(1) << "Integer preference " << pref_name << " mismatched in"
+ << " profile " << i << ".";
return false;
}
}
}
for (int i = 0; i < test()->num_clients(); ++i) {
if (reference_value != GetPrefs(i)->GetDouble(pref_name)) {
- LOG(ERROR) << "Double preference " << pref_name << " mismatched in"
- << " profile " << i << ".";
+ DVLOG(1) << "Double preference " << pref_name << " mismatched in"
+ << " profile " << i << ".";
return false;
}
}
}
for (int i = 0; i < test()->num_clients(); ++i) {
if (reference_value != GetPrefs(i)->GetString(pref_name)) {
- LOG(ERROR) << "String preference " << pref_name << " mismatched in"
- << " profile " << i << ".";
+ DVLOG(1) << "String preference " << pref_name << " mismatched in"
+ << " profile " << i << ".";
return false;
}
}
}
for (int i = 0; i < test()->num_clients(); ++i) {
if (reference_value != GetPrefs(i)->GetFilePath(pref_name)) {
- LOG(ERROR) << "base::FilePath preference " << pref_name
- << " mismatched in" << " profile " << i << ".";
+ DVLOG(1) << "base::FilePath preference " << pref_name << " mismatched in"
+ << " profile " << i << ".";
return false;
}
}
}
for (int i = 0; i < test()->num_clients(); ++i) {
if (!reference_value->Equals(GetPrefs(i)->GetList(pref_name))) {
- LOG(ERROR) << "List preference " << pref_name << " mismatched in"
- << " profile " << i << ".";
+ DVLOG(1) << "List preference " << pref_name << " mismatched in"
+ << " profile " << i << ".";
return false;
}
}
namespace {
-// Helper class used in the implementation of AwaitListPrefMatches.
-class ListPrefMatchStatusChecker : public MultiClientStatusChangeChecker {
+class PrefMatchChecker : public StatusChangeChecker {
public:
- explicit ListPrefMatchStatusChecker(const char* pref_name);
- virtual ~ListPrefMatchStatusChecker();
+ explicit PrefMatchChecker(const char* path);
+ ~PrefMatchChecker() override;
+
+ // StatusChangeChecker implementation.
+ virtual bool IsExitConditionSatisfied() = 0;
+ std::string GetDebugMessage() const override;
+
+ // Wait for condition to become true.
+ void Wait();
+
+ protected:
+ const char* GetPath() const;
- virtual bool IsExitConditionSatisfied() OVERRIDE;
- virtual std::string GetDebugMessage() const OVERRIDE;
private:
- const char* pref_name_;
+ void RegisterPrefListener(PrefService* pref_service);
+
+ ScopedVector<PrefChangeRegistrar> pref_change_registrars_;
+ const char* path_;
};
-ListPrefMatchStatusChecker::ListPrefMatchStatusChecker(const char* pref_name)
- : MultiClientStatusChangeChecker(
- sync_datatype_helper::test()->GetSyncServices()),
- pref_name_(pref_name) {}
+PrefMatchChecker::PrefMatchChecker(const char* path) : path_(path) {
+}
+
+PrefMatchChecker::~PrefMatchChecker() {
+}
+
+std::string PrefMatchChecker::GetDebugMessage() const {
+ return base::StringPrintf("Waiting for pref '%s' to match", GetPath());
+}
+
+void PrefMatchChecker::Wait() {
+ if (test()->use_verifier()) {
+ RegisterPrefListener(GetVerifierPrefs());
+ }
+
+ for (int i = 0; i < test()->num_clients(); ++i) {
+ RegisterPrefListener(GetPrefs(i));
+ }
+
+ if (IsExitConditionSatisfied()) {
+ return;
+ }
-ListPrefMatchStatusChecker::~ListPrefMatchStatusChecker() {}
+ StartBlockingWait();
+}
+
+const char* PrefMatchChecker::GetPath() const {
+ return path_;
+}
-bool ListPrefMatchStatusChecker::IsExitConditionSatisfied() {
- return ListPrefMatches(pref_name_);
+void PrefMatchChecker::RegisterPrefListener(PrefService* pref_service) {
+ scoped_ptr<PrefChangeRegistrar> registrar(new PrefChangeRegistrar());
+ registrar->Init(pref_service);
+ registrar->Add(path_,
+ base::Bind(&PrefMatchChecker::CheckExitCondition,
+ base::Unretained(this)));
+ pref_change_registrars_.push_back(registrar.release());
}
-std::string ListPrefMatchStatusChecker::GetDebugMessage() const {
- return "Waiting for matching preferences";
+// Helper class used in the implementation of AwaitListPrefMatches.
+class ListPrefMatchChecker : public PrefMatchChecker {
+ public:
+ explicit ListPrefMatchChecker(const char* path);
+ ~ListPrefMatchChecker() override;
+
+ // Implementation of PrefMatchChecker.
+ bool IsExitConditionSatisfied() override;
+};
+
+ListPrefMatchChecker::ListPrefMatchChecker(const char* path)
+ : PrefMatchChecker(path) {
+}
+
+ListPrefMatchChecker::~ListPrefMatchChecker() {
+}
+
+bool ListPrefMatchChecker::IsExitConditionSatisfied() {
+ return ListPrefMatches(GetPath());
+}
+
+// Helper class used in the implementation of AwaitBooleanPrefMatches.
+class BooleanPrefMatchChecker : public PrefMatchChecker {
+ public:
+ explicit BooleanPrefMatchChecker(const char* path);
+ ~BooleanPrefMatchChecker() override;
+
+ // Implementation of PrefMatchChecker.
+ bool IsExitConditionSatisfied() override;
+};
+
+BooleanPrefMatchChecker::BooleanPrefMatchChecker(const char* path)
+ : PrefMatchChecker(path) {
+}
+
+BooleanPrefMatchChecker::~BooleanPrefMatchChecker() {
+}
+
+bool BooleanPrefMatchChecker::IsExitConditionSatisfied() {
+ return BooleanPrefMatches(GetPath());
+}
+
+// Helper class used in the implementation of AwaitIntegerPrefMatches.
+class IntegerPrefMatchChecker : public PrefMatchChecker {
+ public:
+ explicit IntegerPrefMatchChecker(const char* path);
+ ~IntegerPrefMatchChecker() override;
+
+ // Implementation of PrefMatchChecker.
+ bool IsExitConditionSatisfied() override;
+};
+
+IntegerPrefMatchChecker::IntegerPrefMatchChecker(const char* path)
+ : PrefMatchChecker(path) {
+}
+
+IntegerPrefMatchChecker::~IntegerPrefMatchChecker() {
+}
+
+bool IntegerPrefMatchChecker::IsExitConditionSatisfied() {
+ return IntegerPrefMatches(GetPath());
+}
+
+// Helper class used in the implementation of AwaitStringPrefMatches.
+class StringPrefMatchChecker : public PrefMatchChecker {
+ public:
+ explicit StringPrefMatchChecker(const char* path);
+ ~StringPrefMatchChecker() override;
+
+ // Implementation of PrefMatchChecker.
+ bool IsExitConditionSatisfied() override;
+};
+
+StringPrefMatchChecker::StringPrefMatchChecker(const char* path)
+ : PrefMatchChecker(path) {
+}
+
+StringPrefMatchChecker::~StringPrefMatchChecker() {
+}
+
+bool StringPrefMatchChecker::IsExitConditionSatisfied() {
+ return StringPrefMatches(GetPath());
}
} // namespace
bool AwaitListPrefMatches(const char* pref_name) {
- ListPrefMatchStatusChecker checker(pref_name);
+ ListPrefMatchChecker checker(pref_name);
+ checker.Wait();
+ return !checker.TimedOut();
+}
+
+bool AwaitBooleanPrefMatches(const char* pref_name) {
+ BooleanPrefMatchChecker checker(pref_name);
+ checker.Wait();
+ return !checker.TimedOut();
+}
+
+bool AwaitIntegerPrefMatches(const char* pref_name) {
+ IntegerPrefMatchChecker checker(pref_name);
+ checker.Wait();
+ return !checker.TimedOut();
+}
+
+bool AwaitStringPrefMatches(const char* pref_name) {
+ StringPrefMatchChecker checker(pref_name);
checker.Wait();
return !checker.TimedOut();
}