1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2014 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
16c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo
1748415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold#ifndef UPDATE_ENGINE_UPDATE_MANAGER_CHROMEOS_POLICY_H_
1848415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold#define UPDATE_ENGINE_UPDATE_MANAGER_CHROMEOS_POLICY_H_
1948415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold
2048415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold#include <string>
21c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo
22f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold#include <base/time/time.h>
230d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo#include <gtest/gtest_prod.h>  // for FRIEND_TEST
240d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo
2563784a578dd26880454d70797519358a2326291bAlex Deymo#include "update_engine/update_manager/policy.h"
2663784a578dd26880454d70797519358a2326291bAlex Deymo#include "update_engine/update_manager/prng.h"
27c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo
2863784a578dd26880454d70797519358a2326291bAlex Deymonamespace chromeos_update_manager {
29c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo
30dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold// Output information from UpdateBackoffAndDownloadUrl.
31dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnoldstruct UpdateBackoffAndDownloadUrlResult {
32dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // Whether the failed attempt count (maintained by the caller) needs to be
33dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // incremented.
34dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  bool do_increment_failures;
35dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // The current backoff expiry. Null if backoff is not in effect.
36dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  base::Time backoff_expiry;
37dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // The new URL index to use and number of download errors associated with it.
38dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // Significant iff |do_increment_failures| is false and |backoff_expiry| is
39dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // null. Negative value means no usable URL was found.
40b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold  int url_idx;
41dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  int url_num_errors;
42b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold};
43b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold
44dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold// Parameters for update scattering, as returned by UpdateScattering.
45f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnoldstruct UpdateScatteringResult {
46f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  bool is_scattering;
47f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  base::TimeDelta wait_period;
48f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  int check_threshold;
49f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold};
50f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold
51c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo// ChromeOSPolicy implements the policy-related logic used in ChromeOS.
52c705cc86983dd46df4261ce692cb7558a515e282Alex Deymoclass ChromeOSPolicy : public Policy {
53c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo public:
54c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo  ChromeOSPolicy() {}
55610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo  ~ChromeOSPolicy() override {}
56c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo
57c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo  // Policy overrides.
58157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko  EvalStatus UpdateCheckAllowed(
590d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo      EvaluationContext* ec, State* state, std::string* error,
600d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo      UpdateCheckParams* result) const override;
61af2f6ae066a8117113f6ff3d112c8d00eb5d8c67Gilad Arnold
62157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko  EvalStatus UpdateCanStart(
63f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold      EvaluationContext* ec,
64f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold      State* state,
65f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold      std::string* error,
6642f253b5318dbe6d0ecf48f7f9a639363fa253e2Gilad Arnold      UpdateDownloadParams* result,
67d78caf9baf2026a356130f4754af2c504f423945Gilad Arnold      UpdateState update_state) const override;
68c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo
69157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko  EvalStatus UpdateDownloadAllowed(
700adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold      EvaluationContext* ec,
710adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold      State* state,
720adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold      std::string* error,
730adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold      bool* result) const override;
740adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold
7578ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold  EvalStatus P2PEnabled(
7678ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold      EvaluationContext* ec,
7778ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold      State* state,
7878ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold      std::string* error,
7978ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold      bool* result) const override;
8078ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold
8178ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold  EvalStatus P2PEnabledChanged(
8278ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold      EvaluationContext* ec,
8378ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold      State* state,
8478ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold      std::string* error,
8578ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold      bool* result,
8678ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold      bool prev_result) const override;
8778ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold
88b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold protected:
89b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold  // Policy override.
90157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko  std::string PolicyName() const override { return "ChromeOSPolicy"; }
91b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold
92c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo private:
9363784a578dd26880454d70797519358a2326291bAlex Deymo  friend class UmChromeOSPolicyTest;
9463784a578dd26880454d70797519358a2326291bAlex Deymo  FRIEND_TEST(UmChromeOSPolicyTest,
950d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo              FirstCheckIsAtMostInitialIntervalAfterStart);
9638b1402462bd15025a53bea993ca3d93cdf0d8deGilad Arnold  FRIEND_TEST(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz);
9738b1402462bd15025a53bea993ca3d93cdf0d8deGilad Arnold  FRIEND_TEST(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz);
98a0258a557d36ff78eacdacd39bdc88c5e6c1056eGilad Arnold  FRIEND_TEST(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval);
9963784a578dd26880454d70797519358a2326291bAlex Deymo  FRIEND_TEST(UmChromeOSPolicyTest, ExponentialBackoffIsCapped);
10063784a578dd26880454d70797519358a2326291bAlex Deymo  FRIEND_TEST(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout);
101a1eabcdc93d118146639139257c2f5ccc3ffb061Gilad Arnold  FRIEND_TEST(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE);
10263784a578dd26880454d70797519358a2326291bAlex Deymo  FRIEND_TEST(UmChromeOSPolicyTest,
103f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold              UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies);
10463784a578dd26880454d70797519358a2326291bAlex Deymo  FRIEND_TEST(UmChromeOSPolicyTest,
105f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold              UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies);
10663784a578dd26880454d70797519358a2326291bAlex Deymo  FRIEND_TEST(UmChromeOSPolicyTest,
107f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold              UpdateCanStartNotAllowedScatteringNewCountThresholdApplies);
10863784a578dd26880454d70797519358a2326291bAlex Deymo  FRIEND_TEST(UmChromeOSPolicyTest,
109f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold              UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies);
11063784a578dd26880454d70797519358a2326291bAlex Deymo  FRIEND_TEST(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied);
11163784a578dd26880454d70797519358a2326291bAlex Deymo  FRIEND_TEST(UmChromeOSPolicyTest,
112f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold              UpdateCanStartAllowedInteractivePreventsScattering);
113349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold  FRIEND_TEST(UmChromeOSPolicyTest,
11478ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold              UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts);
115349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold  FRIEND_TEST(UmChromeOSPolicyTest,
11678ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold              UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod);
117f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold
118f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  // Auxiliary constant (zero by default).
119f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  const base::TimeDelta kZeroInterval;
1200d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo
1210d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  // Default update check timeout interval/fuzz values used to compute the
1220d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  // NextUpdateCheckTime(), in seconds. Actual fuzz is within +/- half of the
1230d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  // indicated value.
124a2e8eaa743e04f9168aa7c64e88c2182d2ac4048Gilad Arnold  static const int kTimeoutInitialInterval;
125a2e8eaa743e04f9168aa7c64e88c2182d2ac4048Gilad Arnold  static const int kTimeoutPeriodicInterval;
126a2e8eaa743e04f9168aa7c64e88c2182d2ac4048Gilad Arnold  static const int kTimeoutMaxBackoffInterval;
127a2e8eaa743e04f9168aa7c64e88c2182d2ac4048Gilad Arnold  static const int kTimeoutRegularFuzz;
1280d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo
129dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // Maximum update attempt backoff interval and fuzz.
130dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  static const int kAttemptBackoffMaxIntervalInDays;
131dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  static const int kAttemptBackoffFuzzInHours;
132dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold
133349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold  // Maximum number of times we'll allow using P2P for the same update payload.
134349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold  static const int kMaxP2PAttempts;
135349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold  // Maximum period of time allowed for download a payload via P2P, in seconds.
136349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold  static const int kMaxP2PAttemptsPeriodInSeconds;
137349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold
1380d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  // A private policy implementation returning the wallclock timestamp when
1390d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  // the next update check should happen.
140a65fced5f4c2b551616b26ee90a800b44090735fGilad Arnold  // TODO(garnold) We should probably change that to infer a monotonic
141a65fced5f4c2b551616b26ee90a800b44090735fGilad Arnold  // timestamp, which will make the update check intervals more resilient to
142a65fced5f4c2b551616b26ee90a800b44090735fGilad Arnold  // clock skews. Might require switching some of the variables exported by the
143a65fced5f4c2b551616b26ee90a800b44090735fGilad Arnold  // UpdaterProvider to report monotonic time, as well.
1440d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  EvalStatus NextUpdateCheckTime(EvaluationContext* ec, State* state,
1450d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo                                 std::string* error,
1460d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo                                 base::Time* next_update_check) const;
1470d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo
1480d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  // Returns a TimeDelta based on the provided |interval| seconds +/- half
1490d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  // |fuzz| seconds. The return value is guaranteed to be a non-negative
1500d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  // TimeDelta.
1510d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo  static base::TimeDelta FuzzedInterval(PRNG* prng, int interval, int fuzz);
1520d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo
153dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // A private policy for determining backoff and the download URL to use.
154dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // Within |update_state|, |backoff_expiry| and |is_backoff_disabled| are used
155dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // for determining whether backoff is still in effect; if not,
156dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // |download_errors| is scanned past |failures_last_updated|, and a new
157dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // download URL from |download_urls| is found and written to |result->url_idx|
158dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // (-1 means no usable URL exists); |download_errors_max| determines the
159dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // maximum number of attempts per URL, according to the Omaha response. If an
160dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // update failure is identified then |result->do_increment_failures| is set to
161dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // true; if backoff is enabled, a new backoff period is computed (from the
162dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // time of failure) based on |num_failures|. Otherwise, backoff expiry is
163dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // nullified, indicating that no backoff is in effect.
164dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  //
165dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // If backing off but the previous backoff expiry is unchanged, returns
166dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // |EvalStatus::kAskMeAgainLater|. Otherwise:
167dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  //
168dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // * If backing off with a new expiry time, then |result->backoff_expiry| is
169dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  //   set to this time.
170b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold  //
171dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // * Else, |result->backoff_expiry| is set to null, indicating that no backoff
172dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  //   is in effect.
173dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  //
174dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // In any of these cases, returns |EvalStatus::kSucceeded|. If an error
175dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  // occurred, returns |EvalStatus::kFailed|.
176dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  EvalStatus UpdateBackoffAndDownloadUrl(
177dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold      EvaluationContext* ec, State* state, std::string* error,
178dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold      UpdateBackoffAndDownloadUrlResult* result,
179dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold      const UpdateState& update_state) const;
180b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold
181f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  // A private policy for checking whether scattering is due. Writes in |result|
182f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  // the decision as to whether or not to scatter; a wallclock-based scatter
183f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  // wait period, which ranges from zero (do not wait) and no greater than the
184f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  // current scatter factor provided by the device policy (if available) or the
185f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  // maximum wait period determined by Omaha; and an update check-based
186f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  // threshold between zero (no threshold) and the maximum number determined by
187b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold  // the update engine. Within |update_state|, |scatter_wait_period| should
188b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold  // contain the last scattering period returned by this function, or zero if no
189b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold  // wait period is known; |scatter_check_threshold| is the last update check
190b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold  // threshold, or zero if no such threshold is known. If not scattering, or if
191b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold  // any of the scattering values has changed, returns |EvalStatus::kSucceeded|;
192b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold  // otherwise, |EvalStatus::kAskMeAgainLater|.
193f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold  EvalStatus UpdateScattering(EvaluationContext* ec, State* state,
194f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold                              std::string* error,
195f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold                              UpdateScatteringResult* result,
196f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold                              const UpdateState& update_state) const;
197f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold
198c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo  DISALLOW_COPY_AND_ASSIGN(ChromeOSPolicy);
199c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo};
200c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo
20163784a578dd26880454d70797519358a2326291bAlex Deymo}  // namespace chromeos_update_manager
202c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo
20348415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold#endif  // UPDATE_ENGINE_UPDATE_MANAGER_CHROMEOS_POLICY_H_
204