blob: b153dfbf8417e5b9d65101dbb6fc429157a67851 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// 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_limit_consistency_test/consistency_golden_converter.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/browser/ash/child_accounts/time_limit_test_utils.h"
namespace ash {
namespace utils = time_limit_test_utils;
namespace time_limit_consistency {
namespace {
// The default resets_at value is 6AM.
constexpr base::TimeDelta kDefaultResetsAt = base::Hours(6);
// Converts a PolicyType object from the time limit processor to a
// ConsistencyGoldenPolicy used by the goldens.
ConsistencyGoldenPolicy ConvertProcessorPolicyToGoldenPolicy(
usage_time_limit::PolicyType processor_policy) {
switch (processor_policy) {
case usage_time_limit::PolicyType::kOverride:
return OVERRIDE;
case usage_time_limit::PolicyType::kFixedLimit:
return FIXED_LIMIT;
case usage_time_limit::PolicyType::kUsageLimit:
return USAGE_LIMIT;
case usage_time_limit::PolicyType::kNoPolicy:
return NO_ACTIVE_POLICY;
}
NOTREACHED();
return UNSPECIFIED_POLICY;
}
// Converts the representation of a day of week used by the goldens to the one
// used by the time limit processor.
const char* ConvertGoldenDayToProcessorDay(ConsistencyGoldenEffectiveDay day) {
switch (day) {
case MONDAY:
return utils::kMonday;
case TUESDAY:
return utils::kTuesday;
case WEDNESDAY:
return utils::kWednesday;
case THURSDAY:
return utils::kThursday;
case FRIDAY:
return utils::kFriday;
case SATURDAY:
return utils::kSaturday;
case SUNDAY:
return utils::kSunday;
default:
NOTREACHED();
return nullptr;
}
}
} // namespace
base::Value::Dict ConvertGoldenInputToProcessorInput(
const ConsistencyGoldenInput& input) {
// Random date representing the last time the policies were updated,
// used whenever the last_updated field is not specified in the input proto.
base::Time default_last_updated =
utils::TimeFromString("1 Jan 2018 10:00 GMT+0300");
base::TimeDelta resets_at =
input.has_usage_limit_resets_at()
? utils::CreateTime(input.usage_limit_resets_at().hour(),
input.usage_limit_resets_at().minute())
: kDefaultResetsAt;
base::Value::Dict policy = utils::CreateTimeLimitPolicy(resets_at);
/* Begin Window Limits data */
for (const ConsistencyGoldenWindowLimitEntry& window_limit :
input.window_limits()) {
utils::AddTimeWindowLimit(
&policy, ConvertGoldenDayToProcessorDay(window_limit.effective_day()),
utils::CreateTime(window_limit.starts_at().hour(),
window_limit.starts_at().minute()),
utils::CreateTime(window_limit.ends_at().hour(),
window_limit.ends_at().minute()),
window_limit.has_last_updated_millis()
? base::Time::FromMillisecondsSinceUnixEpoch(
window_limit.last_updated_millis())
: default_last_updated);
}
/* End Window Limits data */
/* Begin Usage Limits data */
for (const ConsistencyGoldenUsageLimitEntry& usage_limit :
input.usage_limits()) {
utils::AddTimeUsageLimit(
&policy, ConvertGoldenDayToProcessorDay(usage_limit.effective_day()),
base::Minutes(usage_limit.usage_quota_mins()),
usage_limit.has_last_updated_millis()
? base::Time::FromMillisecondsSinceUnixEpoch(
usage_limit.last_updated_millis())
: default_last_updated);
}
/* End Usage Limits data */
/* Begin Overrides data */
for (const ConsistencyGoldenOverride& override_entry : input.overrides()) {
if (override_entry.action() == UNLOCK_UNTIL_LOCK_DEADLINE) {
utils::AddOverrideWithDuration(
&policy, usage_time_limit::TimeLimitOverride::Action::kUnlock,
base::Time::FromMillisecondsSinceUnixEpoch(
override_entry.created_at_millis()),
base::Milliseconds(override_entry.duration_millis()));
} else {
utils::AddOverride(
&policy,
override_entry.action() == LOCK
? usage_time_limit::TimeLimitOverride::Action::kLock
: usage_time_limit::TimeLimitOverride::Action::kUnlock,
base::Time::FromMillisecondsSinceUnixEpoch(
override_entry.created_at_millis()));
}
}
/* End Overrides data */
return policy;
}
ConsistencyGoldenOutput ConvertProcessorOutputToGoldenOutput(
const usage_time_limit::State& state) {
ConsistencyGoldenOutput golden_output;
golden_output.set_is_locked(state.is_locked);
golden_output.set_active_policy(
ConvertProcessorPolicyToGoldenPolicy(state.active_policy));
golden_output.set_next_active_policy(
ConvertProcessorPolicyToGoldenPolicy(state.next_state_active_policy));
if (state.is_time_usage_limit_enabled &&
golden_output.active_policy() != OVERRIDE) {
golden_output.set_remaining_quota_millis(
state.remaining_usage.InMilliseconds());
}
if (state.is_locked) {
golden_output.set_next_unlocking_time_millis(
state.next_unlock_time.InMillisecondsSinceUnixEpoch());
}
return golden_output;
}
std::optional<usage_time_limit::State>
GenerateUnlockUsageLimitOverrideStateFromInput(
const ConsistencyGoldenInput& input) {
const ConsistencyGoldenOverride* usage_limit_override = nullptr;
for (const ConsistencyGoldenOverride& override_entry : input.overrides()) {
if (override_entry.action() == UNLOCK_USAGE_LIMIT &&
(!usage_limit_override ||
override_entry.created_at_millis() >
usage_limit_override->created_at_millis())) {
usage_limit_override = &override_entry;
}
}
if (!usage_limit_override)
return std::nullopt;
usage_time_limit::State previous_state;
previous_state.is_locked = true;
previous_state.active_policy = usage_time_limit::PolicyType::kUsageLimit;
previous_state.is_time_usage_limit_enabled = true;
previous_state.remaining_usage = base::Minutes(0);
// Usage limit started one minute before the override was created.
previous_state.time_usage_limit_started =
base::Time::FromMillisecondsSinceUnixEpoch(
usage_limit_override->created_at_millis()) -
base::Minutes(1);
return previous_state;
}
} // namespace time_limit_consistency
} // namespace ash