blob: 08fec975b4080b6965c641e15a35fee2c8e85928 [file] [log] [blame]
// 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(), &timestamp));
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