automatic_reboot_manager_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 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/system/automatic_reboot_manager.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <utility>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/test_shell_delegate.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/message_loop.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/single_thread_task_runner.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/simple_test_tick_clock.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/thread_task_runner_handle.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/time/tick_clock.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/mock_user_manager.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/mock_power_manager_client.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/mock_update_engine_client.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_details.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_source.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_browser_thread.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AnyNumber;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Mock;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::ReturnPointee;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::_;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace system {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SingleThreadTaskRunner that mocks the current time and allows it to be
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fast-forwarded. The current time in ticks is returned by Now(). The
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// corresponding device uptime is written to |uptime_file_|, providing a mock
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for /proc/uptime.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockTimeSingleThreadTaskRunner : public base::SingleThreadTaskRunner {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockTimeSingleThreadTaskRunner();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // base::SingleThreadTaskRunner:
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool RunsTasksOnCurrentThread() const OVERRIDE;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const base::Closure& task,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::TimeDelta delay) OVERRIDE;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PostNonNestableDelayedTask(
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const tracked_objects::Location& from_here,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Closure& task,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta delay) OVERRIDE;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUptimeFile(const base::FilePath& uptime_file);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUptime(const base::TimeDelta& uptime);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta& Uptime() const;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeTicks& Now() const;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FastForwardBy(const base::TimeDelta& delta);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FastForwardUntilNoTasksRemain();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunUntilIdle();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Strict weak temporal ordering of tasks.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class TemporalOrder {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool operator()(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::pair<base::TimeTicks, base::Closure>& first_task,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::pair<base::TimeTicks, base::Closure>& second_task) const;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockTimeSingleThreadTaskRunner();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath uptime_file_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta uptime_;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks now_;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::priority_queue<std::pair<base::TimeTicks, base::Closure>,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      std::vector<std::pair<base::TimeTicks, base::Closure> >,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      TemporalOrder> tasks_;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTimeSingleThreadTaskRunner);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockTimeTickClock : public base::TickClock {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit MockTimeTickClock(
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockTimeTickClock();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // base::TickClock:
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual base::TimeTicks NowTicks() OVERRIDE;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner_;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTimeTickClock);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AutomaticRebootManagerBasicTest : public testing::Test {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::OneShotTimer<AutomaticRebootManager> Timer;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutomaticRebootManagerBasicTest();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AutomaticRebootManagerBasicTest();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // testing::Test:
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUpdateRebootNeededUptime(const base::TimeDelta& uptime);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetRebootAfterUpdate(bool reboot_after_update, bool expect_reboot);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUptimeLimit(const base::TimeDelta& limit, bool expect_reboot);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void NotifyUpdateRebootNeeded();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void NotifyResumed(bool expect_reboot);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FastForwardBy(const base::TimeDelta& delta, bool expect_reboot);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FastForwardUntilNoTasksRemain(bool expect_reboot);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateAutomaticRebootManager(bool expect_reboot);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ReadUpdateRebootNeededUptimeFromFile(base::TimeDelta* uptime);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyLoginScreenIdleTimerIsStopped() const;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyNoGracePeriod() const;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyGracePeriod(const base::TimeDelta& start_uptime) const;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_user_logged_in_;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateEngineClient::Status update_engine_client_status_;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The uptime is read in the blocking thread pool and then processed on the
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // UI thread. This causes the UI thread to start processing the uptime when it
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // has increased by a small offset already. The offset is calculated and
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // stored in |uptime_processing_delay_| so that tests can accurately determine
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the uptime seen by the UI thread.
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta uptime_processing_delay_;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta update_reboot_needed_uptime_;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta uptime_limit_;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner_;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AutomaticRebootManager> automatic_reboot_manager_;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyTimerIsStopped(const Timer* timer) const;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyTimerIsRunning(const Timer* timer,
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const base::TimeDelta& delay) const;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyLoginScreenIdleTimerIsRunning() const;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyAndResetPowerManagerExpectations();
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath update_reboot_needed_uptime_file_;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reboot_after_update_;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadTaskRunnerHandle ui_thread_task_runner_handle_;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPowerManagerClient* power_manager_client_;  // Not owned.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockUpdateEngineClient* update_engine_client_;  // Not owned.
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple local_state_;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedMockUserManagerEnabler scoped_mock_user_manager_enabler_;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class runs each test case twice, once with and once without a logged-in
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// user.
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AutomaticRebootManagerTest : public AutomaticRebootManagerBasicTest,
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   public testing::WithParamInterface<bool> {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutomaticRebootManagerTest();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AutomaticRebootManagerTest();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SaveUptimeToFile(const base::FilePath& path,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const base::TimeDelta& uptime) {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (path.empty() || uptime == base::TimeDelta())
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string uptime_seconds = base::DoubleToString(uptime.InSecondsF());
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(static_cast<int>(uptime_seconds.size()),
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file_util::WriteFile(path,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 uptime_seconds.c_str(),
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 uptime_seconds.size()));
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeSingleThreadTaskRunner::MockTimeSingleThreadTaskRunner() {
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::RunsTasksOnCurrentThread() const {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::PostDelayedTask(
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& task,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta delay) {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tasks_.push(std::pair<base::TimeTicks, base::Closure>(now_ + delay, task));
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::PostNonNestableDelayedTask(
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& task,
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta delay) {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::SetUptimeFile(
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& uptime_file) {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_file_ = uptime_file;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(uptime_file_, uptime_);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::SetUptime(const base::TimeDelta& uptime) {
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_ = uptime;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(uptime_file_, uptime_);
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::TimeDelta& MockTimeSingleThreadTaskRunner::Uptime() const {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return uptime_;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::TimeTicks& MockTimeSingleThreadTaskRunner::Now() const {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return now_;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::FastForwardBy(
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delta) {
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeTicks latest = now_ + delta;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool* blocking_pool =
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::GetBlockingPool();
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocking_pool->FlushForTesting();
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty() && tasks_.top().first <= latest) {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uptime_ += tasks_.top().first - now_;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SaveUptimeToFile(uptime_file_, uptime_);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    now_ = tasks_.top().first;
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    blocking_pool->FlushForTesting();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_ += latest - now_;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(uptime_file_, uptime_);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  now_ = latest;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::FastForwardUntilNoTasksRemain() {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool* blocking_pool =
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::GetBlockingPool();
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocking_pool->FlushForTesting();
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty()) {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uptime_ += tasks_.top().first - now_;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SaveUptimeToFile(uptime_file_, uptime_);
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    now_ = tasks_.top().first;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    blocking_pool->FlushForTesting();
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::RunUntilIdle() {
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool* blocking_pool =
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::GetBlockingPool();
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocking_pool->FlushForTesting();
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty() && tasks_.top().first <= now_) {
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    blocking_pool->FlushForTesting();
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::TemporalOrder::operator()(
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::pair<base::TimeTicks, base::Closure>& first_task,
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::pair<base::TimeTicks, base::Closure>& second_task) const {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return first_task.first >= second_task.first;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeSingleThreadTaskRunner::~MockTimeSingleThreadTaskRunner() {
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeTickClock::MockTimeTickClock(
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner)
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : task_runner_(task_runner) {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeTickClock::~MockTimeTickClock() {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeTicks MockTimeTickClock::NowTicks() {
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return task_runner_->Now();
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerBasicTest::AutomaticRebootManagerBasicTest()
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : is_user_logged_in_(false),
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      task_runner_(new MockTimeSingleThreadTaskRunner),
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reboot_after_update_(false),
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui_thread_task_runner_handle_(task_runner_),
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      power_manager_client_(NULL),
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      update_engine_client_(NULL) {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerBasicTest::~AutomaticRebootManagerBasicTest() {
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUp() {
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& temp_dir = temp_dir_.path();
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath uptime_file = temp_dir.Append("uptime");
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptimeFile(uptime_file);
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(file_util::WriteFile(uptime_file, NULL, 0));
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_reboot_needed_uptime_file_ =
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      temp_dir.Append("update_reboot_needed_uptime");
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(file_util::WriteFile(
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      update_reboot_needed_uptime_file_, NULL, 0));
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(PathService::Override(chrome::FILE_UPTIME, uptime_file));
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(PathService::Override(chrome::FILE_UPDATE_REBOOT_NEEDED_UPTIME,
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    update_reboot_needed_uptime_file_));
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutomaticRebootManager::RegisterPrefs(local_state_.registry());
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDBusThreadManager* dbus_manager = new MockDBusThreadManager;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DBusThreadManager::InitializeForTesting(dbus_manager);
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  power_manager_client_ = dbus_manager->mock_power_manager_client();
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_ = dbus_manager->mock_update_engine_client();
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*scoped_mock_user_manager_enabler_.user_manager(),
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              IsUserLoggedIn())
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     .WillRepeatedly(ReturnPointee(&is_user_logged_in_));
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*update_engine_client_, GetLastStatus())
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(ReturnPointee(&update_engine_client_status_));
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::TearDown() {
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyAndResetPowerManagerExpectations();
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Let the AutomaticRebootManager, if any, unregister itself as an observer of
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // several subsystems.
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_.reset();
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DBusThreadManager::Shutdown();
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetLocalState(NULL);
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUpdateRebootNeededUptime(
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& uptime) {
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_reboot_needed_uptime_ = uptime;
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(update_reboot_needed_uptime_file_, uptime);
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetRebootAfterUpdate(
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool reboot_after_update,
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, RequestRestart()).Times(expect_reboot);
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reboot_after_update_ = reboot_after_update;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_state_.SetManagedPref(
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kRebootAfterUpdate,
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Value::CreateBooleanValue(reboot_after_update));
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyAndResetPowerManagerExpectations();
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUptimeLimit(
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& limit,
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, RequestRestart()).Times(expect_reboot);
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_limit_ = limit;
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (limit == base::TimeDelta()) {
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_state_.RemoveManagedPref(prefs::kUptimeLimit);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_state_.SetManagedPref(
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs::kUptimeLimit,
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Value::CreateIntegerValue(limit.InSeconds()));
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyAndResetPowerManagerExpectations();
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyUpdateRebootNeeded() {
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, RequestRestart()).Times(0);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->UpdateStatusChanged(update_engine_client_status_);
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyAndResetPowerManagerExpectations();
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyResumed(bool expect_reboot) {
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, RequestRestart()).Times(expect_reboot);
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->SystemResumed(base::TimeDelta::FromHours(1));
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyAndResetPowerManagerExpectations();
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::FastForwardBy(
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delta,
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, RequestRestart()).Times(expect_reboot);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->FastForwardBy(delta);
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyAndResetPowerManagerExpectations();
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::FastForwardUntilNoTasksRemain(
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, RequestRestart()).Times(expect_reboot);
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->FastForwardUntilNoTasksRemain();
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyAndResetPowerManagerExpectations();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::CreateAutomaticRebootManager(
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, RequestRestart()).Times(expect_reboot);
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_.reset(new AutomaticRebootManager(
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<base::TickClock>(new MockTimeTickClock(task_runner_))));
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyAndResetPowerManagerExpectations();
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_processing_delay_ =
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeTicks() - automatic_reboot_manager_->boot_time_ -
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      task_runner_->Uptime();
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(uptime_processing_delay_, base::TimeDelta());
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(uptime_processing_delay_, base::TimeDelta::FromSeconds(1));
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_user_logged_in_ || expect_reboot)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsStopped();
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsRunning();
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutomaticRebootManagerBasicTest::ReadUpdateRebootNeededUptimeFromFile(
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta* uptime) {
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string contents;
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!file_util::ReadFileToString(update_reboot_needed_uptime_file_,
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   &contents)) {
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double seconds;
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!base::StringToDouble(contents.substr(0, contents.find(' ')), &seconds) ||
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      seconds < 0.0) {
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *uptime = base::TimeDelta::FromMilliseconds(seconds * 1000.0);
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsStopped() const {
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      automatic_reboot_manager_->login_screen_idle_timer_.get());
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyNoGracePeriod() const {
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(automatic_reboot_manager_->reboot_requested_);
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(automatic_reboot_manager_->grace_start_timer_.get());
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(automatic_reboot_manager_->grace_end_timer_.get());
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyGracePeriod(
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& start_uptime) const {
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta start =
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start_uptime - task_runner_->Uptime() - uptime_processing_delay_;
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta end = start + base::TimeDelta::FromHours(24);
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (start <= base::TimeDelta()) {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(automatic_reboot_manager_->reboot_requested_);
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsStopped(automatic_reboot_manager_->grace_start_timer_.get());
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_end_timer_.get(),
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         end);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(automatic_reboot_manager_->reboot_requested_);
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_start_timer_.get(),
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         start);
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_end_timer_.get(),
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         end);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyTimerIsStopped(
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Timer* timer) const {
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (timer)
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(timer->IsRunning());
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyTimerIsRunning(
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Timer* timer,
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delay) const {
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(timer);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(timer->IsRunning());
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(delay.ToInternalValue(),
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            timer->GetCurrentDelay().ToInternalValue());
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsRunning() const {
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsRunning(
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      automatic_reboot_manager_->login_screen_idle_timer_.get(),
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromSeconds(60));
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyAndResetPowerManagerExpectations() {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(power_manager_client_);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, AddObserver(_)).Times(AnyNumber());
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, RemoveObserver(_)).Times(AnyNumber());
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*power_manager_client_, SetPolicy(_)).Times(AnyNumber());
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerTest::AutomaticRebootManagerTest() {
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = GetParam();
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerTest::~AutomaticRebootManagerTest() {
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is showing the login screen. The current uptime is 12 hours.
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the idle timer is running. Further verifies that when a user
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// logs in, the idle timer is stopped.
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, LoginStopsIdleTimer) {
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // idle timer is started.
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that a user has logged in.
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->Observe(
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::NOTIFICATION_LOGIN_USER_CHANGED,
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::NoDetails());
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the login screen idle timer is stopped.
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLoginScreenIdleTimerIsStopped();
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot eventually.
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is showing the login screen. The uptime limit is 6 hours. The current
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours.
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that user activity prevents the device from rebooting. Further
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies that when user activity ceases, the devices reboots.
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, UserActivityResetsIdleTimer) {
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // idle timer is started.
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 25 minutes while simulating user activity every
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 50 seconds.
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 30; ++i) {
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Fast forward uptime by 50 seconds. Verify that the device does not reboot
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // immediately.
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FastForwardBy(base::TimeDelta::FromSeconds(50), false);
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Simulate user activity.
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    automatic_reboot_manager_->OnUserActivity();
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 60 seconds without simulating user activity.
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots immediately.
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(60), true);
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running a user session. The current uptime is 10 days.
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// immediately reboot.
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeNoPolicy) {
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(false);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot eventually.
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running a user session. The uptime limit is 24 hours. The current
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours.
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// immediately reboot.
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeBeforeGracePeriod) {
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(false);
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running a user session. The uptime limit is 6 hours. The current
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours.
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it immediately
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboots.
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeInGracePeriod) {
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device reboots immediately.
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(true);
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running a user session. The uptime limit is 6 hours. The current
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 29 hours 30 minutes.
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it immediately
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboots.
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeAfterGracePeriod) {
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromMinutes(30));
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device reboots immediately.
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(true);
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 24 hours, no reboot occurs and
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a grace period is scheduled to begin after 24 hours of uptime.
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, BeforeUptimeLimitGracePeriod) {
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 6 hours, a reboot is requested
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a grace period is started that will end after 6 + 24 hours of uptime.
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, InUptimeLimitGracePeriod) {
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 10 days.
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 6 hours, the device reboots
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// immediately because the grace period ended after 6 + 24 hours of uptime.
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, AfterUptimeLimitGracePeriod) {
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device reboots immediately.
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), true);
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours.
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is removed.
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffBeforeGracePeriod) {
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 1 hour. Verify that the device does not reboot
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromHours(1), false);
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 24 hours.
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is removed.
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffInGracePeriod) {
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(24));
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours.
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is extended to 24 hours, the grace period
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to start further in the future.
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ExtendUptimeLimitBeforeGracePeriod) {
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extend the uptime limit. Verify that the device does not reboot
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start further in the
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // future.
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 18 hours.
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is extended to 24 hours, the grace period
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to start in the future.
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ExtendUptimeLimitInGracePeriod) {
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(18));
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extend the uptime limit. Verify that the device does not reboot
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start in the future.
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 18 hours. The current uptime is
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 6 hours, the grace period
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to have already started.
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitBeforeToInGracePeriod) {
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(18), false);
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorten the uptime limit. Verify that the device does not reboot
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled and has started already.
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 36 hours.
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 18 hours, the grace
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// period is rescheduled to have started earlier.
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitInToInGracePeriod) {
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(36));
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorten the uptime limit. Verify that the device does not reboot
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(18), false);
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to have started earlier.
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 36 hours.
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 6 hours, the device
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboots immediately because the grace period ended after 6 + 24 hours of
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime.
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitInToAfterGracePeriod) {
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(36));
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorten the uptime limit. Verify that the device reboots immediately.
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), true);
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an update is applied, the current uptime is persisted as
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the time at which a reboot became necessary. Further verifies that when the
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// policy to automatically reboot after an update is not enabled, no reboot
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// occurs and no grace period is scheduled.
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateNoPolicy) {
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an update is applied, the current uptime is persisted as
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the time at which a reboot became necessary. Further verifies that when the
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// policy to automatically reboot after an update is enabled, a reboot is
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// requested and a grace period is started that will end 24 hours from now.
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, Update) {
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when Chrome is notified twice that an update has been applied,
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the second notification is ignored and the uptime at which it occured does
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not get persisted as the time at which an update became necessary.
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateAfterUpdate) {
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the previously persisted time at which a reboot became
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary has not been overwritten.
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta new_update_reboot_needed_uptime;
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &new_update_reboot_needed_uptime));
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(update_reboot_needed_uptime_, new_update_reboot_needed_uptime);
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 10 minutes.
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs a grace period is scheduled to begin after the
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// minimum of 1 hour of uptime. Further verifies that when an update is applied,
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the current uptime is persisted as the time at which a reboot became
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary.
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateBeforeMinimumUptime) {
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromMinutes(10));
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to begin in the future.
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(1));
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyAfterUpdateInGracePeriod) {
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime to 12 hours. Verify that the device does not reboot
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromHours(6), false);
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate user activity.
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->OnUserActivity();
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic reboot after an update has been applied. Verify that the
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(6) + uptime_processing_delay_);
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, the device reboots immediately because the grace period ended after
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 + 24 hours of uptime.
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyAfterUpdateAfterGracePeriod) {
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime to 12 hours. Verify that the device does not reboot
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromDays(10) - base::TimeDelta::FromHours(6),
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                false);
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate user activity.
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->OnUserActivity();
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic rebooting after an update has been applied. Verify that
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the device reboots immediately.
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, true);
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The policy to
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// automatically reboot after an update is enabled. The current uptime is
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours 20 seconds.
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// disabled, the reboot request and grace period are removed.
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyOffAfterUpdate) {
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(task_runner_->Uptime() + uptime_processing_delay_);
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic rebooting after an update has been applied. Verify that
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the device does not reboot immediately.
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is not available.
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that even if an uptime limit is set, the policy to automatically
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is enabled and an update has been applied, no reboot
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// occurs and no grace period is scheduled. Further verifies that no time is
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// persisted as the time at which a reboot became necessary.
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, NoUptime) {
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic rebooting after an update has been applied. Verify that
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the device does not reboot immediately.
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no time is persisted as the time at which a reboot became
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary.
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ReadUpdateRebootNeededUptimeFromFile(
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The policy to automatically reboot after an update is
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled. The current uptime is 12 hours.
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an uptime limit of 6 hours is set, the availability of an
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// update does not cause the grace period to be rescheduled. Further verifies
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that the current uptime is persisted as the time at which a reboot became
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary.
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitBeforeUpdate) {
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has not been rescheduled.
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The policy to automatically reboot after an update is
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled. The current uptime is 12 hours.
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an uptime limit of 24 hours is set, the availability of an
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// update causes the grace period to be rescheduled so that it ends 24 hours
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from now. Further verifies that the current uptime is persisted as the time
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// at which a reboot became necessary.
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateBeforeUptimeLimit) {
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start at the time that
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the update became available.
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. An update was applied
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a reboot became necessary to complete the update process after 12 hours.
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The policy to automatically reboot after an update is enabled. The current
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours 20 seconds.
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to reboot after an update is disabled, the
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// grace period is rescheduled to start after 24 hours of uptime. Further
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies that when the uptime limit is removed, the grace period is removed.
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyOffThenUptimeLimitOff) {
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has started.
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been rescheduled to end 24 hours from now.
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic reboot after an update has been applied. Verify that the
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start after 24 hours
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of uptime.
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 6 hours. An update was applied
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a reboot became necessary to complete the update process after 12 hours.
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The policy to automatically reboot after an update is enabled. The current
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours 20 seconds.
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// rescheduled to have started after 12 hours of uptime. Further verifies that
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when the policy to reboot after an update is disabled, the reboot request and
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// grace period are removed.
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffThenPolicyOff) {
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has started.
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to have started after
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 6 hours of uptime.
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been rescheduled to have started after 12
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // hours of uptime.
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic reboot after an update has been applied. Verify that the
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is 6 hours. The current uptime is
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 29 hours 59 minutes 59 seconds.
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the device reboots immediately when the grace period ends after
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 + 24 hours of uptime.
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, GracePeriodEnd) {
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromMinutes(59) +
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromSeconds(59));
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 1 second. Verify that the device reboots
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(1), true);
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The current uptime is 10 days.
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when no automatic reboot policy is enabled, no reboot occurs
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and no grace period is scheduled.
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoPolicy) {
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 24 hours. The current uptime
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is 12 hours.
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that no reboot occurs and a grace period is scheduled to begin after
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 24 hours of uptime.
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartBeforeUptimeLimitGracePeriod) {
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. The current uptime is
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the device reboots immediately because the grace period ended
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartAfterUptimeLimitGracePeriod) {
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots immediately.
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(true);
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. The current uptime is
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that a reboot is requested and a grace period is started that will
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// end after 6 + 24 hours of uptime.
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartInUptimeLimitGracePeriod) {
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, the device reboots immediately because the grace period ended after
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 + 24 hours of uptime.
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartAfterUpdateGracePeriod) {
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots immediately.
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(true);
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartInUpdateGracePeriod) {
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_);
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 10 minutes of uptime. The current uptime is
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 20 minutes.
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and a grace period is scheduled to begin after the
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// minimum of 1 hour of uptime.
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartBeforeUpdateGracePeriod) {
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromMinutes(10));
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromMinutes(20));
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(1));
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is not
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and no grace period is scheduled.
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateNoPolicy) {
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process but the time at which this happened was lost. The
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current uptime is 10 days.
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the current uptime is persisted as the time at which a reboot
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// became necessary. Further verifies that when the policy to automatically
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is enabled, a reboot is requested and a grace period
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is started that will end 24 hours from now.
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateTimeLost) {
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process but the time at which this happened was lost. The
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current uptime is 10 days.
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the current uptime is persisted as the time at which a reboot
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// became necessary. Further verifies that when the policy to automatically
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is not enabled, no reboot occurs and no grace period
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is scheduled.
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateNoPolicyTimeLost) {
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. No update has been applied. The current uptime is
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that no time is persisted as the time at which a reboot became
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary. Further verifies that no reboot occurs and no grace period is
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scheduled.
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoUpdate) {
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no time is persisted as the time at which a reboot became
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary.
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ReadUpdateRebootNeededUptimeFromFile(
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. Also, an update was
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 8 hours of uptime. The current uptime is 12 hours.
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUptimeLimitBeforeUpdate) {
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(8));
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 8 hours. Also, an update was
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours of uptime. The current uptime is 12 hours.
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateBeforeUptimeLimit) {
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(8), false);
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_);
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots eventually.
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. Also, an update was
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours of uptime. The current uptime is not available.
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that even if the policy to automatically reboot after an update is
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and no grace period is scheduled.
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoUptime) {
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_engine_client_status_.status =
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not eventually reboot.
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(AutomaticRebootManagerTestInstance,
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        AutomaticRebootManagerTest,
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        ::testing::Bool());
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace system
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
1758