| Index: chrome/browser/chromeos/session_length_limiter_unittest.cc
|
| diff --git a/chrome/browser/chromeos/session_length_limiter_unittest.cc b/chrome/browser/chromeos/session_length_limiter_unittest.cc
|
| index 1d26284459a6631871a54e44467dbbc0d0de13b2..60252e3bc63e0d9a5aab16ee23cf818944b186e1 100644
|
| --- a/chrome/browser/chromeos/session_length_limiter_unittest.cc
|
| +++ b/chrome/browser/chromeos/session_length_limiter_unittest.cc
|
| @@ -4,12 +4,19 @@
|
|
|
| #include "chrome/browser/chromeos/session_length_limiter.h"
|
|
|
| +#include <queue>
|
| +#include <utility>
|
| +#include <vector>
|
| +
|
| +#include "base/callback.h"
|
| #include "base/compiler_specific.h"
|
| +#include "base/location.h"
|
| +#include "base/logging.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/prefs/testing_pref_service.h"
|
| +#include "base/single_thread_task_runner.h"
|
| #include "base/strings/string_number_conversions.h"
|
| -#include "base/test/test_mock_time_task_runner.h"
|
| #include "base/thread_task_runner_handle.h"
|
| #include "base/values.h"
|
| #include "chrome/common/pref_names.h"
|
| @@ -31,6 +38,44 @@
|
| MOCK_METHOD0(StopSession, void(void));
|
| };
|
|
|
| +// A SingleThreadTaskRunner that mocks the current time and allows it to be
|
| +// fast-forwarded.
|
| +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(const base::TimeDelta& time_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_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| class SessionLengthLimiterTest : public testing::Test {
|
| @@ -69,7 +114,7 @@
|
|
|
| void DestroySessionLengthLimiter();
|
|
|
| - scoped_refptr<base::TestMockTimeTaskRunner> runner_;
|
| + scoped_refptr<MockTimeSingleThreadTaskRunner> runner_;
|
| base::TimeTicks session_start_time_;
|
| base::TimeTicks session_stop_time_;
|
|
|
| @@ -82,6 +127,64 @@
|
| scoped_ptr<SessionLengthLimiter> session_length_limiter_;
|
| };
|
|
|
| +MockTimeSingleThreadTaskRunner::MockTimeSingleThreadTaskRunner()
|
| + : now_(base::TimeTicks::FromInternalValue(1000)) {
|
| +}
|
| +
|
| +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::pair<base::TimeTicks, base::Closure>(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(
|
| + const base::TimeDelta& time_delta) {
|
| + const base::TimeTicks latest = now_ + time_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() {
|
| +}
|
| +
|
| SessionLengthLimiterTest::SessionLengthLimiterTest()
|
| : user_activity_seen_(false),
|
| delegate_(NULL) {
|
| @@ -90,8 +193,7 @@
|
| void SessionLengthLimiterTest::SetUp() {
|
| TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
|
| SessionLengthLimiter::RegisterPrefs(local_state_.registry());
|
| - runner_ = new base::TestMockTimeTaskRunner;
|
| - runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1000));
|
| + runner_ = new MockTimeSingleThreadTaskRunner;
|
| }
|
|
|
| void SessionLengthLimiterTest::TearDown() {
|
| @@ -172,7 +274,7 @@
|
| UpdateSessionStartTimeIfWaitingForUserActivity() {
|
| if (!user_activity_seen_ &&
|
| local_state_.GetBoolean(prefs::kSessionWaitForInitialUserActivity)) {
|
| - session_start_time_ = runner_->GetCurrentMockTime();
|
| + session_start_time_ = runner_->GetCurrentTime();
|
| }
|
| }
|
|
|
| @@ -184,19 +286,19 @@
|
| }
|
|
|
| void SessionLengthLimiterTest::SaveSessionStopTime() {
|
| - session_stop_time_ = runner_->GetCurrentMockTime();
|
| + session_stop_time_ = runner_->GetCurrentTime();
|
| }
|
|
|
| void SessionLengthLimiterTest::CreateSessionLengthLimiter(
|
| bool browser_restarted) {
|
| user_activity_seen_ = false;
|
| - session_start_time_ = runner_->GetCurrentMockTime();
|
| + session_start_time_ = runner_->GetCurrentTime();
|
|
|
| EXPECT_FALSE(delegate_);
|
| delegate_ = new NiceMock<MockSessionLengthLimiterDelegate>;
|
| ON_CALL(*delegate_, GetCurrentTime())
|
| - .WillByDefault(Invoke(
|
| - runner_.get(), &base::TestMockTimeTaskRunner::GetCurrentMockTime));
|
| + .WillByDefault(Invoke(runner_.get(),
|
| + &MockTimeSingleThreadTaskRunner::GetCurrentTime));
|
| EXPECT_CALL(*delegate_, StopSession()).Times(0);
|
| session_length_limiter_.reset(
|
| new SessionLengthLimiter(delegate_, browser_restarted));
|
| @@ -285,7 +387,7 @@
|
| // Pref indicating user activity not set. Session start time in the future.
|
| ClearSessionUserActivitySeenPref();
|
| SetSessionStartTimePref(
|
| - runner_->GetCurrentMockTime() + base::TimeDelta::FromHours(2));
|
| + runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
|
| CreateSessionLengthLimiter(false);
|
| EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
|
| EXPECT_FALSE(IsSessionStartTimePrefSet());
|
| @@ -294,7 +396,7 @@
|
| // Pref indicating user activity set. Session start time in the future.
|
| SetSessionUserActivitySeenPref(true);
|
| SetSessionStartTimePref(
|
| - runner_->GetCurrentMockTime() + base::TimeDelta::FromHours(2));
|
| + runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
|
| CreateSessionLengthLimiter(false);
|
| EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
|
| EXPECT_FALSE(IsSessionStartTimePrefSet());
|
| @@ -303,7 +405,7 @@
|
| // Pref indicating user activity not set. Session start time valid.
|
| ClearSessionUserActivitySeenPref();
|
| SetSessionStartTimePref(
|
| - runner_->GetCurrentMockTime() - base::TimeDelta::FromHours(2));
|
| + runner_->GetCurrentTime() - base::TimeDelta::FromHours(2));
|
| CreateSessionLengthLimiter(false);
|
| EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
|
| EXPECT_FALSE(IsSessionStartTimePrefSet());
|
| @@ -312,7 +414,7 @@
|
| // Pref indicating user activity set. Session start time valid.
|
| SetSessionUserActivitySeenPref(true);
|
| SetSessionStartTimePref(
|
| - runner_->GetCurrentMockTime() - base::TimeDelta::FromHours(2));
|
| + runner_->GetCurrentTime() - base::TimeDelta::FromHours(2));
|
| CreateSessionLengthLimiter(false);
|
| EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
|
| EXPECT_FALSE(IsSessionStartTimePrefSet());
|
| @@ -345,7 +447,7 @@
|
| // Pref indicating user activity not set. Session start time in the future.
|
| ClearSessionUserActivitySeenPref();
|
| SetSessionStartTimePref(
|
| - runner_->GetCurrentMockTime() + base::TimeDelta::FromHours(2));
|
| + runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
|
| CreateSessionLengthLimiter(true);
|
| EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
|
| EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
|
| @@ -354,14 +456,14 @@
|
| // Pref indicating user activity set. Session start time in the future.
|
| SetSessionUserActivitySeenPref(true);
|
| SetSessionStartTimePref(
|
| - runner_->GetCurrentMockTime() + base::TimeDelta::FromHours(2));
|
| + runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
|
| CreateSessionLengthLimiter(true);
|
| EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
|
| EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
|
| DestroySessionLengthLimiter();
|
|
|
| const base::TimeTicks stored_session_start_time =
|
| - runner_->GetCurrentMockTime() - base::TimeDelta::FromHours(2);
|
| + runner_->GetCurrentTime() - base::TimeDelta::FromHours(2);
|
|
|
| // Pref indicating user activity not set. Session start time valid.
|
| ClearSessionUserActivitySeenPref();
|
| @@ -409,7 +511,7 @@
|
| // Pref indicating user activity not set. Session start time in the future.
|
| ClearSessionUserActivitySeenPref();
|
| SetSessionStartTimePref(
|
| - runner_->GetCurrentMockTime() + base::TimeDelta::FromHours(2));
|
| + runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
|
| CreateSessionLengthLimiter(true);
|
| EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
|
| EXPECT_FALSE(IsSessionStartTimePrefSet());
|
| @@ -418,14 +520,14 @@
|
| // Pref indicating user activity set. Session start time in the future.
|
| SetSessionUserActivitySeenPref(true);
|
| SetSessionStartTimePref(
|
| - runner_->GetCurrentMockTime() + base::TimeDelta::FromHours(2));
|
| + runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
|
| CreateSessionLengthLimiter(true);
|
| EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
|
| EXPECT_FALSE(IsSessionStartTimePrefSet());
|
| DestroySessionLengthLimiter();
|
|
|
| const base::TimeTicks stored_session_start_time =
|
| - runner_->GetCurrentMockTime() - base::TimeDelta::FromHours(2);
|
| + runner_->GetCurrentTime() - base::TimeDelta::FromHours(2);
|
|
|
| // Pref indicating user activity not set. Session start time valid.
|
| ClearSessionUserActivitySeenPref();
|
|
|