OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_UPDATE_CHECK_SCHEDULER_H__ |
| 6 #define CHROMEOS_PLATFORM_UPDATE_ENGINE_UPDATE_CHECK_SCHEDULER_H__ |
| 7 |
| 8 #include <base/basictypes.h> |
| 9 #include <glib.h> |
| 10 #include <gtest/gtest_prod.h> // for FRIEND_TEST |
| 11 |
| 12 #include "update_engine/update_attempter.h" |
| 13 |
| 14 namespace chromeos_update_engine { |
| 15 |
| 16 // UpdateCheckScheduler manages the periodic background update checks. This is |
| 17 // the basic update check cycle: |
| 18 // |
| 19 // Run |
| 20 // | |
| 21 // v |
| 22 // /->ScheduleCheck |
| 23 // | | |
| 24 // | v |
| 25 // | StaticCheck (invoked through a GLib timeout source) |
| 26 // | | |
| 27 // | v |
| 28 // | UpdateAttempter::Update |
| 29 // | | |
| 30 // | v |
| 31 // | SetUpdateStatus (invoked by UpdateAttempter on state transitions) |
| 32 // | | |
| 33 // | v |
| 34 // | ScheduleNextCheck (invoked when UpdateAttempter becomes idle) |
| 35 // \---/ |
| 36 class UpdateCheckScheduler { |
| 37 public: |
| 38 static const int kTimeoutOnce; |
| 39 static const int kTimeoutPeriodic; |
| 40 static const int kTimeoutRegularFuzz; |
| 41 static const int kTimeoutMaxBackoff; |
| 42 |
| 43 UpdateCheckScheduler(UpdateAttempter* update_attempter); |
| 44 virtual ~UpdateCheckScheduler(); |
| 45 |
| 46 // Initiates the periodic update checks, if necessary. |
| 47 void Run(); |
| 48 |
| 49 // Sets the new update status. This is invoked by UpdateAttempter. |
| 50 void SetUpdateStatus(UpdateStatus status); |
| 51 |
| 52 private: |
| 53 friend class UpdateCheckSchedulerTest; |
| 54 FRIEND_TEST(UpdateCheckSchedulerTest, CanScheduleTest); |
| 55 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzBackoffTest); |
| 56 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzTest); |
| 57 FRIEND_TEST(UpdateCheckSchedulerTest, GTimeoutAddSecondsTest); |
| 58 FRIEND_TEST(UpdateCheckSchedulerTest, IsBootDeviceRemovableTest); |
| 59 FRIEND_TEST(UpdateCheckSchedulerTest, IsOfficialBuildTest); |
| 60 FRIEND_TEST(UpdateCheckSchedulerTest, RunBootDeviceRemovableTest); |
| 61 FRIEND_TEST(UpdateCheckSchedulerTest, RunNonOfficialBuildTest); |
| 62 FRIEND_TEST(UpdateCheckSchedulerTest, RunTest); |
| 63 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleCheckDisabledTest); |
| 64 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleCheckEnabledTest); |
| 65 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleCheckNegativeIntervalTest); |
| 66 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleNextCheckDisabledTest); |
| 67 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleNextCheckEnabledTest); |
| 68 FRIEND_TEST(UpdateCheckSchedulerTest, SetUpdateStatusIdleDisabledTest); |
| 69 FRIEND_TEST(UpdateCheckSchedulerTest, SetUpdateStatusIdleEnabledTest); |
| 70 FRIEND_TEST(UpdateCheckSchedulerTest, SetUpdateStatusNonIdleTest); |
| 71 FRIEND_TEST(UpdateCheckSchedulerTest, StaticCheckTest); |
| 72 |
| 73 // Wraps GLib's g_timeout_add_seconds so that it can be mocked in tests. |
| 74 virtual guint GTimeoutAddSeconds(guint interval, GSourceFunc function); |
| 75 |
| 76 // Wrappers for utils functions so that they can be mocked in tests. |
| 77 virtual bool IsBootDeviceRemovable(); |
| 78 virtual bool IsOfficialBuild(); |
| 79 |
| 80 // Returns true if an update check can be scheduled. An update check should |
| 81 // not be scheduled if periodic update checks are disabled or if one is |
| 82 // already scheduled. |
| 83 bool CanSchedule() { return enabled_ && !scheduled_; } |
| 84 |
| 85 // Schedules the next periodic update check |interval| seconds from now |
| 86 // randomized by +/- |fuzz|/2. |
| 87 void ScheduleCheck(int interval, int fuzz); |
| 88 |
| 89 // GLib timeout source callback. Initiates an update check through the update |
| 90 // attempter. |
| 91 static gboolean StaticCheck(void* scheduler); |
| 92 |
| 93 // Schedules the next update check by setting up a timeout source. |
| 94 void ScheduleNextCheck(); |
| 95 |
| 96 // Computes the timeout interval along with its random fuzz range for the next |
| 97 // update check by taking into account the last timeout interval as well as |
| 98 // the last update status. |
| 99 void ComputeNextIntervalAndFuzz(int* next_interval, int* next_fuzz); |
| 100 |
| 101 // The UpdateAttempter to use for update checks. |
| 102 UpdateAttempter* update_attempter_; |
| 103 |
| 104 // True if automatic update checks should be scheduled, false otherwise. |
| 105 bool enabled_; |
| 106 |
| 107 // True if there's an update check scheduled already, false otherwise. |
| 108 bool scheduled_; |
| 109 |
| 110 // The timeout interval (before fuzzing) for the last update check. |
| 111 int last_interval_; |
| 112 |
| 113 DISALLOW_COPY_AND_ASSIGN(UpdateCheckScheduler); |
| 114 }; |
| 115 |
| 116 } // namespace chromeos_update_engine |
| 117 |
| 118 #endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_CHECK_SCHEDULER_H__ |
OLD | NEW |