| // |
| // Copyright (C) 2018 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/weekly_time.h" |
| |
| #include <tuple> |
| |
| #include <base/time/time.h> |
| #include <gtest/gtest.h> |
| |
| using base::TimeDelta; |
| using std::tuple; |
| |
| namespace chromeos_update_manager { |
| |
| namespace { |
| |
| enum { |
| kSunday = 0, |
| kMonday, |
| kTuesday, |
| kWednesday, |
| kThursday, |
| kFriday, |
| kSaturday |
| }; |
| |
| } // namespace |
| |
| class WeeklyTimeDurationTest |
| : public testing::TestWithParam<tuple<int /* start_day_of_week */, |
| TimeDelta /* start_time */, |
| int /* end_day_of_week */, |
| TimeDelta /* end_time */, |
| TimeDelta /* expected result */>> { |
| protected: |
| int start_day_of_week() { return std::get<0>(GetParam()); } |
| TimeDelta start_time() { return std::get<1>(GetParam()); } |
| int end_day_of_week() { return std::get<2>(GetParam()); } |
| TimeDelta end_time() { return std::get<3>(GetParam()); } |
| TimeDelta result() { return std::get<4>(GetParam()); } |
| }; |
| |
| TEST_P(WeeklyTimeDurationTest, GetDurationTo) { |
| WeeklyTime start = WeeklyTime(start_day_of_week(), start_time()); |
| WeeklyTime end = WeeklyTime(end_day_of_week(), end_time()); |
| |
| EXPECT_EQ(result(), start.GetDurationTo(end)); |
| } |
| |
| INSTANTIATE_TEST_CASE_P( |
| SameMinutes, |
| WeeklyTimeDurationTest, |
| testing::Values(std::make_tuple(kThursday, |
| TimeDelta::FromMinutes(30), |
| kSaturday, |
| TimeDelta::FromMinutes(30), |
| TimeDelta::FromDays(2)))); |
| |
| INSTANTIATE_TEST_CASE_P( |
| DifferentMinutes, |
| WeeklyTimeDurationTest, |
| testing::Values(std::make_tuple(kMonday, |
| TimeDelta::FromMinutes(10), |
| kWednesday, |
| TimeDelta::FromMinutes(30), |
| TimeDelta::FromDays(2) + |
| TimeDelta::FromMinutes(20)))); |
| |
| INSTANTIATE_TEST_CASE_P( |
| EndLessThanStartSameMinutes, |
| WeeklyTimeDurationTest, |
| testing::Values(std::make_tuple(kSaturday, |
| TimeDelta::FromMinutes(100), |
| kTuesday, |
| TimeDelta::FromMinutes(100), |
| TimeDelta::FromDays(3)))); |
| |
| INSTANTIATE_TEST_CASE_P( |
| EndLessThanStartDifferentMinutes, |
| WeeklyTimeDurationTest, |
| testing::Values(std::make_tuple(kSaturday, |
| TimeDelta::FromMinutes(150), |
| kMonday, |
| TimeDelta::FromMinutes(10), |
| TimeDelta::FromDays(2) - |
| TimeDelta::FromMinutes(140)))); |
| |
| class WeeklyTimeOffsetTest |
| : public testing::TestWithParam<tuple<int /* day_of_week */, |
| TimeDelta /* time */, |
| TimeDelta /* offset */, |
| WeeklyTime /* expected result */>> { |
| protected: |
| int day_of_week() { return std::get<0>(GetParam()); } |
| TimeDelta time() { return std::get<1>(GetParam()); } |
| TimeDelta offset() { return std::get<2>(GetParam()); } |
| WeeklyTime result() { return std::get<3>(GetParam()); } |
| }; |
| |
| TEST_P(WeeklyTimeOffsetTest, WeekTimeAddTime) { |
| WeeklyTime test_time = WeeklyTime(day_of_week(), time()); |
| test_time.AddTime(offset()); |
| |
| EXPECT_EQ(result(), test_time); |
| } |
| |
| INSTANTIATE_TEST_CASE_P( |
| SameDayTest, |
| WeeklyTimeOffsetTest, |
| testing::Values(std::make_tuple(kTuesday, |
| TimeDelta::FromMinutes(200), |
| TimeDelta::FromMinutes(400), |
| WeeklyTime(kTuesday, |
| TimeDelta::FromMinutes(600))))); |
| |
| INSTANTIATE_TEST_CASE_P(DayChangeTest, |
| WeeklyTimeOffsetTest, |
| testing::Values(std::make_tuple( |
| kThursday, |
| TimeDelta::FromHours(23), |
| TimeDelta::FromHours(2), |
| WeeklyTime(kFriday, TimeDelta::FromHours(1))))); |
| |
| INSTANTIATE_TEST_CASE_P(DayChangeTestOver7, |
| WeeklyTimeOffsetTest, |
| testing::Values(std::make_tuple( |
| kSunday, |
| TimeDelta::FromHours(20), |
| TimeDelta::FromDays(3), |
| WeeklyTime(kWednesday, TimeDelta::FromHours(20))))); |
| |
| class WeeklyTimeIntervalRangeTest |
| : public testing::TestWithParam<tuple<int /* test_day_of_week */, |
| int /* test_time */, |
| bool /* in regular interval */, |
| bool /* in short interval */, |
| bool /* |start| < | */>> { |
| protected: |
| int day_of_week() { return std::get<0>(GetParam()); } |
| int minutes() { return std::get<1>(GetParam()); } |
| bool regular_result() { return std::get<2>(GetParam()); } |
| bool short_result() { return std::get<3>(GetParam()); } |
| bool wraparound_result() { return std::get<4>(GetParam()); } |
| }; |
| |
| TEST_P(WeeklyTimeIntervalRangeTest, InRange) { |
| WeeklyTime test = |
| WeeklyTime(day_of_week(), TimeDelta::FromMinutes(minutes())); |
| WeeklyTimeInterval interval_regular = |
| WeeklyTimeInterval(WeeklyTime(kMonday, TimeDelta::FromMinutes(10)), |
| WeeklyTime(kWednesday, TimeDelta::FromMinutes(30))); |
| WeeklyTimeInterval interval_short = |
| WeeklyTimeInterval(WeeklyTime(kThursday, TimeDelta::FromMinutes(10)), |
| WeeklyTime(kThursday, TimeDelta::FromMinutes(11))); |
| |
| WeeklyTimeInterval interval_wraparound = |
| WeeklyTimeInterval(WeeklyTime(kFriday, TimeDelta::FromMinutes(10)), |
| WeeklyTime(kTuesday, TimeDelta::FromMinutes(30))); |
| |
| EXPECT_EQ(regular_result(), interval_regular.InRange(test)); |
| EXPECT_EQ(short_result(), interval_short.InRange(test)); |
| EXPECT_EQ(wraparound_result(), interval_wraparound.InRange(test)); |
| } |
| |
| // Test the left side of the range being inclusive. |
| INSTANTIATE_TEST_CASE_P( |
| InclusiveSuccessLeft, |
| WeeklyTimeIntervalRangeTest, |
| testing::Values(std::make_tuple(kThursday, 10, false, true, false))); |
| |
| // Test the right side of the range being exclusive. |
| INSTANTIATE_TEST_CASE_P( |
| ExclusiveSuccessRight, |
| WeeklyTimeIntervalRangeTest, |
| testing::Values(std::make_tuple(kThursday, 11, false, false, false))); |
| |
| // Test falling out of the interval by a small amount. |
| INSTANTIATE_TEST_CASE_P( |
| FailOutsideRangeSmall, |
| WeeklyTimeIntervalRangeTest, |
| testing::Values(std::make_tuple(kThursday, 12, false, false, false))); |
| |
| // These test cases check that intervals wrap around properly. |
| INSTANTIATE_TEST_CASE_P( |
| WraparoundOutside, |
| WeeklyTimeIntervalRangeTest, |
| testing::Values(std::make_tuple(kWednesday, 10, true, false, false))); |
| |
| INSTANTIATE_TEST_CASE_P( |
| WraparoundInsideRight, |
| WeeklyTimeIntervalRangeTest, |
| testing::Values(std::make_tuple(kSaturday, 10, false, false, true))); |
| |
| INSTANTIATE_TEST_CASE_P( |
| WraparoundInsideLeft, |
| WeeklyTimeIntervalRangeTest, |
| testing::Values(std::make_tuple(kMonday, 0, false, false, true))); |
| |
| } // namespace chromeos_update_manager |