| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/test/integration/status_change_checker.h" | 5 #include "chrome/browser/sync/test/integration/status_change_checker.h" |
| 6 | 6 |
| 7 StatusChangeChecker::StatusChangeChecker(const std::string& source) | 7 #include "base/message_loop/message_loop.h" |
| 8 : source_(source) { | 8 #include "base/timer/timer.h" |
| 9 #include "chrome/browser/sync/profile_sync_service_observer.h" |
| 10 |
| 11 StatusChangeChecker::StatusChangeChecker() {} |
| 12 |
| 13 StatusChangeChecker::~StatusChangeChecker() {} |
| 14 |
| 15 void StatusChangeChecker::set_is_waiting(bool value) { |
| 16 is_waiting_ = value; |
| 9 } | 17 } |
| 10 | 18 |
| 11 StatusChangeChecker::~StatusChangeChecker() { | 19 bool StatusChangeChecker::IsWaiting() { |
| 20 return is_waiting_; |
| 12 } | 21 } |
| 22 |
| 23 void StatusChangeChecker::StopWaitingAndSucceed() { |
| 24 base::MessageLoop::current()->QuitWhenIdle(); |
| 25 } |
| 26 |
| 27 class StatusChangeCheckerRunner : public ProfileSyncServiceObserver { |
| 28 public: |
| 29 explicit StatusChangeCheckerRunner(StatusChangeChecker*); |
| 30 virtual ~StatusChangeCheckerRunner() OVERRIDE; |
| 31 |
| 32 void Run(); |
| 33 |
| 34 virtual void OnStateChanged() OVERRIDE; |
| 35 void OnTimeout(); |
| 36 |
| 37 bool timed_out() const { return timed_out_; } |
| 38 |
| 39 private: |
| 40 StatusChangeChecker* status_change_checker_; |
| 41 bool timed_out_; |
| 42 }; |
| 43 |
| 44 StatusChangeCheckerRunner::StatusChangeCheckerRunner( |
| 45 StatusChangeChecker* checker) |
| 46 : status_change_checker_(checker), timed_out_(false) { |
| 47 status_change_checker_->set_is_waiting(true); |
| 48 } |
| 49 |
| 50 StatusChangeCheckerRunner::~StatusChangeCheckerRunner() { |
| 51 status_change_checker_->set_is_waiting(false); |
| 52 } |
| 53 |
| 54 void StatusChangeCheckerRunner::Run() { |
| 55 status_change_checker_->InitObserver(this); |
| 56 |
| 57 base::OneShotTimer<StatusChangeCheckerRunner> timer; |
| 58 timer.Start(FROM_HERE, |
| 59 status_change_checker_->GetTimeoutDuration(), |
| 60 base::Bind(&StatusChangeCheckerRunner::OnTimeout, |
| 61 base::Unretained(this))); |
| 62 |
| 63 { |
| 64 base::MessageLoop* loop = base::MessageLoop::current(); |
| 65 base::MessageLoop::ScopedNestableTaskAllower allow(loop); |
| 66 loop->Run(); |
| 67 } |
| 68 |
| 69 status_change_checker_->UninitObserver(this); |
| 70 } |
| 71 |
| 72 void StatusChangeCheckerRunner::OnStateChanged() { |
| 73 if (status_change_checker_->IsExitConditionSatisfied()) |
| 74 base::MessageLoop::current()->QuitWhenIdle(); |
| 75 } |
| 76 |
| 77 void StatusChangeCheckerRunner::OnTimeout() { |
| 78 timed_out_ = true; |
| 79 base::MessageLoop::current()->QuitWhenIdle(); |
| 80 } |
| 81 |
| 82 bool StatusChangeChecker::Run(StatusChangeChecker* checker) { |
| 83 // Leave early if we can. |
| 84 // TODO: Support different kinds of early exit checks. |
| 85 if (checker->IsExitConditionSatisfied()) { |
| 86 return true; |
| 87 } |
| 88 |
| 89 // Otherwise start waiting. |
| 90 StatusChangeCheckerRunner runner(checker); |
| 91 runner.Run(); |
| 92 |
| 93 if (runner.timed_out()) { |
| 94 LOG(ERROR) << checker->GetDebugMessage() << ": timed out."; |
| 95 CHECK(false) << "Ending test because of a timeout."; |
| 96 return false; |
| 97 } |
| 98 |
| 99 DVLOG(1) << checker->GetDebugMessage() << ": succeeded."; |
| 100 return true; |
| 101 }; |
| OLD | NEW |