12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/session_length_limiter.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <queue>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <utility>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/single_thread_task_runner.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/thread_task_runner_handle.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Invoke;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Mock;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::NiceMock;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockSessionLengthLimiterDelegate : public SessionLengthLimiter::Delegate {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_CONST_METHOD0(GetCurrentTime, const base::TimeTicks(void));
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(StopSession, void(void));
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SingleThreadTaskRunner that mocks the current time and allows it to be
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fast-forwarded.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockTimeSingleThreadTaskRunner : public base::SingleThreadTaskRunner {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockTimeSingleThreadTaskRunner();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // base::SingleThreadTaskRunner:
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool RunsTasksOnCurrentThread() const OVERRIDE;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const base::Closure& task,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::TimeDelta delay) OVERRIDE;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PostNonNestableDelayedTask(
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const tracked_objects::Location& from_here,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Closure& task,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta delay) OVERRIDE;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeTicks& GetCurrentTime() const;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void FastForwardBy(const base::TimeDelta& time_delta);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FastForwardUntilNoTasksRemain();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Strict weak temporal ordering of tasks.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class TemporalOrder {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool operator()(
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::pair<base::TimeTicks, base::Closure>& first_task,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::pair<base::TimeTicks, base::Closure>& second_task) const;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockTimeSingleThreadTaskRunner();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks now_;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::priority_queue<std::pair<base::TimeTicks, base::Closure>,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      std::vector<std::pair<base::TimeTicks, base::Closure> >,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      TemporalOrder> tasks_;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SessionLengthLimiterTest : public testing::Test {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionLengthLimiterTest();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // testing::Test:
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SetSessionUserActivitySeenPref(bool user_activity_seen);
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ClearSessionUserActivitySeenPref();
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool IsSessionUserActivitySeenPrefSet();
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool GetSessionUserActivitySeenPref();
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SetSessionStartTimePref(const base::TimeTicks& session_start_time);
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ClearSessionStartTimePref();
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool IsSessionStartTimePrefSet();
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::TimeTicks GetSessionStartTimePref();
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SetSessionLengthLimitPref(const base::TimeDelta& session_length_limit);
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ClearSessionLengthLimitPref();
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SetWaitForInitialUserActivityPref(bool wait_for_initial_user_activity);
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SimulateUserActivity();
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void UpdateSessionStartTimeIfWaitingForUserActivity();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectStopSession();
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SaveSessionStopTime();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Clears the session state by resetting |user_activity_| and
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // |session_start_time_| and creates a new SessionLengthLimiter.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateSessionLengthLimiter(bool browser_restarted);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void DestroySessionLengthLimiter();
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MockTimeSingleThreadTaskRunner> runner_;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks session_start_time_;
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::TimeTicks session_stop_time_;
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestingPrefServiceSimple local_state_;
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool user_activity_seen_;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockSessionLengthLimiterDelegate* delegate_;  // Owned by
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                // session_length_limiter_.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SessionLengthLimiter> session_length_limiter_;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)MockTimeSingleThreadTaskRunner::MockTimeSingleThreadTaskRunner()
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : now_(base::TimeTicks::FromInternalValue(1000)) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::RunsTasksOnCurrentThread() const {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::PostDelayedTask(
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& task,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta delay) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tasks_.push(std::pair<base::TimeTicks, base::Closure>(now_ + delay, task));
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::PostNonNestableDelayedTask(
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& task,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta delay) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::TimeTicks& MockTimeSingleThreadTaskRunner::GetCurrentTime() const {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return now_;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MockTimeSingleThreadTaskRunner::FastForwardBy(
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const base::TimeDelta& time_delta) {
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::TimeTicks latest = now_ + time_delta;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty() && tasks_.top().first <= latest) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    now_ = tasks_.top().first;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  now_ = latest;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::FastForwardUntilNoTasksRemain() {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty()) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    now_ = tasks_.top().first;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::TemporalOrder::operator()(
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::pair<base::TimeTicks, base::Closure>& first_task,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::pair<base::TimeTicks, base::Closure>& second_task) const {
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return first_task.first > second_task.first;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeSingleThreadTaskRunner::~MockTimeSingleThreadTaskRunner() {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SessionLengthLimiterTest::SessionLengthLimiterTest()
1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : user_activity_seen_(false),
1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      delegate_(NULL) {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SessionLengthLimiterTest::SetUp() {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionLengthLimiter::RegisterPrefs(local_state_.registry());
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  runner_ = new MockTimeSingleThreadTaskRunner;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SessionLengthLimiterTest::TearDown() {
2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  session_length_limiter_.reset();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetLocalState(NULL);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SessionLengthLimiterTest::SetSessionUserActivitySeenPref(
2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bool user_activity_seen) {
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  local_state_.SetUserPref(prefs::kSessionUserActivitySeen,
2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           new base::FundamentalValue(user_activity_seen));
2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SessionLengthLimiterTest::ClearSessionUserActivitySeenPref() {
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  local_state_.ClearPref(prefs::kSessionUserActivitySeen);
2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool SessionLengthLimiterTest::IsSessionUserActivitySeenPrefSet() {
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return local_state_.HasPrefPath(prefs::kSessionUserActivitySeen);
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool SessionLengthLimiterTest::GetSessionUserActivitySeenPref() {
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionUserActivitySeenPrefSet());
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return local_state_.GetBoolean(prefs::kSessionUserActivitySeen);
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SessionLengthLimiterTest::SetSessionStartTimePref(
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const base::TimeTicks& session_start_time) {
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  local_state_.SetUserPref(
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      prefs::kSessionStartTime,
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      new base::StringValue(
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          base::Int64ToString(session_start_time.ToInternalValue())));
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SessionLengthLimiterTest::ClearSessionStartTimePref() {
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  local_state_.ClearPref(prefs::kSessionStartTime);
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool SessionLengthLimiterTest::IsSessionStartTimePrefSet() {
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return local_state_.HasPrefPath(prefs::kSessionStartTime);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)base::TimeTicks SessionLengthLimiterTest::GetSessionStartTimePref() {
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionStartTimePrefSet());
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return base::TimeTicks::FromInternalValue(
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      local_state_.GetInt64(prefs::kSessionStartTime));
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SessionLengthLimiterTest::SetSessionLengthLimitPref(
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const base::TimeDelta& session_length_limit) {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_state_.SetUserPref(prefs::kSessionLengthLimit,
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      new base::FundamentalValue(
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          static_cast<int>(session_length_limit.InMilliseconds())));
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  UpdateSessionStartTimeIfWaitingForUserActivity();
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SessionLengthLimiterTest::ClearSessionLengthLimitPref() {
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  local_state_.RemoveUserPref(prefs::kSessionLengthLimit);
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  UpdateSessionStartTimeIfWaitingForUserActivity();
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SessionLengthLimiterTest::SetWaitForInitialUserActivityPref(
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bool wait_for_initial_user_activity) {
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  UpdateSessionStartTimeIfWaitingForUserActivity();
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  local_state_.SetUserPref(
2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      prefs::kSessionWaitForInitialUserActivity,
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      new base::FundamentalValue(wait_for_initial_user_activity));
2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SessionLengthLimiterTest::SimulateUserActivity() {
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (session_length_limiter_)
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    session_length_limiter_->OnUserActivity(NULL);
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  UpdateSessionStartTimeIfWaitingForUserActivity();
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  user_activity_seen_ = true;
2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SessionLengthLimiterTest::
2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    UpdateSessionStartTimeIfWaitingForUserActivity() {
2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!user_activity_seen_ &&
2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      local_state_.GetBoolean(prefs::kSessionWaitForInitialUserActivity)) {
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    session_start_time_ = runner_->GetCurrentTime();
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SessionLengthLimiterTest::ExpectStopSession() {
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(delegate_);
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*delegate_, StopSession())
2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      .Times(1)
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      .WillOnce(Invoke(this, &SessionLengthLimiterTest::SaveSessionStopTime));
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SessionLengthLimiterTest::SaveSessionStopTime() {
2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  session_stop_time_ = runner_->GetCurrentTime();
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SessionLengthLimiterTest::CreateSessionLengthLimiter(
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool browser_restarted) {
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  user_activity_seen_ = false;
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  session_start_time_ = runner_->GetCurrentTime();
2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(delegate_);
2981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  delegate_ = new NiceMock<MockSessionLengthLimiterDelegate>;
2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ON_CALL(*delegate_, GetCurrentTime())
3001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      .WillByDefault(Invoke(runner_.get(),
3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                            &MockTimeSingleThreadTaskRunner::GetCurrentTime));
3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(*delegate_, StopSession()).Times(0);
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  session_length_limiter_.reset(
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new SessionLengthLimiter(delegate_, browser_restarted));
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SessionLengthLimiterTest::DestroySessionLengthLimiter() {
3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  session_length_limiter_.reset();
3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  delegate_ = NULL;
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies that when not instructed to wait for initial user activity, the
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// session start time is set and the pref indicating user activity is cleared
3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// in local state during login.
3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, StartDoNotWaitForInitialUserActivity) {
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time not set.
3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionStartTimePref();
3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
3211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time not set.
3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
3261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionStartTimePref();
3271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
3281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
3291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
3301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
3311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time in the future.
3331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
3341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(session_start_time_ + base::TimeDelta::FromHours(2));
3351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
3361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
3371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
3381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
3391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time in the future.
3411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
3421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(session_start_time_ + base::TimeDelta::FromHours(2));
3431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
3441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
3451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
3461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
3471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time valid.
3491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
3501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(session_start_time_ - base::TimeDelta::FromHours(2));
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(false);
3521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
3531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
3541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
3551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time valid.
3571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
3581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(session_start_time_ - base::TimeDelta::FromHours(2));
3591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
3601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
3611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies that when instructed to wait for initial user activity, the session
3661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// start time and the pref indicating user activity are cleared in local state
3671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// during login.
3681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, StartWaitForInitialUserActivity) {
3691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   SetWaitForInitialUserActivityPref(true);
3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time not set.
3721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionStartTimePref();
3741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
3751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
3781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time not set.
3801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
3811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionStartTimePref();
3821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
3831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
3841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time in the future.
3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetSessionStartTimePref(
3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(false);
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time in the future.
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetSessionStartTimePref(
3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(false);
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time valid.
4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(
4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() - base::TimeDelta::FromHours(2));
4091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
4101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time valid.
4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(
4171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() - base::TimeDelta::FromHours(2));
4181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
4211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies that when not instructed to wait for initial user activity, local
4251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// state is correctly updated during restart after a crash:
4261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// * If no valid session start time is found in local state, the session start
4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//   time is set and the pref indicating user activity is cleared.
4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// * If a valid session start time is found in local state, the session start
4291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//   time and the pref indicating user activity are *not* modified.
4301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, RestartDoNotWaitForInitialUserActivity) {
4311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time not set.
4321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
4331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionStartTimePref();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(true);
4351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
4361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
4371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time not set.
4401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
4411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionStartTimePref();
4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(true);
4431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
4441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time in the future.
4481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
4491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(
4501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
4511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(true);
4521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
4531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
4541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time in the future.
4571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetSessionStartTimePref(
4591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
4601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(true);
4611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
4621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
4631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
4641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::TimeTicks stored_session_start_time =
4661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() - base::TimeDelta::FromHours(2);
4671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time valid.
4691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
4701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(stored_session_start_time);
4711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(true);
4721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
4731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(stored_session_start_time, GetSessionStartTimePref());
4741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
4751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time valid.
4771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
4781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(stored_session_start_time);
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(true);
4801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionUserActivitySeenPrefSet());
4811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(GetSessionUserActivitySeenPref());
4821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(stored_session_start_time, GetSessionStartTimePref());
4831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies that when instructed to wait for initial user activity, local state
4871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// is correctly updated during restart after a crash:
4881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// * If no valid session start time is found in local state, the session start
4891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//   time and the pref indicating user activity are cleared.
4901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// * If a valid session start time is found in local state, the session start
4911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//   time and the pref indicating user activity are *not* modified.
4921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, RestartWaitForInitialUserActivity) {
4931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetWaitForInitialUserActivityPref(true);
4941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time not set.
4961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
4971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionStartTimePref();
4981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(true);
4991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
5001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
5011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
5021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time not set.
5041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionStartTimePref();
5061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(true);
5071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
5081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
5091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
5101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time in the future.
5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
5131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(
5141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(true);
5161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
5171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
5181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time in the future.
5211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
5221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(
5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() + base::TimeDelta::FromHours(2));
5241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(true);
5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::TimeTicks stored_session_start_time =
5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      runner_->GetCurrentTime() - base::TimeDelta::FromHours(2);
5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity not set. Session start time valid.
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionUserActivitySeenPref();
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(stored_session_start_time);
5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(true);
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(stored_session_start_time, GetSessionStartTimePref());
5381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
5391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Pref indicating user activity set. Session start time valid.
5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionUserActivitySeenPref(true);
5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionStartTimePref(stored_session_start_time);
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(true);
5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionUserActivitySeenPrefSet());
5451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(GetSessionUserActivitySeenPref());
5461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(stored_session_start_time, GetSessionStartTimePref());
5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DestroySessionLengthLimiter();
5481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies that local state is correctly updated when waiting for initial user
5511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// activity is toggled and no user activity has occurred yet.
5521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, ToggleWaitForInitialUserActivity) {
5531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
5541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity was not set and the session
5561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // start time was set.
5571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
5581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
5591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Enable waiting for initial user activity.
5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(1));
5621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetWaitForInitialUserActivityPref(true);
5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the session start time was cleared and the pref indicating user
5651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // activity was not set.
5661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Disable waiting for initial user activity.
5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(1));
5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetWaitForInitialUserActivityPref(false);
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity was not set and the session
5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // start time was.
5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies that local state is correctly updated when instructed not to wait
5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// for initial user activity and user activity occurs. Also verifies that once
5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// initial user activity has occurred, neither the session start time nor the
5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// pref indicating user activity change in local state anymore.
5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, UserActivityWhileNotWaiting) {
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity was not set and the session
5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // start time was set.
5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
5901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Simulate user activity.
5921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(1));
5931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SimulateUserActivity();
5941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity and the session start time
5961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // were set.
5971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionUserActivitySeenPrefSet());
5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(GetSessionUserActivitySeenPref());
5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
6001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Simulate user activity.
6021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(1));
6031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SimulateUserActivity();
6041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity and the session start time
6061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // were not changed.
6071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionUserActivitySeenPrefSet());
6081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(GetSessionUserActivitySeenPref());
6091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
6101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Enable waiting for initial user activity.
6121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(1));
6131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetWaitForInitialUserActivityPref(true);
6141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity and the session start time
6161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // were not changed.
6171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionUserActivitySeenPrefSet());
6181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(GetSessionUserActivitySeenPref());
6191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
6201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
6211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies that local state is correctly updated when instructed to wait for
6231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// initial user activity and user activity occurs. Also verifies that once
6241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// initial user activity has occurred, neither the session start time nor the
6251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// pref indicating user activity change in local state anymore.
6261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, UserActivityWhileWaiting) {
6271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetWaitForInitialUserActivityPref(true);
6281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
6301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity and the session start time
6321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // were not set.
6331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionUserActivitySeenPrefSet());
6341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
6351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Simulate user activity.
6371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(1));
6381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SimulateUserActivity();
6391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity and the session start time
6411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // were set.
6421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionUserActivitySeenPrefSet());
6431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(GetSessionUserActivitySeenPref());
6441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
6451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Simulate user activity.
6471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(1));
6481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SimulateUserActivity();
6491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity and the session start time
6511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // were not changed.
6521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionUserActivitySeenPrefSet());
6531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(GetSessionUserActivitySeenPref());
6541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
6551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Disable waiting for initial user activity.
6571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(1));
6581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetWaitForInitialUserActivityPref(false);
6591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the pref indicating user activity and the session start time
6611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // were not changed.
6621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsSessionUserActivitySeenPrefSet());
6631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(GetSessionUserActivitySeenPref());
6641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates a SessionLengthLimiter without setting a limit. Verifies that the
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// limiter does not start a timer.
6691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, RunWithoutLimit) {
6701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::ThreadTaskRunnerHandle runner_handler(runner_);
6711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
6731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that no timer fires to terminate the session.
6751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardUntilNoTasksRemain();
6761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
6771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Creates a SessionLengthLimiter after setting a limit and instructs it not to
6791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// wait for user activity. Verifies that the limiter starts a timer even if no
6801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// user activity occurs and that when the session length reaches the limit, the
6811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// session is terminated.
6821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, RunWithoutUserActivityWhileNotWaiting) {
6831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::ThreadTaskRunnerHandle runner_handler(runner_);
6841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set a 60 second session time limit.
6861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionLengthLimitPref(base::TimeDelta::FromSeconds(60));
6871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
6891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
6901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the timer fires and the session is terminated when the session
6921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // length limit is reached.
6931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExpectStopSession();
6941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardUntilNoTasksRemain();
6951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_ + base::TimeDelta::FromSeconds(60),
6961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            session_stop_time_);
6971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
6981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Creates a SessionLengthLimiter after setting a limit and instructs it to wait
7001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// for initial user activity. Verifies that if no user activity occurs, the
7011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// limiter does not start a timer.
7021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, RunWithoutUserActivityWhileWaiting) {
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadTaskRunnerHandle runner_handler(runner_);
7041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetWaitForInitialUserActivityPref(true);
7051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set a 60 second session time limit.
7071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionLengthLimitPref(base::TimeDelta::FromSeconds(60));
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(false);
7101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no timer fires to terminate the session.
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  runner_->FastForwardUntilNoTasksRemain();
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Creates a SessionLengthLimiter after setting a limit and instructs it not to
7171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// wait for user activity. Verifies that the limiter starts a timer and that
7181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// when the session length reaches the limit, the session is terminated. Also
7191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// verifies that user activity does not affect the timer.
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, RunWithUserActivityWhileNotWaiting) {
7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::ThreadTaskRunnerHandle runner_handler(runner_);
7221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set a 60 second session time limit.
7241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionLengthLimitPref(base::TimeDelta::FromSeconds(60));
7251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CreateSessionLengthLimiter(false);
7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Simulate user activity after 20 seconds.
7301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(20));
7311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SimulateUserActivity();
7321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
7331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that the timer fires and the session is terminated when the session
7351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // length limit is reached.
7361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExpectStopSession();
7371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardUntilNoTasksRemain();
7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_ + base::TimeDelta::FromSeconds(60),
7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            session_stop_time_);
7401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
7411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Creates a SessionLengthLimiter after setting a limit and instructs it to wait
7431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// for initial user activity. Verifies that once user activity occurs, the
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// limiter starts a timer and that when the session length reaches the limit,
7451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// the session is terminated. Also verifies that further user activity does not
7461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// affect the timer.
7471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SessionLengthLimiterTest, RunWithUserActivityWhileWaiting) {
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadTaskRunnerHandle runner_handler(runner_);
7491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetWaitForInitialUserActivityPref(true);
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set a 60 second session time limit.
7521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionLengthLimitPref(base::TimeDelta::FromSeconds(60));
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(false);
7551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(IsSessionStartTimePrefSet());
7561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Simulate user activity after 20 seconds.
7581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(20));
7591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SimulateUserActivity();
7601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
7611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Simulate user activity after 20 seconds.
7631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(20));
7641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SimulateUserActivity();
7651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_, GetSessionStartTimePref());
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the timer fires and the session is terminated when the session
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // length limit is reached.
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectStopSession();
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  runner_->FastForwardUntilNoTasksRemain();
7711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_ + base::TimeDelta::FromSeconds(60),
7721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            session_stop_time_);
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates a SessionLengthLimiter after setting a 60 second limit, allows 50
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// seconds of session time to pass, then increases the limit to 90 seconds.
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the session time reaches the new 90 second limit, the
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// session is terminated.
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SessionLengthLimiterTest, RunAndIncreaseSessionLengthLimit) {
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadTaskRunnerHandle runner_handler(runner_);
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set a 60 second session time limit.
7831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionLengthLimitPref(base::TimeDelta::FromSeconds(60));
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(false);
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the time by 50 seconds, verifying that no timer fires to
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // terminate the session.
7891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(50));
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Increase the session length limit to 90 seconds.
7921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionLengthLimitPref(base::TimeDelta::FromSeconds(90));
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the the timer fires and the session is terminated when the
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // session length limit is reached.
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectStopSession();
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  runner_->FastForwardUntilNoTasksRemain();
7981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_ + base::TimeDelta::FromSeconds(90),
7991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            session_stop_time_);
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates a SessionLengthLimiter after setting a 60 second limit, allows 50
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// seconds of session time to pass, then decreases the limit to 40 seconds.
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the limit is decreased to 40 seconds after 50 seconds of
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// session time have passed, the next timer tick causes the session to be
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// terminated.
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SessionLengthLimiterTest, RunAndDecreaseSessionLengthLimit) {
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadTaskRunnerHandle runner_handler(runner_);
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set a 60 second session time limit.
8111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionLengthLimitPref(base::TimeDelta::FromSeconds(60));
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(false);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the time by 50 seconds, verifying that no timer fires to
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // terminate the session.
8171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(50));
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that reducing the session length limit below the 50 seconds that
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // have already elapsed causes the session to be terminated immediately.
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectStopSession();
8221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionLengthLimitPref(base::TimeDelta::FromSeconds(40));
8231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(session_start_time_ + base::TimeDelta::FromSeconds(50),
8241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            session_stop_time_);
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates a SessionLengthLimiter after setting a 60 second limit, allows 50
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// seconds of session time to pass, then removes the limit. Verifies that after
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the limit is removed, the session is not terminated when the session time
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reaches the original 60 second limit.
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SessionLengthLimiterTest, RunAndRemoveSessionLengthLimit) {
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadTaskRunnerHandle runner_handler(runner_);
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set a 60 second session time limit.
8351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetSessionLengthLimitPref(base::TimeDelta::FromSeconds(60));
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSessionLengthLimiter(false);
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the time by 50 seconds, verifying that no timer fires to
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // terminate the session.
8411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  runner_->FastForwardBy(base::TimeDelta::FromSeconds(50));
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the session length limit.
8441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ClearSessionLengthLimitPref();
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no timer fires to terminate the session.
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  runner_->FastForwardUntilNoTasksRemain();
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
851