blob: 52c5425d2c44b7bb874db2378475d8f7aec307ac [file] [log] [blame]
Adolfo Victoria94ffe132018-06-28 16:14:56 -07001//
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
23using base::TimeDelta;
24using std::tuple;
25
26namespace chromeos_update_manager {
27
28namespace {
29
30enum {
31 kSunday = 0,
32 kMonday,
33 kTuesday,
34 kWednesday,
35 kThursday,
36 kFriday,
37 kSaturday
38};
39
40} // namespace
41
42class 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
56TEST_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
63INSTANTIATE_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
72INSTANTIATE_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
82INSTANTIATE_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
91INSTANTIATE_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
101class 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
113TEST_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
120INSTANTIATE_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
129INSTANTIATE_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
137INSTANTIATE_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
145class 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
159TEST_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.
179INSTANTIATE_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.
185INSTANTIATE_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.
191INSTANTIATE_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.
197INSTANTIATE_TEST_CASE_P(
198 WraparoundOutside,
199 WeeklyTimeIntervalRangeTest,
200 testing::Values(std::make_tuple(kWednesday, 10, true, false, false)));
201
202INSTANTIATE_TEST_CASE_P(
203 WraparoundInsideRight,
204 WeeklyTimeIntervalRangeTest,
205 testing::Values(std::make_tuple(kSaturday, 10, false, false, true)));
206
207INSTANTIATE_TEST_CASE_P(
208 WraparoundInsideLeft,
209 WeeklyTimeIntervalRangeTest,
210 testing::Values(std::make_tuple(kMonday, 0, false, false, true)));
211
212} // namespace chromeos_update_manager