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"
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/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()),
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            base::WriteFile(path, uptime_seconds.c_str(),
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            uptime_seconds.size()));
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeSingleThreadTaskRunner::MockTimeSingleThreadTaskRunner() {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::RunsTasksOnCurrentThread() const {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::PostDelayedTask(
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& task,
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta delay) {
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tasks_.push(std::pair<base::TimeTicks, base::Closure>(now_ + delay, task));
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::PostNonNestableDelayedTask(
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& task,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta delay) {
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::SetUptimeFile(
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& uptime_file) {
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_file_ = uptime_file;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(uptime_file_, uptime_);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::SetUptime(const base::TimeDelta& uptime) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_ = uptime;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(uptime_file_, uptime_);
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::TimeDelta& MockTimeSingleThreadTaskRunner::Uptime() const {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return uptime_;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::TimeTicks& MockTimeSingleThreadTaskRunner::Now() const {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return now_;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::FastForwardBy(
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delta) {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeTicks latest = now_ + delta;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool* blocking_pool =
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::GetBlockingPool();
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocking_pool->FlushForTesting();
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty() && tasks_.top().first <= latest) {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uptime_ += tasks_.top().first - now_;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SaveUptimeToFile(uptime_file_, uptime_);
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    now_ = tasks_.top().first;
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    blocking_pool->FlushForTesting();
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_ += latest - now_;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(uptime_file_, uptime_);
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  now_ = latest;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::FastForwardUntilNoTasksRemain() {
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool* blocking_pool =
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::GetBlockingPool();
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocking_pool->FlushForTesting();
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty()) {
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uptime_ += tasks_.top().first - now_;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SaveUptimeToFile(uptime_file_, uptime_);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    now_ = tasks_.top().first;
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    blocking_pool->FlushForTesting();
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockTimeSingleThreadTaskRunner::RunUntilIdle() {
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SequencedWorkerPool* blocking_pool =
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::GetBlockingPool();
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  blocking_pool->FlushForTesting();
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!tasks_.empty() && tasks_.top().first <= now_) {
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure task = tasks_.top().second;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tasks_.pop();
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task.Run();
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    blocking_pool->FlushForTesting();
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockTimeSingleThreadTaskRunner::TemporalOrder::operator()(
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::pair<base::TimeTicks, base::Closure>& first_task,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::pair<base::TimeTicks, base::Closure>& second_task) const {
3113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return first_task.first > second_task.first;
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeSingleThreadTaskRunner::~MockTimeSingleThreadTaskRunner() {
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeTickClock::MockTimeTickClock(
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<MockTimeSingleThreadTaskRunner> task_runner)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : task_runner_(task_runner) {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockTimeTickClock::~MockTimeTickClock() {
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeTicks MockTimeTickClock::NowTicks() {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return task_runner_->Now();
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerBasicTest::AutomaticRebootManagerBasicTest()
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : is_user_logged_in_(false),
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_(false),
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      task_runner_(new MockTimeSingleThreadTaskRunner),
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      power_manager_client_(NULL),
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      update_engine_client_(NULL),
335a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reboot_after_update_(false),
336a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ui_thread_task_runner_handle_(task_runner_),
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      mock_user_manager_(new MockUserManager),
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_manager_enabler_(mock_user_manager_) {
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerBasicTest::~AutomaticRebootManagerBasicTest() {
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUp() {
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& temp_dir = temp_dir_.path();
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath uptime_file = temp_dir.Append("uptime");
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptimeFile(uptime_file);
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_FALSE(base::WriteFile(uptime_file, NULL, 0));
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_reboot_needed_uptime_file_ =
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      temp_dir.Append("update_reboot_needed_uptime");
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_FALSE(base::WriteFile(update_reboot_needed_uptime_file_, NULL, 0));
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(PathService::Override(chromeos::FILE_UPTIME, uptime_file));
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(PathService::Override(chromeos::FILE_UPDATE_REBOOT_NEEDED_UPTIME,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    update_reboot_needed_uptime_file_));
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutomaticRebootManager::RegisterPrefs(local_state_.registry());
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FakeDBusThreadManager* dbus_manager = new FakeDBusThreadManager;
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  power_manager_client_ = new FakePowerManagerClient;
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dbus_manager->SetPowerManagerClient(
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<PowerManagerClient>(power_manager_client_));
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  update_engine_client_ = new FakeUpdateEngineClient;
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dbus_manager->SetUpdateEngineClient(
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<UpdateEngineClient>(update_engine_client_));
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DBusThreadManager::InitializeForTesting(dbus_manager);
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*mock_user_manager_, IsUserLoggedIn())
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     .WillRepeatedly(ReturnPointee(&is_user_logged_in_));
371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*mock_user_manager_, IsLoggedInAsKioskApp())
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     .WillRepeatedly(ReturnPointee(&is_logged_in_as_kiosk_app_));
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::TearDown() {
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Let the AutomaticRebootManager, if any, unregister itself as an observer of
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // several subsystems.
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_.reset();
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DBusThreadManager::Shutdown();
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetLocalState(NULL);
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUpdateRebootNeededUptime(
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& uptime) {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_reboot_needed_uptime_ = uptime;
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SaveUptimeToFile(update_reboot_needed_uptime_file_, uptime);
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetRebootAfterUpdate(
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool reboot_after_update,
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reboot_after_update_ = reboot_after_update;
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_state_.SetManagedPref(
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kRebootAfterUpdate,
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Value::CreateBooleanValue(reboot_after_update));
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
400a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            power_manager_client_->num_request_restart_calls());
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUptimeLimit(
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& limit,
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_limit_ = limit;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (limit == base::TimeDelta()) {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_state_.RemoveManagedPref(prefs::kUptimeLimit);
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_state_.SetManagedPref(
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs::kUptimeLimit,
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Value::CreateIntegerValue(limit.InSeconds()));
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
416a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            power_manager_client_->num_request_restart_calls());
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyUpdateRebootNeeded() {
421a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
422a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  automatic_reboot_manager_->UpdateStatusChanged(
423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      update_engine_client_->GetLastStatus());
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, power_manager_client_->num_request_restart_calls());
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyResumed(bool expect_reboot) {
4290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  automatic_reboot_manager_->SuspendDone(base::TimeDelta::FromHours(1));
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
431a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            power_manager_client_->num_request_restart_calls());
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutomaticRebootManagerBasicTest::NotifyTerminating(bool expect_reboot) {
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  automatic_reboot_manager_->Observe(
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      chrome::NOTIFICATION_APP_TERMINATING,
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::NotificationService::NoDetails());
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->RunUntilIdle();
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            power_manager_client_->num_request_restart_calls());
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::FastForwardBy(
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delta,
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->FastForwardBy(delta);
449a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            power_manager_client_->num_request_restart_calls());
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::FastForwardUntilNoTasksRemain(
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->FastForwardUntilNoTasksRemain();
456a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            power_manager_client_->num_request_restart_calls());
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::CreateAutomaticRebootManager(
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool expect_reboot) {
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_.reset(new AutomaticRebootManager(
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<base::TickClock>(new MockTimeTickClock(task_runner_))));
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->RunUntilIdle();
465a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(expect_reboot ? 1 : 0,
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            power_manager_client_->num_request_restart_calls());
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uptime_processing_delay_ =
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeTicks() - automatic_reboot_manager_->boot_time_ -
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      task_runner_->Uptime();
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(uptime_processing_delay_, base::TimeDelta());
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(uptime_processing_delay_, base::TimeDelta::FromSeconds(1));
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_user_logged_in_ || expect_reboot)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsStopped();
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsRunning();
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutomaticRebootManagerBasicTest::ReadUpdateRebootNeededUptimeFromFile(
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta* uptime) {
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string contents;
48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!base::ReadFileToString(update_reboot_needed_uptime_file_, &contents)) {
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double seconds;
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!base::StringToDouble(contents.substr(0, contents.find(' ')), &seconds) ||
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      seconds < 0.0) {
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *uptime = base::TimeDelta::FromMilliseconds(seconds * 1000.0);
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsStopped() const {
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      automatic_reboot_manager_->login_screen_idle_timer_.get());
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyNoGracePeriod() const {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(automatic_reboot_manager_->reboot_requested_);
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(automatic_reboot_manager_->grace_start_timer_.get());
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsStopped(automatic_reboot_manager_->grace_end_timer_.get());
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyGracePeriod(
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& start_uptime) const {
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta start =
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start_uptime - task_runner_->Uptime() - uptime_processing_delay_;
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta end = start + base::TimeDelta::FromHours(24);
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (start <= base::TimeDelta()) {
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(automatic_reboot_manager_->reboot_requested_);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsStopped(automatic_reboot_manager_->grace_start_timer_.get());
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_end_timer_.get(),
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         end);
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(automatic_reboot_manager_->reboot_requested_);
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_start_timer_.get(),
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         start);
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTimerIsRunning(automatic_reboot_manager_->grace_end_timer_.get(),
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         end);
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyTimerIsStopped(
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Timer* timer) const {
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (timer)
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(timer->IsRunning());
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::VerifyTimerIsRunning(
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Timer* timer,
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::TimeDelta& delay) const {
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(timer);
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(timer->IsRunning());
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(delay.ToInternalValue(),
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            timer->GetCurrentDelay().ToInternalValue());
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutomaticRebootManagerBasicTest::
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyLoginScreenIdleTimerIsRunning() const {
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTimerIsRunning(
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      automatic_reboot_manager_->login_screen_idle_timer_.get(),
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromSeconds(60));
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
548a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutomaticRebootManagerBasicTest::SetUpdateStatusNeedReboot() {
549a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  UpdateEngineClient::Status client_status;
550a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  client_status.status = UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT;
55190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  update_engine_client_->set_default_status(client_status);
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerTest::AutomaticRebootManagerTest() {
555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (GetParam()) {
556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_LOGIN_SCREEN:
557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_user_logged_in_ = false;
558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_ = false;
559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_KIOSK_APP_SESSION:
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_user_logged_in_ = true;
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_ = true;
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_NON_KIOSK_APP_SESSION:
565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_user_logged_in_ = true;
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_logged_in_as_kiosk_app_ = false;
567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutomaticRebootManagerTest::~AutomaticRebootManagerTest() {
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is showing the login screen. The current uptime is 12 hours.
575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that the idle timer is running. Further verifies that when a kiosk
576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// app session begins, the idle timer is stopped.
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, LoginStopsIdleTimer) {
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // idle timer is started.
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that a kiosk app session has been started.
585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  automatic_reboot_manager_->Observe(
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      chrome::NOTIFICATION_LOGIN_USER_CHANGED,
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::NotificationService::NoDetails());
591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the login screen idle timer is stopped.
593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyLoginScreenIdleTimerIsStopped();
594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is showing the login screen. The current uptime is 12 hours.
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that the idle timer is running. Further verifies that when a
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// non-kiosk-app session begins, the idle timer is stopped.
602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskLoginStopsIdleTimer) {
603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // idle timer is started.
607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that a non-kiosk-app session has been started.
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatic_reboot_manager_->Observe(
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::NOTIFICATION_LOGIN_USER_CHANGED,
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::Source<AutomaticRebootManagerBasicTest>(this),
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::NoDetails());
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the login screen idle timer is stopped.
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLoginScreenIdleTimerIsStopped();
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot eventually.
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is showing the login screen. The uptime limit is 6 hours. The current
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours.
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that user activity prevents the device from rebooting. Further
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies that when user activity ceases, the devices reboots.
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, UserActivityResetsIdleTimer) {
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately and the login screen
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // idle timer is started.
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 25 minutes while simulating user activity every
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 50 seconds.
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 30; ++i) {
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Fast forward uptime by 50 seconds. Verify that the device does not reboot
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // immediately.
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FastForwardBy(base::TimeDelta::FromSeconds(50), false);
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Simulate user activity.
6487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    automatic_reboot_manager_->OnUserActivity(NULL);
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 60 seconds without simulating user activity.
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device reboots immediately.
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(60), true);
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The current uptime is 10 days.
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// immediately reboot.
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeNoPolicy) {
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(false);
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot eventually.
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The current uptime is 10 days.
679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeAppNoPolicy) {
682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that no grace period has started.
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyNoGracePeriod();
690868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The uptime limit is 24 hours. The
700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// immediately reboot.
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeBeforeGracePeriod) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(false);
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device eventually reboots.
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(true);
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The uptime limit is 24 hours. The
726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeBeforeGracePeriod) {
730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The uptime limit is 6 hours. The
751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it immediately
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboots.
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeInGracePeriod) {
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device reboots immediately.
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(true);
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The uptime limit is 6 hours. The
774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 12 hours.
775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeInGracePeriod) {
778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has started.
788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
791868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
792868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
794868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
796868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
797868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
798868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a kiosk app session. The uptime limit is 6 hours. The
799868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 29 hours 30 minutes.
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the device is suspended and then resumes, it immediately
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboots.
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, ResumeAfterGracePeriod) {
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_user_logged_in_ = true;
804868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_logged_in_as_kiosk_app_ = true;
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromMinutes(30));
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device reboots immediately.
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyResumed(true);
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running a non-kiosk-app session. The uptime limit is 6 hours. The
823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// current uptime is 29 hours 30 minutes.
824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the device is suspended and then resumes, it does not
825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately reboot.
826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(AutomaticRebootManagerBasicTest, NonKioskResumeAfterGracePeriod) {
827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  is_user_logged_in_ = true;
828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          base::TimeDelta::FromMinutes(30));
830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
836868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
837868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has started.
838868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the device has resumed from 1 hour of sleep. Verify that the
841868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // device does not reboot immediately.
842868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyResumed(false);
843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
847868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
848868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running. The current uptime is 10 days.
849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the browser terminates, the device does not immediately
850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// reboot.
851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(AutomaticRebootManagerTest, TerminateNoPolicy) {
852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
857868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that no grace period has started.
858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyNoGracePeriod();
859868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the browser is terminating. Verify that the device does not
861868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot immediately.
862868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyTerminating(false);
863868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
865868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 12 hours.
870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the browser terminates, it does not immediately reboot.
871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(AutomaticRebootManagerTest, TerminateBeforeGracePeriod) {
872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
881868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
883868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the browser is terminating. Verify that the device does not
884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot immediately.
885868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyTerminating(false);
886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
887868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
888868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
889868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
890868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
891868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
892868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
893868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Chrome is running. The uptime limit is set to 6 hours. The current uptime is
894868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 12 hours.
895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that when the browser terminates, the device immediately reboots if
896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// a kiosk app session is in progress.
897868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(AutomaticRebootManagerTest, TerminateInGracePeriod) {
898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
899868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot immediately.
901868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(false);
902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that a grace period has started.
907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
908868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
909868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify that the browser is terminating. Verify that the device immediately
910868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboots if a kiosk app session is in progress.
911868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyTerminating(is_logged_in_as_kiosk_app_);
912868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 24 hours, no reboot occurs and
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a grace period is scheduled to begin after 24 hours of uptime.
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, BeforeUptimeLimitGracePeriod) {
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
937868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
938868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
939868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 6 hours, a reboot is requested
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a grace period is started that will end after 6 + 24 hours of uptime.
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, InUptimeLimitGracePeriod) {
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 10 days.
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is set to 6 hours, the device reboots
969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately if no non-kiosk-app-session is in progress because the grace
970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// period ended after 6 + 24 hours of uptime.
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, AfterUptimeLimitGracePeriod) {
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
980868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the uptime limit. Verify that unless a non-kiosk-app session is in
981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // progress, the the device immediately reboots.
982868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), !is_user_logged_in_ ||
983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                is_logged_in_as_kiosk_app_);
984868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
985868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
987868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
988868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours.
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is removed.
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffBeforeGracePeriod) {
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 1 hour. Verify that the device does not reboot
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromHours(1), false);
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 24 hours.
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is removed.
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffInGracePeriod) {
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(24));
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours.
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is extended to 24 hours, the grace period
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to start further in the future.
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ExtendUptimeLimitBeforeGracePeriod) {
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extend the uptime limit. Verify that the device does not reboot
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start further in the
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // future.
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1082868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 12 hours. The current uptime is
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 18 hours.
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is extended to 24 hours, the grace period
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to start in the future.
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ExtendUptimeLimitInGracePeriod) {
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(18));
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(12), false);
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extend the uptime limit. Verify that the device does not reboot
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start in the future.
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 18 hours. The current uptime is
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 6 hours, the grace period
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is rescheduled to have already started.
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitBeforeToInGracePeriod) {
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(18), false);
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorten the uptime limit. Verify that the device does not reboot
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled and has started already.
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 36 hours.
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 18 hours, the grace
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// period is rescheduled to have started earlier.
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitInToInGracePeriod) {
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(36));
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorten the uptime limit. Verify that the device does not reboot
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(18), false);
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to have started earlier.
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. The current uptime is
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 36 hours.
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is shortened to 6 hours, the device
1187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// reboots immediately if no non-kiosk-app session is in progress because the
1188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// grace period ended after 6 + 24 hours of uptime.
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, ShortenUptimeLimitInToAfterGracePeriod) {
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(36));
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Shorten the uptime limit. Verify that unless a non-kiosk-app session is in
1206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // progress, the the device immediately reboots.
1207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), !is_user_logged_in_ ||
1208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                is_logged_in_as_kiosk_app_);
1209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an update is applied, the current uptime is persisted as
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the time at which a reboot became necessary. Further verifies that when the
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// policy to automatically reboot after an update is not enabled, no reboot
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// occurs and no grace period is scheduled.
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateNoPolicy) {
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an update is applied, the current uptime is persisted as
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the time at which a reboot became necessary. Further verifies that when the
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// policy to automatically reboot after an update is enabled, a reboot is
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// requested and a grace period is started that will end 24 hours from now.
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, Update) {
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 12 hours.
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when Chrome is notified twice that an update has been applied,
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the second notification is ignored and the uptime at which it occured does
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not get persisted as the time at which an update became necessary.
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateAfterUpdate) {
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the previously persisted time at which a reboot became
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary has not been overwritten.
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta new_update_reboot_needed_uptime;
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &new_update_reboot_needed_uptime));
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(update_reboot_needed_uptime_, new_update_reboot_needed_uptime);
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is 10 minutes.
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs a grace period is scheduled to begin after the
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// minimum of 1 hour of uptime. Further verifies that when an update is applied,
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the current uptime is persisted as the time at which a reboot became
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary.
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateBeforeMinimumUptime) {
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromMinutes(10));
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to begin in the future.
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(1));
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyAfterUpdateInGracePeriod) {
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime to 12 hours. Verify that the device does not reboot
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromHours(6), false);
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate user activity.
13857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  automatic_reboot_manager_->OnUserActivity(NULL);
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic reboot after an update has been applied. Verify that the
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(6) + uptime_processing_delay_);
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
1404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// enabled, the device reboots immediately if no non-kiosk-app session is in
1405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// progress because the grace period ended after 6 + 24 hours of uptime.
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyAfterUpdateAfterGracePeriod) {
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime to 12 hours. Verify that the device does not reboot
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromDays(10) - base::TimeDelta::FromHours(6),
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                false);
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate user activity.
14227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  automatic_reboot_manager_->OnUserActivity(NULL);
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic rebooting after an update has been applied. Verify that
1425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // unless a non-kiosk-app session is in progress, the the device immediately
1426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboots.
1427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetRebootAfterUpdate(true, !is_user_logged_in_ || is_logged_in_as_kiosk_app_);
1428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. An update was applied and a reboot became necessary to
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The policy to
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// automatically reboot after an update is enabled. The current uptime is
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours 20 seconds.
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// disabled, the reboot request and grace period are removed.
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyOffAfterUpdate) {
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(6));
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(task_runner_->Uptime() + uptime_processing_delay_);
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic rebooting after an update has been applied. Verify that
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the device does not reboot immediately.
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The current uptime is not available.
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that even if an uptime limit is set, the policy to automatically
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is enabled and an update has been applied, no reboot
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// occurs and no grace period is scheduled. Further verifies that no time is
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// persisted as the time at which a reboot became necessary.
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, NoUptime) {
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable automatic rebooting after an update has been applied. Verify that
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the device does not reboot immediately.
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no time is persisted as the time at which a reboot became
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary.
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ReadUpdateRebootNeededUptimeFromFile(
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The policy to automatically reboot after an update is
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled. The current uptime is 12 hours.
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an uptime limit of 6 hours is set, the availability of an
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// update does not cause the grace period to be rescheduled. Further verifies
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that the current uptime is persisted as the time at which a reboot became
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary.
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitBeforeUpdate) {
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has not been rescheduled.
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The policy to automatically reboot after an update is
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled. The current uptime is 12 hours.
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when an uptime limit of 24 hours is set, the availability of an
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// update causes the grace period to be rescheduled so that it ends 24 hours
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from now. Further verifies that the current uptime is persisted as the time
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// at which a reboot became necessary.
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UpdateBeforeUptimeLimit) {
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start at the time that
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the update became available.
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 24 hours. An update was applied
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a reboot became necessary to complete the update process after 12 hours.
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The policy to automatically reboot after an update is enabled. The current
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours 20 seconds.
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to reboot after an update is disabled, the
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// grace period is rescheduled to start after 24 hours of uptime. Further
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies that when the uptime limit is removed, the grace period is removed.
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, PolicyOffThenUptimeLimitOff) {
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has started.
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been rescheduled to end 24 hours from now.
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic reboot after an update has been applied. Verify that the
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to start after 24 hours
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of uptime.
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is set to 6 hours. An update was applied
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and a reboot became necessary to complete the update process after 12 hours.
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The policy to automatically reboot after an update is enabled. The current
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// uptime is 12 hours 20 seconds.
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the uptime limit is removed, the grace period is
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// rescheduled to have started after 12 hours of uptime. Further verifies that
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when the policy to reboot after an update is disabled, the reboot request and
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// grace period are removed.
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, UptimeLimitOffThenPolicyOff) {
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify that an update has been applied and a reboot is necessary. Verify
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the device does not reboot immediately.
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifyUpdateRebootNeeded();
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has started.
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been rescheduled to have started after
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 6 hours of uptime.
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fast forward the uptime by 20 seconds. Verify that the device does not
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot immediately.
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(20), false);
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the uptime limit. Verify that the device does not reboot
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta(), false);
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been rescheduled to have started after 12
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // hours of uptime.
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Disable automatic reboot after an update has been applied. Verify that the
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device does not reboot immediately.
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(false, false);
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the grace period has been removed.
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is running. The uptime limit is 6 hours. The current uptime is
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 29 hours 59 minutes 59 seconds.
1709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that if no non-kiosk-app session is in progress, the device reboots
1710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately when the grace period ends after 6 + 24 hours of uptime.
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, GracePeriodEnd) {
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(29) +
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromMinutes(59) +
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          base::TimeDelta::FromSeconds(59));
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the uptime limit. Verify that the device does not reboot immediately.
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Fast forward the uptime by 1 second. Verify that unless a non-kiosk-app
1726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // session is in progress, the the device immediately reboots.
1727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardBy(base::TimeDelta::FromSeconds(1), !is_user_logged_in_ ||
1728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 is_logged_in_as_kiosk_app_);
1729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The current uptime is 10 days.
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when no automatic reboot policy is enabled, no reboot occurs
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and no grace period is scheduled.
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoPolicy) {
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 24 hours. The current uptime
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is 12 hours.
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that no reboot occurs and a grace period is scheduled to begin after
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 24 hours of uptime.
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartBeforeUptimeLimitGracePeriod) {
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(24), false);
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1766868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. The current uptime is
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
1774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verifies that if no non-kiosk-app session is in progress, the device reboots
1775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// immediately because the grace period ended after 6 + 24 hours of uptime.
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartAfterUptimeLimitGracePeriod) {
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the the device
1781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // immediately reboots.
1782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(!is_user_logged_in_ ||
1783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               is_logged_in_as_kiosk_app_);
1784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. The current uptime is
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that a reboot is requested and a grace period is started that will
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// end after 6 + 24 hours of uptime.
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartInUptimeLimitGracePeriod) {
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1805868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1807868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1808868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
1815868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// enabled, the device reboots immediately if no non-kiosk-app session is in
1816868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// progress because the grace period ended after 6 + 24 hours of uptime.
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartAfterUpdateGracePeriod) {
1818a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboots immediately.
1825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateAutomaticRebootManager(!is_user_logged_in_ ||
1826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               is_logged_in_as_kiosk_app_);
1827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that if a non-kiosk-app session is in progress, the device does not
1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // reboot eventually.
1830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartInUpdateGracePeriod) {
1841a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_);
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 10 minutes of uptime. The current uptime is
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 20 minutes.
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and a grace period is scheduled to begin after the
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// minimum of 1 hour of uptime.
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartBeforeUpdateGracePeriod) {
1865a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromMinutes(10));
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromMinutes(20));
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has been scheduled to start in the future.
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(base::TimeDelta::FromHours(1));
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process after 6 hours of uptime. The current uptime is
18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 10 days.
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is not
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and no grace period is scheduled.
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateNoPolicy) {
1888a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process but the time at which this happened was lost. The
19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current uptime is 10 days.
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the current uptime is persisted as the time at which a reboot
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// became necessary. Further verifies that when the policy to automatically
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is enabled, a reboot is requested and a grace period
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is started that will end 24 hours from now.
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateTimeLost) {
1910a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_ + uptime_processing_delay_);
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
1927868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
1928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
1929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. An update was applied and a reboot became necessary to
19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// complete the update process but the time at which this happened was lost. The
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current uptime is 10 days.
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the current uptime is persisted as the time at which a reboot
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// became necessary. Further verifies that when the policy to automatically
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reboot after an update is not enabled, no reboot occurs and no grace period
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is scheduled.
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateNoPolicyTimeLost) {
1940a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromDays(10));
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the current uptime has been persisted as the time at which a
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reboot became necessary.
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ReadUpdateRebootNeededUptimeFromFile(
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(task_runner_->Uptime(), update_reboot_needed_uptime_);
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1955868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. No update has been applied. The current uptime is
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 12 hours.
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that no time is persisted as the time at which a reboot became
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary. Further verifies that no reboot occurs and no grace period is
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scheduled.
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoUpdate) {
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no time is persisted as the time at which a reboot became
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary.
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ReadUpdateRebootNeededUptimeFromFile(
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &update_reboot_needed_uptime_));
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1979868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. Also, an update was
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 8 hours of uptime. The current uptime is 12 hours.
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUptimeLimitBeforeUpdate) {
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
1991a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(8));
19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(uptime_limit_);
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
2003868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
2004868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
2005868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 8 hours. Also, an update was
20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours of uptime. The current uptime is 12 hours.
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that when the policy to automatically reboot after an update is
20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, a reboot is requested and a grace period is started that will end
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// after 6 + 24 hours of uptime.
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartUpdateBeforeUptimeLimit) {
20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(8), false);
2016a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_->SetUptime(base::TimeDelta::FromHours(12));
20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that a grace period has started.
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGracePeriod(update_reboot_needed_uptime_);
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that unless a non-kiosk-app session is in progress, the device
2028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // eventually reboots.
2029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FastForwardUntilNoTasksRemain(!is_user_logged_in_ ||
2030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                is_logged_in_as_kiosk_app_);
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome is starting. The uptime limit is set to 6 hours. Also, an update was
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// applied and a reboot became necessary to complete the update process after
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6 hours of uptime. The current uptime is not available.
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that even if the policy to automatically reboot after an update is
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enabled, no reboot occurs and no grace period is scheduled.
20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(AutomaticRebootManagerTest, StartNoUptime) {
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUptimeLimit(base::TimeDelta::FromHours(6), false);
2040a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetUpdateStatusNeedReboot();
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpdateRebootNeededUptime(base::TimeDelta::FromHours(6));
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRebootAfterUpdate(true, false);
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that the device does not reboot immediately.
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateAutomaticRebootManager(false);
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no grace period has started.
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyNoGracePeriod();
20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify that the device does not reboot eventually.
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FastForwardUntilNoTasksRemain(false);
20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
2055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    AutomaticRebootManagerTestInstance,
2056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    AutomaticRebootManagerTest,
2057868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ::testing::Values(
2058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_LOGIN_SCREEN,
2059868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_KIOSK_APP_SESSION,
2060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AUTOMATIC_REBOOT_MANAGER_TEST_SCENARIO_NON_KIOSK_APP_SESSION));
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace system
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
2064