blob: e3158ed5e2395303bc83f6c2a30a9b8cc82b9908 [file] [log] [blame]
Darin Petkov1023a602010-08-30 13:47:51 -07001// 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
14namespace 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// \---/
36class 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
Darin Petkov85ced132010-09-01 10:20:56 -070052 void set_poll_interval(int interval) { poll_interval_ = interval; }
53
Darin Petkov1023a602010-08-30 13:47:51 -070054 private:
55 friend class UpdateCheckSchedulerTest;
56 FRIEND_TEST(UpdateCheckSchedulerTest, CanScheduleTest);
57 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzBackoffTest);
Darin Petkov85ced132010-09-01 10:20:56 -070058 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzPollTest);
59 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzPriorityTest);
Darin Petkov1023a602010-08-30 13:47:51 -070060 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzTest);
61 FRIEND_TEST(UpdateCheckSchedulerTest, GTimeoutAddSecondsTest);
62 FRIEND_TEST(UpdateCheckSchedulerTest, IsBootDeviceRemovableTest);
63 FRIEND_TEST(UpdateCheckSchedulerTest, IsOfficialBuildTest);
64 FRIEND_TEST(UpdateCheckSchedulerTest, RunBootDeviceRemovableTest);
65 FRIEND_TEST(UpdateCheckSchedulerTest, RunNonOfficialBuildTest);
66 FRIEND_TEST(UpdateCheckSchedulerTest, RunTest);
67 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleCheckDisabledTest);
68 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleCheckEnabledTest);
69 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleCheckNegativeIntervalTest);
70 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleNextCheckDisabledTest);
71 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleNextCheckEnabledTest);
72 FRIEND_TEST(UpdateCheckSchedulerTest, SetUpdateStatusIdleDisabledTest);
73 FRIEND_TEST(UpdateCheckSchedulerTest, SetUpdateStatusIdleEnabledTest);
74 FRIEND_TEST(UpdateCheckSchedulerTest, SetUpdateStatusNonIdleTest);
75 FRIEND_TEST(UpdateCheckSchedulerTest, StaticCheckTest);
76
77 // Wraps GLib's g_timeout_add_seconds so that it can be mocked in tests.
78 virtual guint GTimeoutAddSeconds(guint interval, GSourceFunc function);
79
80 // Wrappers for utils functions so that they can be mocked in tests.
81 virtual bool IsBootDeviceRemovable();
82 virtual bool IsOfficialBuild();
83
84 // Returns true if an update check can be scheduled. An update check should
85 // not be scheduled if periodic update checks are disabled or if one is
86 // already scheduled.
87 bool CanSchedule() { return enabled_ && !scheduled_; }
88
89 // Schedules the next periodic update check |interval| seconds from now
90 // randomized by +/- |fuzz|/2.
91 void ScheduleCheck(int interval, int fuzz);
92
93 // GLib timeout source callback. Initiates an update check through the update
94 // attempter.
95 static gboolean StaticCheck(void* scheduler);
96
97 // Schedules the next update check by setting up a timeout source.
98 void ScheduleNextCheck();
99
100 // Computes the timeout interval along with its random fuzz range for the next
101 // update check by taking into account the last timeout interval as well as
102 // the last update status.
103 void ComputeNextIntervalAndFuzz(int* next_interval, int* next_fuzz);
104
105 // The UpdateAttempter to use for update checks.
106 UpdateAttempter* update_attempter_;
107
108 // True if automatic update checks should be scheduled, false otherwise.
109 bool enabled_;
110
111 // True if there's an update check scheduled already, false otherwise.
112 bool scheduled_;
113
114 // The timeout interval (before fuzzing) for the last update check.
115 int last_interval_;
116
Darin Petkov85ced132010-09-01 10:20:56 -0700117 // Server dictated poll interval in seconds, if positive.
118 int poll_interval_;
119
Darin Petkov1023a602010-08-30 13:47:51 -0700120 DISALLOW_COPY_AND_ASSIGN(UpdateCheckScheduler);
121};
122
123} // namespace chromeos_update_engine
124
125#endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_CHECK_SCHEDULER_H__