Index: ash/system/chromeos/session/logout_confirmation_controller_unittest.cc |
diff --git a/ash/system/chromeos/session/logout_confirmation_controller_unittest.cc b/ash/system/chromeos/session/logout_confirmation_controller_unittest.cc |
index f459d8aa29881473460c1017dc479d0efef57bdd..fb9d3791ad18af6c10bd660e3e6937111be144b9 100644 |
--- a/ash/system/chromeos/session/logout_confirmation_controller_unittest.cc |
+++ b/ash/system/chromeos/session/logout_confirmation_controller_unittest.cc |
@@ -4,14 +4,149 @@ |
#include "ash/system/chromeos/session/logout_confirmation_controller.h" |
+#include <queue> |
+#include <utility> |
+#include <vector> |
+ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
+#include "base/compiler_specific.h" |
+#include "base/location.h" |
#include "base/memory/ref_counted.h" |
-#include "base/test/test_mock_time_task_runner.h" |
+#include "base/single_thread_task_runner.h" |
#include "base/thread_task_runner_handle.h" |
+#include "base/time/tick_clock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace ash { |
+namespace { |
+ |
+// A SingleThreadTaskRunner that mocks the current time and allows it to be |
+// fast-forwarded. TODO(bartfab): Copies of this class exist in several tests. |
+// Consolidate them (crbug.com/329911). |
+class MockTimeSingleThreadTaskRunner : public base::SingleThreadTaskRunner { |
+ public: |
+ MockTimeSingleThreadTaskRunner(); |
+ |
+ // base::SingleThreadTaskRunner: |
+ virtual bool RunsTasksOnCurrentThread() const override; |
+ virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
+ const base::Closure& task, |
+ base::TimeDelta delay) override; |
+ virtual bool PostNonNestableDelayedTask( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& task, |
+ base::TimeDelta delay) override; |
+ |
+ const base::TimeTicks& GetCurrentTime() const; |
+ |
+ void FastForwardBy(base::TimeDelta delta); |
+ void FastForwardUntilNoTasksRemain(); |
+ |
+ private: |
+ // Strict weak temporal ordering of tasks. |
+ class TemporalOrder { |
+ public: |
+ bool operator()( |
+ const std::pair<base::TimeTicks, base::Closure>& first_task, |
+ const std::pair<base::TimeTicks, base::Closure>& second_task) const; |
+ }; |
+ |
+ virtual ~MockTimeSingleThreadTaskRunner(); |
+ |
+ base::TimeTicks now_; |
+ std::priority_queue<std::pair<base::TimeTicks, base::Closure>, |
+ std::vector<std::pair<base::TimeTicks, base::Closure> >, |
+ TemporalOrder> tasks_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MockTimeSingleThreadTaskRunner); |
+}; |
+ |
+// A base::TickClock that uses a MockTimeSingleThreadTaskRunner as the source of |
+// the current time. |
+class MockClock : public base::TickClock { |
+ public: |
+ explicit MockClock(scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner); |
+ virtual ~MockClock(); |
+ |
+ // base::TickClock: |
+ virtual base::TimeTicks NowTicks() override; |
+ |
+ private: |
+ scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MockClock); |
+}; |
+ |
+ |
+MockTimeSingleThreadTaskRunner::MockTimeSingleThreadTaskRunner() { |
+} |
+ |
+bool MockTimeSingleThreadTaskRunner::RunsTasksOnCurrentThread() const { |
+ return true; |
+} |
+ |
+bool MockTimeSingleThreadTaskRunner::PostDelayedTask( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& task, |
+ base::TimeDelta delay) { |
+ tasks_.push(std::make_pair(now_ + delay, task)); |
+ return true; |
+} |
+ |
+bool MockTimeSingleThreadTaskRunner::PostNonNestableDelayedTask( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& task, |
+ base::TimeDelta delay) { |
+ NOTREACHED(); |
+ return false; |
+} |
+ |
+const base::TimeTicks& MockTimeSingleThreadTaskRunner::GetCurrentTime() const { |
+ return now_; |
+} |
+ |
+void MockTimeSingleThreadTaskRunner::FastForwardBy(base::TimeDelta delta) { |
+ const base::TimeTicks latest = now_ + delta; |
+ while (!tasks_.empty() && tasks_.top().first <= latest) { |
+ now_ = tasks_.top().first; |
+ base::Closure task = tasks_.top().second; |
+ tasks_.pop(); |
+ task.Run(); |
+ } |
+ now_ = latest; |
+} |
+ |
+void MockTimeSingleThreadTaskRunner::FastForwardUntilNoTasksRemain() { |
+ while (!tasks_.empty()) { |
+ now_ = tasks_.top().first; |
+ base::Closure task = tasks_.top().second; |
+ tasks_.pop(); |
+ task.Run(); |
+ } |
+} |
+ |
+bool MockTimeSingleThreadTaskRunner::TemporalOrder::operator()( |
+ const std::pair<base::TimeTicks, base::Closure>& first_task, |
+ const std::pair<base::TimeTicks, base::Closure>& second_task) const { |
+ return first_task.first > second_task.first; |
+} |
+ |
+MockTimeSingleThreadTaskRunner::~MockTimeSingleThreadTaskRunner() { |
+} |
+ |
+MockClock::MockClock(scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner) |
+ : task_runner_(task_runner) { |
+} |
+ |
+MockClock::~MockClock() { |
+} |
+ |
+base::TimeTicks MockClock::NowTicks() { |
+ return task_runner_->GetCurrentTime(); |
+} |
+ |
+} // namespace |
class LogoutConfirmationControllerTest : public testing::Test { |
protected: |
@@ -22,7 +157,7 @@ |
bool log_out_called_; |
- scoped_refptr<base::TestMockTimeTaskRunner> runner_; |
+ scoped_refptr<MockTimeSingleThreadTaskRunner> runner_; |
base::ThreadTaskRunnerHandle runner_handle_; |
LogoutConfirmationController controller_; |
@@ -33,11 +168,12 @@ |
LogoutConfirmationControllerTest::LogoutConfirmationControllerTest() |
: log_out_called_(false), |
- runner_(new base::TestMockTimeTaskRunner), |
+ runner_(new MockTimeSingleThreadTaskRunner), |
runner_handle_(runner_), |
controller_(base::Bind(&LogoutConfirmationControllerTest::LogOut, |
base::Unretained(this))) { |
- controller_.SetClockForTesting(runner_->GetMockTickClock()); |
+ controller_.SetClockForTesting( |
+ scoped_ptr<base::TickClock>(new MockClock(runner_))); |
} |
LogoutConfirmationControllerTest::~LogoutConfirmationControllerTest() { |
@@ -50,7 +186,7 @@ |
// Verifies that the user is logged out immediately if logout confirmation with |
// a zero-length countdown is requested. |
TEST_F(LogoutConfirmationControllerTest, ZeroDuration) { |
- controller_.ConfirmLogout(runner_->GetCurrentMockTime()); |
+ controller_.ConfirmLogout(runner_->GetCurrentTime()); |
EXPECT_FALSE(log_out_called_); |
runner_->FastForwardBy(base::TimeDelta()); |
EXPECT_TRUE(log_out_called_); |
@@ -59,7 +195,7 @@ |
// Verifies that the user is logged out when the countdown expires. |
TEST_F(LogoutConfirmationControllerTest, DurationExpired) { |
controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(10)); |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(10)); |
EXPECT_FALSE(log_out_called_); |
runner_->FastForwardBy(base::TimeDelta::FromSeconds(9)); |
EXPECT_FALSE(log_out_called_); |
@@ -72,12 +208,12 @@ |
// out when the new countdown expires. |
TEST_F(LogoutConfirmationControllerTest, DurationShortened) { |
controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(30)); |
- EXPECT_FALSE(log_out_called_); |
- runner_->FastForwardBy(base::TimeDelta::FromSeconds(9)); |
- EXPECT_FALSE(log_out_called_); |
- controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(10)); |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(30)); |
+ EXPECT_FALSE(log_out_called_); |
+ runner_->FastForwardBy(base::TimeDelta::FromSeconds(9)); |
+ EXPECT_FALSE(log_out_called_); |
+ controller_.ConfirmLogout( |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(10)); |
runner_->FastForwardBy(base::TimeDelta::FromSeconds(9)); |
EXPECT_FALSE(log_out_called_); |
runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); |
@@ -89,12 +225,12 @@ |
// out when the original countdown expires. |
TEST_F(LogoutConfirmationControllerTest, DurationExtended) { |
controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(10)); |
- EXPECT_FALSE(log_out_called_); |
- runner_->FastForwardBy(base::TimeDelta::FromSeconds(9)); |
- EXPECT_FALSE(log_out_called_); |
- controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(10)); |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(10)); |
+ EXPECT_FALSE(log_out_called_); |
+ runner_->FastForwardBy(base::TimeDelta::FromSeconds(9)); |
+ EXPECT_FALSE(log_out_called_); |
+ controller_.ConfirmLogout( |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(10)); |
runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); |
EXPECT_TRUE(log_out_called_); |
} |
@@ -103,7 +239,7 @@ |
// user is not logged out, even when the original countdown expires. |
TEST_F(LogoutConfirmationControllerTest, Lock) { |
controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(10)); |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(10)); |
EXPECT_FALSE(log_out_called_); |
controller_.OnLockStateChanged(true); |
runner_->FastForwardUntilNoTasksRemain(); |
@@ -114,7 +250,7 @@ |
// out immediately. |
TEST_F(LogoutConfirmationControllerTest, UserAccepted) { |
controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(10)); |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(10)); |
EXPECT_FALSE(log_out_called_); |
controller_.OnLogoutConfirmed(); |
EXPECT_TRUE(log_out_called_); |
@@ -124,7 +260,7 @@ |
// out, even when the original countdown expires. |
TEST_F(LogoutConfirmationControllerTest, UserDenied) { |
controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(10)); |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(10)); |
EXPECT_FALSE(log_out_called_); |
controller_.OnDialogClosed(); |
runner_->FastForwardUntilNoTasksRemain(); |
@@ -136,14 +272,14 @@ |
// expires. |
TEST_F(LogoutConfirmationControllerTest, DurationExpiredAfterDeniedRequest) { |
controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(10)); |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(10)); |
EXPECT_FALSE(log_out_called_); |
controller_.OnDialogClosed(); |
runner_->FastForwardUntilNoTasksRemain(); |
EXPECT_FALSE(log_out_called_); |
controller_.ConfirmLogout( |
- runner_->GetCurrentMockTime() + base::TimeDelta::FromSeconds(10)); |
+ runner_->GetCurrentTime() + base::TimeDelta::FromSeconds(10)); |
EXPECT_FALSE(log_out_called_); |
runner_->FastForwardBy(base::TimeDelta::FromSeconds(9)); |
EXPECT_FALSE(log_out_called_); |