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