| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ash/child_accounts/time_limits/app_types.h" |
| |
| #include <string> |
| |
| #include "base/test/gtest_util.h" |
| #include "base/test/task_environment.h" |
| #include "base/time/time.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace ash { |
| namespace app_time { |
| |
| namespace { |
| base::Time TimeFromString(const std::string& str) { |
| base::Time timestamp; |
| EXPECT_TRUE(base::Time::FromString(str.c_str(), ×tamp)); |
| return timestamp; |
| } |
| |
| } // namespace |
| |
| using ActiveTimeTest = testing::Test; |
| using AppActivityTest = testing::Test; |
| |
| TEST_F(ActiveTimeTest, CreateActiveTime) { |
| const base::Time start = TimeFromString("11 Jan 2020 10:00:00 PST"); |
| const base::Time end = TimeFromString("11 Jan 2020 10:10:00 PST"); |
| |
| // Create ActiveTime with the correct timestamps. |
| const AppActivity::ActiveTime active_time(start, end); |
| EXPECT_EQ(start, active_time.active_from()); |
| EXPECT_EQ(end, active_time.active_to()); |
| |
| // Try to create ActiveTime with invalid ranges. |
| EXPECT_DCHECK_DEATH(AppActivity::ActiveTime(start, start)); |
| EXPECT_DCHECK_DEATH(AppActivity::ActiveTime(end, start)); |
| } |
| |
| TEST_F(ActiveTimeTest, UpdateActiveTime) { |
| AppActivity::ActiveTime active_time( |
| TimeFromString("11 Jan 2020 10:00:00 PST"), |
| TimeFromString("11 Jan 2020 10:10:00 PST")); |
| const base::Time& start_equal_end = active_time.active_to(); |
| EXPECT_DCHECK_DEATH(active_time.set_active_from(start_equal_end)); |
| |
| const base::Time start_after_end = |
| active_time.active_to() + base::TimeDelta::FromSeconds(1); |
| EXPECT_DCHECK_DEATH(active_time.set_active_from(start_after_end)); |
| |
| const base::Time& end_equal_start = active_time.active_from(); |
| EXPECT_DCHECK_DEATH(active_time.set_active_to(end_equal_start)); |
| |
| const base::Time end_before_start = |
| active_time.active_from() - base::TimeDelta::FromSeconds(1); |
| EXPECT_DCHECK_DEATH(active_time.set_active_to(end_before_start)); |
| } |
| |
| TEST_F(ActiveTimeTest, ActiveTimeTimestampComparisions) { |
| const AppActivity::ActiveTime active_time( |
| TimeFromString("11 Jan 2020 10:00:00 PST"), |
| TimeFromString("11 Jan 2020 10:10:00 PST")); |
| |
| const base::Time contained = TimeFromString("11 Jan 2020 10:05:00 PST"); |
| EXPECT_TRUE(active_time.Contains(contained)); |
| EXPECT_FALSE(active_time.IsEarlierThan(contained)); |
| EXPECT_FALSE(active_time.IsLaterThan(contained)); |
| |
| const base::Time before = TimeFromString("11 Jan 2020 09:58:00 PST"); |
| EXPECT_FALSE(active_time.Contains(before)); |
| EXPECT_FALSE(active_time.IsEarlierThan(before)); |
| EXPECT_TRUE(active_time.IsLaterThan(before)); |
| |
| const base::Time after = TimeFromString("11 Jan 2020 10:11:00 PST"); |
| EXPECT_FALSE(active_time.Contains(after)); |
| EXPECT_TRUE(active_time.IsEarlierThan(after)); |
| EXPECT_FALSE(active_time.IsLaterThan(after)); |
| |
| const base::Time& equal_start = active_time.active_from(); |
| EXPECT_FALSE(active_time.Contains(equal_start)); |
| EXPECT_FALSE(active_time.IsEarlierThan(equal_start)); |
| EXPECT_TRUE(active_time.IsLaterThan(equal_start)); |
| |
| const base::Time& equal_end = active_time.active_to(); |
| EXPECT_FALSE(active_time.Contains(equal_end)); |
| EXPECT_TRUE(active_time.IsEarlierThan(equal_end)); |
| EXPECT_FALSE(active_time.IsLaterThan(equal_end)); |
| } |
| |
| TEST_F(ActiveTimeTest, MergeActiveTimesTest) { |
| const base::TimeDelta delta = |
| AppActivity::ActiveTime::kActiveTimeMergePrecision / 2; |
| |
| base::Time time1 = TimeFromString("11 Jan 2020 10:00:00 PST"); |
| base::Time time2 = TimeFromString("11 Jan 2020 10:10:00 PST"); |
| base::Time time3 = TimeFromString("11 Jan 2020 10:20:00 PST"); |
| |
| AppActivity::ActiveTime active_time_1(time1, time2); |
| AppActivity::ActiveTime active_time_2(time2 + delta, time3); |
| AppActivity::ActiveTime active_time_3(time2 + 3 * delta, time3); |
| |
| absl::optional<AppActivity::ActiveTime> merged_time1 = |
| AppActivity::ActiveTime::Merge(active_time_1, active_time_2); |
| EXPECT_TRUE(merged_time1.has_value()); |
| EXPECT_EQ(merged_time1->active_from(), time1); |
| EXPECT_EQ(merged_time1->active_to(), time3); |
| |
| absl::optional<AppActivity::ActiveTime> merged_time2 = |
| AppActivity::ActiveTime::Merge(active_time_2, active_time_1); |
| EXPECT_TRUE(merged_time2.has_value()); |
| EXPECT_EQ(merged_time2->active_from(), time1); |
| EXPECT_EQ(merged_time2->active_to(), time3); |
| |
| absl::optional<AppActivity::ActiveTime> merged_time3 = |
| AppActivity::ActiveTime::Merge(active_time_1, active_time_3); |
| EXPECT_FALSE(merged_time3.has_value()); |
| |
| absl::optional<AppActivity::ActiveTime> merged_time4 = |
| AppActivity::ActiveTime::Merge(active_time_3, active_time_1); |
| EXPECT_FALSE(merged_time4.has_value()); |
| |
| absl::optional<AppActivity::ActiveTime> merged_time5 = |
| AppActivity::ActiveTime::Merge(active_time_2, active_time_3); |
| EXPECT_TRUE(merged_time5.has_value()); |
| EXPECT_EQ(merged_time5->active_from(), time2 + delta); |
| EXPECT_EQ(merged_time5->active_to(), time3); |
| } |
| |
| // TODO(agawronska) : Add more tests for app activity. |
| |
| } // namespace app_time |
| } // namespace ash |