update_engine: Template specialized UpdateManager interface for mockability
This change is to create an interface that is for testing
|UpdateManager|. Currently the |UpdateMaanger| exists by having two main
member functions that are templatized allowing for a generic set of
policy methods to be passed in taking a abitrary set of arguments. The
downside of this design is the difficulty when testing such a class.
Next steps are to refactor |Policy| and |UpdateManager| to exist
together without the need for templatized member function within
|UpdateManager| as the whole set of policy methods that can be passed in
are already determined (UpdateCheckAllowed, UpdateCanBeApplied,
UpdateCanStart, UpdateDownloadAllowed, P2PEnabled, P2PEnabledChanged).
The issue is that these functions each take a different set of arguments
and can probably be combined into one generic set of arguments making
the |UpdateManager| much simpler to manage.
BUG=chromium:924165
TEST=unittests
TEST=FEATURES="test" emerge-${BOARD} update_engine
Change-Id: Ia8091495079f9324bccf5e717d5f26ea7ef24514
diff --git a/update_manager/update_manager.h b/update_manager/update_manager.h
index b0fd97f..732175f 100644
--- a/update_manager/update_manager.h
+++ b/update_manager/update_manager.h
@@ -42,8 +42,27 @@
}
};
+// Please do not move this class into a new file for simplicity.
+// This pure virtual class is purely created for purpose of testing. The reason
+// was that |UpdateManager|'s member functions are templatized, which does not
+// play nicely when testing (mocking + faking). Whenever a specialized member of
+// |UpdateManager| must be tested, please add a specialized template member
+// function within this class for testing.
+class SpecializedPolicyRequestInterface {
+ public:
+ virtual ~SpecializedPolicyRequestInterface() = default;
+
+ virtual void AsyncPolicyRequestUpdateCheckAllowed(
+ base::Callback<void(EvalStatus, const UpdateCheckParams& result)>
+ callback,
+ EvalStatus (Policy::*policy_method)(EvaluationContext*,
+ State*,
+ std::string*,
+ UpdateCheckParams*) const) = 0;
+};
+
// The main Update Manager singleton class.
-class UpdateManager {
+class UpdateManager : public SpecializedPolicyRequestInterface {
public:
// Creates the UpdateManager instance, assuming ownership on the provided
// |state|.
@@ -91,6 +110,14 @@
EvaluationContext*, State*, std::string*, R*, ExpectedArgs...) const,
ActualArgs... args);
+ void AsyncPolicyRequestUpdateCheckAllowed(
+ base::Callback<void(EvalStatus, const UpdateCheckParams& result)>
+ callback,
+ EvalStatus (Policy::*policy_method)(EvaluationContext*,
+ State*,
+ std::string*,
+ UpdateCheckParams*) const) override;
+
protected:
// The UpdateManager receives ownership of the passed Policy instance.
void set_policy(const Policy* policy) { policy_.reset(policy); }