Commit 89f1df98 authored by anina koehler's avatar anina koehler Committed by Commit Bot

Remove SCHEMA_ALLOW_INVALID from SchemaOnErrorStrategy

Deprecate the policy schema SCHEMA_ALLOW_INVALID since it only has a different value from SCHEMA_ALLOW_UNKNOWN on Mac OS and Android and in a low percentage of its use cases.

Bug: 969706
Change-Id: Ie5251e1ceaa6a4bc8472e6bb1477b7a6de45fc2f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2018946
Commit-Queue: Anina Koehler <aninak@google.com>
Reviewed-by: default avatarAlexander Hendrich <hendrich@chromium.org>
Cr-Commit-Position: refs/heads/master@{#742540}
parent c7bb21d0
...@@ -753,19 +753,9 @@ TEST(SchemaValidatingPolicyHandlerTest, CheckAndGetValueInvalid) { ...@@ -753,19 +753,9 @@ TEST(SchemaValidatingPolicyHandlerTest, CheckAndGetValueInvalid) {
policy_map.LoadFrom(policy_map_dict, POLICY_LEVEL_RECOMMENDED, policy_map.LoadFrom(policy_map_dict, POLICY_LEVEL_RECOMMENDED,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD); POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD);
TestSchemaValidatingPolicyHandler handler(schema, SCHEMA_ALLOW_INVALID); TestSchemaValidatingPolicyHandler handler(schema, SCHEMA_ALLOW_UNKNOWN);
std::unique_ptr<base::Value> output_value; std::unique_ptr<base::Value> output_value;
ASSERT_TRUE(handler.CheckAndGetValueForTest(policy_map, &output_value)); EXPECT_FALSE(handler.CheckAndGetValueForTest(policy_map, &output_value));
ASSERT_TRUE(output_value);
base::DictionaryValue* dict = nullptr;
ASSERT_TRUE(output_value->GetAsDictionary(&dict));
// Test that CheckAndGetValue() actually dropped invalid properties.
int int_value = -1;
EXPECT_TRUE(dict->GetInteger("OneToThree", &int_value));
EXPECT_EQ(2, int_value);
EXPECT_FALSE(dict->HasKey("Colors"));
} }
TEST(SchemaValidatingPolicyHandlerTest, CheckAndGetValueUnknown) { TEST(SchemaValidatingPolicyHandlerTest, CheckAndGetValueUnknown) {
...@@ -807,7 +797,7 @@ TEST(SchemaValidatingPolicyHandlerTest, CheckAndGetValueUnknown) { ...@@ -807,7 +797,7 @@ TEST(SchemaValidatingPolicyHandlerTest, CheckAndGetValueUnknown) {
policy_map.LoadFrom(policy_map_dict, POLICY_LEVEL_RECOMMENDED, policy_map.LoadFrom(policy_map_dict, POLICY_LEVEL_RECOMMENDED,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD); POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD);
TestSchemaValidatingPolicyHandler handler(schema, SCHEMA_ALLOW_INVALID); TestSchemaValidatingPolicyHandler handler(schema, SCHEMA_ALLOW_UNKNOWN);
std::unique_ptr<base::Value> output_value; std::unique_ptr<base::Value> output_value;
ASSERT_TRUE(handler.CheckAndGetValueForTest(policy_map, &output_value)); ASSERT_TRUE(handler.CheckAndGetValueForTest(policy_map, &output_value));
ASSERT_TRUE(output_value); ASSERT_TRUE(output_value);
......
...@@ -221,10 +221,6 @@ bool SchemaTypeToValueType(const std::string& schema_type, ...@@ -221,10 +221,6 @@ bool SchemaTypeToValueType(const std::string& schema_type,
kSchemaTypesToValueTypesEnd, value_type); kSchemaTypesToValueTypesEnd, value_type);
} }
bool StrategyAllowInvalid(SchemaOnErrorStrategy strategy) {
return strategy == SCHEMA_ALLOW_INVALID;
}
bool StrategyAllowUnknown(SchemaOnErrorStrategy strategy) { bool StrategyAllowUnknown(SchemaOnErrorStrategy strategy) {
return strategy != SCHEMA_STRICT; return strategy != SCHEMA_STRICT;
} }
...@@ -1219,7 +1215,6 @@ bool Schema::Validate(const base::Value& value, ...@@ -1219,7 +1215,6 @@ bool Schema::Validate(const base::Value& value,
if (!StrategyAllowUnknown(strategy)) if (!StrategyAllowUnknown(strategy))
return false; return false;
} else { } else {
bool all_subschemas_are_valid = true;
for (const auto& subschema : schema_list) { for (const auto& subschema : schema_list) {
std::string new_error; std::string new_error;
const bool validation_result = subschema.Validate( const bool validation_result = subschema.Validate(
...@@ -1230,13 +1225,10 @@ bool Schema::Validate(const base::Value& value, ...@@ -1230,13 +1225,10 @@ bool Schema::Validate(const base::Value& value,
} }
if (!validation_result) { if (!validation_result) {
// Invalid property was detected. // Invalid property was detected.
all_subschemas_are_valid = false; return false;
if (!StrategyAllowInvalid(strategy))
return false;
} }
} }
if (all_subschemas_are_valid) present_properties.insert(dict_item.first);
present_properties.insert(dict_item.first);
} }
} }
...@@ -1259,7 +1251,7 @@ bool Schema::Validate(const base::Value& value, ...@@ -1259,7 +1251,7 @@ bool Schema::Validate(const base::Value& value,
AddListIndexPrefixToPath(index, error_path); AddListIndexPrefixToPath(index, error_path);
*error = std::move(new_error); *error = std::move(new_error);
} }
if (!validation_result && !StrategyAllowInvalid(strategy)) if (!validation_result)
return false; // Invalid list item was detected. return false; // Invalid list item was detected.
} }
} else if (value.is_int()) { } else if (value.is_int()) {
...@@ -1314,7 +1306,6 @@ bool Schema::Normalize(base::Value* value, ...@@ -1314,7 +1306,6 @@ bool Schema::Normalize(base::Value* value,
return false; return false;
drop_list.push_back(dict_item.first); drop_list.push_back(dict_item.first);
} else { } else {
bool all_subschemas_are_valid = true;
for (const auto& subschema : schema_list) { for (const auto& subschema : schema_list) {
std::string new_error; std::string new_error;
const bool normalization_result = subschema.Normalize( const bool normalization_result = subschema.Normalize(
...@@ -1325,15 +1316,12 @@ bool Schema::Normalize(base::Value* value, ...@@ -1325,15 +1316,12 @@ bool Schema::Normalize(base::Value* value,
} }
if (!normalization_result) { if (!normalization_result) {
// Invalid property was detected. // Invalid property was detected.
all_subschemas_are_valid = false; return false;
if (!StrategyAllowInvalid(strategy))
return false;
drop_list.push_back(dict_item.first); drop_list.push_back(dict_item.first);
break; break;
} }
} }
if (all_subschemas_are_valid) present_properties.insert(dict_item.first);
present_properties.insert(dict_item.first);
} }
} }
...@@ -1370,8 +1358,7 @@ bool Schema::Normalize(base::Value* value, ...@@ -1370,8 +1358,7 @@ bool Schema::Normalize(base::Value* value,
} }
if (!normalization_result) { if (!normalization_result) {
// Invalid list item was detected. // Invalid list item was detected.
if (!StrategyAllowInvalid(strategy)) return false;
return false;
} else { } else {
if (write_index != index) if (write_index != index)
list[write_index] = std::move(list_item); list[write_index] = std::move(list_item);
......
...@@ -41,8 +41,6 @@ enum SchemaOnErrorStrategy { ...@@ -41,8 +41,6 @@ enum SchemaOnErrorStrategy {
SCHEMA_STRICT = 0, SCHEMA_STRICT = 0,
// Unknown properties in any dictionary will be ignored. // Unknown properties in any dictionary will be ignored.
SCHEMA_ALLOW_UNKNOWN, SCHEMA_ALLOW_UNKNOWN,
// Mismatched values will be ignored.
SCHEMA_ALLOW_INVALID,
}; };
// Schema validation options for Schema::ParseToDictAndValidate(). // Schema validation options for Schema::ParseToDictAndValidate().
......
...@@ -794,7 +794,7 @@ TEST(SchemaTest, Validate) { ...@@ -794,7 +794,7 @@ TEST(SchemaTest, Validate) {
// Invalid top level property. // Invalid top level property.
bundle.SetInteger("Boolean", 12345); bundle.SetInteger("Boolean", 12345);
TestSchemaValidation(schema, bundle, SCHEMA_STRICT, false); TestSchemaValidation(schema, bundle, SCHEMA_STRICT, false);
TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_INVALID, true); TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_UNKNOWN, false);
TestSchemaValidationWithPath(schema, bundle, "Boolean"); TestSchemaValidationWithPath(schema, bundle, "Boolean");
bundle.SetBoolean("Boolean", true); bundle.SetBoolean("Boolean", true);
...@@ -808,7 +808,6 @@ TEST(SchemaTest, Validate) { ...@@ -808,7 +808,6 @@ TEST(SchemaTest, Validate) {
root.SetBoolean("Object.three", false); root.SetBoolean("Object.three", false);
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, true); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, true);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, true);
TestSchemaValidationWithPath(subschema, root, "Object"); TestSchemaValidationWithPath(subschema, root, "Object");
root.Remove("Object.three", nullptr); root.Remove("Object.three", nullptr);
...@@ -816,7 +815,6 @@ TEST(SchemaTest, Validate) { ...@@ -816,7 +815,6 @@ TEST(SchemaTest, Validate) {
root.SetInteger("Object.one", 12345); root.SetInteger("Object.one", 12345);
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, true);
TestSchemaValidationWithPath(subschema, root, "Object.one"); TestSchemaValidationWithPath(subschema, root, "Object.one");
root.Remove("Object.one", nullptr); root.Remove("Object.one", nullptr);
} }
...@@ -834,7 +832,6 @@ TEST(SchemaTest, Validate) { ...@@ -834,7 +832,6 @@ TEST(SchemaTest, Validate) {
root.Append(std::move(dict_value)); root.Append(std::move(dict_value));
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, true); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, true);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, true);
TestSchemaValidationWithPath(subschema, root, "items[0]"); TestSchemaValidationWithPath(subschema, root, "items[0]");
root.Remove(root.GetSize() - 1, nullptr); root.Remove(root.GetSize() - 1, nullptr);
...@@ -844,7 +841,6 @@ TEST(SchemaTest, Validate) { ...@@ -844,7 +841,6 @@ TEST(SchemaTest, Validate) {
root.Append(std::move(dict_value)); root.Append(std::move(dict_value));
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, true);
TestSchemaValidationWithPath(subschema, root, "items[0].two"); TestSchemaValidationWithPath(subschema, root, "items[0].two");
root.Remove(root.GetSize() - 1, nullptr); root.Remove(root.GetSize() - 1, nullptr);
} }
...@@ -862,13 +858,11 @@ TEST(SchemaTest, Validate) { ...@@ -862,13 +858,11 @@ TEST(SchemaTest, Validate) {
list_value->AppendInteger(12345); list_value->AppendInteger(12345);
TestSchemaValidation(subschema, root, SCHEMA_STRICT, true); TestSchemaValidation(subschema, root, SCHEMA_STRICT, true);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, true); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, true);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, true);
// Invalid list item. // Invalid list item.
list_value->AppendString("blabla"); list_value->AppendString("blabla");
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, true);
TestSchemaValidationWithPath(subschema, root, "List.items[1]"); TestSchemaValidationWithPath(subschema, root, "List.items[1]");
} }
...@@ -887,13 +881,11 @@ TEST(SchemaTest, Validate) { ...@@ -887,13 +881,11 @@ TEST(SchemaTest, Validate) {
list_value->AppendString("blabla"); list_value->AppendString("blabla");
TestSchemaValidation(subschema, root, SCHEMA_STRICT, true); TestSchemaValidation(subschema, root, SCHEMA_STRICT, true);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, true); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, true);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, true);
// Invalid list item. // Invalid list item.
list_value->AppendInteger(12345); list_value->AppendInteger(12345);
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, true);
TestSchemaValidationWithPath(subschema, root, "items[0].List.items[1]"); TestSchemaValidationWithPath(subschema, root, "items[0].List.items[1]");
} }
...@@ -972,13 +964,11 @@ TEST(SchemaTest, Validate) { ...@@ -972,13 +964,11 @@ TEST(SchemaTest, Validate) {
root.SetDouble("Number", 3.14); root.SetDouble("Number", 3.14);
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, false);
// Invalid required property. // Invalid required property.
root.SetInteger("String", 123); root.SetInteger("String", 123);
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, false);
root.SetString("String", "a string"); root.SetString("String", "a string");
// Invalid subschema of required property with multiple subschemas. // Invalid subschema of required property with multiple subschemas.
...@@ -991,12 +981,10 @@ TEST(SchemaTest, Validate) { ...@@ -991,12 +981,10 @@ TEST(SchemaTest, Validate) {
root.SetInteger("Integer", 2); root.SetInteger("Integer", 2);
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, false);
root.SetInteger("Integer", 3); root.SetInteger("Integer", 3);
TestSchemaValidation(subschema, root, SCHEMA_STRICT, false); TestSchemaValidation(subschema, root, SCHEMA_STRICT, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false); TestSchemaValidation(subschema, root, SCHEMA_ALLOW_UNKNOWN, false);
TestSchemaValidation(subschema, root, SCHEMA_ALLOW_INVALID, false);
} }
// Test that integer to double promotion is allowed. // Test that integer to double promotion is allowed.
......
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