blob: f2595221d4157c890f5a28aa2652ef1e53a529cb [file] [log] [blame]
// Copyright 2019 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/chromeos/child_accounts/time_limit_test_utils.h"
#include <algorithm>
#include <utility>
#include "base/json/json_writer.h"
#include "base/logging.h"
#include "base/optional.h"
namespace chromeos {
namespace time_limit_test_utils {
namespace {
// Definition of private constants.
constexpr char kTimeLimitLastUpdatedAt[] = "last_updated_millis";
constexpr char kTimeWindowLimit[] = "time_window_limit";
constexpr char kTimeUsageLimit[] = "time_usage_limit";
constexpr char kUsageLimitResetAt[] = "reset_at";
constexpr char kUsageLimitUsageQuota[] = "usage_quota_mins";
constexpr char kWindowLimitEntries[] = "entries";
constexpr char kWindowLimitEntryEffectiveDay[] = "effective_day";
constexpr char kWindowLimitEntryEndsAt[] = "ends_at";
constexpr char kWindowLimitEntryStartsAt[] = "starts_at";
constexpr char kWindowLimitEntryTimeHour[] = "hour";
constexpr char kWindowLimitEntryTimeMinute[] = "minute";
} // namespace
// Definition of public constants.
const char kMonday[] = "MONDAY";
const char kTuesday[] = "TUESDAY";
const char kWednesday[] = "WEDNESDAY";
const char kThursday[] = "THURSDAY";
const char kFriday[] = "FRIDAY";
const char kSaturday[] = "SATURDAY";
const char kSunday[] = "SUNDAY";
base::Time TimeFromString(const char* time_string) {
base::Time time;
if (!base::Time::FromUTCString(time_string, &time))
LOG(ERROR) << "Wrong time string format.";
return time;
}
std::string CreatePolicyTimestamp(const char* time_string) {
base::Time time = TimeFromString(time_string);
return CreatePolicyTimestamp(time);
}
std::string CreatePolicyTimestamp(base::Time time) {
return std::to_string((time - base::Time::UnixEpoch()).InMilliseconds());
}
base::TimeDelta CreateTime(int hour, int minute) {
DCHECK_LT(hour, 24);
DCHECK_GE(hour, 0);
DCHECK_LT(minute, 60);
DCHECK_GE(minute, 0);
return base::TimeDelta::FromMinutes(hour * 60 + minute);
}
base::Value CreatePolicyTime(base::TimeDelta time) {
DCHECK_EQ(
time.InNanoseconds() % base::TimeDelta::FromMinutes(1).InNanoseconds(),
0);
DCHECK_LT(time, base::TimeDelta::FromHours(24));
int hour = time.InHours();
int minute = time.InMinutes() -
time.InHours() * base::TimeDelta::FromHours(1).InMinutes();
base::Value policyTime(base::Value::Type::DICTIONARY);
policyTime.SetKey(kWindowLimitEntryTimeHour, base::Value(hour));
policyTime.SetKey(kWindowLimitEntryTimeMinute, base::Value(minute));
return policyTime;
}
base::Value CreateTimeWindow(const std::string& day,
base::TimeDelta start_time,
base::TimeDelta end_time,
base::Time last_updated) {
base::Value time_window(base::Value::Type::DICTIONARY);
time_window.SetKey(kWindowLimitEntryEffectiveDay, base::Value(day));
time_window.SetKey(kWindowLimitEntryStartsAt, CreatePolicyTime(start_time));
time_window.SetKey(kWindowLimitEntryEndsAt, CreatePolicyTime(end_time));
time_window.SetKey(kTimeLimitLastUpdatedAt,
base::Value(CreatePolicyTimestamp(last_updated)));
return time_window;
}
base::Value CreateTimeUsage(base::TimeDelta usage_quota,
base::Time last_updated) {
base::Value time_usage(base::Value::Type::DICTIONARY);
time_usage.SetKey(kUsageLimitUsageQuota,
base::Value(usage_quota.InMinutes()));
time_usage.SetKey(kTimeLimitLastUpdatedAt,
base::Value(CreatePolicyTimestamp(last_updated)));
return time_usage;
}
base::Value CreateTimeLimitPolicy(base::TimeDelta reset_time) {
base::Value time_usage_limit = base::Value(base::Value::Type::DICTIONARY);
time_usage_limit.SetKey(kUsageLimitResetAt, CreatePolicyTime(reset_time));
base::Value time_limit = base::Value(base::Value::Type::DICTIONARY);
time_limit.SetKey(kTimeUsageLimit, std::move(time_usage_limit));
return time_limit;
}
void AddTimeUsageLimit(base::Value* policy,
std::string day,
base::TimeDelta quota,
base::Time last_updated) {
// Asserts that the usage limit quota in minutes corresponds to an integer
// number.
DCHECK_EQ(
quota.InNanoseconds() % base::TimeDelta::FromMinutes(1).InNanoseconds(),
0);
DCHECK_LT(quota, base::TimeDelta::FromHours(24));
std::transform(day.begin(), day.end(), day.begin(), ::tolower);
policy->FindKey(kTimeUsageLimit)
->SetKey(day, CreateTimeUsage(quota, last_updated));
}
void AddTimeWindowLimit(base::Value* policy,
const std::string& day,
base::TimeDelta start_time,
base::TimeDelta end_time,
base::Time last_updated) {
base::Value* time_window_limit = policy->FindKey(kTimeWindowLimit);
if (!time_window_limit) {
time_window_limit = policy->SetKey(
kTimeWindowLimit, base::Value(base::Value::Type::DICTIONARY));
}
base::Value* window_limit_entries =
time_window_limit->FindKey(kWindowLimitEntries);
if (!window_limit_entries) {
window_limit_entries = time_window_limit->SetKey(
kWindowLimitEntries, base::Value(base::Value::Type::LIST));
}
window_limit_entries->Append(
CreateTimeWindow(day, start_time, end_time, last_updated));
}
void AddOverride(base::Value* policy,
usage_time_limit::TimeLimitOverride::Action action,
base::Time created_at) {
base::Value* overrides =
policy->FindKey(usage_time_limit::TimeLimitOverride::kOverridesDictKey);
if (!overrides) {
overrides =
policy->SetKey(usage_time_limit::TimeLimitOverride::kOverridesDictKey,
base::Value(base::Value::Type::LIST));
}
usage_time_limit::TimeLimitOverride new_override(action, created_at,
base::nullopt);
overrides->Append(new_override.ToDictionary());
}
void AddOverrideWithDuration(base::Value* policy,
usage_time_limit::TimeLimitOverride::Action action,
base::Time created_at,
base::TimeDelta duration) {
base::Value* overrides =
policy->FindKey(usage_time_limit::TimeLimitOverride::kOverridesDictKey);
if (!overrides) {
overrides =
policy->SetKey(usage_time_limit::TimeLimitOverride::kOverridesDictKey,
base::Value(base::Value::Type::LIST));
}
usage_time_limit::TimeLimitOverride new_override(action, created_at,
duration);
overrides->Append(new_override.ToDictionary());
}
std::string PolicyToString(const base::Value& policy) {
std::string json_string;
base::JSONWriter::Write(policy, &json_string);
return json_string;
}
} // namespace time_limit_test_utils
} // namespace chromeos