blob: 2cd21d422033f46580d7b7dffe1ecbfea7669320 [file] [log] [blame]
Alex Deymoc705cc82014-02-19 11:15:00 -08001// Copyright (c) 2014 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
Gilad Arnold48415f12014-06-27 07:10:58 -07005#ifndef UPDATE_ENGINE_UPDATE_MANAGER_UPDATE_MANAGER_H_
6#define UPDATE_ENGINE_UPDATE_MANAGER_UPDATE_MANAGER_H_
7
8#include <string>
Alex Deymoc705cc82014-02-19 11:15:00 -08009
Alex Deymo7b948f02014-03-10 17:01:10 -070010#include <base/callback.h>
11#include <base/memory/ref_counted.h>
Alex Deymoc705cc82014-02-19 11:15:00 -080012#include <base/memory/scoped_ptr.h>
Gilad Arnoldb2271992014-06-19 12:35:24 -070013#include <base/time/time.h>
Alex Deymoc705cc82014-02-19 11:15:00 -080014
Alex Deymo41a75a72014-04-15 15:36:22 -070015#include "update_engine/clock_interface.h"
Alex Deymo63784a52014-05-28 10:46:14 -070016#include "update_engine/update_manager/default_policy.h"
17#include "update_engine/update_manager/policy.h"
18#include "update_engine/update_manager/state.h"
Alex Deymoc705cc82014-02-19 11:15:00 -080019
Alex Deymo63784a52014-05-28 10:46:14 -070020namespace chromeos_update_manager {
Alex Deymoc705cc82014-02-19 11:15:00 -080021
Alex Deymo63784a52014-05-28 10:46:14 -070022// The main Update Manager singleton class.
23class UpdateManager {
Alex Deymoc705cc82014-02-19 11:15:00 -080024 public:
Alex Deymo63784a52014-05-28 10:46:14 -070025 // Creates the UpdateManager instance, assuming ownership on the provided
Alex Deymo680d0222014-04-24 21:00:08 -070026 // |state|.
Alex Deymo63784a52014-05-28 10:46:14 -070027 UpdateManager(chromeos_update_engine::ClockInterface* clock,
Gilad Arnoldfd45a732014-08-07 15:53:46 -070028 base::TimeDelta evaluation_timeout,
29 base::TimeDelta expiration_timeout, State* state);
Alex Deymoc705cc82014-02-19 11:15:00 -080030
Alex Deymo63784a52014-05-28 10:46:14 -070031 virtual ~UpdateManager() {}
Alex Deymoc705cc82014-02-19 11:15:00 -080032
33 // PolicyRequest() evaluates the given policy with the provided arguments and
34 // returns the result. The |policy_method| is the pointer-to-method of the
Alex Deymo63784a52014-05-28 10:46:14 -070035 // Policy class for the policy request to call. The UpdateManager will call
Alex Deymoc705cc82014-02-19 11:15:00 -080036 // this method on the right policy. The pointer |result| must not be NULL and
37 // the remaining |args| depend on the arguments required by the passed
38 // |policy_method|.
39 //
40 // When the policy request succeeds, the |result| is set and the method
Gilad Arnold897b5e52014-05-21 09:37:18 -070041 // returns EvalStatus::kSucceeded, otherwise, the |result| may not be set. A
42 // policy called with this method should not block (i.e. return
43 // EvalStatus::kAskMeAgainLater), which is considered a programming error. On
44 // failure, EvalStatus::kFailed is returned.
Alex Deymoc705cc82014-02-19 11:15:00 -080045 //
46 // An example call to this method is:
Alex Deymo63784a52014-05-28 10:46:14 -070047 // um.PolicyRequest(&Policy::SomePolicyMethod, &bool_result, arg1, arg2);
Gilad Arnold13a82432014-05-19 12:52:44 -070048 template<typename R, typename... ActualArgs, typename... ExpectedArgs>
Alex Deymoe75e0252014-04-08 14:00:11 -070049 EvalStatus PolicyRequest(
Gilad Arnold13a82432014-05-19 12:52:44 -070050 EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
51 std::string*, R*,
52 ExpectedArgs...) const,
53 R* result, ActualArgs...);
Alex Deymoc705cc82014-02-19 11:15:00 -080054
Alex Deymo7b948f02014-03-10 17:01:10 -070055 // Evaluates the given |policy_method| policy with the provided |args|
56 // arguments and calls the |callback| callback with the result when done.
57 //
58 // If the policy implementation should block, returning a
Alex Deymo63784a52014-05-28 10:46:14 -070059 // EvalStatus::kAskMeAgainLater status the Update Manager will re-evaluate the
Alex Deymo53556ec2014-03-17 10:05:57 -070060 // policy until another status is returned. If the policy implementation based
61 // its return value solely on const variables, the callback will be called
Gilad Arnoldfd45a732014-08-07 15:53:46 -070062 // with the EvalStatus::kAskMeAgainLater status (which indicates an error).
Gilad Arnold13a82432014-05-19 12:52:44 -070063 template<typename R, typename... ActualArgs, typename... ExpectedArgs>
Alex Deymo7b948f02014-03-10 17:01:10 -070064 void AsyncPolicyRequest(
65 base::Callback<void(EvalStatus, const R& result)> callback,
Gilad Arnold13a82432014-05-19 12:52:44 -070066 EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
67 std::string*, R*,
68 ExpectedArgs...) const,
69 ActualArgs... args);
Alex Deymo7b948f02014-03-10 17:01:10 -070070
Alex Deymo94c06162014-03-21 20:34:46 -070071 protected:
Alex Deymo63784a52014-05-28 10:46:14 -070072 // The UpdateManager receives ownership of the passed Policy instance.
Alex Deymo94c06162014-03-21 20:34:46 -070073 void set_policy(const Policy* policy) {
74 policy_.reset(policy);
75 }
76
Alex Deymo680d0222014-04-24 21:00:08 -070077 // State getter used for testing.
78 State* state() { return state_.get(); }
79
Alex Deymoc705cc82014-02-19 11:15:00 -080080 private:
Alex Deymo63784a52014-05-28 10:46:14 -070081 FRIEND_TEST(UmUpdateManagerTest, PolicyRequestCallsPolicy);
82 FRIEND_TEST(UmUpdateManagerTest, PolicyRequestCallsDefaultOnError);
Gilad Arnold897b5e52014-05-21 09:37:18 -070083 FRIEND_TEST(UmUpdateManagerTest, PolicyRequestDoesntBlockDeathTest);
Alex Deymo63784a52014-05-28 10:46:14 -070084 FRIEND_TEST(UmUpdateManagerTest, AsyncPolicyRequestDelaysEvaluation);
Gilad Arnoldfd45a732014-08-07 15:53:46 -070085 FRIEND_TEST(UmUpdateManagerTest, AsyncPolicyRequestTimeoutDoesNotFire);
Gilad Arnoldf9f85d62014-06-19 18:07:01 -070086 FRIEND_TEST(UmUpdateManagerTest, AsyncPolicyRequestTimesOut);
Alex Deymo7b948f02014-03-10 17:01:10 -070087
Alex Deymo7b948f02014-03-10 17:01:10 -070088 // EvaluatePolicy() evaluates the passed |policy_method| method on the current
89 // policy with the given |args| arguments. If the method fails, the default
90 // policy is used instead.
Alex Deymoe75e0252014-04-08 14:00:11 -070091 template<typename R, typename... Args>
92 EvalStatus EvaluatePolicy(
93 EvaluationContext* ec,
Gilad Arnold13a82432014-05-19 12:52:44 -070094 EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
95 std::string*, R*,
96 Args...) const,
Alex Deymoe75e0252014-04-08 14:00:11 -070097 R* result, Args... args);
Alex Deymo7b948f02014-03-10 17:01:10 -070098
99 // OnPolicyReadyToEvaluate() is called by the main loop when the evaluation
100 // of the given |policy_method| should be executed. If the evaluation finishes
101 // the |callback| callback is called passing the |result| and the |status|
102 // returned by the policy. If the evaluation returns an
103 // EvalStatus::kAskMeAgainLater state, the |callback| will NOT be called and
104 // the evaluation will be re-scheduled to be called later.
Alex Deymoe75e0252014-04-08 14:00:11 -0700105 template<typename R, typename... Args>
Alex Deymo7b948f02014-03-10 17:01:10 -0700106 void OnPolicyReadyToEvaluate(
107 scoped_refptr<EvaluationContext> ec,
108 base::Callback<void(EvalStatus status, const R& result)> callback,
Gilad Arnold13a82432014-05-19 12:52:44 -0700109 EvalStatus (Policy::*policy_method)(EvaluationContext*, State*,
110 std::string*, R*,
111 Args...) const,
Alex Deymoe75e0252014-04-08 14:00:11 -0700112 Args... args);
Alex Deymoc705cc82014-02-19 11:15:00 -0800113
Alex Deymo63784a52014-05-28 10:46:14 -0700114 // The policy used by the UpdateManager. Note that since it is a const Policy,
Alex Deymoc705cc82014-02-19 11:15:00 -0800115 // policy implementations are not allowed to persist state on this class.
116 scoped_ptr<const Policy> policy_;
117
118 // A safe default value to the current policy. This policy is used whenever
Alex Deymoe636c3c2014-03-11 19:02:08 -0700119 // a policy implementation fails with EvalStatus::kFailed.
Alex Deymoc705cc82014-02-19 11:15:00 -0800120 const DefaultPolicy default_policy_;
121
Alex Deymo2de23f52014-02-26 14:30:13 -0800122 // State Providers.
123 scoped_ptr<State> state_;
Alex Deymoc705cc82014-02-19 11:15:00 -0800124
Alex Deymo41a75a72014-04-15 15:36:22 -0700125 // Pointer to the mockable clock interface;
126 chromeos_update_engine::ClockInterface* clock_;
127
Gilad Arnoldb2271992014-06-19 12:35:24 -0700128 // Timeout for a policy evaluation.
129 const base::TimeDelta evaluation_timeout_;
130
Gilad Arnoldfd45a732014-08-07 15:53:46 -0700131 // Timeout for expiration of the evaluation context, used for async requests.
132 const base::TimeDelta expiration_timeout_;
133
Alex Deymo63784a52014-05-28 10:46:14 -0700134 DISALLOW_COPY_AND_ASSIGN(UpdateManager);
Alex Deymoc705cc82014-02-19 11:15:00 -0800135};
136
Alex Deymo63784a52014-05-28 10:46:14 -0700137} // namespace chromeos_update_manager
Alex Deymoc705cc82014-02-19 11:15:00 -0800138
139// Include the implementation of the template methods.
Alex Deymo63784a52014-05-28 10:46:14 -0700140#include "update_engine/update_manager/update_manager-inl.h"
Alex Deymoc705cc82014-02-19 11:15:00 -0800141
Gilad Arnold48415f12014-06-27 07:10:58 -0700142#endif // UPDATE_ENGINE_UPDATE_MANAGER_UPDATE_MANAGER_H_