13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/json_schema/json_schema_validator.h" 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/json_schema/json_schema_validator_unittest_base.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JSONSchemaValidatorCPPTest : public JSONSchemaValidatorTestBase { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch JSONSchemaValidatorCPPTest() : JSONSchemaValidatorTestBase() {} 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ExpectValid(const std::string& test_source, 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value* instance, 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* schema, 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::ListValue* types) OVERRIDE { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator validator(schema, types); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (validator.Validate(instance)) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < validator.errors().size(); ++i) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << test_source << ": " 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << validator.errors()[i].path << ": " 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << validator.errors()[i].message; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ExpectNotValid( 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& test_source, 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value* instance, base::DictionaryValue* schema, 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::ListValue* types, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& expected_error_path, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& expected_error_message) OVERRIDE { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator validator(schema, types); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (validator.Validate(instance)) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << test_source; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, validator.errors().size()) << test_source; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_error_path, validator.errors()[0].path) << test_source; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_error_message, validator.errors()[0].message) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << test_source; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JSONSchemaValidatorCPPTest, Test) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTests(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(JSONSchemaValidator, IsValidSchema) { 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string error; 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("", &error)); 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("\0", &error)); 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("string", &error)); 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("\"string\"", &error)); 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("[]", &error)); 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("{}", &error)); 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema( 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{ \"type\": 123 }", &error)); 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema( 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{ \"type\": \"invalid\" }", &error)); 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema( 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{" 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"object\"," 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"properties\": []" // Invalid properties type. 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "}", &error)); 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema( 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{" 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"string\"," 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"maxLength\": -1" // Must be >= 0. 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "}", &error)); 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema( 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{" 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"string\"," 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) " \"enum\": [ {} ]" // "enum" dict values must contain "name". 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "}", &error)); 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema( 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{" 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) " \"type\": \"string\"," 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) " \"enum\": [ { \"name\": {} } ]" // "enum" name must be a simple value. 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "}", &error)); 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema( 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "{" 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"array\"," 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"items\": [ 123 ]," // "items" must contain a schema or schemas. 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "}", &error)); 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(JSONSchemaValidator::IsValidSchema( 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{ \"type\": \"object\" }", &error)) << error; 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(JSONSchemaValidator::IsValidSchema( 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{ \"type\": [\"object\", \"array\"] }", &error)) << error; 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(JSONSchemaValidator::IsValidSchema( 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "{" 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": [\"object\", \"array\"]," 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"properties\": {" 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"string-property\": {" 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"string\"," 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"minLength\": 1," 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"maxLength\": 100," 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"title\": \"The String Policy\"," 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"description\": \"This policy controls the String widget.\"" 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " }," 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"integer-property\": {" 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"number\"," 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"minimum\": 1000.0," 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"maximum\": 9999.0" 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " }," 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"enum-property\": {" 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"integer\"," 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) " \"enum\": [0, 1, {\"name\": 10}, 100]" 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " }," 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"items-property\": {" 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"array\"," 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"items\": {" 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"string\"" 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " }" 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " }," 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"items-list-property\": {" 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"array\"," 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"items\": [" 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " { \"type\": \"string\" }," 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " { \"type\": \"integer\" }" 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " ]" 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " }" 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " }," 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"additionalProperties\": {" 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " \"type\": \"any\"" 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) " }" 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "}", &error)) << error; 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(JSONSchemaValidator::IsValidSchema( 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "{" 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"type\": \"object\"," 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"patternProperties\": {" 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \".\": { \"type\": \"any\" }," 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"foo\": { \"type\": \"any\" }," 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"^foo$\": { \"type\": \"any\" }," 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"foo+\": { \"type\": \"any\" }," 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"foo?\": { \"type\": \"any\" }," 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"fo{2,4}\": { \"type\": \"any\" }," 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"(left)|(right)\": { \"type\": \"any\" }" 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " }" 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "}", &error)) << error; 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(JSONSchemaValidator::IsValidSchema( 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "{" 147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"type\": \"object\"," 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"unknown attribute\": \"that should just be ignored\"" 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "}", 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) JSONSchemaValidator::OPTIONS_IGNORE_UNKNOWN_ATTRIBUTES, 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &error)) << error; 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(JSONSchemaValidator::IsValidSchema( 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "{" 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"type\": \"object\"," 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"unknown attribute\": \"that will cause a failure\"" 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "}", 0, &error)) << error; 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 158