// // Copyright (C) 2017 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "update_engine/update_manager/android_things_policy.h" #include #include "update_engine/update_manager/next_update_check_policy_impl.h" #include "update_engine/update_manager/policy_test_utils.h" using base::Time; using base::TimeDelta; using chromeos_update_engine::ErrorCode; using chromeos_update_engine::InstallPlan; namespace chromeos_update_manager { class UmAndroidThingsPolicyTest : public UmPolicyTestBase { protected: UmAndroidThingsPolicyTest() { policy_ = std::make_unique(); } void SetUpDefaultState() override { UmPolicyTestBase::SetUpDefaultState(); // For the purpose of the tests, this is an official build fake_state_.system_provider()->var_is_official_build()->reset( new bool(true)); // NOLINTNEXTLINE(readability/casting) fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(2)); } // Configures the policy to return a desired value from UpdateCheckAllowed by // faking the current wall clock time as needed. Restores the default state. // This is used when testing policies that depend on this one. virtual void SetUpdateCheckAllowed(bool allow_check) { Time next_update_check; CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime, &next_update_check, AndroidThingsPolicy::kNextUpdateCheckPolicyConstants); SetUpDefaultState(); Time curr_time = next_update_check; if (allow_check) curr_time += TimeDelta::FromSeconds(1); else curr_time -= TimeDelta::FromSeconds(1); fake_clock_.SetWallclockTime(curr_time); } }; TEST_F(UmAndroidThingsPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) { // We get the next update_check timestamp from the policy's private method // and then we check the public method respects that value on the normal // case. Time next_update_check; Time last_checked_time = fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234); LOG(INFO) << "last_checked_time: " << last_checked_time; fake_state_.updater_provider()->var_last_checked_time()->reset( new Time(last_checked_time)); CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime, &next_update_check, AndroidThingsPolicy::kNextUpdateCheckPolicyConstants); LOG(INFO) << "Next check allowed at: " << next_update_check; // Check that the policy blocks until the next_update_check is reached. SetUpDefaultClock(); SetUpDefaultState(); fake_state_.updater_provider()->var_last_checked_time()->reset( new Time(last_checked_time)); fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1)); UpdateCheckParams result; ExpectPolicyStatus( EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result); SetUpDefaultClock(); SetUpDefaultState(); fake_state_.updater_provider()->var_last_checked_time()->reset( new Time(last_checked_time)); fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1)); ExpectPolicyStatus( EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result); EXPECT_TRUE(result.updates_enabled); EXPECT_FALSE(result.interactive); } TEST_F(UmAndroidThingsPolicyTest, UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) { // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial // build; we don't want periodic update checks on developer images. fake_state_.system_provider()->var_is_official_build()->reset( new bool(false)); UpdateCheckParams result; ExpectPolicyStatus( EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result); } TEST_F(UmAndroidThingsPolicyTest, UpdateCheckAllowedUpdatesDisabledWhenNotEnoughSlotsAbUpdates) { // UpdateCheckAllowed should return false (kSucceeded) if the image booted // without enough slots to do A/B updates. // NOLINTNEXTLINE(readability/casting) fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1)); UpdateCheckParams result; ExpectPolicyStatus( EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result); EXPECT_FALSE(result.updates_enabled); } TEST_F(UmAndroidThingsPolicyTest, UpdateCheckAllowedForcedUpdateRequestedInteractive) { // UpdateCheckAllowed should return true because a forced update request was // signaled for an interactive update. SetUpdateCheckAllowed(true); fake_state_.updater_provider()->var_forced_update_requested()->reset( new UpdateRequestStatus(UpdateRequestStatus::kInteractive)); UpdateCheckParams result; ExpectPolicyStatus( EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result); EXPECT_TRUE(result.updates_enabled); EXPECT_TRUE(result.interactive); } TEST_F(UmAndroidThingsPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) { // UpdateCheckAllowed should return true because a forced update request was // signaled for a periodic check. SetUpdateCheckAllowed(true); fake_state_.updater_provider()->var_forced_update_requested()->reset( new UpdateRequestStatus(UpdateRequestStatus::kPeriodic)); UpdateCheckParams result; ExpectPolicyStatus( EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result); EXPECT_TRUE(result.updates_enabled); EXPECT_FALSE(result.interactive); } TEST_F(UmAndroidThingsPolicyTest, UpdateCanBeAppliedOk) { // UpdateCanBeApplied should return kSucceeded in the base case InstallPlan plan; ErrorCode result; ExpectPolicyStatus( EvalStatus::kSucceeded, &Policy::UpdateCanBeApplied, &result, &plan); EXPECT_EQ(ErrorCode::kSuccess, result); } TEST_F(UmAndroidThingsPolicyTest, UpdateCanBeAppliedRestricted) { // UpdateCanBeApplied should return kOmahaUpdateDeferredPerPolicy in // when the restricted flag is set in the Updater. fake_state_.updater_provider()->var_update_restrictions()->reset( new UpdateRestrictions(UpdateRestrictions::kRestrictDownloading)); InstallPlan plan; ErrorCode result; ExpectPolicyStatus( EvalStatus::kSucceeded, &Policy::UpdateCanBeApplied, &result, &plan); EXPECT_EQ(ErrorCode::kOmahaUpdateDeferredPerPolicy, result); } } // namespace chromeos_update_manager