Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Unified Diff: components/policy/core/common/schema_unittest.cc

Issue 134153005: Add strictness to Schema::Validate() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@expand-policy-schema-2
Patch Set: pull from previous CL Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/policy/core/common/schema_unittest.cc
diff --git a/components/policy/core/common/schema_unittest.cc b/components/policy/core/common/schema_unittest.cc
index 8a3ba90b1bd09876b9f0f98900fb11a9ddd50b6c..3f8483d4337e6f43711ca0f2e22b214ed6d9143f 100644
--- a/components/policy/core/common/schema_unittest.cc
+++ b/components/policy/core/common/schema_unittest.cc
@@ -4,6 +4,7 @@
#include "components/policy/core/common/schema.h"
+#include "base/memory/scoped_ptr.h"
#include "components/policy/core/common/schema_internal.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -49,6 +50,16 @@ const char kTestSchema[] =
" },"
" \"additionalProperties\": { \"type\": \"string\" }"
" },"
+ " \"ObjectOfObject\": {"
+ " \"type\": \"object\","
+ " \"Object\": {"
+ " \"type\": \"object\","
+ " \"properties\": {"
+ " \"one\": { \"type\": \"string\" },"
+ " \"two\": { \"type\": \"integer\" }"
+ " }"
+ " }"
+ " },"
Joao da Silva 2014/01/22 10:49:53 Test with a list of dictionaries too. More types t
binjin 2014/01/23 12:01:31 Done. Added tests for ArrayOfObjects, ObjectOfArra
" \"IntegerWithEnums\": {"
" \"type\": \"integer\","
" \"enum\": [1, 2, 3]"
@@ -78,6 +89,35 @@ bool ParseFails(const std::string& content) {
return true;
}
+void TestSchemaValidation(Schema schema,
+ const base::Value& value,
+ SchemaOnErrorStrategy strategy,
+ bool expected_return_value) {
+ std::string error;
+ static const char* no_error_returned = "No error returned.";
+
+ // Test that Schema::Validate() works as expected.
+ error = no_error_returned;
+ bool returned = schema.Validate(value, strategy, &error);
+ EXPECT_EQ(returned, expected_return_value) << error;
+
+ // Test that Schema::Normalize() will return the same value as
+ // Schema::Validate().
+ error = no_error_returned;
+ scoped_ptr<base::Value> cloned_value(value.DeepCopy());
+ returned = schema.Normalize(cloned_value.get(), strategy, &error);
+ EXPECT_EQ(returned, expected_return_value) << error;
+
+ // Test that Schema::Normalize() have actually dropped invalid and unknown
+ // properties.
+ if (expected_return_value) {
+ EXPECT_TRUE(schema.Validate(*cloned_value.get(),
+ SCHEMA_VERY_STRICT, &error));
+ EXPECT_TRUE(schema.Normalize(cloned_value.get(),
+ SCHEMA_VERY_STRICT, &error));
+ }
+}
+
std::string SchemaObjectWrapper(const std::string& subschema) {
return "{"
" \"type\": \"object\","
@@ -286,6 +326,7 @@ TEST(SchemaTest, ValidSchema) {
{ "Null", base::Value::TYPE_NULL },
{ "Number", base::Value::TYPE_DOUBLE },
{ "Object", base::Value::TYPE_DICTIONARY },
+ { "ObjectOfObject", base::Value::TYPE_DICTIONARY },
{ "String", base::Value::TYPE_STRING },
{ "StringWithEnums", base::Value::TYPE_STRING },
};
@@ -467,11 +508,11 @@ TEST(SchemaTest, Validate) {
ASSERT_TRUE(schema.valid()) << error;
base::DictionaryValue bundle;
- EXPECT_TRUE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, true);
// Wrong type, expected integer.
bundle.SetBoolean("Integer", true);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
// Wrong type, expected list of strings.
{
@@ -479,7 +520,7 @@ TEST(SchemaTest, Validate) {
base::ListValue list;
list.AppendInteger(1);
bundle.Set("Array", list.DeepCopy());
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
}
// Wrong type in a sub-object.
@@ -488,13 +529,13 @@ TEST(SchemaTest, Validate) {
base::DictionaryValue dict;
dict.SetString("one", "one");
bundle.Set("Object", dict.DeepCopy());
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
}
// Unknown name.
bundle.Clear();
bundle.SetBoolean("Unknown", true);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
// All of these will be valid.
bundle.Clear();
@@ -545,47 +586,71 @@ TEST(SchemaTest, Validate) {
bundle.SetString("StringWithEnums", "two");
bundle.SetInteger("IntegerWithRange", 3);
- EXPECT_TRUE(schema.Validate(bundle));
-
- bundle.SetString("boom", "bang");
- EXPECT_FALSE(schema.Validate(bundle));
- bundle.Remove("boom", NULL);
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, true);
bundle.SetInteger("IntegerWithEnums", 0);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithEnums", 1);
bundle.SetInteger("IntegerWithEnumsGaps", 0);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithEnumsGaps", 9);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithEnumsGaps", 10);
- EXPECT_TRUE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, true);
bundle.SetInteger("IntegerWithEnumsGaps", 11);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithEnumsGaps", 19);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithEnumsGaps", 21);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithEnumsGaps", 29);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithEnumsGaps", 30);
- EXPECT_TRUE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, true);
bundle.SetInteger("IntegerWithEnumsGaps", 31);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithEnumsGaps", 100);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithEnumsGaps", 20);
bundle.SetString("StringWithEnums", "FOUR");
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetString("StringWithEnums", "two");
bundle.SetInteger("IntegerWithRange", 4);
- EXPECT_FALSE(schema.Validate(bundle));
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
bundle.SetInteger("IntegerWithRange", 3);
+ // Unknown top level property.
+ bundle.SetString("boom", "bang");
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
+ TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_UNKNOWN_TOPLEVEL, true);
+ TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_UNKNOWN, true);
+ bundle.Remove("boom", NULL);
+
+ // Invalid top level property.
+ bundle.SetInteger("Boolean", 12345);
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
+ TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_INVALID_TOPLEVEL, true);
+ TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_INVALID, true);
+ bundle.SetBoolean("Boolean", true);
+
+ // Unknown property.
+ bundle.SetBoolean("ObjectOfObject.Object.three", false);
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
+ TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_UNKNOWN_TOPLEVEL, false);
+ TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_UNKNOWN, true);
+ bundle.Remove("ObjectOfObject.Object.three", NULL);
+
+ // Invalid property.
+ bundle.SetInteger("ObjectOfObject.Object.one", 12345);
+ TestSchemaValidation(schema, bundle, SCHEMA_VERY_STRICT, false);
+ TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_INVALID_TOPLEVEL, false);
+ TestSchemaValidation(schema, bundle, SCHEMA_ALLOW_INVALID, true);
+ bundle.Remove("ObjectOfObject.Object.one", NULL);
}
+
TEST(SchemaTest, InvalidReferences) {
// References to undeclared schemas fail.
EXPECT_TRUE(ParseFails(
« components/policy/core/common/schema_map.cc ('K') | « components/policy/core/common/schema_map.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698