automatic_reboot_manager_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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"
179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/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"
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/mock_user_manager.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_paths.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
36a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/dbus/fake_power_manager_client.h"
37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/dbus/fake_update_engine_client.h"
38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_details.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_source.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_browser_thread.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::ReturnPointee;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace system {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SingleThreadTaskRunner that mocks the current time and allows it to be
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fast-forwarded. The current time in ticks is returned by Now(). The
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// corresponding device uptime is written to |uptime_file_|, providing a mock
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for /proc/uptime.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockTimeSingleThreadTaskRunner : public base::SingleThreadTaskRunner {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockTimeSingleThreadTaskRunner();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // base::SingleThreadTaskRunner:
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool RunsTasksOnCurrentThread() const OVERRIDE;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const base::Closure& task,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::TimeDelta delay) OVERRIDE;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PostNonNestableDelayedTask(
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const tracked_objects::Location& from_here,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Closure& task,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta delay) OVERRIDE;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUptimeFile(const base::FilePath& uptime_file);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUptime(const base::TimeDelta& uptime);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta& Uptime() const;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeTicks& Now() const;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FastForwardBy(const base::TimeDelta& delta);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FastForwardUntilNoTasksRemain();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunUntilIdle();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Strict weak temporal ordering of tasks.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class TemporalOrder {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool operator()(
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::pair<base::TimeTicks, base::Closure>& first_task,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::pair<base::TimeTicks, base::Closure>& second_task) const;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockTimeSingleThreadTaskRunner();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath uptime_file_;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta uptime_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks now_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::priority_queue<std::pair<base::TimeTicks, base::Closure>,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      std::vector<std::pair<base::TimeTicks, base::Closure> >,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      TemporalOrder> tasks_;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTimeSingleThreadTaskRunner);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockTimeTickClock : public base::TickClock {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit MockTimeTickClock(
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockTimeTickClock();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // base::TickClock:
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual base::TimeTicks NowTicks() OVERRIDE;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner_;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTimeTickClock);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AutomaticRebootManagerBasicTest : public testing::Test {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::OneShotTimer<AutomaticRebootManager> Timer;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutomaticRebootManagerBasicTest();
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AutomaticRebootManagerBasicTest();
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // testing::Test:
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUpdateRebootNeededUptime(const base::TimeDelta& uptime);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetRebootAfterUpdate(bool reboot_after_update, bool expect_reboot);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUptimeLimit(const base::TimeDelta& limit, bool expect_reboot);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void NotifyUpdateRebootNeeded();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void NotifyResumed(bool expect_reboot);
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void NotifyTerminating(bool expect_reboot);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FastForwardBy(const base::TimeDelta& delta, bool expect_reboot);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FastForwardUntilNoTasksRemain(bool expect_reboot);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateAutomaticRebootManager(bool expect_reboot);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ReadUpdateRebootNeededUptimeFromFile(base::TimeDelta* uptime);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyLoginScreenIdleTimerIsStopped() const;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyNoGracePeriod() const;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyGracePeriod(const base::TimeDelta& start_uptime) const;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_user_logged_in_;
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_logged_in_as_kiosk_app_;
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
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)
165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) protected:
166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  FakePowerManagerClient* power_manager_client_;  // Not owned.
167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  FakeUpdateEngineClient* update_engine_client_;  // Not owned.
168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Sets the status of |update_engine_client_| to NEED_REBOOT for tests.
170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void SetUpdateStatusNeedReboot();
171a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyTimerIsStopped(const Timer* timer) const;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyTimerIsRunning(const Timer* timer,
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const base::TimeDelta& delay) const;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyLoginScreenIdleTimerIsRunning() const;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath update_reboot_needed_uptime_file_;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reboot_after_update_;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadTaskRunnerHandle ui_thread_task_runner_handle_;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple local_state_;
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockUserManager* mock_user_manager_;  // Not owned.
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedUserManagerEnabler user_manager_enabler_;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)enum AutomaticRebootManagerTestScenario {
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_LOGIN_SCREEN,
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_KIOSK_APP_SESSION,
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_NON_KIOSK_APP_SESSION,
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This class runs each test case three times:
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// * once while the login screen is being shown
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// * once while a kiosk app session is in progress
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// * once while a non-kiosk-app session is in progress
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class AutomaticRebootManagerTest
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : public AutomaticRebootManagerBasicTest,
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      public testing::WithParamInterface<AutomaticRebootManagerTestScenario> {
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutomaticRebootManagerTest();
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AutomaticRebootManagerTest();
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SaveUptimeToFile(const base::FilePath& path,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const base::TimeDelta& uptime) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (path.empty() || uptime == base::TimeDelta())
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string uptime_seconds = base::DoubleToString(uptime.InSecondsF());
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(static_cast<int>(uptime_seconds.size()),
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file_util::WriteFile(path,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 uptime_seconds.c_str(),
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 uptime_seconds.size()));
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeSingleThreadTaskRunner::MockTimeSingleThreadTaskRunner() {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::RunsTasksOnCurrentThread() const {
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::PostDelayedTask(
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& task,
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta delay) {
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tasks_.push(std::pair<base::TimeTicks, base::Closure>(now_ + delay, task));
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::PostNonNestableDelayedTask(
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& task,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta delay) {
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::SetUptimeFile(
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& uptime_file) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_file_ = uptime_file;
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(uptime_file_, uptime_);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::SetUptime(const base::TimeDelta& uptime) {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_ = uptime;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(uptime_file_, uptime_);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::TimeDelta& MockTimeSingleThreadTaskRunner::Uptime() const {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return uptime_;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::TimeTicks& MockTimeSingleThreadTaskRunner::Now() const {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return now_;
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::FastForwardBy(
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delta) {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeTicks latest = now_ + delta;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool* blocking_pool =
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::GetBlockingPool();
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocking_pool->FlushForTesting();
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty() && tasks_.top().first <= latest) {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uptime_ += tasks_.top().first - now_;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SaveUptimeToFile(uptime_file_, uptime_);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    now_ = tasks_.top().first;
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    blocking_pool->FlushForTesting();
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_ += latest - now_;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(uptime_file_, uptime_);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  now_ = latest;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::FastForwardUntilNoTasksRemain() {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool* blocking_pool =
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::GetBlockingPool();
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocking_pool->FlushForTesting();
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty()) {
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uptime_ += tasks_.top().first - now_;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SaveUptimeToFile(uptime_file_, uptime_);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    now_ = tasks_.top().first;
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)void MockTimeSingleThreadTaskRunner::RunUntilIdle() {
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool* blocking_pool =
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::GetBlockingPool();
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocking_pool->FlushForTesting();
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty() && tasks_.top().first <= now_) {
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    blocking_pool->FlushForTesting();
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::TemporalOrder::operator()(
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::pair<base::TimeTicks, base::Closure>& first_task,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::pair<base::TimeTicks, base::Closure>& second_task) const {
3123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return first_task.first > second_task.first;
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeSingleThreadTaskRunner::~MockTimeSingleThreadTaskRunner() {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeTickClock::MockTimeTickClock(
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : task_runner_(task_runner) {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeTickClock::~MockTimeTickClock() {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeTicks MockTimeTickClock::NowTicks() {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return task_runner_->Now();
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerBasicTest::AutomaticRebootManagerBasicTest()
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : is_user_logged_in_(false),
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_(false),
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      task_runner_(new MockTimeSingleThreadTaskRunner),
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      power_manager_client_(NULL),
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      update_engine_client_(NULL),
336a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reboot_after_update_(false),
337a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ui_thread_task_runner_handle_(task_runner_),
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      mock_user_manager_(new MockUserManager),
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_manager_enabler_(mock_user_manager_) {
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerBasicTest::~AutomaticRebootManagerBasicTest() {
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUp() {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& temp_dir = temp_dir_.path();
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath uptime_file = temp_dir.Append("uptime");
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptimeFile(uptime_file);
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(file_util::WriteFile(uptime_file, NULL, 0));
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_reboot_needed_uptime_file_ =
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      temp_dir.Append("update_reboot_needed_uptime");
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(file_util::WriteFile(
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      update_reboot_needed_uptime_file_, NULL, 0));
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(PathService::Override(chromeos::FILE_UPTIME, uptime_file));
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(PathService::Override(chromeos::FILE_UPDATE_REBOOT_NEEDED_UPTIME,
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    update_reboot_needed_uptime_file_));
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutomaticRebootManager::RegisterPrefs(local_state_.registry());
361a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  MockDBusThreadManagerWithoutGMock* dbus_manager =
362a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      new MockDBusThreadManagerWithoutGMock;
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DBusThreadManager::InitializeForTesting(dbus_manager);
364a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  power_manager_client_ = dbus_manager->fake_power_manager_client();
365a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  update_engine_client_ = dbus_manager->fake_update_engine_client();
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_user_manager_, IsUserLoggedIn())
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     .WillRepeatedly(ReturnPointee(&is_user_logged_in_));
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*mock_user_manager_, IsLoggedInAsKioskApp())
370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     .WillRepeatedly(ReturnPointee(&is_logged_in_as_kiosk_app_));
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::TearDown() {
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Let the AutomaticRebootManager, if any, unregister itself as an observer of
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // several subsystems.
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_.reset();
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DBusThreadManager::Shutdown();
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetLocalState(NULL);
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUpdateRebootNeededUptime(
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& uptime) {
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_reboot_needed_uptime_ = uptime;
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(update_reboot_needed_uptime_file_, uptime);
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetRebootAfterUpdate(
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool reboot_after_update,
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reboot_after_update_ = reboot_after_update;
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_state_.SetManagedPref(
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kRebootAfterUpdate,
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Value::CreateBooleanValue(reboot_after_update));
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
398a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
399a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUptimeLimit(
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& limit,
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_limit_ = limit;
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (limit == base::TimeDelta()) {
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_state_.RemoveManagedPref(prefs::kUptimeLimit);
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_state_.SetManagedPref(
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs::kUptimeLimit,
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Value::CreateIntegerValue(limit.InSeconds()));
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
414a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
415a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyUpdateRebootNeeded() {
419a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
420a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  automatic_reboot_manager_->UpdateStatusChanged(
421a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      update_engine_client_->GetLastStatus());
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(0, power_manager_client_->request_restart_call_count());
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyResumed(bool expect_reboot) {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->SystemResumed(base::TimeDelta::FromHours(1));
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
429a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
430a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyTerminating(bool expect_reboot) {
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  automatic_reboot_manager_->Observe(
435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      chrome::NOTIFICATION_APP_TERMINATING,
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::NotificationService::NoDetails());
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->RunUntilIdle();
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            power_manager_client_->request_restart_call_count());
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::FastForwardBy(
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delta,
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->FastForwardBy(delta);
447a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
448a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::FastForwardUntilNoTasksRemain(
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->FastForwardUntilNoTasksRemain();
454a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
455a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::CreateAutomaticRebootManager(
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_.reset(new AutomaticRebootManager(
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<base::TickClock>(new MockTimeTickClock(task_runner_))));
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
463a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
464a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_processing_delay_ =
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeTicks() - automatic_reboot_manager_->boot_time_ -
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      task_runner_->Uptime();
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(uptime_processing_delay_, base::TimeDelta());
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(uptime_processing_delay_, base::TimeDelta::FromSeconds(1));
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_user_logged_in_ || expect_reboot)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsStopped();
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsRunning();
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutomaticRebootManagerBasicTest::ReadUpdateRebootNeededUptimeFromFile(
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta* uptime) {
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string contents;
48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!base::ReadFileToString(update_reboot_needed_uptime_file_, &contents)) {
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double seconds;
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!base::StringToDouble(contents.substr(0, contents.find(' ')), &seconds) ||
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      seconds < 0.0) {
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *uptime = base::TimeDelta::FromMilliseconds(seconds * 1000.0);
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsStopped() const {
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      automatic_reboot_manager_->login_screen_idle_timer_.get());
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyNoGracePeriod() const {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(automatic_reboot_manager_->reboot_requested_);
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(automatic_reboot_manager_->grace_start_timer_.get());
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(automatic_reboot_manager_->grace_end_timer_.get());
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyGracePeriod(
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& start_uptime) const {
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta start =
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start_uptime - task_runner_->Uptime() - uptime_processing_delay_;
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta end = start + base::TimeDelta::FromHours(24);
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (start <= base::TimeDelta()) {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(automatic_reboot_manager_->reboot_requested_);
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsStopped(automatic_reboot_manager_->grace_start_timer_.get());
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_end_timer_.get(),
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         end);
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(automatic_reboot_manager_->reboot_requested_);
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_start_timer_.get(),
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         start);
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_end_timer_.get(),
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         end);
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyTimerIsStopped(
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Timer* timer) const {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (timer)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(timer->IsRunning());
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyTimerIsRunning(
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Timer* timer,
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delay) const {
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(timer);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(timer->IsRunning());
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(delay.ToInternalValue(),
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            timer->GetCurrentDelay().ToInternalValue());
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsRunning() const {
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsRunning(
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      automatic_reboot_manager_->login_screen_idle_timer_.get(),
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromSeconds(60));
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
546a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUpdateStatusNeedReboot() {
547a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  UpdateEngineClient::Status client_status;
548a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  client_status.status = UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
54990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  update_engine_client_->set_default_status(client_status);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerTest::AutomaticRebootManagerTest() {
553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (GetParam()) {
554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_LOGIN_SCREEN:
555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_user_logged_in_ = false;
556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_ = false;
557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_KIOSK_APP_SESSION:
559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_user_logged_in_ = true;
560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_ = true;
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_NON_KIOSK_APP_SESSION:
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_user_logged_in_ = true;
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_ = false;
565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerTest::~AutomaticRebootManagerTest() {
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is showing the login screen. The current uptime is 12 hours.
573868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that the idle timer is running. Further verifies that when a kiosk
574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// app session begins, the idle timer is stopped.
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, LoginStopsIdleTimer) {
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // idle timer is started.
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that a kiosk app session has been started.
583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  automatic_reboot_manager_->Observe(
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      chrome::NOTIFICATION_LOGIN_USER_CHANGED,
587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::NotificationService::NoDetails());
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the login screen idle timer is stopped.
591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyLoginScreenIdleTimerIsStopped();
592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is showing the login screen. The current uptime is 12 hours.
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that the idle timer is running. Further verifies that when a
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// non-kiosk-app session begins, the idle timer is stopped.
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskLoginStopsIdleTimer) {
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // idle timer is started.
605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that a non-kiosk-app session has been started.
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->Observe(
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::NOTIFICATION_LOGIN_USER_CHANGED,
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::NoDetails());
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the login screen idle timer is stopped.
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLoginScreenIdleTimerIsStopped();
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot eventually.
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is showing the login screen. The uptime limit is 6 hours. The current
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours.
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that user activity prevents the device from rebooting. Further
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies that when user activity ceases, the devices reboots.
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, UserActivityResetsIdleTimer) {
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // idle timer is started.
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 25 minutes while simulating user activity every
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 50 seconds.
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 30; ++i) {
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Fast forward uptime by 50 seconds. Verify that the device does not reboot
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // immediately.
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FastForwardBy(base::TimeDelta::FromSeconds(50), false);
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Simulate user activity.
6467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    automatic_reboot_manager_->OnUserActivity(NULL);
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 60 seconds without simulating user activity.
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots immediately.
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(60), true);
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The current uptime is 10 days.
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// immediately reboot.
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeNoPolicy) {
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(false);
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot eventually.
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The current uptime is 10 days.
677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeAppNoPolicy) {
680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that no grace period has started.
687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyNoGracePeriod();
688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
690868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The uptime limit is 24 hours. The
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// immediately reboot.
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeBeforeGracePeriod) {
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(false);
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The uptime limit is 24 hours. The
724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeBeforeGracePeriod) {
728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The uptime limit is 6 hours. The
749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it immediately
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboots.
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeInGracePeriod) {
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device reboots immediately.
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(true);
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The uptime limit is 6 hours. The
772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeInGracePeriod) {
776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has started.
786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
791868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
792868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
794868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
796868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The uptime limit is 6 hours. The
797868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 29 hours 30 minutes.
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it immediately
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboots.
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeAfterGracePeriod) {
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromMinutes(30));
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device reboots immediately.
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(true);
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
820868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The uptime limit is 6 hours. The
821868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 29 hours 30 minutes.
822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeAfterGracePeriod) {
825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          base::TimeDelta::FromMinutes(30));
828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has started.
836868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
837868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
838868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
841868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
842868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running. The current uptime is 10 days.
847868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the browser terminates, the device does not immediately
848868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// reboot.
849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(AutomaticRebootManagerTest, TerminateNoPolicy) {
850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that no grace period has started.
856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyNoGracePeriod();
857868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the browser is terminating. Verify that the device does not
859868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot immediately.
860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyTerminating(false);
861868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
862868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
863868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
865868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 12 hours.
868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the browser terminates, it does not immediately reboot.
869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(AutomaticRebootManagerTest, TerminateBeforeGracePeriod) {
870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
881868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the browser is terminating. Verify that the device does not
882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot immediately.
883868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyTerminating(false);
884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
885868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
887868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
888868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
889868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
890868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
891868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running. The uptime limit is set to 6 hours. The current uptime is
892868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 12 hours.
893868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the browser terminates, the device immediately reboots if
894868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// a kiosk app session is in progress.
895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(AutomaticRebootManagerTest, TerminateInGracePeriod) {
896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
897868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
899868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
901868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has started.
905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the browser is terminating. Verify that the device immediately
908868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboots if a kiosk app session is in progress.
909868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyTerminating(is_logged_in_as_kiosk_app_);
910868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
911868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
912868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 24 hours, no reboot occurs and
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a grace period is scheduled to begin after 24 hours of uptime.
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, BeforeUptimeLimitGracePeriod) {
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
936868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
937868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
938868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 6 hours, a reboot is requested
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a grace period is started that will end after 6 + 24 hours of uptime.
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, InUptimeLimitGracePeriod) {
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 10 days.
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 6 hours, the device reboots
967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately if no non-kiosk-app-session is in progress because the grace
968868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// period ended after 6 + 24 hours of uptime.
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, AfterUptimeLimitGracePeriod) {
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
978868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that unless a non-kiosk-app session is in
979868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // progress, the the device immediately reboots.
980868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), !is_user_logged_in_ ||
981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                is_logged_in_as_kiosk_app_);
982868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
984868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
985868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours.
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is removed.
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffBeforeGracePeriod) {
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 1 hour. Verify that the device does not reboot
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromHours(1), false);
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 24 hours.
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is removed.
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffInGracePeriod) {
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(24));
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours.
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is extended to 24 hours, the grace period
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to start further in the future.
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ExtendUptimeLimitBeforeGracePeriod) {
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extend the uptime limit. Verify that the device does not reboot
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start further in the
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // future.
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 18 hours.
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is extended to 24 hours, the grace period
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to start in the future.
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ExtendUptimeLimitInGracePeriod) {
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(18));
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extend the uptime limit. Verify that the device does not reboot
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start in the future.
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 18 hours. The current uptime is
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 6 hours, the grace period
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to have already started.
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitBeforeToInGracePeriod) {
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(18), false);
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorten the uptime limit. Verify that the device does not reboot
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled and has started already.
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 36 hours.
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 18 hours, the grace
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// period is rescheduled to have started earlier.
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitInToInGracePeriod) {
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(36));
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorten the uptime limit. Verify that the device does not reboot
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(18), false);
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to have started earlier.
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 36 hours.
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 6 hours, the device
1185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// reboots immediately if no non-kiosk-app session is in progress because the
1186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// grace period ended after 6 + 24 hours of uptime.
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitInToAfterGracePeriod) {
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(36));
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Shorten the uptime limit. Verify that unless a non-kiosk-app session is in
1204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // progress, the the device immediately reboots.
1205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), !is_user_logged_in_ ||
1206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                is_logged_in_as_kiosk_app_);
1207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an update is applied, the current uptime is persisted as
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the time at which a reboot became necessary. Further verifies that when the
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// policy to automatically reboot after an update is not enabled, no reboot
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// occurs and no grace period is scheduled.
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateNoPolicy) {
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an update is applied, the current uptime is persisted as
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the time at which a reboot became necessary. Further verifies that when the
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// policy to automatically reboot after an update is enabled, a reboot is
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// requested and a grace period is started that will end 24 hours from now.
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, Update) {
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when Chrome is notified twice that an update has been applied,
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the second notification is ignored and the uptime at which it occured does
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not get persisted as the time at which an update became necessary.
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateAfterUpdate) {
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the previously persisted time at which a reboot became
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary has not been overwritten.
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta new_update_reboot_needed_uptime;
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &new_update_reboot_needed_uptime));
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(update_reboot_needed_uptime_, new_update_reboot_needed_uptime);
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 10 minutes.
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs a grace period is scheduled to begin after the
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// minimum of 1 hour of uptime. Further verifies that when an update is applied,
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the current uptime is persisted as the time at which a reboot became
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary.
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateBeforeMinimumUptime) {
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromMinutes(10));
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to begin in the future.
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(1));
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyAfterUpdateInGracePeriod) {
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime to 12 hours. Verify that the device does not reboot
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromHours(6), false);
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate user activity.
13837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  automatic_reboot_manager_->OnUserActivity(NULL);
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic reboot after an update has been applied. Verify that the
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(6) + uptime_processing_delay_);
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
1402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// enabled, the device reboots immediately if no non-kiosk-app session is in
1403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// progress because the grace period ended after 6 + 24 hours of uptime.
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyAfterUpdateAfterGracePeriod) {
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime to 12 hours. Verify that the device does not reboot
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromDays(10) - base::TimeDelta::FromHours(6),
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                false);
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate user activity.
14207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  automatic_reboot_manager_->OnUserActivity(NULL);
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic rebooting after an update has been applied. Verify that
1423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // unless a non-kiosk-app session is in progress, the the device immediately
1424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboots.
1425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetRebootAfterUpdate(true, !is_user_logged_in_ || is_logged_in_as_kiosk_app_);
1426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The policy to
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// automatically reboot after an update is enabled. The current uptime is
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours 20 seconds.
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// disabled, the reboot request and grace period are removed.
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyOffAfterUpdate) {
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(task_runner_->Uptime() + uptime_processing_delay_);
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic rebooting after an update has been applied. Verify that
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the device does not reboot immediately.
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is not available.
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that even if an uptime limit is set, the policy to automatically
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is enabled and an update has been applied, no reboot
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// occurs and no grace period is scheduled. Further verifies that no time is
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// persisted as the time at which a reboot became necessary.
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, NoUptime) {
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic rebooting after an update has been applied. Verify that
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the device does not reboot immediately.
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no time is persisted as the time at which a reboot became
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary.
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ReadUpdateRebootNeededUptimeFromFile(
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The policy to automatically reboot after an update is
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled. The current uptime is 12 hours.
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an uptime limit of 6 hours is set, the availability of an
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// update does not cause the grace period to be rescheduled. Further verifies
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that the current uptime is persisted as the time at which a reboot became
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary.
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitBeforeUpdate) {
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has not been rescheduled.
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The policy to automatically reboot after an update is
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled. The current uptime is 12 hours.
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an uptime limit of 24 hours is set, the availability of an
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// update causes the grace period to be rescheduled so that it ends 24 hours
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from now. Further verifies that the current uptime is persisted as the time
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// at which a reboot became necessary.
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateBeforeUptimeLimit) {
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start at the time that
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the update became available.
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. An update was applied
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a reboot became necessary to complete the update process after 12 hours.
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The policy to automatically reboot after an update is enabled. The current
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours 20 seconds.
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to reboot after an update is disabled, the
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// grace period is rescheduled to start after 24 hours of uptime. Further
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies that when the uptime limit is removed, the grace period is removed.
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyOffThenUptimeLimitOff) {
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has started.
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been rescheduled to end 24 hours from now.
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic reboot after an update has been applied. Verify that the
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start after 24 hours
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of uptime.
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 6 hours. An update was applied
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a reboot became necessary to complete the update process after 12 hours.
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The policy to automatically reboot after an update is enabled. The current
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours 20 seconds.
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// rescheduled to have started after 12 hours of uptime. Further verifies that
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when the policy to reboot after an update is disabled, the reboot request and
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// grace period are removed.
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffThenPolicyOff) {
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has started.
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to have started after
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 6 hours of uptime.
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been rescheduled to have started after 12
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // hours of uptime.
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic reboot after an update has been applied. Verify that the
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is 6 hours. The current uptime is
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 29 hours 59 minutes 59 seconds.
1707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that if no non-kiosk-app session is in progress, the device reboots
1708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately when the grace period ends after 6 + 24 hours of uptime.
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, GracePeriodEnd) {
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromMinutes(59) +
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromSeconds(59));
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Fast forward the uptime by 1 second. Verify that unless a non-kiosk-app
1724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // session is in progress, the the device immediately reboots.
1725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(1), !is_user_logged_in_ ||
1726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 is_logged_in_as_kiosk_app_);
1727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The current uptime is 10 days.
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when no automatic reboot policy is enabled, no reboot occurs
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and no grace period is scheduled.
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoPolicy) {
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 24 hours. The current uptime
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is 12 hours.
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that no reboot occurs and a grace period is scheduled to begin after
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 24 hours of uptime.
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartBeforeUptimeLimitGracePeriod) {
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1764868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1766868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. The current uptime is
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
1772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that if no non-kiosk-app session is in progress, the device reboots
1773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately because the grace period ended after 6 + 24 hours of uptime.
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartAfterUptimeLimitGracePeriod) {
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the the device
1779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // immediately reboots.
1780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(!is_user_logged_in_ ||
1781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               is_logged_in_as_kiosk_app_);
1782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. The current uptime is
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that a reboot is requested and a grace period is started that will
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// end after 6 + 24 hours of uptime.
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartInUptimeLimitGracePeriod) {
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1804868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1805868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
1813868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// enabled, the device reboots immediately if no non-kiosk-app session is in
1814868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// progress because the grace period ended after 6 + 24 hours of uptime.
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartAfterUpdateGracePeriod) {
1816a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1821868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboots immediately.
1823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(!is_user_logged_in_ ||
1824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               is_logged_in_as_kiosk_app_);
1825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartInUpdateGracePeriod) {
1839a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_);
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 10 minutes of uptime. The current uptime is
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 20 minutes.
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and a grace period is scheduled to begin after the
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// minimum of 1 hour of uptime.
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartBeforeUpdateGracePeriod) {
1863a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromMinutes(10));
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromMinutes(20));
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(1));
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is not
18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and no grace period is scheduled.
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateNoPolicy) {
1886a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process but the time at which this happened was lost. The
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current uptime is 10 days.
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the current uptime is persisted as the time at which a reboot
19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// became necessary. Further verifies that when the policy to automatically
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is enabled, a reboot is requested and a grace period
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is started that will end 24 hours from now.
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateTimeLost) {
1908a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1927868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process but the time at which this happened was lost. The
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current uptime is 10 days.
19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the current uptime is persisted as the time at which a reboot
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// became necessary. Further verifies that when the policy to automatically
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is not enabled, no reboot occurs and no grace period
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is scheduled.
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateNoPolicyTimeLost) {
1938a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1953868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. No update has been applied. The current uptime is
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that no time is persisted as the time at which a reboot became
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary. Further verifies that no reboot occurs and no grace period is
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scheduled.
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoUpdate) {
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no time is persisted as the time at which a reboot became
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary.
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ReadUpdateRebootNeededUptimeFromFile(
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1977868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. Also, an update was
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 8 hours of uptime. The current uptime is 12 hours.
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUptimeLimitBeforeUpdate) {
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
1989a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(8));
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2000868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
2001868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
2002868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
2003868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 8 hours. Also, an update was
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours of uptime. The current uptime is 12 hours.
20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateBeforeUptimeLimit) {
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(8), false);
2014a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_);
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
2026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
2027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
2028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. Also, an update was
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours of uptime. The current uptime is not available.
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that even if the policy to automatically reboot after an update is
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and no grace period is scheduled.
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoUptime) {
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
2038a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
2053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    AutomaticRebootManagerTestInstance,
2054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    AutomaticRebootManagerTest,
2055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ::testing::Values(
2056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_LOGIN_SCREEN,
2057868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_KIOSK_APP_SESSION,
2058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_NON_KIOSK_APP_SESSION));
20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace system
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
2062