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

Side by Side Diff: components/policy/core/common/schema_unittest.cc

Issue 23851022: Added new policy Schema classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: POLICY_EXPORT for Schema::Iterator Created 7 years, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/policy/core/common/schema.h"
6
7 #include "components/policy/core/common/schema_internal.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 namespace policy {
11
12 namespace schema {
13
14 namespace {
15
16 #define SCHEMA_VERSION "\"$schema\":\"http://json-schema.org/draft-03/schema#\""
17 #define OBJECT_TYPE "\"type\":\"object\""
18
19 const internal::SchemaNode kTypeBoolean = { base::Value::TYPE_BOOLEAN, NULL, };
20 const internal::SchemaNode kTypeInteger = { base::Value::TYPE_INTEGER, NULL, };
21 const internal::SchemaNode kTypeNumber = { base::Value::TYPE_DOUBLE, NULL, };
22 const internal::SchemaNode kTypeString = { base::Value::TYPE_STRING, NULL, };
23
24 bool ParseFails(const std::string& content) {
25 std::string error;
26 scoped_ptr<PolicySchema> schema = PolicySchema::Parse(content, &error);
27 if (schema)
28 EXPECT_TRUE(schema->schema().valid());
29 else
30 EXPECT_FALSE(error.empty());
31 return !schema;
32 }
33
34 } // namespace
35
36 TEST(SchemaTest, MinimalSchema) {
Mattias Nissler (ping if slow) 2013/09/13 12:56:48 Why not include this test in InvalidSchemas?
Joao da Silva 2013/09/13 14:02:54 This schema is valid, and this is just testing tha
Mattias Nissler (ping if slow) 2013/09/13 14:55:17 Right, sorry. I failed to parse the double negatio
37 EXPECT_FALSE(ParseFails(
38 "{"
39 SCHEMA_VERSION ","
40 OBJECT_TYPE
41 "}"));
42 }
43
44 TEST(SchemaTest, InvalidSchemas) {
45 EXPECT_TRUE(ParseFails(""));
46 EXPECT_TRUE(ParseFails("omg"));
47 EXPECT_TRUE(ParseFails("\"omg\""));
48 EXPECT_TRUE(ParseFails("123"));
49 EXPECT_TRUE(ParseFails("[]"));
50 EXPECT_TRUE(ParseFails("null"));
51 EXPECT_TRUE(ParseFails("{}"));
52 EXPECT_TRUE(ParseFails("{" SCHEMA_VERSION "}"));
53 EXPECT_TRUE(ParseFails("{" OBJECT_TYPE "}"));
54
55 EXPECT_TRUE(ParseFails(
56 "{"
57 SCHEMA_VERSION ","
58 OBJECT_TYPE ","
59 "\"additionalProperties\": { \"type\":\"object\" }"
60 "}"));
61
62 EXPECT_TRUE(ParseFails(
63 "{"
64 SCHEMA_VERSION ","
65 OBJECT_TYPE ","
66 "\"patternProperties\": { \"a+b*\": { \"type\": \"object\" } }"
67 "}"));
68
69 EXPECT_TRUE(ParseFails(
70 "{"
71 SCHEMA_VERSION ","
72 OBJECT_TYPE ","
73 "\"properties\": { \"Policy\": { \"type\": \"bogus\" } }"
74 "}"));
75
76 EXPECT_TRUE(ParseFails(
77 "{"
78 SCHEMA_VERSION ","
79 OBJECT_TYPE ","
80 "\"properties\": { \"Policy\": { \"type\": [\"string\", \"number\"] } }"
81 "}"));
82
83 EXPECT_TRUE(ParseFails(
84 "{"
85 SCHEMA_VERSION ","
86 OBJECT_TYPE ","
87 "\"properties\": { \"Policy\": { \"type\": \"any\" } }"
88 "}"));
89 }
90
91 TEST(SchemaTest, ValidSchema) {
92 std::string error;
93 scoped_ptr<PolicySchema> policy_schema = PolicySchema::Parse(
94 "{"
95 SCHEMA_VERSION ","
96 OBJECT_TYPE ","
97 "\"properties\": {"
98 " \"Boolean\": { \"type\": \"boolean\" },"
99 " \"Integer\": { \"type\": \"integer\" },"
100 " \"Null\": { \"type\": \"null\" },"
101 " \"Number\": { \"type\": \"number\" },"
102 " \"String\": { \"type\": \"string\" },"
103 " \"Array\": {"
104 " \"type\": \"array\","
105 " \"items\": { \"type\": \"string\" }"
106 " },"
107 " \"ArrayOfObjects\": {"
108 " \"type\": \"array\","
109 " \"items\": {"
110 " \"type\": \"object\","
111 " \"properties\": {"
112 " \"one\": { \"type\": \"string\" },"
113 " \"two\": { \"type\": \"integer\" }"
114 " }"
115 " }"
116 " },"
117 " \"ArrayOfArray\": {"
118 " \"type\": \"array\","
119 " \"items\": {"
120 " \"type\": \"array\","
121 " \"items\": { \"type\": \"string\" }"
122 " }"
123 " },"
124 " \"Object\": {"
125 " \"type\": \"object\","
126 " \"properties\": {"
127 " \"one\": { \"type\": \"boolean\" },"
128 " \"two\": { \"type\": \"integer\" }"
129 " },"
130 " \"additionalProperties\": { \"type\": \"string\" }"
131 " }"
132 "}"
133 "}", &error);
134 ASSERT_TRUE(policy_schema) << error;
135 ASSERT_TRUE(policy_schema->schema().valid());
136
137 Schema schema = policy_schema->schema();
138 ASSERT_EQ(base::Value::TYPE_DICTIONARY, schema.type());
139 EXPECT_FALSE(schema.GetProperty("invalid").valid());
140
141 Schema sub = schema.GetProperty("Boolean");
142 ASSERT_TRUE(sub.valid());
143 EXPECT_EQ(base::Value::TYPE_BOOLEAN, sub.type());
144
145 sub = schema.GetProperty("Integer");
146 ASSERT_TRUE(sub.valid());
147 EXPECT_EQ(base::Value::TYPE_INTEGER, sub.type());
148
149 sub = schema.GetProperty("Null");
150 ASSERT_TRUE(sub.valid());
151 EXPECT_EQ(base::Value::TYPE_NULL, sub.type());
152
153 sub = schema.GetProperty("Number");
154 ASSERT_TRUE(sub.valid());
155 EXPECT_EQ(base::Value::TYPE_DOUBLE, sub.type());
156
157 sub = schema.GetProperty("String");
158 ASSERT_TRUE(sub.valid());
159 EXPECT_EQ(base::Value::TYPE_STRING, sub.type());
160
161 sub = schema.GetProperty("Array");
162 ASSERT_TRUE(sub.valid());
163 ASSERT_EQ(base::Value::TYPE_LIST, sub.type());
164 sub = sub.GetItems();
165 ASSERT_TRUE(sub.valid());
166 EXPECT_EQ(base::Value::TYPE_STRING, sub.type());
167
168 sub = schema.GetProperty("ArrayOfObjects");
169 ASSERT_TRUE(sub.valid());
170 ASSERT_EQ(base::Value::TYPE_LIST, sub.type());
171 sub = sub.GetItems();
172 ASSERT_TRUE(sub.valid());
173 EXPECT_EQ(base::Value::TYPE_DICTIONARY, sub.type());
174 Schema subsub = sub.GetProperty("one");
175 ASSERT_TRUE(subsub.valid());
176 EXPECT_EQ(base::Value::TYPE_STRING, subsub.type());
177 subsub = sub.GetProperty("two");
178 ASSERT_TRUE(subsub.valid());
179 EXPECT_EQ(base::Value::TYPE_INTEGER, subsub.type());
180 subsub = sub.GetProperty("invalid");
181 EXPECT_FALSE(subsub.valid());
182
183 sub = schema.GetProperty("ArrayOfArray");
184 ASSERT_TRUE(sub.valid());
185 ASSERT_EQ(base::Value::TYPE_LIST, sub.type());
186 sub = sub.GetItems();
187 ASSERT_TRUE(sub.valid());
188 ASSERT_EQ(base::Value::TYPE_LIST, sub.type());
189 sub = sub.GetItems();
190 ASSERT_TRUE(sub.valid());
191 EXPECT_EQ(base::Value::TYPE_STRING, sub.type());
192
193 sub = schema.GetProperty("Object");
194 ASSERT_TRUE(sub.valid());
195 ASSERT_EQ(base::Value::TYPE_DICTIONARY, sub.type());
196 subsub = sub.GetProperty("one");
197 ASSERT_TRUE(subsub.valid());
198 EXPECT_EQ(base::Value::TYPE_BOOLEAN, subsub.type());
199 subsub = sub.GetProperty("two");
200 ASSERT_TRUE(subsub.valid());
201 EXPECT_EQ(base::Value::TYPE_INTEGER, subsub.type());
202 subsub = sub.GetProperty("undeclared");
203 ASSERT_TRUE(subsub.valid());
204 EXPECT_EQ(base::Value::TYPE_STRING, subsub.type());
205
206 struct {
207 const char* expected_key;
208 base::Value::Type expected_type;
209 } kExpectedProperties[] = {
210 { "Array", base::Value::TYPE_LIST },
211 { "ArrayOfArray", base::Value::TYPE_LIST },
212 { "ArrayOfObjects", base::Value::TYPE_LIST },
213 { "Boolean", base::Value::TYPE_BOOLEAN },
214 { "Integer", base::Value::TYPE_INTEGER },
215 { "Null", base::Value::TYPE_NULL },
216 { "Number", base::Value::TYPE_DOUBLE },
217 { "Object", base::Value::TYPE_DICTIONARY },
218 { "String", base::Value::TYPE_STRING },
219 };
220 Schema::Iterator it = schema.GetPropertiesIterator();
221 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kExpectedProperties); ++i) {
222 ASSERT_FALSE(it.IsAtEnd());
223 EXPECT_STREQ(kExpectedProperties[i].expected_key, it.key());
224 ASSERT_TRUE(it.schema().valid());
225 EXPECT_EQ(kExpectedProperties[i].expected_type, it.schema().type());
226 it.Advance();
227 }
228 EXPECT_TRUE(it.IsAtEnd());
229 }
230
231 TEST(SchemaTest, Lookups) {
232 std::string error;
233 scoped_ptr<PolicySchema> policy_schema = PolicySchema::Parse(
234 "{"
235 SCHEMA_VERSION ","
236 OBJECT_TYPE
237 "}", &error);
238 ASSERT_TRUE(policy_schema) << error;
239 Schema schema = policy_schema->schema();
240 ASSERT_TRUE(schema.valid());
241 ASSERT_EQ(base::Value::TYPE_DICTIONARY, schema.type());
242
243 // This empty schema should never find named properties.
244 EXPECT_FALSE(schema.GetKnownProperty("").valid());
245 EXPECT_FALSE(schema.GetKnownProperty("xyz").valid());
246 EXPECT_TRUE(schema.GetPropertiesIterator().IsAtEnd());
247
248 policy_schema = PolicySchema::Parse(
249 "{"
250 SCHEMA_VERSION ","
251 OBJECT_TYPE ","
252 "\"properties\": {"
253 " \"Boolean\": { \"type\": \"boolean\" }"
254 "}"
255 "}", &error);
256 ASSERT_TRUE(policy_schema) << error;
257 schema = policy_schema->schema();
258 ASSERT_TRUE(schema.valid());
259 ASSERT_EQ(base::Value::TYPE_DICTIONARY, schema.type());
260
261 EXPECT_FALSE(schema.GetKnownProperty("").valid());
262 EXPECT_FALSE(schema.GetKnownProperty("xyz").valid());
263 EXPECT_TRUE(schema.GetKnownProperty("Boolean").valid());
264
265 policy_schema = PolicySchema::Parse(
266 "{"
267 SCHEMA_VERSION ","
268 OBJECT_TYPE ","
269 "\"properties\": {"
270 " \"bb\" : { \"type\": \"null\" },"
271 " \"aa\" : { \"type\": \"boolean\" },"
272 " \"abab\" : { \"type\": \"string\" },"
273 " \"ab\" : { \"type\": \"number\" },"
274 " \"aba\" : { \"type\": \"integer\" }"
275 "}"
276 "}", &error);
277 ASSERT_TRUE(policy_schema) << error;
278 schema = policy_schema->schema();
279 ASSERT_TRUE(schema.valid());
280 ASSERT_EQ(base::Value::TYPE_DICTIONARY, schema.type());
281
282 EXPECT_FALSE(schema.GetKnownProperty("").valid());
283 EXPECT_FALSE(schema.GetKnownProperty("xyz").valid());
284
285 struct {
286 const char* expected_key;
287 base::Value::Type expected_type;
288 } kExpectedKeys[] = {
289 { "aa", base::Value::TYPE_BOOLEAN },
290 { "ab", base::Value::TYPE_DOUBLE },
291 { "aba", base::Value::TYPE_INTEGER },
292 { "abab", base::Value::TYPE_STRING },
293 { "bb", base::Value::TYPE_NULL },
294 };
295 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kExpectedKeys); ++i) {
296 Schema sub = schema.GetKnownProperty(kExpectedKeys[i].expected_key);
297 ASSERT_TRUE(sub.valid());
298 EXPECT_EQ(kExpectedKeys[i].expected_type, sub.type());
299 }
300 }
301
302 TEST(SchemaTest, WrapSimpleNode) {
303 scoped_ptr<PolicySchema> policy_schema = PolicySchema::Wrap(&kTypeString);
304 ASSERT_TRUE(policy_schema);
305 Schema schema = policy_schema->schema();
306 ASSERT_TRUE(schema.valid());
307 EXPECT_EQ(base::Value::TYPE_STRING, schema.type());
308 }
309
310 TEST(SchemaTest, WrapDictionary) {
311 const internal::SchemaNode kList = {
312 base::Value::TYPE_LIST,
313 &kTypeString,
314 };
315
316 const internal::PropertyNode kPropertyNodes[] = {
317 { "Boolean", &kTypeBoolean },
318 { "Integer", &kTypeInteger },
319 { "List", &kList },
320 { "Number", &kTypeNumber },
321 { "String", &kTypeString },
322 };
323
324 const internal::PropertiesNode kProperties = {
325 kPropertyNodes,
326 kPropertyNodes + arraysize(kPropertyNodes),
327 NULL,
328 };
329
330 const internal::SchemaNode root = {
331 base::Value::TYPE_DICTIONARY,
332 &kProperties,
333 };
334
335 scoped_ptr<PolicySchema> policy_schema = PolicySchema::Wrap(&root);
336 ASSERT_TRUE(policy_schema);
337 Schema schema = policy_schema->schema();
338 ASSERT_TRUE(schema.valid());
339 EXPECT_EQ(base::Value::TYPE_DICTIONARY, schema.type());
340
341 Schema::Iterator it = schema.GetPropertiesIterator();
342 for (size_t i = 0; i < arraysize(kPropertyNodes); ++i) {
343 ASSERT_FALSE(it.IsAtEnd());
344 EXPECT_STREQ(kPropertyNodes[i].key, it.key());
345 Schema sub = it.schema();
346 ASSERT_TRUE(sub.valid());
347 EXPECT_EQ(kPropertyNodes[i].schema->type, sub.type());
348 it.Advance();
349 }
350 EXPECT_TRUE(it.IsAtEnd());
351 }
352
353 } // namespace schema
354
355 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698