1 // 2 // Copyright (C) 2018 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "update_engine/update_manager/update_time_restrictions_policy_impl.h" 18 19 #include <memory> 20 21 #include <base/time/time.h> 22 23 #include "update_engine/update_manager/policy_test_utils.h" 24 #include "update_engine/update_manager/weekly_time.h" 25 26 using base::Time; 27 using base::TimeDelta; 28 using chromeos_update_engine::ErrorCode; 29 using chromeos_update_engine::InstallPlan; 30 using std::string; 31 32 namespace chromeos_update_manager { 33 34 constexpr TimeDelta kHour = TimeDelta::FromHours(1); 35 constexpr TimeDelta kMinute = TimeDelta::FromMinutes(1); 36 37 const WeeklyTimeIntervalVector kTestIntervals{ 38 // Monday 10:15 AM to Monday 3:30 PM. 39 WeeklyTimeInterval(WeeklyTime(1, kHour * 10 + kMinute * 15), 40 WeeklyTime(1, kHour * 15 + kMinute * 30)), 41 // Wednesday 8:30 PM to Thursday 8:40 AM. 42 WeeklyTimeInterval(WeeklyTime(3, kHour * 20 + kMinute * 30), 43 WeeklyTime(4, kHour * 8 + kMinute * 40)), 44 }; 45 46 class UmUpdateTimeRestrictionsPolicyImplTest : public UmPolicyTestBase { 47 protected: 48 UmUpdateTimeRestrictionsPolicyImplTest() { 49 policy_ = std::make_unique<UpdateTimeRestrictionsPolicyImpl>(); 50 } 51 52 void TestPolicy(const Time::Exploded& exploded, 53 const WeeklyTimeIntervalVector& test_intervals, 54 const EvalStatus& expected_value, 55 bool kiosk) { 56 if (kiosk) 57 fake_state_.device_policy_provider() 58 ->var_auto_launched_kiosk_app_id() 59 ->reset(new string("myapp")); 60 61 Time time; 62 EXPECT_TRUE(Time::FromLocalExploded(exploded, &time)); 63 fake_clock_.SetWallclockTime(time); 64 SetUpDefaultTimeProvider(); 65 fake_state_.device_policy_provider() 66 ->var_disallowed_time_intervals() 67 ->reset(new WeeklyTimeIntervalVector(test_intervals)); 68 ErrorCode result; 69 InstallPlan install_plan; 70 ExpectPolicyStatus( 71 expected_value, &Policy::UpdateCanBeApplied, &result, &install_plan); 72 if (expected_value == EvalStatus::kSucceeded) 73 EXPECT_EQ(result, ErrorCode::kOmahaUpdateDeferredPerPolicy); 74 } 75 }; 76 77 // If there are no intervals, then the check should always return kContinue. 78 TEST_F(UmUpdateTimeRestrictionsPolicyImplTest, NoIntervalsSetTest) { 79 Time::Exploded random_time{2018, 7, 1, 9, 12, 30, 0, 0}; 80 TestPolicy(random_time, 81 WeeklyTimeIntervalVector(), 82 EvalStatus::kContinue, 83 /* kiosk = */ true); 84 } 85 86 // Check that all intervals are checked. 87 TEST_F(UmUpdateTimeRestrictionsPolicyImplTest, TimeInRange) { 88 // Monday, July 9th 2018 12:30 PM. 89 Time::Exploded first_interval_time{2018, 7, 1, 9, 12, 30, 0, 0}; 90 TestPolicy(first_interval_time, 91 kTestIntervals, 92 EvalStatus::kSucceeded, 93 /* kiosk = */ true); 94 95 // Check second interval. 96 // Thursday, July 12th 2018 4:30 AM. 97 Time::Exploded second_interval_time{2018, 7, 4, 12, 4, 30, 0, 0}; 98 TestPolicy(second_interval_time, 99 kTestIntervals, 100 EvalStatus::kSucceeded, 101 /* kiosk = */ true); 102 } 103 104 TEST_F(UmUpdateTimeRestrictionsPolicyImplTest, TimeOutOfRange) { 105 // Monday, July 9th 2018 6:30 PM. 106 Time::Exploded out_of_range_time{2018, 7, 1, 9, 18, 30, 0, 0}; 107 TestPolicy(out_of_range_time, 108 kTestIntervals, 109 EvalStatus::kContinue, 110 /* kiosk = */ true); 111 } 112 113 TEST_F(UmUpdateTimeRestrictionsPolicyImplTest, NoKioskDisablesPolicy) { 114 Time::Exploded in_range_time{2018, 7, 1, 9, 12, 30, 0, 0}; 115 TestPolicy(in_range_time, 116 kTestIntervals, 117 EvalStatus::kContinue, 118 /* kiosk = */ false); 119 } 120 } // namespace chromeos_update_manager 121