Commit 4b4c4aea authored by Henrique Grandinetti's avatar Henrique Grandinetti Committed by Commit Bot

Handle UsageTimeLimit with multiple overrides.

On cl https://chromium-review.googlesource.com/c/chromium/src/+/1112051, I changed the override part of UsageTimeLimit policy from a single object to an array. On this cl I change the usage_time_limit_processor to handle this as well. Currently, the only override considered is the latest one.

Bug: 823536
Change-Id: Ia5842edec3fc6127115d7f7b988ec43c437b1713
Reviewed-on: https://chromium-review.googlesource.com/1127399Reviewed-by: default avatarJacob Dufault <jdufault@chromium.org>
Reviewed-by: default avatarAlexander Alekseev <alemate@chromium.org>
Commit-Queue: Henrique Grandinetti <hgrandinetti@google.com>
Cr-Commit-Position: refs/heads/master@{#574136}
parent cc1c4db2
......@@ -11,7 +11,7 @@ namespace usage_time_limit {
namespace internal {
namespace {
constexpr char kOverride[] = "overrides";
constexpr char kOverrides[] = "overrides";
constexpr char kOverrideAction[] = "action";
constexpr char kOverrideActionCreatedAt[] = "created_at_millis";
constexpr char kOverrideActionDurationMins[] = "duration_mins";
......@@ -855,16 +855,48 @@ TimeUsageLimit::TimeUsageLimit(TimeUsageLimit&&) = default;
TimeUsageLimit& TimeUsageLimit::operator=(TimeUsageLimit&&) = default;
Override::Override(const base::Value& override_dict) {
const base::Value* action_value = override_dict.FindKey(kOverrideAction);
const base::Value* created_at_value =
override_dict.FindKey(kOverrideActionCreatedAt);
Override::Override(const base::Value& override_list) {
if (!override_list.is_list()) {
LOG(ERROR) << "Overrides is not a list.";
return;
}
if (!action_value || !created_at_value)
const base::Value* last_override = nullptr;
for (const base::Value& override_value : override_list.GetList()) {
if (!override_value.is_dict()) {
LOG(ERROR) << "Override entry is not a dictionary";
continue;
}
const base::Value* created_at_value =
override_value.FindKey(kOverrideActionCreatedAt);
if (!created_at_value) {
LOG(ERROR) << "Override entry is missing created_at_millis field.";
continue;
}
if (!last_override ||
created_at_value->GetString().compare(
last_override->FindKey(kOverrideActionCreatedAt)->GetString()) >
0) {
last_override = &override_value;
}
}
if (!last_override)
return;
const base::Value* action_value = last_override->FindKey(kOverrideAction);
if (!action_value)
return;
const base::Value* created_at_value =
last_override->FindKey(kOverrideActionCreatedAt);
int64_t created_at_millis;
if (!base::StringToInt64(created_at_value->GetString(), &created_at_millis)) {
LOG(ERROR) << "Invalid override created_at_millis.";
// Cannot process entry without a valid creation time.
return;
}
......@@ -874,7 +906,7 @@ Override::Override(const base::Value& override_dict) {
created_at = base::Time::UnixEpoch() +
base::TimeDelta::FromMilliseconds(created_at_millis);
const base::Value* duration_value = override_dict.FindPath(
const base::Value* duration_value = last_override->FindPath(
{kOverrideActionSpecificData, kOverrideActionDurationMins});
if (duration_value)
duration = base::TimeDelta::FromMinutes(duration_value->GetInt());
......@@ -919,7 +951,7 @@ base::Optional<internal::TimeUsageLimit> TimeUsageLimitFromPolicy(
base::Optional<internal::Override> OverrideFromPolicy(
const std::unique_ptr<base::DictionaryValue>& time_limit) {
base::Value* override_value = time_limit->FindKey(internal::kOverride);
base::Value* override_value = time_limit->FindKey(internal::kOverrides);
if (!override_value)
return base::nullopt;
return internal::Override(*override_value);
......
......@@ -183,16 +183,25 @@ TEST_F(UsageTimeLimitProcessorInternalTest, TimeUsageWindowValid) {
TEST_F(UsageTimeLimitProcessorInternalTest, OverrideValid) {
// Create policy information.
std::string created_at_millis = CreatePolicyTimestamp("1 Jan 2018 10:00:00");
base::Value override = base::Value(base::Value::Type::DICTIONARY);
override.SetKey("action", base::Value("UNLOCK"));
override.SetKey("created_at_millis", base::Value(created_at_millis));
base::Value override_one = base::Value(base::Value::Type::DICTIONARY);
override_one.SetKey("action", base::Value("UNLOCK"));
override_one.SetKey("created_at_millis", base::Value(created_at_millis));
base::Value override_two = base::Value(base::Value::Type::DICTIONARY);
override_two.SetKey("action", base::Value("LOCK"));
override_two.SetKey("created_at_millis",
base::Value(CreatePolicyTimestamp("1 Jan 2018 9:00:00")));
base::Value overrides(base::Value::Type::LIST);
overrides.GetList().push_back(std::move(override_one));
overrides.GetList().push_back(std::move(override_two));
// Call tested functions.
Override override_struct(override);
Override override_struct(overrides);
// Assert right fields are set.
ASSERT_EQ(override_struct.action, Override::Action::kUnlock);
ASSERT_EQ(override_struct.created_at, base::Time::FromDoubleT(1514800800));
ASSERT_EQ(override_struct.created_at, TimeFromString("1 Jan 2018 10:00:00"));
ASSERT_FALSE(override_struct.duration);
}
......@@ -485,10 +494,12 @@ TEST_F(UsageTimeLimitProcessorTest, GetStateWithOverrideLock) {
base::Value override = base::Value(base::Value::Type::DICTIONARY);
override.SetKey("action", base::Value("LOCK"));
override.SetKey("created_at_millis", base::Value(created_at));
base::Value overrides(base::Value::Type::LIST);
overrides.GetList().push_back(std::move(override));
std::unique_ptr<base::Value> time_limit =
std::make_unique<base::Value>(base::Value::Type::DICTIONARY);
time_limit->SetKey("overrides", std::move(override));
time_limit->SetKey("overrides", std::move(overrides));
std::unique_ptr<base::DictionaryValue> time_limit_dictionary =
base::DictionaryValue::From(std::move(time_limit));
......@@ -531,11 +542,13 @@ TEST_F(UsageTimeLimitProcessorTest, GetStateUpdateUnlockedTimeWindowLimit) {
base::Value override = base::Value(base::Value::Type::DICTIONARY);
override.SetKey("action", base::Value("UNLOCK"));
override.SetKey("created_at_millis", base::Value(created_at));
base::Value overrides(base::Value::Type::LIST);
overrides.GetList().push_back(std::move(override));
std::unique_ptr<base::Value> time_limit =
std::make_unique<base::Value>(base::Value::Type::DICTIONARY);
time_limit->SetKey("time_window_limit", std::move(time_window_limit));
time_limit->SetKey("overrides", std::move(override));
time_limit->SetKey("overrides", std::move(overrides));
std::unique_ptr<base::DictionaryValue> time_limit_dictionary =
base::DictionaryValue::From(std::move(time_limit));
......@@ -617,13 +630,15 @@ TEST_F(UsageTimeLimitProcessorTest, GetStateOverrideTimeWindowLimitOnly) {
base::Value override = base::Value(base::Value::Type::DICTIONARY);
override.SetKey("action", base::Value("UNLOCK"));
override.SetKey("created_at_millis", base::Value(created_at));
base::Value overrides(base::Value::Type::LIST);
overrides.GetList().push_back(std::move(override));
// Setup policy.
std::unique_ptr<base::Value> time_limit =
std::make_unique<base::Value>(base::Value::Type::DICTIONARY);
time_limit->SetKey("time_window_limit", std::move(time_window_limit));
time_limit->SetKey("time_usage_limit", std::move(time_usage_limit));
time_limit->SetKey("overrides", std::move(override));
time_limit->SetKey("overrides", std::move(overrides));
std::unique_ptr<base::DictionaryValue> time_limit_dictionary =
base::DictionaryValue::From(std::move(time_limit));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment