+namespace {
+
+// Helper class used in the implementation of AwaitDictionariesMatch.
+class DictionaryMatchStatusChecker : public MultiClientStatusChangeChecker {
+ public:
+ DictionaryMatchStatusChecker();
+ virtual ~DictionaryMatchStatusChecker();
+
+ virtual bool IsExitConditionSatisfied() OVERRIDE;
+ virtual std::string GetDebugMessage() const OVERRIDE;
+};
+
+DictionaryMatchStatusChecker::DictionaryMatchStatusChecker()
+ : MultiClientStatusChangeChecker(
+ sync_datatype_helper::test()->GetSyncServices()) {}
+
+DictionaryMatchStatusChecker::~DictionaryMatchStatusChecker() {}
+
+bool DictionaryMatchStatusChecker::IsExitConditionSatisfied() {
+ return DictionariesMatch();
+}
+
+std::string DictionaryMatchStatusChecker::GetDebugMessage() const {
+ return "Waiting for matching dictionaries";
+}
+
+// Helper class used in the implementation of AwaitNumDictionaryEntries.
+class NumDictionaryEntriesStatusChecker
+ : public SingleClientStatusChangeChecker {
+ public:
+ NumDictionaryEntriesStatusChecker(int index, size_t num_words);
+ virtual ~NumDictionaryEntriesStatusChecker();
+
+ virtual bool IsExitConditionSatisfied() OVERRIDE;
+ virtual std::string GetDebugMessage() const OVERRIDE;
+ private:
+ int index_;
+ size_t num_words_;
+};
+
+NumDictionaryEntriesStatusChecker::NumDictionaryEntriesStatusChecker(
+ int index, size_t num_words)
+ : SingleClientStatusChangeChecker(
+ sync_datatype_helper::test()->GetSyncService(index)),
+ index_(index),
+ num_words_(num_words) {}
+
+NumDictionaryEntriesStatusChecker::~NumDictionaryEntriesStatusChecker() {}
+
+bool NumDictionaryEntriesStatusChecker::IsExitConditionSatisfied() {
+ return GetDictionarySize(index_) == num_words_;
+}
+
+std::string NumDictionaryEntriesStatusChecker::GetDebugMessage() const {
+ return base::StringPrintf(
+ "Waiting for client %d: %" PRIuS " / %" PRIuS " words downloaded",
+ index_, GetDictionarySize(index_), num_words_);
+}
+
+} // namespace
+
+bool AwaitDictionariesMatch() {
+ DictionaryMatchStatusChecker checker;
+ checker.Wait();
+ return !checker.TimedOut();
+}
+
+bool AwaitNumDictionaryEntries(int index, size_t num_words) {
+ NumDictionaryEntriesStatusChecker checker(index, num_words);
+ checker.Wait();
+ return !checker.TimedOut();
+}
+