| Adolfo Victoria | 94ffe13 | 2018-06-28 16:14:56 -0700 | [diff] [blame] | 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 | #include "update_engine/update_manager/weekly_time.h" | 
|  | 17 |  | 
|  | 18 | #include <tuple> | 
|  | 19 |  | 
|  | 20 | #include <base/time/time.h> | 
|  | 21 | #include <gtest/gtest.h> | 
|  | 22 |  | 
|  | 23 | using base::TimeDelta; | 
|  | 24 | using std::tuple; | 
|  | 25 |  | 
|  | 26 | namespace chromeos_update_manager { | 
|  | 27 |  | 
|  | 28 | namespace { | 
|  | 29 |  | 
|  | 30 | enum { | 
|  | 31 | kSunday = 0, | 
|  | 32 | kMonday, | 
|  | 33 | kTuesday, | 
|  | 34 | kWednesday, | 
|  | 35 | kThursday, | 
|  | 36 | kFriday, | 
|  | 37 | kSaturday | 
|  | 38 | }; | 
|  | 39 |  | 
|  | 40 | }  // namespace | 
|  | 41 |  | 
|  | 42 | class WeeklyTimeDurationTest | 
|  | 43 | : public testing::TestWithParam<tuple<int /* start_day_of_week */, | 
|  | 44 | TimeDelta /* start_time */, | 
|  | 45 | int /* end_day_of_week */, | 
|  | 46 | TimeDelta /* end_time */, | 
|  | 47 | TimeDelta /* expected result */>> { | 
|  | 48 | protected: | 
|  | 49 | int start_day_of_week() { return std::get<0>(GetParam()); } | 
|  | 50 | TimeDelta start_time() { return std::get<1>(GetParam()); } | 
|  | 51 | int end_day_of_week() { return std::get<2>(GetParam()); } | 
|  | 52 | TimeDelta end_time() { return std::get<3>(GetParam()); } | 
|  | 53 | TimeDelta result() { return std::get<4>(GetParam()); } | 
|  | 54 | }; | 
|  | 55 |  | 
|  | 56 | TEST_P(WeeklyTimeDurationTest, GetDurationTo) { | 
|  | 57 | WeeklyTime start = WeeklyTime(start_day_of_week(), start_time()); | 
|  | 58 | WeeklyTime end = WeeklyTime(end_day_of_week(), end_time()); | 
|  | 59 |  | 
|  | 60 | EXPECT_EQ(result(), start.GetDurationTo(end)); | 
|  | 61 | } | 
|  | 62 |  | 
|  | 63 | INSTANTIATE_TEST_CASE_P( | 
|  | 64 | SameMinutes, | 
|  | 65 | WeeklyTimeDurationTest, | 
|  | 66 | testing::Values(std::make_tuple(kThursday, | 
|  | 67 | TimeDelta::FromMinutes(30), | 
|  | 68 | kSaturday, | 
|  | 69 | TimeDelta::FromMinutes(30), | 
|  | 70 | TimeDelta::FromDays(2)))); | 
|  | 71 |  | 
|  | 72 | INSTANTIATE_TEST_CASE_P( | 
|  | 73 | DifferentMinutes, | 
|  | 74 | WeeklyTimeDurationTest, | 
|  | 75 | testing::Values(std::make_tuple(kMonday, | 
|  | 76 | TimeDelta::FromMinutes(10), | 
|  | 77 | kWednesday, | 
|  | 78 | TimeDelta::FromMinutes(30), | 
|  | 79 | TimeDelta::FromDays(2) + | 
|  | 80 | TimeDelta::FromMinutes(20)))); | 
|  | 81 |  | 
|  | 82 | INSTANTIATE_TEST_CASE_P( | 
|  | 83 | EndLessThanStartSameMinutes, | 
|  | 84 | WeeklyTimeDurationTest, | 
|  | 85 | testing::Values(std::make_tuple(kSaturday, | 
|  | 86 | TimeDelta::FromMinutes(100), | 
|  | 87 | kTuesday, | 
|  | 88 | TimeDelta::FromMinutes(100), | 
|  | 89 | TimeDelta::FromDays(3)))); | 
|  | 90 |  | 
|  | 91 | INSTANTIATE_TEST_CASE_P( | 
|  | 92 | EndLessThanStartDifferentMinutes, | 
|  | 93 | WeeklyTimeDurationTest, | 
|  | 94 | testing::Values(std::make_tuple(kSaturday, | 
|  | 95 | TimeDelta::FromMinutes(150), | 
|  | 96 | kMonday, | 
|  | 97 | TimeDelta::FromMinutes(10), | 
|  | 98 | TimeDelta::FromDays(2) - | 
|  | 99 | TimeDelta::FromMinutes(140)))); | 
|  | 100 |  | 
|  | 101 | class WeeklyTimeOffsetTest | 
|  | 102 | : public testing::TestWithParam<tuple<int /* day_of_week */, | 
|  | 103 | TimeDelta /* time */, | 
|  | 104 | TimeDelta /* offset */, | 
|  | 105 | WeeklyTime /* expected result */>> { | 
|  | 106 | protected: | 
|  | 107 | int day_of_week() { return std::get<0>(GetParam()); } | 
|  | 108 | TimeDelta time() { return std::get<1>(GetParam()); } | 
|  | 109 | TimeDelta offset() { return std::get<2>(GetParam()); } | 
|  | 110 | WeeklyTime result() { return std::get<3>(GetParam()); } | 
|  | 111 | }; | 
|  | 112 |  | 
|  | 113 | TEST_P(WeeklyTimeOffsetTest, WeekTimeAddTime) { | 
|  | 114 | WeeklyTime test_time = WeeklyTime(day_of_week(), time()); | 
|  | 115 | test_time.AddTime(offset()); | 
|  | 116 |  | 
|  | 117 | EXPECT_EQ(result(), test_time); | 
|  | 118 | } | 
|  | 119 |  | 
|  | 120 | INSTANTIATE_TEST_CASE_P( | 
|  | 121 | SameDayTest, | 
|  | 122 | WeeklyTimeOffsetTest, | 
|  | 123 | testing::Values(std::make_tuple(kTuesday, | 
|  | 124 | TimeDelta::FromMinutes(200), | 
|  | 125 | TimeDelta::FromMinutes(400), | 
|  | 126 | WeeklyTime(kTuesday, | 
|  | 127 | TimeDelta::FromMinutes(600))))); | 
|  | 128 |  | 
|  | 129 | INSTANTIATE_TEST_CASE_P(DayChangeTest, | 
|  | 130 | WeeklyTimeOffsetTest, | 
|  | 131 | testing::Values(std::make_tuple( | 
|  | 132 | kThursday, | 
|  | 133 | TimeDelta::FromHours(23), | 
|  | 134 | TimeDelta::FromHours(2), | 
|  | 135 | WeeklyTime(kFriday, TimeDelta::FromHours(1))))); | 
|  | 136 |  | 
|  | 137 | INSTANTIATE_TEST_CASE_P(DayChangeTestOver7, | 
|  | 138 | WeeklyTimeOffsetTest, | 
|  | 139 | testing::Values(std::make_tuple( | 
|  | 140 | kSunday, | 
|  | 141 | TimeDelta::FromHours(20), | 
|  | 142 | TimeDelta::FromDays(3), | 
|  | 143 | WeeklyTime(kWednesday, TimeDelta::FromHours(20))))); | 
|  | 144 |  | 
|  | 145 | class WeeklyTimeIntervalRangeTest | 
|  | 146 | : public testing::TestWithParam<tuple<int /* test_day_of_week */, | 
|  | 147 | int /* test_time */, | 
|  | 148 | bool /* in regular interval */, | 
|  | 149 | bool /* in short interval */, | 
|  | 150 | bool /* |start| < | */>> { | 
|  | 151 | protected: | 
|  | 152 | int day_of_week() { return std::get<0>(GetParam()); } | 
|  | 153 | int minutes() { return std::get<1>(GetParam()); } | 
|  | 154 | bool regular_result() { return std::get<2>(GetParam()); } | 
|  | 155 | bool short_result() { return std::get<3>(GetParam()); } | 
|  | 156 | bool wraparound_result() { return std::get<4>(GetParam()); } | 
|  | 157 | }; | 
|  | 158 |  | 
|  | 159 | TEST_P(WeeklyTimeIntervalRangeTest, InRange) { | 
|  | 160 | WeeklyTime test = | 
|  | 161 | WeeklyTime(day_of_week(), TimeDelta::FromMinutes(minutes())); | 
|  | 162 | WeeklyTimeInterval interval_regular = | 
|  | 163 | WeeklyTimeInterval(WeeklyTime(kMonday, TimeDelta::FromMinutes(10)), | 
|  | 164 | WeeklyTime(kWednesday, TimeDelta::FromMinutes(30))); | 
|  | 165 | WeeklyTimeInterval interval_short = | 
|  | 166 | WeeklyTimeInterval(WeeklyTime(kThursday, TimeDelta::FromMinutes(10)), | 
|  | 167 | WeeklyTime(kThursday, TimeDelta::FromMinutes(11))); | 
|  | 168 |  | 
|  | 169 | WeeklyTimeInterval interval_wraparound = | 
|  | 170 | WeeklyTimeInterval(WeeklyTime(kFriday, TimeDelta::FromMinutes(10)), | 
|  | 171 | WeeklyTime(kTuesday, TimeDelta::FromMinutes(30))); | 
|  | 172 |  | 
|  | 173 | EXPECT_EQ(regular_result(), interval_regular.InRange(test)); | 
|  | 174 | EXPECT_EQ(short_result(), interval_short.InRange(test)); | 
|  | 175 | EXPECT_EQ(wraparound_result(), interval_wraparound.InRange(test)); | 
|  | 176 | } | 
|  | 177 |  | 
|  | 178 | // Test the left side of the range being inclusive. | 
|  | 179 | INSTANTIATE_TEST_CASE_P( | 
|  | 180 | InclusiveSuccessLeft, | 
|  | 181 | WeeklyTimeIntervalRangeTest, | 
|  | 182 | testing::Values(std::make_tuple(kThursday, 10, false, true, false))); | 
|  | 183 |  | 
|  | 184 | // Test the right side of the range being exclusive. | 
|  | 185 | INSTANTIATE_TEST_CASE_P( | 
|  | 186 | ExclusiveSuccessRight, | 
|  | 187 | WeeklyTimeIntervalRangeTest, | 
|  | 188 | testing::Values(std::make_tuple(kThursday, 11, false, false, false))); | 
|  | 189 |  | 
|  | 190 | // Test falling out of the interval by a small amount. | 
|  | 191 | INSTANTIATE_TEST_CASE_P( | 
|  | 192 | FailOutsideRangeSmall, | 
|  | 193 | WeeklyTimeIntervalRangeTest, | 
|  | 194 | testing::Values(std::make_tuple(kThursday, 12, false, false, false))); | 
|  | 195 |  | 
|  | 196 | // These test cases check that intervals wrap around properly. | 
|  | 197 | INSTANTIATE_TEST_CASE_P( | 
|  | 198 | WraparoundOutside, | 
|  | 199 | WeeklyTimeIntervalRangeTest, | 
|  | 200 | testing::Values(std::make_tuple(kWednesday, 10, true, false, false))); | 
|  | 201 |  | 
|  | 202 | INSTANTIATE_TEST_CASE_P( | 
|  | 203 | WraparoundInsideRight, | 
|  | 204 | WeeklyTimeIntervalRangeTest, | 
|  | 205 | testing::Values(std::make_tuple(kSaturday, 10, false, false, true))); | 
|  | 206 |  | 
|  | 207 | INSTANTIATE_TEST_CASE_P( | 
|  | 208 | WraparoundInsideLeft, | 
|  | 209 | WeeklyTimeIntervalRangeTest, | 
|  | 210 | testing::Values(std::make_tuple(kMonday, 0, false, false, true))); | 
|  | 211 |  | 
|  | 212 | }  // namespace chromeos_update_manager |