Index: chrome/browser/sync/test/integration/bookmarks_helper.cc |
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.cc b/chrome/browser/sync/test/integration/bookmarks_helper.cc |
index 2cfb377a2fec72db46e286d3fd4f59ca084ea096..fc07d2a1fae99974631db60f40cd11da66620a2a 100644 |
--- a/chrome/browser/sync/test/integration/bookmarks_helper.cc |
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.cc |
@@ -75,13 +75,13 @@ class FaviconChangeObserver : public BookmarkModelObserver { |
} |
void WaitForGetFavicon() { |
wait_for_load_ = true; |
- content::RunMessageLoop(); |
+ run_loop_.Run(); |
ASSERT_TRUE(node_->is_favicon_loaded()); |
ASSERT_FALSE(model_->GetFavicon(node_).IsEmpty()); |
} |
void WaitForSetFavicon() { |
wait_for_load_ = false; |
- content::RunMessageLoop(); |
+ run_loop_.Run(); |
} |
virtual void BookmarkModelLoaded(BookmarkModel* model, |
bool ids_reassigned) OVERRIDE {} |
@@ -116,7 +116,7 @@ class FaviconChangeObserver : public BookmarkModelObserver { |
const BookmarkNode* node) OVERRIDE { |
if (model == model_ && node == node_) { |
if (!wait_for_load_ || (wait_for_load_ && node->is_favicon_loaded())) |
- base::MessageLoopForUI::current()->Quit(); |
+ run_loop_.Quit(); |
} |
} |
@@ -124,6 +124,7 @@ class FaviconChangeObserver : public BookmarkModelObserver { |
BookmarkModel* model_; |
const BookmarkNode* node_; |
bool wait_for_load_; |
+ base::RunLoop run_loop_; |
DISALLOW_COPY_AND_ASSIGN(FaviconChangeObserver); |
}; |
@@ -314,24 +315,22 @@ bool NodesMatch(const BookmarkNode* node_a, const BookmarkNode* node_b) { |
if (node_a == NULL || node_b == NULL) |
return node_a == node_b; |
if (node_a->is_folder() != node_b->is_folder()) { |
- LOG(ERROR) << "Cannot compare folder with bookmark"; |
+ VLOG(1) << "Cannot compare folder with bookmark"; |
return false; |
} |
if (node_a->GetTitle() != node_b->GetTitle()) { |
- LOG(ERROR) << "Title mismatch: " << node_a->GetTitle() << " vs. " |
- << node_b->GetTitle(); |
+ VLOG(1) << "Title mismatch: " << node_a->GetTitle() << " vs. " |
+ << node_b->GetTitle(); |
return false; |
} |
if (node_a->url() != node_b->url()) { |
- LOG(ERROR) << "URL mismatch: " << node_a->url() << " vs. " |
- << node_b->url(); |
+ VLOG(1) << "URL mismatch: " << node_a->url() << " vs. " << node_b->url(); |
return false; |
} |
if (node_a->parent()->GetIndexOf(node_a) != |
node_b->parent()->GetIndexOf(node_b)) { |
- LOG(ERROR) << "Index mismatch: " |
- << node_a->parent()->GetIndexOf(node_a) << " vs. " |
- << node_b->parent()->GetIndexOf(node_b); |
+ VLOG(1) << "Index mismatch: " << node_a->parent()->GetIndexOf(node_a) |
+ << " vs. " << node_b->parent()->GetIndexOf(node_b); |
return false; |
} |
return true; |
@@ -347,7 +346,7 @@ bool BookmarkModelsMatch(BookmarkModel* model_a, BookmarkModel* model_b) { |
while (iterator_a.has_next()) { |
const BookmarkNode* node_a = iterator_a.Next(); |
if (!iterator_b.has_next()) { |
- LOG(ERROR) << "Models do not match."; |
+ VLOG(1) << "Models do not match."; |
return false; |
} |
const BookmarkNode* node_b = iterator_b.Next(); |
@@ -658,7 +657,7 @@ bool AllModelsMatchVerifier() { |
for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) { |
if (!ModelMatchesVerifier(i)) { |
- LOG(ERROR) << "Model " << i << " does not match the verifier."; |
+ VLOG(1) << "Model " << i << " does not match the verifier."; |
return false; |
} |
} |
@@ -678,48 +677,13 @@ bool AllModelsMatch() { |
for (int i = 1; i < sync_datatype_helper::test()->num_clients(); ++i) { |
if (!ModelsMatch(0, i)) { |
- LOG(ERROR) << "Model " << i << " does not match Model 0."; |
+ VLOG(1) << "Model " << i << " does not match Model 0."; |
return false; |
} |
} |
return true; |
} |
-namespace { |
- |
-// Helper class used in the implementation of AwaitAllModelsMatch. |
-class AllModelsMatchChecker : public MultiClientStatusChangeChecker { |
- public: |
- AllModelsMatchChecker(); |
- virtual ~AllModelsMatchChecker(); |
- |
- virtual bool IsExitConditionSatisfied() OVERRIDE; |
- virtual std::string GetDebugMessage() const OVERRIDE; |
-}; |
- |
-AllModelsMatchChecker::AllModelsMatchChecker() |
- : MultiClientStatusChangeChecker( |
- sync_datatype_helper::test()->GetSyncServices()) {} |
- |
-AllModelsMatchChecker::~AllModelsMatchChecker() {} |
- |
-bool AllModelsMatchChecker::IsExitConditionSatisfied() { |
- return AllModelsMatch(); |
-} |
- |
-std::string AllModelsMatchChecker::GetDebugMessage() const { |
- return "Waiting for matching models"; |
-} |
- |
-} // namespace |
- |
-bool AwaitAllModelsMatch() { |
- AllModelsMatchChecker checker; |
- checker.Wait(); |
- return !checker.TimedOut(); |
-} |
- |
- |
bool ContainsDuplicateBookmarks(int profile) { |
ui::TreeNodeIterator<const BookmarkNode> iterator( |
GetBookmarkModel(profile)->root_node()); |
@@ -822,4 +786,155 @@ std::string IndexedSubsubfolderName(int i) { |
return base::StringPrintf("Subsubfolder Name %d", i); |
} |
+class BookmarkConditionChecker : public StatusChangeChecker, |
+ public BookmarkModelObserver { |
+ public: |
+ BookmarkConditionChecker(base::Callback<bool()> exit_condition, |
+ const std::string& debug_message); |
+ virtual ~BookmarkConditionChecker(); |
+ |
+ // Implementation of StatusChangeChecker. |
+ virtual std::string GetDebugMessage() const OVERRIDE; |
+ virtual bool IsExitConditionSatisfied() OVERRIDE; |
+ |
+ // Implementation of BookmarkModelObserver. |
+ virtual void BookmarkModelLoaded(BookmarkModel* model, |
+ bool ids_reassigned) OVERRIDE; |
+ virtual void BookmarkNodeMoved(BookmarkModel* model, |
+ const BookmarkNode* old_parent, |
+ int old_index, |
+ const BookmarkNode* new_parent, |
+ int new_index) OVERRIDE; |
+ virtual void BookmarkNodeAdded(BookmarkModel* model, |
+ const BookmarkNode* parent, |
+ int index) OVERRIDE; |
+ virtual void BookmarkNodeRemoved(BookmarkModel* model, |
+ const BookmarkNode* parent, |
+ int old_index, |
+ const BookmarkNode* node, |
+ const std::set<GURL>& removed_urls) OVERRIDE; |
+ virtual void BookmarkNodeChanged(BookmarkModel* model, |
+ const BookmarkNode* node) OVERRIDE; |
+ virtual void BookmarkNodeFaviconChanged(BookmarkModel* model, |
+ const BookmarkNode* node) OVERRIDE; |
+ virtual void BookmarkNodeChildrenReordered(BookmarkModel* model, |
+ const BookmarkNode* node) OVERRIDE; |
+ virtual void BookmarkAllUserNodesRemoved( |
+ BookmarkModel* model, |
+ const std::set<GURL>& removed_urls) OVERRIDE; |
+ |
+ // Waits until the condition to be met or a timeout occurs. |
+ void Wait(); |
+ |
+ private: |
+ base::Callback<bool()> exit_condition_; |
+ std::string debug_message_; |
+ bool registered_; |
+}; |
+ |
+BookmarkConditionChecker::BookmarkConditionChecker( |
+ base::Callback<bool()> exit_condition, |
+ const std::string& debug_message) |
+ : exit_condition_(exit_condition), |
+ debug_message_(debug_message), |
+ registered_(false) { |
+} |
+ |
+BookmarkConditionChecker::~BookmarkConditionChecker() { |
+ if (!registered_) |
+ return; |
+ |
+ for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) { |
+ GetBookmarkModel(i)->RemoveObserver(this); |
+ } |
+} |
+ |
+std::string BookmarkConditionChecker::GetDebugMessage() const { |
+ return debug_message_; |
+} |
+ |
+bool BookmarkConditionChecker::IsExitConditionSatisfied() { |
+ return exit_condition_.Run(); |
+} |
+ |
+// Implementation of BookmarkModelObserver. |
+void BookmarkConditionChecker::BookmarkModelLoaded(BookmarkModel* model, |
+ bool ids_reassigned) { |
+ CheckExitCondition(); |
+} |
+ |
+void BookmarkConditionChecker::BookmarkNodeMoved(BookmarkModel* model, |
+ const BookmarkNode* old_parent, |
+ int old_index, |
+ const BookmarkNode* new_parent, |
+ int new_index) { |
+ CheckExitCondition(); |
+} |
+ |
+void BookmarkConditionChecker::BookmarkNodeAdded(BookmarkModel* model, |
+ const BookmarkNode* parent, |
+ int index) { |
+ CheckExitCondition(); |
+} |
+ |
+void BookmarkConditionChecker::BookmarkNodeRemoved( |
+ BookmarkModel* model, |
+ const BookmarkNode* parent, |
+ int old_index, |
+ const BookmarkNode* node, |
+ const std::set<GURL>& removed_urls) { |
+ CheckExitCondition(); |
+} |
+ |
+void BookmarkConditionChecker::BookmarkNodeChanged(BookmarkModel* model, |
+ const BookmarkNode* node) { |
+ CheckExitCondition(); |
+} |
+ |
+void BookmarkConditionChecker::BookmarkNodeFaviconChanged( |
+ BookmarkModel* model, |
+ const BookmarkNode* node) { |
+ CheckExitCondition(); |
+} |
+ |
+void BookmarkConditionChecker::BookmarkNodeChildrenReordered( |
+ BookmarkModel* model, |
+ const BookmarkNode* node) { |
+ CheckExitCondition(); |
+} |
+ |
+void BookmarkConditionChecker::BookmarkAllUserNodesRemoved( |
+ BookmarkModel* model, |
+ const std::set<GURL>& removed_urls) { |
+ CheckExitCondition(); |
+} |
+ |
+void BookmarkConditionChecker::Wait() { |
+ for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) { |
+ GetBookmarkModel(i)->AddObserver(this); |
+ } |
+ registered_ = true; |
+ |
+ if (IsExitConditionSatisfied()) { |
+ VLOG(1) << "Finished without wait: " << GetDebugMessage(); |
+ return; |
+ } |
+ |
+ StartBlockingWait(); |
+} |
+ |
+bool AwaitAllModelsMatch() { |
+ BookmarkConditionChecker checker(base::Bind(&AllModelsMatch), |
+ "Waiting for models to match"); |
+ checker.Wait(); |
+ return !checker.TimedOut(); |
+} |
+ |
+bool AwaitAllModelsMatchVerifier() { |
+ BookmarkConditionChecker checker(base::Bind(&AllModelsMatchVerifier), |
+ "Waiting for models to match verifier"); |
+ checker.Wait(); |
+ return !checker.TimedOut(); |
+} |
+ |
} // namespace bookmarks_helper |