OLD | NEW |
---|---|
(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 | |
OLD | NEW |