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