blob: ec9e1a64c9bb86f417fcd1f9202c9d85312a5da9 [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
Alex Deymo759c2752014-03-17 21:09:36 -07005#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_UPDATE_CHECK_SCHEDULER_H_
6#define CHROMEOS_PLATFORM_UPDATE_ENGINE_UPDATE_CHECK_SCHEDULER_H_
Darin Petkov1023a602010-08-30 13:47:51 -07007
8#include <base/basictypes.h>
9#include <glib.h>
10#include <gtest/gtest_prod.h> // for FRIEND_TEST
11
Jay Srinivasan43488792012-06-19 00:25:31 -070012#include "update_engine/system_state.h"
Alex Deymo7984bf02014-04-02 20:41:57 -070013#include "update_engine/update_attempter.h"
Darin Petkov1023a602010-08-30 13:47:51 -070014
15namespace chromeos_update_engine {
16
17// UpdateCheckScheduler manages the periodic background update checks. This is
18// the basic update check cycle:
19//
20// Run
21// |
22// v
23// /->ScheduleCheck
24// | |
25// | v
26// | StaticCheck (invoked through a GLib timeout source)
27// | |
28// | v
29// | UpdateAttempter::Update
30// | |
31// | v
32// | SetUpdateStatus (invoked by UpdateAttempter on state transitions)
33// | |
34// | v
35// | ScheduleNextCheck (invoked when UpdateAttempter becomes idle)
36// \---/
37class UpdateCheckScheduler {
38 public:
Gilad Arnold1ebd8132012-03-05 10:19:29 -080039 static const int kTimeoutInitialInterval;
40 static const int kTimeoutPeriodicInterval;
Darin Petkov1023a602010-08-30 13:47:51 -070041 static const int kTimeoutRegularFuzz;
Gilad Arnold1ebd8132012-03-05 10:19:29 -080042 static const int kTimeoutMaxBackoffInterval;
Darin Petkov1023a602010-08-30 13:47:51 -070043
Gilad Arnold4d740eb2012-05-15 08:48:13 -070044 UpdateCheckScheduler(UpdateAttempter* update_attempter,
Jay Srinivasan08fce042012-06-07 16:31:01 -070045 SystemState* system_state);
Darin Petkov1023a602010-08-30 13:47:51 -070046 virtual ~UpdateCheckScheduler();
47
48 // Initiates the periodic update checks, if necessary.
49 void Run();
50
Nam T. Nguyen7d623eb2014-05-13 16:06:28 -070051 // Sets the new update status. This is invoked by UpdateAttempter.
52 void SetUpdateStatus(UpdateStatus status);
Darin Petkov1023a602010-08-30 13:47:51 -070053
Darin Petkov85ced132010-09-01 10:20:56 -070054 void set_poll_interval(int interval) { poll_interval_ = interval; }
Darin Petkov1b003102010-11-30 10:18:36 -080055 int poll_interval() const { return poll_interval_; }
Darin Petkov85ced132010-09-01 10:20:56 -070056
Darin Petkov1023a602010-08-30 13:47:51 -070057 private:
58 friend class UpdateCheckSchedulerTest;
59 FRIEND_TEST(UpdateCheckSchedulerTest, CanScheduleTest);
60 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzBackoffTest);
Darin Petkov85ced132010-09-01 10:20:56 -070061 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzPollTest);
62 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzPriorityTest);
Darin Petkov1023a602010-08-30 13:47:51 -070063 FRIEND_TEST(UpdateCheckSchedulerTest, ComputeNextIntervalAndFuzzTest);
64 FRIEND_TEST(UpdateCheckSchedulerTest, GTimeoutAddSecondsTest);
Darin Petkov1023a602010-08-30 13:47:51 -070065 FRIEND_TEST(UpdateCheckSchedulerTest, RunBootDeviceRemovableTest);
66 FRIEND_TEST(UpdateCheckSchedulerTest, RunNonOfficialBuildTest);
67 FRIEND_TEST(UpdateCheckSchedulerTest, RunTest);
68 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleCheckDisabledTest);
69 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleCheckEnabledTest);
70 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleCheckNegativeIntervalTest);
71 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleNextCheckDisabledTest);
72 FRIEND_TEST(UpdateCheckSchedulerTest, ScheduleNextCheckEnabledTest);
73 FRIEND_TEST(UpdateCheckSchedulerTest, SetUpdateStatusIdleDisabledTest);
74 FRIEND_TEST(UpdateCheckSchedulerTest, SetUpdateStatusIdleEnabledTest);
75 FRIEND_TEST(UpdateCheckSchedulerTest, SetUpdateStatusNonIdleTest);
Darin Petkov2a0e6332010-09-24 14:43:41 -070076 FRIEND_TEST(UpdateCheckSchedulerTest, StaticCheckOOBECompleteTest);
77 FRIEND_TEST(UpdateCheckSchedulerTest, StaticCheckOOBENotCompleteTest);
Thieu Le116fda32011-04-19 11:01:54 -070078 FRIEND_TEST(UpdateAttempterTest, PingOmahaTest);
Darin Petkov1023a602010-08-30 13:47:51 -070079
80 // Wraps GLib's g_timeout_add_seconds so that it can be mocked in tests.
81 virtual guint GTimeoutAddSeconds(guint interval, GSourceFunc function);
82
Darin Petkov1023a602010-08-30 13:47:51 -070083 // Returns true if an update check can be scheduled. An update check should
84 // not be scheduled if periodic update checks are disabled or if one is
85 // already scheduled.
86 bool CanSchedule() { return enabled_ && !scheduled_; }
87
88 // Schedules the next periodic update check |interval| seconds from now
89 // randomized by +/- |fuzz|/2.
90 void ScheduleCheck(int interval, int fuzz);
91
92 // GLib timeout source callback. Initiates an update check through the update
93 // attempter.
94 static gboolean StaticCheck(void* scheduler);
95
Gilad Arnold1ebd8132012-03-05 10:19:29 -080096 // Schedules the next update check by setting up a timeout source;
Nam T. Nguyen7d623eb2014-05-13 16:06:28 -070097 void ScheduleNextCheck();
Darin Petkov1023a602010-08-30 13:47:51 -070098
99 // Computes the timeout interval along with its random fuzz range for the next
100 // update check by taking into account the last timeout interval as well as
Nam T. Nguyen7d623eb2014-05-13 16:06:28 -0700101 // the last update status.
102 void ComputeNextIntervalAndFuzz(int* next_interval, int* next_fuzz);
Darin Petkov1023a602010-08-30 13:47:51 -0700103
104 // The UpdateAttempter to use for update checks.
105 UpdateAttempter* update_attempter_;
106
107 // True if automatic update checks should be scheduled, false otherwise.
108 bool enabled_;
109
110 // True if there's an update check scheduled already, false otherwise.
111 bool scheduled_;
112
113 // The timeout interval (before fuzzing) for the last update check.
114 int last_interval_;
115
Darin Petkov85ced132010-09-01 10:20:56 -0700116 // Server dictated poll interval in seconds, if positive.
117 int poll_interval_;
118
Jay Srinivasan08fce042012-06-07 16:31:01 -0700119 // The external state of the system outside the update_engine process.
120 SystemState* system_state_;
121
Darin Petkov1023a602010-08-30 13:47:51 -0700122 DISALLOW_COPY_AND_ASSIGN(UpdateCheckScheduler);
123};
124
125} // namespace chromeos_update_engine
126
Alex Deymo759c2752014-03-17 21:09:36 -0700127#endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_UPDATE_CHECK_SCHEDULER_H_