Commit a487ad8f authored by Henrique Grandinetti's avatar Henrique Grandinetti Committed by Commit Bot

Stop comparing timestamps as strings on UsageTimeLimitProcessor.

Bug: 908443
Change-Id: Icf41f1753450cee63b9296652599f5eb7c4de671
Reviewed-on: https://chromium-review.googlesource.com/c/1351149
Commit-Queue: Henrique Grandinetti <hgrandinetti@chromium.org>
Reviewed-by: default avatarMichael Giuffrida <michaelpg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#611309}
parent bc17c845
...@@ -991,7 +991,9 @@ TimeLimitOverride::TimeLimitOverride(const base::Value& override_list) { ...@@ -991,7 +991,9 @@ TimeLimitOverride::TimeLimitOverride(const base::Value& override_list) {
return; return;
} }
// The most recent override created.
const base::Value* last_override = nullptr; const base::Value* last_override = nullptr;
int64_t last_override_created_at_millis;
for (const base::Value& override_value : override_list.GetList()) { for (const base::Value& override_value : override_list.GetList()) {
if (!override_value.is_dict()) { if (!override_value.is_dict()) {
LOG(ERROR) << "Override entry is not a dictionary"; LOG(ERROR) << "Override entry is not a dictionary";
...@@ -1005,11 +1007,28 @@ TimeLimitOverride::TimeLimitOverride(const base::Value& override_list) { ...@@ -1005,11 +1007,28 @@ TimeLimitOverride::TimeLimitOverride(const base::Value& override_list) {
LOG(ERROR) << "Override entry is missing created_at_millis field."; LOG(ERROR) << "Override entry is missing created_at_millis field.";
continue; continue;
} }
if (!last_override ||
created_at_value->GetString().compare( if (!last_override) {
last_override->FindKey(kOverrideActionCreatedAt)->GetString()) > // Check if the creation time is a valid number.
0) { if (!base::StringToInt64(created_at_value->GetString(),
&last_override_created_at_millis)) {
LOG(ERROR) << "Invalid override created_at_millis.";
continue;
}
last_override = &override_value; last_override = &override_value;
continue;
}
int64_t current_override_created_at_millis;
if (!base::StringToInt64(created_at_value->GetString(),
&current_override_created_at_millis)) {
LOG(ERROR) << "Invalid override created_at_millis.";
continue;
}
if (current_override_created_at_millis > last_override_created_at_millis) {
last_override = &override_value;
last_override_created_at_millis = current_override_created_at_millis;
} }
} }
...@@ -1021,20 +1040,10 @@ TimeLimitOverride::TimeLimitOverride(const base::Value& override_list) { ...@@ -1021,20 +1040,10 @@ TimeLimitOverride::TimeLimitOverride(const base::Value& override_list) {
if (!action_value) if (!action_value)
return; 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;
}
action = action_value->GetString() == kOverrideActionLock ? Action::kLock action = action_value->GetString() == kOverrideActionLock ? Action::kLock
: Action::kUnlock; : Action::kUnlock;
created_at = base::Time::UnixEpoch() + created_at = base::Time::UnixEpoch() + base::TimeDelta::FromMilliseconds(
base::TimeDelta::FromMilliseconds(created_at_millis); last_override_created_at_millis);
const base::Value* duration_value = last_override->FindPath( const base::Value* duration_value = last_override->FindPath(
{kOverrideActionSpecificData, kOverrideActionDurationMins}); {kOverrideActionSpecificData, kOverrideActionDurationMins});
......
...@@ -182,7 +182,6 @@ namespace internal { ...@@ -182,7 +182,6 @@ namespace internal {
using UsageTimeLimitProcessorInternalTest = testing::Test; using UsageTimeLimitProcessorInternalTest = testing::Test;
// TODO: improve tests to cover bugs on crbug/894047
TEST_F(UsageTimeLimitProcessorInternalTest, TimeLimitWindowValid) { TEST_F(UsageTimeLimitProcessorInternalTest, TimeLimitWindowValid) {
std::string last_updated_millis = std::string last_updated_millis =
CreatePolicyTimestamp("1 Jan 1970 00:00:00"); CreatePolicyTimestamp("1 Jan 1970 00:00:00");
...@@ -286,11 +285,11 @@ TEST_F(UsageTimeLimitProcessorInternalTest, OverrideValid) { ...@@ -286,11 +285,11 @@ TEST_F(UsageTimeLimitProcessorInternalTest, OverrideValid) {
// Create policy information. // Create policy information.
std::string created_at_millis = CreatePolicyTimestamp("1 Jan 2018 10:00:00"); std::string created_at_millis = CreatePolicyTimestamp("1 Jan 2018 10:00:00");
base::Value override_one = base::Value(base::Value::Type::DICTIONARY); base::Value override_one = base::Value(base::Value::Type::DICTIONARY);
override_one.SetKey("action", base::Value("UNLOCK")); override_one.SetKey("action", base::Value(kUnlock));
override_one.SetKey("created_at_millis", base::Value(created_at_millis)); override_one.SetKey("created_at_millis", base::Value(created_at_millis));
base::Value override_two = base::Value(base::Value::Type::DICTIONARY); base::Value override_two = base::Value(base::Value::Type::DICTIONARY);
override_two.SetKey("action", base::Value("LOCK")); override_two.SetKey("action", base::Value(kLock));
override_two.SetKey("created_at_millis", override_two.SetKey("created_at_millis",
base::Value(CreatePolicyTimestamp("1 Jan 2018 9:00:00"))); base::Value(CreatePolicyTimestamp("1 Jan 2018 9:00:00")));
...@@ -307,6 +306,42 @@ TEST_F(UsageTimeLimitProcessorInternalTest, OverrideValid) { ...@@ -307,6 +306,42 @@ TEST_F(UsageTimeLimitProcessorInternalTest, OverrideValid) {
ASSERT_FALSE(override_struct.duration); ASSERT_FALSE(override_struct.duration);
} }
// Check that the most recent override is chosen when more than one is sent on
// the policy. This test covers the corner case when the timestamp strings have
// different sizes.
TEST_F(UsageTimeLimitProcessorInternalTest, MultipleOverrides) {
// Create policy information.
base::Value override_one = base::Value(base::Value::Type::DICTIONARY);
override_one.SetKey("action", base::Value(kUnlock));
override_one.SetKey("created_at_millis", base::Value("1000000"));
base::Value override_two = base::Value(base::Value::Type::DICTIONARY);
override_two.SetKey("action", base::Value(kLock));
override_two.SetKey("created_at_millis", base::Value("999999"));
base::Value override_three = base::Value(base::Value::Type::DICTIONARY);
override_two.SetKey("action", base::Value(kLock));
override_two.SetKey("created_at_millis", base::Value("900000"));
base::Value override_four = base::Value(base::Value::Type::DICTIONARY);
override_two.SetKey("action", base::Value(kUnlock));
override_two.SetKey("created_at_millis", base::Value("1200000"));
base::Value overrides(base::Value::Type::LIST);
overrides.GetList().push_back(std::move(override_one));
overrides.GetList().push_back(std::move(override_two));
overrides.GetList().push_back(std::move(override_three));
overrides.GetList().push_back(std::move(override_four));
// Call tested functions.
TimeLimitOverride override_struct(overrides);
// Assert right fields are set.
ASSERT_EQ(override_struct.action, TimeLimitOverride::Action::kUnlock);
ASSERT_EQ(override_struct.created_at, base::Time::FromJavaTime(1200000));
ASSERT_FALSE(override_struct.duration);
}
} // namespace internal } // namespace internal
// Tests the GetState for a policy that only have the time window limit set. It // Tests the GetState for a policy that only have the time window limit set. It
......
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