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"
368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chromeos/dbus/fake_dbus_thread_manager.h"
37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/dbus/fake_power_manager_client.h"
38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/dbus/fake_update_engine_client.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());
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FakeDBusThreadManager* dbus_manager = new FakeDBusThreadManager;
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  power_manager_client_ = new FakePowerManagerClient;
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dbus_manager->SetPowerManagerClient(
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<PowerManagerClient>(power_manager_client_));
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  update_engine_client_ = new FakeUpdateEngineClient;
367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dbus_manager->SetUpdateEngineClient(
368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<UpdateEngineClient>(update_engine_client_));
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DBusThreadManager::InitializeForTesting(dbus_manager);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_user_manager_, IsUserLoggedIn())
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     .WillRepeatedly(ReturnPointee(&is_user_logged_in_));
373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*mock_user_manager_, IsLoggedInAsKioskApp())
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     .WillRepeatedly(ReturnPointee(&is_logged_in_as_kiosk_app_));
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::TearDown() {
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Let the AutomaticRebootManager, if any, unregister itself as an observer of
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // several subsystems.
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_.reset();
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DBusThreadManager::Shutdown();
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetLocalState(NULL);
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUpdateRebootNeededUptime(
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& uptime) {
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_reboot_needed_uptime_ = uptime;
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(update_reboot_needed_uptime_file_, uptime);
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetRebootAfterUpdate(
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool reboot_after_update,
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reboot_after_update_ = reboot_after_update;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_state_.SetManagedPref(
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kRebootAfterUpdate,
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Value::CreateBooleanValue(reboot_after_update));
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
402a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
403a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUptimeLimit(
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& limit,
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_limit_ = limit;
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (limit == base::TimeDelta()) {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_state_.RemoveManagedPref(prefs::kUptimeLimit);
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_state_.SetManagedPref(
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs::kUptimeLimit,
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Value::CreateIntegerValue(limit.InSeconds()));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
418a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
419a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyUpdateRebootNeeded() {
423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
424a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  automatic_reboot_manager_->UpdateStatusChanged(
425a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      update_engine_client_->GetLastStatus());
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
427a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(0, power_manager_client_->request_restart_call_count());
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyResumed(bool expect_reboot) {
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->SystemResumed(base::TimeDelta::FromHours(1));
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
433a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
434a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyTerminating(bool expect_reboot) {
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  automatic_reboot_manager_->Observe(
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      chrome::NOTIFICATION_APP_TERMINATING,
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::NotificationService::NoDetails());
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->RunUntilIdle();
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            power_manager_client_->request_restart_call_count());
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::FastForwardBy(
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delta,
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->FastForwardBy(delta);
451a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
452a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::FastForwardUntilNoTasksRemain(
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->FastForwardUntilNoTasksRemain();
458a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
459a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::CreateAutomaticRebootManager(
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_.reset(new AutomaticRebootManager(
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<base::TickClock>(new MockTimeTickClock(task_runner_))));
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
467a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
468a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            power_manager_client_->request_restart_call_count());
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_processing_delay_ =
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeTicks() - automatic_reboot_manager_->boot_time_ -
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      task_runner_->Uptime();
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(uptime_processing_delay_, base::TimeDelta());
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(uptime_processing_delay_, base::TimeDelta::FromSeconds(1));
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_user_logged_in_ || expect_reboot)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsStopped();
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsRunning();
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutomaticRebootManagerBasicTest::ReadUpdateRebootNeededUptimeFromFile(
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta* uptime) {
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string contents;
48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!base::ReadFileToString(update_reboot_needed_uptime_file_, &contents)) {
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double seconds;
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!base::StringToDouble(contents.substr(0, contents.find(' ')), &seconds) ||
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      seconds < 0.0) {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *uptime = base::TimeDelta::FromMilliseconds(seconds * 1000.0);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsStopped() const {
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      automatic_reboot_manager_->login_screen_idle_timer_.get());
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyNoGracePeriod() const {
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(automatic_reboot_manager_->reboot_requested_);
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(automatic_reboot_manager_->grace_start_timer_.get());
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(automatic_reboot_manager_->grace_end_timer_.get());
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyGracePeriod(
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& start_uptime) const {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta start =
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start_uptime - task_runner_->Uptime() - uptime_processing_delay_;
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta end = start + base::TimeDelta::FromHours(24);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (start <= base::TimeDelta()) {
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(automatic_reboot_manager_->reboot_requested_);
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsStopped(automatic_reboot_manager_->grace_start_timer_.get());
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_end_timer_.get(),
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         end);
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(automatic_reboot_manager_->reboot_requested_);
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_start_timer_.get(),
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         start);
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_end_timer_.get(),
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         end);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyTimerIsStopped(
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Timer* timer) const {
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (timer)
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(timer->IsRunning());
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyTimerIsRunning(
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Timer* timer,
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delay) const {
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(timer);
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(timer->IsRunning());
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(delay.ToInternalValue(),
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            timer->GetCurrentDelay().ToInternalValue());
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsRunning() const {
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsRunning(
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      automatic_reboot_manager_->login_screen_idle_timer_.get(),
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromSeconds(60));
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
550a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUpdateStatusNeedReboot() {
551a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  UpdateEngineClient::Status client_status;
552a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  client_status.status = UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
55390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  update_engine_client_->set_default_status(client_status);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerTest::AutomaticRebootManagerTest() {
557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (GetParam()) {
558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_LOGIN_SCREEN:
559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_user_logged_in_ = false;
560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_ = false;
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_KIOSK_APP_SESSION:
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_user_logged_in_ = true;
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_ = true;
565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_NON_KIOSK_APP_SESSION:
567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_user_logged_in_ = true;
568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_ = false;
569868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerTest::~AutomaticRebootManagerTest() {
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is showing the login screen. The current uptime is 12 hours.
577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that the idle timer is running. Further verifies that when a kiosk
578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// app session begins, the idle timer is stopped.
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, LoginStopsIdleTimer) {
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // idle timer is started.
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that a kiosk app session has been started.
587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  automatic_reboot_manager_->Observe(
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      chrome::NOTIFICATION_LOGIN_USER_CHANGED,
591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::NotificationService::NoDetails());
593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the login screen idle timer is stopped.
595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyLoginScreenIdleTimerIsStopped();
596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is showing the login screen. The current uptime is 12 hours.
602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that the idle timer is running. Further verifies that when a
603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// non-kiosk-app session begins, the idle timer is stopped.
604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskLoginStopsIdleTimer) {
605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // idle timer is started.
609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that a non-kiosk-app session has been started.
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->Observe(
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::NOTIFICATION_LOGIN_USER_CHANGED,
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::NoDetails());
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the login screen idle timer is stopped.
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLoginScreenIdleTimerIsStopped();
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot eventually.
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is showing the login screen. The uptime limit is 6 hours. The current
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours.
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that user activity prevents the device from rebooting. Further
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies that when user activity ceases, the devices reboots.
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, UserActivityResetsIdleTimer) {
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // idle timer is started.
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 25 minutes while simulating user activity every
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 50 seconds.
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 30; ++i) {
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Fast forward uptime by 50 seconds. Verify that the device does not reboot
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // immediately.
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FastForwardBy(base::TimeDelta::FromSeconds(50), false);
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Simulate user activity.
6507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    automatic_reboot_manager_->OnUserActivity(NULL);
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 60 seconds without simulating user activity.
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots immediately.
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(60), true);
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The current uptime is 10 days.
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// immediately reboot.
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeNoPolicy) {
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(false);
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot eventually.
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The current uptime is 10 days.
681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeAppNoPolicy) {
684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
690868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that no grace period has started.
691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyNoGracePeriod();
692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The uptime limit is 24 hours. The
702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// immediately reboot.
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeBeforeGracePeriod) {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(false);
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The uptime limit is 24 hours. The
728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeBeforeGracePeriod) {
732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The uptime limit is 6 hours. The
753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it immediately
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboots.
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeInGracePeriod) {
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device reboots immediately.
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(true);
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The uptime limit is 6 hours. The
776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeInGracePeriod) {
780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has started.
790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
791868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
792868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
794868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
796868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
797868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
798868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
799868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
800868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The uptime limit is 6 hours. The
801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 29 hours 30 minutes.
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it immediately
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboots.
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeAfterGracePeriod) {
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromMinutes(30));
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device reboots immediately.
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(true);
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The uptime limit is 6 hours. The
825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 29 hours 30 minutes.
826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeAfterGracePeriod) {
829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          base::TimeDelta::FromMinutes(30));
832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
836868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
837868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
838868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has started.
840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
841868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
842868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
847868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
848868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running. The current uptime is 10 days.
851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the browser terminates, the device does not immediately
852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// reboot.
853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(AutomaticRebootManagerTest, TerminateNoPolicy) {
854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
857868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
859868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that no grace period has started.
860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyNoGracePeriod();
861868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
862868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the browser is terminating. Verify that the device does not
863868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot immediately.
864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyTerminating(false);
865868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 12 hours.
872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the browser terminates, it does not immediately reboot.
873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(AutomaticRebootManagerTest, TerminateBeforeGracePeriod) {
874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
881868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
883868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
885868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the browser is terminating. Verify that the device does not
886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot immediately.
887868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyTerminating(false);
888868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
889868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
890868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
891868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
892868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
893868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
894868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running. The uptime limit is set to 6 hours. The current uptime is
896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 12 hours.
897868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the browser terminates, the device immediately reboots if
898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// a kiosk app session is in progress.
899868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(AutomaticRebootManagerTest, TerminateInGracePeriod) {
900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
901868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
908868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has started.
909868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
910868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
911868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the browser is terminating. Verify that the device immediately
912868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboots if a kiosk app session is in progress.
913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyTerminating(is_logged_in_as_kiosk_app_);
914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 24 hours, no reboot occurs and
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a grace period is scheduled to begin after 24 hours of uptime.
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, BeforeUptimeLimitGracePeriod) {
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
939868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 6 hours, a reboot is requested
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a grace period is started that will end after 6 + 24 hours of uptime.
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, InUptimeLimitGracePeriod) {
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 10 days.
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 6 hours, the device reboots
971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately if no non-kiosk-app-session is in progress because the grace
972868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// period ended after 6 + 24 hours of uptime.
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, AfterUptimeLimitGracePeriod) {
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that unless a non-kiosk-app session is in
983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // progress, the the device immediately reboots.
984868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), !is_user_logged_in_ ||
985868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                is_logged_in_as_kiosk_app_);
986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
987868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
988868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
989868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
990868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours.
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is removed.
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffBeforeGracePeriod) {
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 1 hour. Verify that the device does not reboot
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromHours(1), false);
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1019868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 24 hours.
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is removed.
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffInGracePeriod) {
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(24));
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours.
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is extended to 24 hours, the grace period
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to start further in the future.
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ExtendUptimeLimitBeforeGracePeriod) {
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extend the uptime limit. Verify that the device does not reboot
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start further in the
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // future.
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1082868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 18 hours.
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is extended to 24 hours, the grace period
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to start in the future.
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ExtendUptimeLimitInGracePeriod) {
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(18));
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extend the uptime limit. Verify that the device does not reboot
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start in the future.
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 18 hours. The current uptime is
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 6 hours, the grace period
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to have already started.
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitBeforeToInGracePeriod) {
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(18), false);
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorten the uptime limit. Verify that the device does not reboot
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled and has started already.
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 36 hours.
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 18 hours, the grace
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// period is rescheduled to have started earlier.
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitInToInGracePeriod) {
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(36));
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorten the uptime limit. Verify that the device does not reboot
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(18), false);
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to have started earlier.
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 36 hours.
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 6 hours, the device
1189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// reboots immediately if no non-kiosk-app session is in progress because the
1190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// grace period ended after 6 + 24 hours of uptime.
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitInToAfterGracePeriod) {
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(36));
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Shorten the uptime limit. Verify that unless a non-kiosk-app session is in
1208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // progress, the the device immediately reboots.
1209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), !is_user_logged_in_ ||
1210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                is_logged_in_as_kiosk_app_);
1211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an update is applied, the current uptime is persisted as
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the time at which a reboot became necessary. Further verifies that when the
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// policy to automatically reboot after an update is not enabled, no reboot
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// occurs and no grace period is scheduled.
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateNoPolicy) {
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an update is applied, the current uptime is persisted as
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the time at which a reboot became necessary. Further verifies that when the
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// policy to automatically reboot after an update is enabled, a reboot is
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// requested and a grace period is started that will end 24 hours from now.
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, Update) {
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when Chrome is notified twice that an update has been applied,
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the second notification is ignored and the uptime at which it occured does
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not get persisted as the time at which an update became necessary.
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateAfterUpdate) {
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the previously persisted time at which a reboot became
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary has not been overwritten.
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta new_update_reboot_needed_uptime;
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &new_update_reboot_needed_uptime));
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(update_reboot_needed_uptime_, new_update_reboot_needed_uptime);
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 10 minutes.
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs a grace period is scheduled to begin after the
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// minimum of 1 hour of uptime. Further verifies that when an update is applied,
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the current uptime is persisted as the time at which a reboot became
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary.
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateBeforeMinimumUptime) {
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromMinutes(10));
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to begin in the future.
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(1));
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyAfterUpdateInGracePeriod) {
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime to 12 hours. Verify that the device does not reboot
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromHours(6), false);
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate user activity.
13877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  automatic_reboot_manager_->OnUserActivity(NULL);
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic reboot after an update has been applied. Verify that the
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(6) + uptime_processing_delay_);
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
1406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// enabled, the device reboots immediately if no non-kiosk-app session is in
1407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// progress because the grace period ended after 6 + 24 hours of uptime.
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyAfterUpdateAfterGracePeriod) {
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime to 12 hours. Verify that the device does not reboot
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromDays(10) - base::TimeDelta::FromHours(6),
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                false);
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate user activity.
14247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  automatic_reboot_manager_->OnUserActivity(NULL);
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic rebooting after an update has been applied. Verify that
1427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // unless a non-kiosk-app session is in progress, the the device immediately
1428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboots.
1429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetRebootAfterUpdate(true, !is_user_logged_in_ || is_logged_in_as_kiosk_app_);
1430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The policy to
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// automatically reboot after an update is enabled. The current uptime is
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours 20 seconds.
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// disabled, the reboot request and grace period are removed.
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyOffAfterUpdate) {
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(task_runner_->Uptime() + uptime_processing_delay_);
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic rebooting after an update has been applied. Verify that
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the device does not reboot immediately.
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is not available.
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that even if an uptime limit is set, the policy to automatically
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is enabled and an update has been applied, no reboot
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// occurs and no grace period is scheduled. Further verifies that no time is
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// persisted as the time at which a reboot became necessary.
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, NoUptime) {
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic rebooting after an update has been applied. Verify that
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the device does not reboot immediately.
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no time is persisted as the time at which a reboot became
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary.
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ReadUpdateRebootNeededUptimeFromFile(
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The policy to automatically reboot after an update is
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled. The current uptime is 12 hours.
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an uptime limit of 6 hours is set, the availability of an
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// update does not cause the grace period to be rescheduled. Further verifies
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that the current uptime is persisted as the time at which a reboot became
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary.
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitBeforeUpdate) {
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has not been rescheduled.
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1549868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The policy to automatically reboot after an update is
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled. The current uptime is 12 hours.
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an uptime limit of 24 hours is set, the availability of an
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// update causes the grace period to be rescheduled so that it ends 24 hours
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from now. Further verifies that the current uptime is persisted as the time
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// at which a reboot became necessary.
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateBeforeUptimeLimit) {
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start at the time that
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the update became available.
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. An update was applied
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a reboot became necessary to complete the update process after 12 hours.
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The policy to automatically reboot after an update is enabled. The current
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours 20 seconds.
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to reboot after an update is disabled, the
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// grace period is rescheduled to start after 24 hours of uptime. Further
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies that when the uptime limit is removed, the grace period is removed.
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyOffThenUptimeLimitOff) {
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has started.
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been rescheduled to end 24 hours from now.
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic reboot after an update has been applied. Verify that the
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start after 24 hours
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of uptime.
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 6 hours. An update was applied
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a reboot became necessary to complete the update process after 12 hours.
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The policy to automatically reboot after an update is enabled. The current
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours 20 seconds.
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// rescheduled to have started after 12 hours of uptime. Further verifies that
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when the policy to reboot after an update is disabled, the reboot request and
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// grace period are removed.
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffThenPolicyOff) {
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has started.
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to have started after
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 6 hours of uptime.
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been rescheduled to have started after 12
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // hours of uptime.
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic reboot after an update has been applied. Verify that the
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is 6 hours. The current uptime is
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 29 hours 59 minutes 59 seconds.
1711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that if no non-kiosk-app session is in progress, the device reboots
1712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately when the grace period ends after 6 + 24 hours of uptime.
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, GracePeriodEnd) {
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromMinutes(59) +
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromSeconds(59));
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Fast forward the uptime by 1 second. Verify that unless a non-kiosk-app
1728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // session is in progress, the the device immediately reboots.
1729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(1), !is_user_logged_in_ ||
1730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 is_logged_in_as_kiosk_app_);
1731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The current uptime is 10 days.
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when no automatic reboot policy is enabled, no reboot occurs
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and no grace period is scheduled.
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoPolicy) {
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 24 hours. The current uptime
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is 12 hours.
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that no reboot occurs and a grace period is scheduled to begin after
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 24 hours of uptime.
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartBeforeUptimeLimitGracePeriod) {
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. The current uptime is
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
1776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that if no non-kiosk-app session is in progress, the device reboots
1777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately because the grace period ended after 6 + 24 hours of uptime.
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartAfterUptimeLimitGracePeriod) {
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the the device
1783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // immediately reboots.
1784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(!is_user_logged_in_ ||
1785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               is_logged_in_as_kiosk_app_);
1786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. The current uptime is
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that a reboot is requested and a grace period is started that will
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// end after 6 + 24 hours of uptime.
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartInUptimeLimitGracePeriod) {
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1807868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1808868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1809868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
1817868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// enabled, the device reboots immediately if no non-kiosk-app session is in
1818868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// progress because the grace period ended after 6 + 24 hours of uptime.
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartAfterUpdateGracePeriod) {
1820a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboots immediately.
1827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(!is_user_logged_in_ ||
1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               is_logged_in_as_kiosk_app_);
1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartInUpdateGracePeriod) {
1843a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_);
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1857868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 10 minutes of uptime. The current uptime is
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 20 minutes.
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and a grace period is scheduled to begin after the
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// minimum of 1 hour of uptime.
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartBeforeUpdateGracePeriod) {
1867a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromMinutes(10));
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromMinutes(20));
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(1));
18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1881868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is not
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and no grace period is scheduled.
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateNoPolicy) {
1890a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process but the time at which this happened was lost. The
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current uptime is 10 days.
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the current uptime is persisted as the time at which a reboot
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// became necessary. Further verifies that when the policy to automatically
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is enabled, a reboot is requested and a grace period
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is started that will end 24 hours from now.
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateTimeLost) {
1912a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1930868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1931868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process but the time at which this happened was lost. The
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current uptime is 10 days.
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the current uptime is persisted as the time at which a reboot
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// became necessary. Further verifies that when the policy to automatically
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is not enabled, no reboot occurs and no grace period
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is scheduled.
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateNoPolicyTimeLost) {
1942a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. No update has been applied. The current uptime is
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that no time is persisted as the time at which a reboot became
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary. Further verifies that no reboot occurs and no grace period is
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scheduled.
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoUpdate) {
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no time is persisted as the time at which a reboot became
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary.
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ReadUpdateRebootNeededUptimeFromFile(
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. Also, an update was
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 8 hours of uptime. The current uptime is 12 hours.
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUptimeLimitBeforeUpdate) {
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
1993a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(8));
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2004868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
2005868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
2006868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
2007868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 8 hours. Also, an update was
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours of uptime. The current uptime is 12 hours.
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateBeforeUptimeLimit) {
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(8), false);
2018a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_);
20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
2030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
2031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
2032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. Also, an update was
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours of uptime. The current uptime is not available.
20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that even if the policy to automatically reboot after an update is
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and no grace period is scheduled.
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoUptime) {
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
2042a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
2057868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    AutomaticRebootManagerTestInstance,
2058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    AutomaticRebootManagerTest,
2059868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ::testing::Values(
2060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_LOGIN_SCREEN,
2061868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_KIOSK_APP_SESSION,
2062868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_NON_KIOSK_APP_SESSION));
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace system
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
2066