You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
7.9 KiB
213 lines
7.9 KiB
//
|
|
// 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
|