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 17aab50e31f0b80ed53a9b8d5dbabcf943974bd32cAlex Deymo#include "update_engine/update_manager/update_manager.h" 18aab50e31f0b80ed53a9b8d5dbabcf943974bd32cAlex Deymo 19f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold#include <unistd.h> 20f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 217b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo#include <algorithm> 2202f7c1dee242f490143791dbb73fa23fa3007cfaBen Chan#include <memory> 237b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo#include <string> 24dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold#include <tuple> 2594c0616c9f81b65154953ac31e488cc87191e17cAlex Deymo#include <utility> 267b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo#include <vector> 277b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo 287b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo#include <base/bind.h> 29509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo#include <base/test/simple_test_clock.h> 30f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold#include <base/time/time.h> 313f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/fake_message_loop.h> 323f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/message_loop.h> 333f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/message_loop_utils.h> 34c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo#include <gmock/gmock.h> 351f01291c91ba75102868a76c826a6318f55fb098Alex Deymo#include <gtest/gtest.h> 36c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 3739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/fake_clock.h" 3863784a578dd26880454d70797519358a2326291bAlex Deymo#include "update_engine/update_manager/default_policy.h" 3963784a578dd26880454d70797519358a2326291bAlex Deymo#include "update_engine/update_manager/fake_state.h" 4063784a578dd26880454d70797519358a2326291bAlex Deymo#include "update_engine/update_manager/mock_policy.h" 4163784a578dd26880454d70797519358a2326291bAlex Deymo#include "update_engine/update_manager/umtest_utils.h" 42c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 437b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymousing base::Bind; 447b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymousing base::Callback; 45f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnoldusing base::Time; 46f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnoldusing base::TimeDelta; 473f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenkousing brillo::MessageLoop; 483f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenkousing brillo::MessageLoopRunMaxIterations; 49b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnoldusing chromeos_update_engine::ErrorCode; 5041a75a7ca3f0252f2c9f991dd465aa332e7ce4d1Alex Deymousing chromeos_update_engine::FakeClock; 517b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymousing std::pair; 52c705cc86983dd46df4261ce692cb7558a515e282Alex Deymousing std::string; 53dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnoldusing std::tuple; 5402f7c1dee242f490143791dbb73fa23fa3007cfaBen Chanusing std::unique_ptr; 557b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymousing std::vector; 565ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 57f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnoldnamespace { 58f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold 59f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold// Generates a fixed timestamp for use in faking the current time. 60f62a4b81b66dfcb848191efe8470646a0c986f08Gilad ArnoldTime FixedTime() { 61f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold Time::Exploded now_exp; 62f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold now_exp.year = 2014; 63f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold now_exp.month = 3; 64f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold now_exp.day_of_week = 2; 65f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold now_exp.day_of_month = 18; 66f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold now_exp.hour = 8; 67f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold now_exp.minute = 5; 68f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold now_exp.second = 33; 69f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold now_exp.millisecond = 675; 70a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli Time time; 71a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli ignore_result(Time::FromLocalExploded(now_exp, &time)); 72a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli return time; 73f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold} 74f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold 75f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold} // namespace 76f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold 7763784a578dd26880454d70797519358a2326291bAlex Deymonamespace chromeos_update_manager { 78c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 7963784a578dd26880454d70797519358a2326291bAlex Deymoclass UmUpdateManagerTest : public ::testing::Test { 80c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo protected: 81157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko void SetUp() override { 82509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo loop_.SetAsCurrent(); 8342c30c376cb7b0b459ff0cbf3ac23fe87ea64f4dAlex Deymo fake_state_ = new FakeState(); 84b227199133f2d694414293697c67599a761f23beGilad Arnold umut_.reset(new UpdateManager(&fake_clock_, TimeDelta::FromSeconds(5), 85fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold TimeDelta::FromSeconds(1), fake_state_)); 86c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo } 87c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 88509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo void TearDown() override { 89509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo EXPECT_FALSE(loop_.PendingTasks()); 90509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo } 91509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo 92509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo base::SimpleTestClock test_clock_; 933f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko brillo::FakeMessageLoop loop_{&test_clock_}; 9463784a578dd26880454d70797519358a2326291bAlex Deymo FakeState* fake_state_; // Owned by the umut_. 9541a75a7ca3f0252f2c9f991dd465aa332e7ce4d1Alex Deymo FakeClock fake_clock_; 9602f7c1dee242f490143791dbb73fa23fa3007cfaBen Chan unique_ptr<UpdateManager> umut_; 97c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo}; 98c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 99c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo// The FailingPolicy implements a single method and make it always fail. This 100c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo// class extends the DefaultPolicy class to allow extensions of the Policy 101c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo// class without extending nor changing this test. 102c705cc86983dd46df4261ce692cb7558a515e282Alex Deymoclass FailingPolicy : public DefaultPolicy { 103f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold public: 104f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold explicit FailingPolicy(int* num_called_p) : num_called_p_(num_called_p) {} 105f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold FailingPolicy() : FailingPolicy(nullptr) {} 106157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko EvalStatus UpdateCheckAllowed(EvaluationContext* ec, State* state, 107157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko string* error, 108157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko UpdateCheckParams* result) const override { 109f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold if (num_called_p_) 110f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold (*num_called_p_)++; 111c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo *error = "FailingPolicy failed."; 112e636c3cccaae066a7c9e65d0e4dd69699b3c6d82Alex Deymo return EvalStatus::kFailed; 113c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo } 114f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 115f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold protected: 116f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo string PolicyName() const override { return "FailingPolicy"; } 117f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 118f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold private: 119f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold int* num_called_p_; 120c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo}; 121c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 1227b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo// The LazyPolicy always returns EvalStatus::kAskMeAgainLater. 123c705cc86983dd46df4261ce692cb7558a515e282Alex Deymoclass LazyPolicy : public DefaultPolicy { 124157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko EvalStatus UpdateCheckAllowed(EvaluationContext* ec, State* state, 125157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko string* error, 126157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko UpdateCheckParams* result) const override { 127e636c3cccaae066a7c9e65d0e4dd69699b3c6d82Alex Deymo return EvalStatus::kAskMeAgainLater; 128c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo } 129f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 130f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold protected: 131f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo string PolicyName() const override { return "LazyPolicy"; } 132f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold}; 133f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 134fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold// A policy that sleeps for a predetermined amount of time, then checks for a 135fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold// wallclock-based time threshold (if given) and returns 136fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold// EvalStatus::kAskMeAgainLater if not passed; otherwise, returns 137fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold// EvalStatus::kSucceeded. Increments a counter every time it is being queried, 138fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold// if a pointer to it is provided. 139f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnoldclass DelayPolicy : public DefaultPolicy { 140f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold public: 141fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold DelayPolicy(int sleep_secs, Time time_threshold, int* num_called_p) 142f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold : sleep_secs_(sleep_secs), time_threshold_(time_threshold), 143f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold num_called_p_(num_called_p) {} 144157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko EvalStatus UpdateCheckAllowed(EvaluationContext* ec, State* state, 145157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko string* error, 146157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko UpdateCheckParams* result) const override { 147f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold if (num_called_p_) 148f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold (*num_called_p_)++; 149fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold 150fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // Sleep for a predetermined amount of time. 151fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold if (sleep_secs_ > 0) 152fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold sleep(sleep_secs_); 153fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold 154fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // Check for a time threshold. This can be used to ensure that the policy 155fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // has some non-constant dependency. 156fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold if (time_threshold_ < Time::Max() && 157fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold ec->IsWallclockTimeGreaterThan(time_threshold_)) 158fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold return EvalStatus::kSucceeded; 159fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold 160f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold return EvalStatus::kAskMeAgainLater; 161f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold } 162f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 163f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold protected: 164f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo string PolicyName() const override { return "DelayPolicy"; } 165f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 166f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold private: 167f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold int sleep_secs_; 168fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold Time time_threshold_; 169f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold int* num_called_p_; 170c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo}; 171c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 1727b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo// AccumulateCallsCallback() adds to the passed |acc| accumulator vector pairs 1737b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo// of EvalStatus and T instances. This allows to create a callback that keeps 1747b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo// track of when it is called and the arguments passed to it, to be used with 17563784a578dd26880454d70797519358a2326291bAlex Deymo// the UpdateManager::AsyncPolicyRequest(). 1767b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymotemplate<typename T> 1777b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymostatic void AccumulateCallsCallback(vector<pair<EvalStatus, T>>* acc, 1787b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo EvalStatus status, const T& result) { 1797b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo acc->push_back(std::make_pair(status, result)); 1807b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo} 1817b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo 1820d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo// Tests that policy requests are completed successfully. It is important that 1830d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo// this tests cover all policy requests as defined in Policy. 18463784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmUpdateManagerTest, PolicyRequestCallUpdateCheckAllowed) { 1850d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo UpdateCheckParams result; 18663784a578dd26880454d70797519358a2326291bAlex Deymo EXPECT_EQ(EvalStatus::kSucceeded, umut_->PolicyRequest( 1870d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo &Policy::UpdateCheckAllowed, &result)); 188c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo} 189c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 19063784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmUpdateManagerTest, PolicyRequestCallUpdateCanStart) { 191dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold UpdateState update_state = UpdateState(); 192dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.is_interactive = true; 193dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.is_delta_payload = false; 194dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.first_seen = FixedTime(); 195dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.num_checks = 1; 196dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.num_failures = 0; 197dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.failures_last_updated = Time(); 198dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.download_urls = vector<string>{"http://fake/url/"}; 199dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.download_errors_max = 10; 20078ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold update_state.p2p_downloading_disabled = false; 20178ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold update_state.p2p_sharing_disabled = false; 202349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold update_state.p2p_num_attempts = 0; 203349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold update_state.p2p_first_attempted = Time(); 204dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.last_download_url_idx = -1; 205dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.last_download_url_num_errors = 0; 206dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.download_errors = vector<tuple<int, ErrorCode, Time>>(); 207dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.backoff_expiry = Time(); 208dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.is_backoff_disabled = false; 209dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.scatter_wait_period = TimeDelta::FromSeconds(15); 210dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.scatter_check_threshold = 4; 211dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.scatter_wait_period_max = TimeDelta::FromSeconds(60); 212dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.scatter_check_threshold_min = 2; 213dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold update_state.scatter_check_threshold_max = 8; 214dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold 21542f253b5318dbe6d0ecf48f7f9a639363fa253e2Gilad Arnold UpdateDownloadParams result; 216f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold EXPECT_EQ(EvalStatus::kSucceeded, 217dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold umut_->PolicyRequest(&Policy::UpdateCanStart, &result, 218f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold update_state)); 219f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold} 220f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold 22163784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmUpdateManagerTest, PolicyRequestCallsDefaultOnError) { 22263784a578dd26880454d70797519358a2326291bAlex Deymo umut_->set_policy(new FailingPolicy()); 223c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 224c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo // Tests that the DefaultPolicy instance is called when the method fails, 225c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo // which will set this as true. 2260d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo UpdateCheckParams result; 2270d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo result.updates_enabled = false; 22863784a578dd26880454d70797519358a2326291bAlex Deymo EvalStatus status = umut_->PolicyRequest( 229680d022b08b1368ddbea970a75ebff7c642f2621Alex Deymo &Policy::UpdateCheckAllowed, &result); 230af2f6ae066a8117113f6ff3d112c8d00eb5d8c67Gilad Arnold EXPECT_EQ(EvalStatus::kSucceeded, status); 2310d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo EXPECT_TRUE(result.updates_enabled); 232c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo} 233c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 234897b5e592cf64e3c04ed1151d19ce5cd51a90592Gilad Arnold// This test only applies to debug builds where DCHECK is enabled. 235897b5e592cf64e3c04ed1151d19ce5cd51a90592Gilad Arnold#if DCHECK_IS_ON 236897b5e592cf64e3c04ed1151d19ce5cd51a90592Gilad ArnoldTEST_F(UmUpdateManagerTest, PolicyRequestDoesntBlockDeathTest) { 237897b5e592cf64e3c04ed1151d19ce5cd51a90592Gilad Arnold // The update manager should die (DCHECK) if a policy called synchronously 238897b5e592cf64e3c04ed1151d19ce5cd51a90592Gilad Arnold // returns a kAskMeAgainLater value. 2390d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo UpdateCheckParams result; 24063784a578dd26880454d70797519358a2326291bAlex Deymo umut_->set_policy(new LazyPolicy()); 241897b5e592cf64e3c04ed1151d19ce5cd51a90592Gilad Arnold EXPECT_DEATH(umut_->PolicyRequest(&Policy::UpdateCheckAllowed, &result), ""); 242c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo} 243897b5e592cf64e3c04ed1151d19ce5cd51a90592Gilad Arnold#endif // DCHECK_IS_ON 244c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 24563784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmUpdateManagerTest, AsyncPolicyRequestDelaysEvaluation) { 2467b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo // To avoid differences in code execution order between an AsyncPolicyRequest 2477b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo // call on a policy that returns AskMeAgainLater the first time and one that 2487b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo // succeeds the first time, we ensure that the passed callback is called from 2497b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo // the main loop in both cases even when we could evaluate it right now. 25063784a578dd26880454d70797519358a2326291bAlex Deymo umut_->set_policy(new FailingPolicy()); 2517b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo 2520d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo vector<pair<EvalStatus, UpdateCheckParams>> calls; 25344dc3bfd45eaddc1e7b586f8839babe4540418b5Gilad Arnold Callback<void(EvalStatus, const UpdateCheckParams&)> callback = Bind( 25444dc3bfd45eaddc1e7b586f8839babe4540418b5Gilad Arnold AccumulateCallsCallback<UpdateCheckParams>, &calls); 2557b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo 256fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold umut_->AsyncPolicyRequest(callback, &Policy::UpdateCheckAllowed); 2577b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo // The callback should wait until we run the main loop for it to be executed. 25880f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, calls.size()); 259509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo MessageLoopRunMaxIterations(MessageLoop::current(), 100); 26080f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, calls.size()); 2617b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo} 2627b948f060281eb1f9ab198bce67da5aadf03df60Alex Deymo 263fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad ArnoldTEST_F(UmUpdateManagerTest, AsyncPolicyRequestTimeoutDoesNotFire) { 264f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold // Set up an async policy call to return immediately, then wait a little and 265f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold // ensure that the timeout event does not fire. 266f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold int num_called = 0; 267f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold umut_->set_policy(new FailingPolicy(&num_called)); 268f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 269f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold vector<pair<EvalStatus, UpdateCheckParams>> calls; 270f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold Callback<void(EvalStatus, const UpdateCheckParams&)> callback = 271f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold Bind(AccumulateCallsCallback<UpdateCheckParams>, &calls); 272f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 273fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold umut_->AsyncPolicyRequest(callback, &Policy::UpdateCheckAllowed); 274f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold // Run the main loop, ensure that policy was attempted once before deferring 275f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold // to the default. 276509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo MessageLoopRunMaxIterations(MessageLoop::current(), 100); 277f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold EXPECT_EQ(1, num_called); 27880f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo ASSERT_EQ(1U, calls.size()); 279f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold EXPECT_EQ(EvalStatus::kSucceeded, calls[0].first); 280f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold // Wait for the timeout to expire, run the main loop again, ensure that 281f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold // nothing happened. 282509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo test_clock_.Advance(TimeDelta::FromSeconds(2)); 283509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo MessageLoopRunMaxIterations(MessageLoop::current(), 10); 284f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold EXPECT_EQ(1, num_called); 28580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, calls.size()); 286f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold} 287f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 288f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad ArnoldTEST_F(UmUpdateManagerTest, AsyncPolicyRequestTimesOut) { 289fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // Set up an async policy call to exceed its expiration timeout, make sure 290fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // that the default policy was not used (no callback) and that evaluation is 291fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // reattempted. 292f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold int num_called = 0; 293f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold umut_->set_policy(new DelayPolicy( 294fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold 0, fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(3), 295f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold &num_called)); 296f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 297f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold vector<pair<EvalStatus, UpdateCheckParams>> calls; 298f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold Callback<void(EvalStatus, const UpdateCheckParams&)> callback = 299f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold Bind(AccumulateCallsCallback<UpdateCheckParams>, &calls); 300f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 301fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold umut_->AsyncPolicyRequest(callback, &Policy::UpdateCheckAllowed); 302f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold // Run the main loop, ensure that policy was attempted once but the callback 303f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold // was not invoked. 304509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo MessageLoopRunMaxIterations(MessageLoop::current(), 100); 305f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold EXPECT_EQ(1, num_called); 30680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, calls.size()); 307fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // Wait for the expiration timeout to expire, run the main loop again, 308fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // ensure that reevaluation occurred but callback was not invoked (i.e. 309fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // default policy was not consulted). 310509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo test_clock_.Advance(TimeDelta::FromSeconds(2)); 311fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold fake_clock_.SetWallclockTime(fake_clock_.GetWallclockTime() + 312fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold TimeDelta::FromSeconds(2)); 313509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo MessageLoopRunMaxIterations(MessageLoop::current(), 10); 314fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold EXPECT_EQ(2, num_called); 31580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, calls.size()); 316fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // Wait for reevaluation due to delay to happen, ensure that it occurs and 317fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold // that the callback is invoked. 318509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo test_clock_.Advance(TimeDelta::FromSeconds(2)); 319fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold fake_clock_.SetWallclockTime(fake_clock_.GetWallclockTime() + 320fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold TimeDelta::FromSeconds(2)); 321509dd5376f47e38d18fe7d29da776e3dc9a9786dAlex Deymo MessageLoopRunMaxIterations(MessageLoop::current(), 10); 322fd45a731d9f9176ce134b34e2a84acc0cf403d1dGilad Arnold EXPECT_EQ(3, num_called); 32380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo ASSERT_EQ(1U, calls.size()); 324f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold EXPECT_EQ(EvalStatus::kSucceeded, calls[0].first); 325f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold} 326f9f85d6680164064648ce3ed1d31589e1f1b7a29Gilad Arnold 32763784a578dd26880454d70797519358a2326291bAlex Deymo} // namespace chromeos_update_manager 328