blob: e2e32e178c7c9d44789efdb1ac336bf335f180fb [file] [log] [blame]
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -07001// Copyright 2014 The Chromium OS 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 <algorithm>
6#include <limits>
7#include <memory>
8#include <vector>
9
10#include <base/json/json_reader.h>
11#include <base/json/json_writer.h>
12#include <base/values.h>
13#include <gtest/gtest.h>
14
15#include "buffet/commands/object_schema.h"
16#include "buffet/commands/prop_types.h"
Alex Vakulenko6201d2d2014-07-16 14:46:48 -070017#include "buffet/commands/unittest_utils.h"
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070018
Alex Vakulenko6201d2d2014-07-16 14:46:48 -070019using buffet::unittests::CreateValue;
20using buffet::unittests::CreateDictionaryValue;
21using buffet::unittests::ValueToString;
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070022
23TEST(CommandSchema, IntPropType_Empty) {
24 buffet::IntPropType prop;
25 EXPECT_TRUE(prop.GetConstraints().empty());
26 EXPECT_FALSE(prop.HasOverriddenAttributes());
27 EXPECT_FALSE(prop.IsBasedOnSchema());
28}
29
30TEST(CommandSchema, IntPropType_Types) {
31 buffet::IntPropType prop;
32 EXPECT_EQ(nullptr, prop.GetBoolean());
33 EXPECT_EQ(&prop, prop.GetInt());
34 EXPECT_EQ(nullptr, prop.GetDouble());
35 EXPECT_EQ(nullptr, prop.GetString());
Alex Vakulenko66ec2922014-06-17 15:30:22 -070036 EXPECT_EQ(nullptr, prop.GetObject());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070037}
38
39TEST(CommandSchema, IntPropType_ToJson) {
40 buffet::IntPropType prop;
41 EXPECT_EQ("'integer'", ValueToString(prop.ToJson(false, nullptr).get()));
42 EXPECT_EQ("{'type':'integer'}",
43 ValueToString(prop.ToJson(true, nullptr).get()));
44 buffet::IntPropType param2;
45 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
46 EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
47 param2.FromJson(CreateDictionaryValue("{'minimum':3}").get(),
48 &prop, nullptr);
49 EXPECT_EQ("{'minimum':3}",
50 ValueToString(param2.ToJson(false, nullptr).get()));
51 param2.FromJson(CreateDictionaryValue("{'maximum':-7}").get(),
52 &prop, nullptr);
53 EXPECT_EQ("{'maximum':-7}",
54 ValueToString(param2.ToJson(false, nullptr).get()));
55 param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':5}").get(),
56 &prop, nullptr);
57 EXPECT_EQ("{'maximum':5,'minimum':0}",
58 ValueToString(param2.ToJson(false, nullptr).get()));
59 param2.FromJson(CreateDictionaryValue("{'enum':[1,2,3]}").get(), &prop,
60 nullptr);
61 EXPECT_EQ("[1,2,3]",
62 ValueToString(param2.ToJson(false, nullptr).get()));
63}
64
65TEST(CommandSchema, IntPropType_FromJson) {
66 buffet::IntPropType prop;
67 prop.AddMinMaxConstraint(2, 8);
68 buffet::IntPropType param2;
69 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
70 EXPECT_FALSE(param2.HasOverriddenAttributes());
71 EXPECT_TRUE(param2.IsBasedOnSchema());
72 EXPECT_EQ(2, prop.GetMinValue());
73 EXPECT_EQ(8, prop.GetMaxValue());
74 prop.AddMinMaxConstraint(-2, 30);
75 param2.FromJson(CreateDictionaryValue("{'minimum':7}").get(),
76 &prop, nullptr);
77 EXPECT_TRUE(param2.HasOverriddenAttributes());
78 EXPECT_TRUE(param2.IsBasedOnSchema());
79 EXPECT_EQ(7, param2.GetMinValue());
80 EXPECT_EQ(30, param2.GetMaxValue());
81 param2.FromJson(CreateDictionaryValue("{'maximum':17}").get(),
82 &prop, nullptr);
83 EXPECT_TRUE(param2.HasOverriddenAttributes());
84 EXPECT_TRUE(param2.IsBasedOnSchema());
85 EXPECT_EQ(-2, param2.GetMinValue());
86 EXPECT_EQ(17, param2.GetMaxValue());
87 param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':6}").get(),
88 &prop, nullptr);
89 EXPECT_TRUE(param2.HasOverriddenAttributes());
90 EXPECT_TRUE(param2.IsBasedOnSchema());
91 EXPECT_EQ(0, param2.GetMinValue());
92 EXPECT_EQ(6, param2.GetMaxValue());
93}
94
95TEST(CommandSchema, IntPropType_Validate) {
96 buffet::IntPropType prop;
97 prop.AddMinMaxConstraint(2, 4);
Alex Vakulenko5f472062014-08-14 17:54:04 -070098 chromeos::ErrorPtr error;
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070099 EXPECT_FALSE(prop.ValidateValue(CreateValue("-1").get(), &error));
100 EXPECT_EQ("out_of_range", error->GetCode());
101 error.reset();
102 EXPECT_FALSE(prop.ValidateValue(CreateValue("0").get(), &error));
103 EXPECT_EQ("out_of_range", error->GetCode());
104 error.reset();
105 EXPECT_FALSE(prop.ValidateValue(CreateValue("1").get(), &error));
106 EXPECT_EQ("out_of_range", error->GetCode());
107 error.reset();
108 EXPECT_TRUE(prop.ValidateValue(CreateValue("2").get(), &error));
109 EXPECT_EQ(nullptr, error.get());
110 EXPECT_TRUE(prop.ValidateValue(CreateValue("3").get(), &error));
111 EXPECT_EQ(nullptr, error.get());
112 EXPECT_TRUE(prop.ValidateValue(CreateValue("4").get(), &error));
113 EXPECT_EQ(nullptr, error.get());
114 EXPECT_FALSE(prop.ValidateValue(CreateValue("5").get(), &error));
115 EXPECT_EQ("out_of_range", error->GetCode());
116 error.reset();
117 EXPECT_FALSE(prop.ValidateValue(CreateValue("true").get(), &error));
118 EXPECT_EQ("type_mismatch", error->GetCode());
119 error.reset();
120 EXPECT_FALSE(prop.ValidateValue(CreateValue("3.0").get(), &error));
121 EXPECT_EQ("type_mismatch", error->GetCode());
122 error.reset();
123 EXPECT_FALSE(prop.ValidateValue(CreateValue("'3'").get(), &error));
124 EXPECT_EQ("type_mismatch", error->GetCode());
125}
126
127///////////////////////////////////////////////////////////////////////////////
128
129TEST(CommandSchema, BoolPropType_Empty) {
130 buffet::BooleanPropType prop;
131 EXPECT_TRUE(prop.GetConstraints().empty());
132 EXPECT_FALSE(prop.HasOverriddenAttributes());
133 EXPECT_FALSE(prop.IsBasedOnSchema());
134}
135
136TEST(CommandSchema, BoolPropType_Types) {
137 buffet::BooleanPropType prop;
138 EXPECT_EQ(nullptr, prop.GetInt());
139 EXPECT_EQ(&prop, prop.GetBoolean());
140 EXPECT_EQ(nullptr, prop.GetDouble());
141 EXPECT_EQ(nullptr, prop.GetString());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700142 EXPECT_EQ(nullptr, prop.GetObject());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700143}
144
145TEST(CommandSchema, BoolPropType_ToJson) {
146 buffet::BooleanPropType prop;
147 EXPECT_EQ("'boolean'", ValueToString(prop.ToJson(false, nullptr).get()));
148 EXPECT_EQ("{'type':'boolean'}",
149 ValueToString(prop.ToJson(true, nullptr).get()));
150 buffet::BooleanPropType param2;
151 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
152 EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
153 param2.FromJson(CreateDictionaryValue("{'enum':[true,false]}").get(), &prop,
154 nullptr);
155 EXPECT_EQ("[true,false]", ValueToString(param2.ToJson(false, nullptr).get()));
156 EXPECT_EQ("{'enum':[true,false],'type':'boolean'}",
157 ValueToString(param2.ToJson(true, nullptr).get()));
158}
159
160TEST(CommandSchema, BoolPropType_FromJson) {
161 buffet::BooleanPropType prop;
162 prop.FromJson(CreateDictionaryValue("{'enum':[true]}").get(), &prop,
163 nullptr);
164 buffet::BooleanPropType param2;
165 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
166 EXPECT_FALSE(param2.HasOverriddenAttributes());
167 EXPECT_TRUE(param2.IsBasedOnSchema());
168 EXPECT_EQ(std::vector<bool>{true}, prop.GetOneOfValues());
169}
170
171TEST(CommandSchema, BoolPropType_Validate) {
172 buffet::BooleanPropType prop;
173 prop.FromJson(CreateDictionaryValue("{'enum':[true]}").get(), &prop,
174 nullptr);
Alex Vakulenko5f472062014-08-14 17:54:04 -0700175 chromeos::ErrorPtr error;
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700176 EXPECT_FALSE(prop.ValidateValue(CreateValue("false").get(), &error));
177 EXPECT_EQ("out_of_range", error->GetCode());
178 error.reset();
179 EXPECT_TRUE(prop.ValidateValue(CreateValue("true").get(), &error));
180 error.reset();
181 EXPECT_FALSE(prop.ValidateValue(CreateValue("1").get(), &error));
182 EXPECT_EQ("type_mismatch", error->GetCode());
183 error.reset();
184 EXPECT_FALSE(prop.ValidateValue(CreateValue("3.0").get(), &error));
185 EXPECT_EQ("type_mismatch", error->GetCode());
186 error.reset();
187 EXPECT_FALSE(prop.ValidateValue(CreateValue("'3'").get(), &error));
188 EXPECT_EQ("type_mismatch", error->GetCode());
189}
190
191///////////////////////////////////////////////////////////////////////////////
192
193TEST(CommandSchema, DoublePropType_Empty) {
194 buffet::DoublePropType prop;
195 EXPECT_DOUBLE_EQ(std::numeric_limits<double>::lowest(), prop.GetMinValue());
196 EXPECT_DOUBLE_EQ((std::numeric_limits<double>::max)(), prop.GetMaxValue());
197 EXPECT_FALSE(prop.HasOverriddenAttributes());
198 EXPECT_FALSE(prop.IsBasedOnSchema());
199}
200
201TEST(CommandSchema, DoublePropType_Types) {
202 buffet::DoublePropType prop;
203 EXPECT_EQ(nullptr, prop.GetInt());
204 EXPECT_EQ(nullptr, prop.GetBoolean());
205 EXPECT_EQ(&prop, prop.GetDouble());
206 EXPECT_EQ(nullptr, prop.GetString());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700207 EXPECT_EQ(nullptr, prop.GetObject());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700208}
209
210TEST(CommandSchema, DoublePropType_ToJson) {
211 buffet::DoublePropType prop;
212 EXPECT_EQ("'number'", ValueToString(prop.ToJson(false, nullptr).get()));
213 EXPECT_EQ("{'type':'number'}",
214 ValueToString(prop.ToJson(true, nullptr).get()));
215 buffet::DoublePropType param2;
216 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
217 EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
218 param2.FromJson(CreateDictionaryValue("{'minimum':3}").get(), &prop,
219 nullptr);
220 EXPECT_EQ("{'minimum':3.0}",
221 ValueToString(param2.ToJson(false, nullptr).get()));
222 param2.FromJson(CreateDictionaryValue("{'maximum':-7}").get(), &prop,
223 nullptr);
224 EXPECT_EQ("{'maximum':-7.0}",
225 ValueToString(param2.ToJson(false, nullptr).get()));
226 param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':5}").get(),
227 &prop, nullptr);
228 EXPECT_EQ("{'maximum':5.0,'minimum':0.0}",
229 ValueToString(param2.ToJson(false, nullptr).get()));
230}
231
232TEST(CommandSchema, DoublePropType_FromJson) {
233 buffet::DoublePropType prop;
234 prop.AddMinMaxConstraint(2.5, 8.7);
235 buffet::DoublePropType param2;
236 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
237 EXPECT_FALSE(param2.HasOverriddenAttributes());
238 EXPECT_TRUE(param2.IsBasedOnSchema());
239 EXPECT_DOUBLE_EQ(2.5, prop.GetMinValue());
240 EXPECT_DOUBLE_EQ(8.7, prop.GetMaxValue());
241 prop.AddMinMaxConstraint(-2.2, 30.4);
242 param2.FromJson(CreateDictionaryValue("{'minimum':7}").get(), &prop,
243 nullptr);
244 EXPECT_TRUE(param2.HasOverriddenAttributes());
245 EXPECT_TRUE(param2.IsBasedOnSchema());
246 EXPECT_DOUBLE_EQ(7.0, param2.GetMinValue());
247 EXPECT_DOUBLE_EQ(30.4, param2.GetMaxValue());
248 param2.FromJson(CreateDictionaryValue("{'maximum':17.2}").get(), &prop,
249 nullptr);
250 EXPECT_TRUE(param2.HasOverriddenAttributes());
251 EXPECT_TRUE(param2.IsBasedOnSchema());
252 EXPECT_DOUBLE_EQ(-2.2, param2.GetMinValue());
253 EXPECT_DOUBLE_EQ(17.2, param2.GetMaxValue());
254 param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':6.1}").get(),
255 &prop, nullptr);
256 EXPECT_TRUE(param2.HasOverriddenAttributes());
257 EXPECT_TRUE(param2.IsBasedOnSchema());
258 EXPECT_DOUBLE_EQ(0.0, param2.GetMinValue());
259 EXPECT_DOUBLE_EQ(6.1, param2.GetMaxValue());
260}
261
262TEST(CommandSchema, DoublePropType_Validate) {
263 buffet::DoublePropType prop;
264 prop.AddMinMaxConstraint(-1.2, 1.3);
Alex Vakulenko5f472062014-08-14 17:54:04 -0700265 chromeos::ErrorPtr error;
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700266 EXPECT_FALSE(prop.ValidateValue(CreateValue("-2").get(), &error));
267 EXPECT_EQ("out_of_range", error->GetCode());
268 error.reset();
269 EXPECT_FALSE(prop.ValidateValue(CreateValue("-1.3").get(), &error));
270 EXPECT_EQ("out_of_range", error->GetCode());
271 error.reset();
272 EXPECT_TRUE(prop.ValidateValue(CreateValue("-1.2").get(), &error));
273 EXPECT_EQ(nullptr, error.get());
274 EXPECT_TRUE(prop.ValidateValue(CreateValue("0.0").get(), &error));
275 EXPECT_EQ(nullptr, error.get());
276 EXPECT_TRUE(prop.ValidateValue(CreateValue("1.3").get(), &error));
277 EXPECT_EQ(nullptr, error.get());
278 EXPECT_FALSE(prop.ValidateValue(CreateValue("1.31").get(), &error));
279 EXPECT_EQ("out_of_range", error->GetCode());
280 error.reset();
281 EXPECT_FALSE(prop.ValidateValue(CreateValue("true").get(), &error));
282 EXPECT_EQ("type_mismatch", error->GetCode());
283 error.reset();
284 EXPECT_FALSE(prop.ValidateValue(CreateValue("'0.0'").get(), &error));
285 EXPECT_EQ("type_mismatch", error->GetCode());
286}
287
288///////////////////////////////////////////////////////////////////////////////
289
290TEST(CommandSchema, StringPropType_Empty) {
291 buffet::StringPropType prop;
292 EXPECT_EQ(0, prop.GetMinLength());
293 EXPECT_EQ((std::numeric_limits<int>::max)(), prop.GetMaxLength());
294 EXPECT_FALSE(prop.HasOverriddenAttributes());
295 EXPECT_FALSE(prop.IsBasedOnSchema());
296}
297
298TEST(CommandSchema, StringPropType_Types) {
299 buffet::StringPropType prop;
300 EXPECT_EQ(nullptr, prop.GetInt());
301 EXPECT_EQ(nullptr, prop.GetBoolean());
302 EXPECT_EQ(nullptr, prop.GetDouble());
303 EXPECT_EQ(&prop, prop.GetString());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700304 EXPECT_EQ(nullptr, prop.GetObject());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700305}
306
307TEST(CommandSchema, StringPropType_ToJson) {
308 buffet::StringPropType prop;
309 EXPECT_EQ("'string'", ValueToString(prop.ToJson(false, nullptr).get()));
310 EXPECT_EQ("{'type':'string'}",
311 ValueToString(prop.ToJson(true, nullptr).get()));
312 buffet::StringPropType param2;
313 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
314 EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
315 param2.FromJson(CreateDictionaryValue("{'minLength':3}").get(), &prop,
316 nullptr);
317 EXPECT_EQ("{'minLength':3}",
318 ValueToString(param2.ToJson(false, nullptr).get()));
319 param2.FromJson(CreateDictionaryValue("{'maxLength':7}").get(), &prop,
320 nullptr);
321 EXPECT_EQ("{'maxLength':7}",
322 ValueToString(param2.ToJson(false, nullptr).get()));
323 param2.FromJson(CreateDictionaryValue("{'minLength':0,'maxLength':5}").get(),
324 &prop, nullptr);
325 EXPECT_EQ("{'maxLength':5,'minLength':0}",
326 ValueToString(param2.ToJson(false, nullptr).get()));
327}
328
329TEST(CommandSchema, StringPropType_FromJson) {
330 buffet::StringPropType prop;
331 prop.AddLengthConstraint(2, 8);
332 buffet::StringPropType param2;
333 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
334 EXPECT_FALSE(param2.HasOverriddenAttributes());
335 EXPECT_TRUE(param2.IsBasedOnSchema());
336 EXPECT_EQ(2, prop.GetMinLength());
337 EXPECT_EQ(8, prop.GetMaxLength());
338 prop.AddLengthConstraint(3, 5);
339 param2.FromJson(CreateDictionaryValue("{'minLength':4}").get(), &prop,
340 nullptr);
341 EXPECT_TRUE(param2.HasOverriddenAttributes());
342 EXPECT_TRUE(param2.IsBasedOnSchema());
343 EXPECT_EQ(4, param2.GetMinLength());
344 EXPECT_EQ(5, param2.GetMaxLength());
345 param2.FromJson(CreateDictionaryValue("{'maxLength':8}").get(), &prop,
346 nullptr);
347 EXPECT_TRUE(param2.HasOverriddenAttributes());
348 EXPECT_TRUE(param2.IsBasedOnSchema());
349 EXPECT_EQ(3, param2.GetMinLength());
350 EXPECT_EQ(8, param2.GetMaxLength());
351 param2.FromJson(CreateDictionaryValue(
352 "{'minLength':1,'maxLength':7}").get(), &prop, nullptr);
353 EXPECT_TRUE(param2.HasOverriddenAttributes());
354 EXPECT_TRUE(param2.IsBasedOnSchema());
355 EXPECT_EQ(1, param2.GetMinLength());
356 EXPECT_EQ(7, param2.GetMaxLength());
357}
358
359TEST(CommandSchema, StringPropType_Validate) {
360 buffet::StringPropType prop;
361 prop.AddLengthConstraint(1, 3);
Alex Vakulenko5f472062014-08-14 17:54:04 -0700362 chromeos::ErrorPtr error;
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700363 EXPECT_FALSE(prop.ValidateValue(CreateValue("''").get(), &error));
364 EXPECT_EQ("out_of_range", error->GetCode());
365 error.reset();
366 prop.AddLengthConstraint(2, 3);
367 EXPECT_FALSE(prop.ValidateValue(CreateValue("''").get(), &error));
368 EXPECT_EQ("out_of_range", error->GetCode());
369 error.reset();
370 EXPECT_FALSE(prop.ValidateValue(CreateValue("'a'").get(), &error));
371 EXPECT_EQ("out_of_range", error->GetCode());
372 error.reset();
373 EXPECT_TRUE(prop.ValidateValue(CreateValue("'ab'").get(), &error));
374 EXPECT_EQ(nullptr, error.get());
375 EXPECT_TRUE(prop.ValidateValue(CreateValue("'abc'").get(), &error));
376 EXPECT_EQ(nullptr, error.get());
377 EXPECT_FALSE(prop.ValidateValue(CreateValue("'abcd'").get(), &error));
378 EXPECT_EQ("out_of_range", error->GetCode());
379 error.reset();
380
381 prop.FromJson(CreateDictionaryValue("{'enum':['abc','def','xyz!!']}").get(),
382 nullptr, &error);
383 EXPECT_TRUE(prop.ValidateValue(CreateValue("'abc'").get(), &error));
384 EXPECT_TRUE(prop.ValidateValue(CreateValue("'def'").get(), &error));
385 EXPECT_TRUE(prop.ValidateValue(CreateValue("'xyz!!'").get(), &error));
386 EXPECT_FALSE(prop.ValidateValue(CreateValue("'xyz'").get(), &error));
387 EXPECT_EQ("out_of_range", error->GetCode());
388 error.reset();
389}
390
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700391///////////////////////////////////////////////////////////////////////////////
392
393TEST(CommandSchema, ObjectPropType_Empty) {
394 buffet::ObjectPropType prop;
395 EXPECT_TRUE(prop.HasOverriddenAttributes());
396 EXPECT_FALSE(prop.IsBasedOnSchema());
397}
398
399TEST(CommandSchema, ObjectPropType_Types) {
400 buffet::ObjectPropType prop;
401 EXPECT_EQ(nullptr, prop.GetInt());
402 EXPECT_EQ(nullptr, prop.GetBoolean());
403 EXPECT_EQ(nullptr, prop.GetDouble());
404 EXPECT_EQ(nullptr, prop.GetString());
405 EXPECT_EQ(&prop, prop.GetObject());
406}
407
408TEST(CommandSchema, ObjectPropType_ToJson) {
409 buffet::ObjectPropType prop;
410 EXPECT_EQ("{'properties':{}}",
411 ValueToString(prop.ToJson(false, nullptr).get()));
412 EXPECT_EQ("{'properties':{},'type':'object'}",
413 ValueToString(prop.ToJson(true, nullptr).get()));
414 EXPECT_FALSE(prop.IsBasedOnSchema());
415 buffet::ObjectPropType prop2;
416 prop2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
417 EXPECT_EQ("{}", ValueToString(prop2.ToJson(false, nullptr).get()));
418 EXPECT_TRUE(prop2.IsBasedOnSchema());
419
420 auto schema = std::make_shared<buffet::ObjectSchema>();
421 schema->AddProp("expires", std::make_shared<buffet::IntPropType>());
422 auto pw = std::make_shared<buffet::StringPropType>();
423 pw->AddLengthConstraint(6, 100);
424 schema->AddProp("password", pw);
425 prop2.SetObjectSchema(schema);
426 EXPECT_EQ("{'properties':{'expires':'integer',"
427 "'password':{'maxLength':100,'minLength':6}}}",
428 ValueToString(prop2.ToJson(false, nullptr).get()));
429 EXPECT_EQ("{'properties':{'expires':{'type':'integer'},"
430 "'password':{'maxLength':100,'minLength':6,'type':'string'}},"
431 "'type':'object'}",
432 ValueToString(prop2.ToJson(true, nullptr).get()));
433}
434
435TEST(CommandSchema, ObjectPropType_FromJson) {
436 buffet::ObjectPropType base_prop;
437 EXPECT_TRUE(base_prop.FromJson(CreateDictionaryValue(
438 "{'properties':{'name':'string','age':'integer'}}").get(), nullptr,
439 nullptr));
440 auto schema = base_prop.GetObjectSchemaPtr();
441 const buffet::PropType* prop = schema->GetProp("name");
442 EXPECT_EQ(buffet::ValueType::String, prop->GetType());
443 prop = schema->GetProp("age");
444 EXPECT_EQ(buffet::ValueType::Int, prop->GetType());
445}
446
447TEST(CommandSchema, ObjectPropType_Validate) {
448 buffet::ObjectPropType prop;
449 prop.FromJson(CreateDictionaryValue(
450 "{'properties':{'expires':'integer',"
451 "'password':{'maxLength':100,'minLength':6}}}").get(), nullptr,
452 nullptr);
Alex Vakulenko5f472062014-08-14 17:54:04 -0700453 chromeos::ErrorPtr error;
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700454 EXPECT_TRUE(prop.ValidateValue(CreateValue(
455 "{'expires':10,'password':'abcdef'}").get(), &error));
456 error.reset();
457
458 EXPECT_FALSE(prop.ValidateValue(CreateValue(
459 "{'expires':10}").get(), &error));
460 EXPECT_EQ("parameter_missing", error->GetCode());
461 error.reset();
462
463 EXPECT_FALSE(prop.ValidateValue(CreateValue(
464 "{'password':'abcdef'}").get(), &error));
465 EXPECT_EQ("parameter_missing", error->GetCode());
466 error.reset();
467
468 EXPECT_FALSE(prop.ValidateValue(CreateValue(
469 "{'expires':10,'password':'abcde'}").get(), &error));
470 EXPECT_EQ("out_of_range", error->GetFirstError()->GetCode());
471 error.reset();
472
473 EXPECT_FALSE(prop.ValidateValue(CreateValue("2").get(), &error));
474 EXPECT_EQ("type_mismatch", error->GetCode());
475 error.reset();
476
477 EXPECT_FALSE(prop.ValidateValue(CreateValue(
478 "{'expires':10,'password':'abcdef','retry':true}").get(), &error));
479 EXPECT_EQ("unexpected_parameter", error->GetCode());
480 error.reset();
481}
482
483TEST(CommandSchema, ObjectPropType_Validate_Enum) {
484 buffet::ObjectPropType prop;
485 EXPECT_TRUE(prop.FromJson(CreateDictionaryValue(
486 "{'properties':{'width':'integer','height':'integer'},"
487 "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}").get(),
488 nullptr, nullptr));
Alex Vakulenko5f472062014-08-14 17:54:04 -0700489 chromeos::ErrorPtr error;
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700490 EXPECT_TRUE(prop.ValidateValue(CreateValue(
491 "{'height':20,'width':10}").get(), &error));
492 error.reset();
493
494 EXPECT_TRUE(prop.ValidateValue(CreateValue(
495 "{'height':200,'width':100}").get(), &error));
496 error.reset();
497
498 EXPECT_FALSE(prop.ValidateValue(CreateValue(
499 "{'height':12,'width':10}").get(), &error));
500 EXPECT_EQ("out_of_range", error->GetCode());
501 error.reset();
502}
503
504///////////////////////////////////////////////////////////////////////////////
505
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700506TEST(CommandSchema, ObjectSchema_FromJson_Shorthand_TypeName) {
507 buffet::ObjectSchema schema;
508 const char* schema_str = "{"
509 "'param1':'integer',"
510 "'param2':'number',"
511 "'param3':'string'"
512 "}";
513 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
514 nullptr));
515 EXPECT_EQ(buffet::ValueType::Int, schema.GetProp("param1")->GetType());
516 EXPECT_EQ(buffet::ValueType::Double, schema.GetProp("param2")->GetType());
517 EXPECT_EQ(buffet::ValueType::String, schema.GetProp("param3")->GetType());
518 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
519 EXPECT_EQ("number", schema.GetProp("param2")->GetTypeAsString());
520 EXPECT_EQ("string", schema.GetProp("param3")->GetTypeAsString());
521 EXPECT_EQ(nullptr, schema.GetProp("param4"));
522
523 int min_int = (std::numeric_limits<int>::min)();
524 int max_int = (std::numeric_limits<int>::max)();
525 double min_dbl = (std::numeric_limits<double>::lowest)();
526 double max_dbl = (std::numeric_limits<double>::max)();
527 EXPECT_EQ(min_int, schema.GetProp("param1")->GetInt()->GetMinValue());
528 EXPECT_EQ(max_int, schema.GetProp("param1")->GetInt()->GetMaxValue());
529 EXPECT_EQ(min_dbl, schema.GetProp("param2")->GetDouble()->GetMinValue());
530 EXPECT_EQ(max_dbl, schema.GetProp("param2")->GetDouble()->GetMaxValue());
531 EXPECT_EQ(0, schema.GetProp("param3")->GetString()->GetMinLength());
532 EXPECT_EQ(max_int, schema.GetProp("param3")->GetString()->GetMaxLength());
533}
534
535TEST(CommandSchema, ObjectSchema_FromJson_Full_TypeName) {
536 buffet::ObjectSchema schema;
537 const char* schema_str = "{"
538 "'param1':{'type':'integer'},"
539 "'param2':{'type':'number'},"
540 "'param3':{'type':'string'}"
541 "}";
542 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
543 nullptr));
544 EXPECT_EQ(buffet::ValueType::Int, schema.GetProp("param1")->GetType());
545 EXPECT_EQ(buffet::ValueType::Double, schema.GetProp("param2")->GetType());
546 EXPECT_EQ(buffet::ValueType::String, schema.GetProp("param3")->GetType());
547 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
548 EXPECT_EQ("number", schema.GetProp("param2")->GetTypeAsString());
549 EXPECT_EQ("string", schema.GetProp("param3")->GetTypeAsString());
550 EXPECT_EQ(nullptr, schema.GetProp("param4"));
551
552 int min_int = (std::numeric_limits<int>::min)();
553 int max_int = (std::numeric_limits<int>::max)();
554 double min_dbl = (std::numeric_limits<double>::lowest)();
555 double max_dbl = (std::numeric_limits<double>::max)();
556 EXPECT_EQ(min_int, schema.GetProp("param1")->GetInt()->GetMinValue());
557 EXPECT_EQ(max_int, schema.GetProp("param1")->GetInt()->GetMaxValue());
558 EXPECT_EQ(min_dbl, schema.GetProp("param2")->GetDouble()->GetMinValue());
559 EXPECT_EQ(max_dbl, schema.GetProp("param2")->GetDouble()->GetMaxValue());
560 EXPECT_EQ(0, schema.GetProp("param3")->GetString()->GetMinLength());
561 EXPECT_EQ(max_int, schema.GetProp("param3")->GetString()->GetMaxLength());
562}
563
564TEST(CommandSchema, ObjectSchema_FromJson_Shorthand_TypeDeduction_Scalar) {
565 buffet::ObjectSchema schema;
566 const char* schema_str = "{"
567 "'param1' :{'minimum':2},"
568 "'param2' :{'maximum':10},"
569 "'param3' :{'maximum':8, 'minimum':2},"
570 "'param4' :{'minimum':2.1},"
571 "'param5' :{'maximum':10.1},"
572 "'param6' :{'maximum':8.1, 'minimum':3.1},"
573 "'param7' :{'maximum':8, 'minimum':3.1},"
574 "'param8' :{'maximum':8.1, 'minimum':3},"
575 "'param9' :{'minLength':2},"
576 "'param10':{'maxLength':10},"
577 "'param11':{'maxLength':8, 'minLength':3}"
578 "}";
579 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
580 nullptr));
581 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
582 EXPECT_EQ("integer", schema.GetProp("param2")->GetTypeAsString());
583 EXPECT_EQ("integer", schema.GetProp("param3")->GetTypeAsString());
584 EXPECT_EQ("number", schema.GetProp("param4")->GetTypeAsString());
585 EXPECT_EQ("number", schema.GetProp("param5")->GetTypeAsString());
586 EXPECT_EQ("number", schema.GetProp("param6")->GetTypeAsString());
587 EXPECT_EQ("number", schema.GetProp("param7")->GetTypeAsString());
588 EXPECT_EQ("number", schema.GetProp("param8")->GetTypeAsString());
589 EXPECT_EQ("string", schema.GetProp("param9")->GetTypeAsString());
590 EXPECT_EQ("string", schema.GetProp("param10")->GetTypeAsString());
591 EXPECT_EQ("string", schema.GetProp("param11")->GetTypeAsString());
592
593 int min_int = (std::numeric_limits<int>::min)();
594 int max_int = (std::numeric_limits<int>::max)();
595 double min_dbl = (std::numeric_limits<double>::lowest)();
596 double max_dbl = (std::numeric_limits<double>::max)();
597 EXPECT_EQ(2, schema.GetProp("param1")->GetInt()->GetMinValue());
598 EXPECT_EQ(max_int, schema.GetProp("param1")->GetInt()->GetMaxValue());
599 EXPECT_EQ(min_int, schema.GetProp("param2")->GetInt()->GetMinValue());
600 EXPECT_EQ(10, schema.GetProp("param2")->GetInt()->GetMaxValue());
601 EXPECT_EQ(2, schema.GetProp("param3")->GetInt()->GetMinValue());
602 EXPECT_EQ(8, schema.GetProp("param3")->GetInt()->GetMaxValue());
603 EXPECT_DOUBLE_EQ(2.1, schema.GetProp("param4")->GetDouble()->GetMinValue());
604 EXPECT_DOUBLE_EQ(max_dbl,
605 schema.GetProp("param4")->GetDouble()->GetMaxValue());
606 EXPECT_DOUBLE_EQ(min_dbl,
607 schema.GetProp("param5")->GetDouble()->GetMinValue());
608 EXPECT_DOUBLE_EQ(10.1, schema.GetProp("param5")->GetDouble()->GetMaxValue());
609 EXPECT_DOUBLE_EQ(3.1, schema.GetProp("param6")->GetDouble()->GetMinValue());
610 EXPECT_DOUBLE_EQ(8.1, schema.GetProp("param6")->GetDouble()->GetMaxValue());
611 EXPECT_DOUBLE_EQ(3.1, schema.GetProp("param7")->GetDouble()->GetMinValue());
612 EXPECT_DOUBLE_EQ(8.0, schema.GetProp("param7")->GetDouble()->GetMaxValue());
613 EXPECT_DOUBLE_EQ(3.0, schema.GetProp("param8")->GetDouble()->GetMinValue());
614 EXPECT_DOUBLE_EQ(8.1, schema.GetProp("param8")->GetDouble()->GetMaxValue());
615 EXPECT_EQ(2, schema.GetProp("param9")->GetString()->GetMinLength());
616 EXPECT_EQ(max_int, schema.GetProp("param9")->GetString()->GetMaxLength());
617 EXPECT_EQ(0, schema.GetProp("param10")->GetString()->GetMinLength());
618 EXPECT_EQ(10, schema.GetProp("param10")->GetString()->GetMaxLength());
619 EXPECT_EQ(3, schema.GetProp("param11")->GetString()->GetMinLength());
620 EXPECT_EQ(8, schema.GetProp("param11")->GetString()->GetMaxLength());
621}
622
623TEST(CommandSchema, ObjectSchema_FromJson_Shorthand_TypeDeduction_Array) {
624 buffet::ObjectSchema schema;
625 const char* schema_str = "{"
626 "'param1' :[0,1,2,3],"
627 "'param2' :[0.0,1.1,2.2],"
628 "'param3' :['id1', 'id2'],"
629 "'param4' :{'enum':[1,2,3]},"
630 "'param5' :{'enum':[-1.1,2.2,3]},"
631 "'param6' :{'enum':['id0', 'id1']},"
632 "'param7' :{'type':'integer', 'enum':[1,2,3]},"
633 "'param8' :{'type':'number', 'enum':[1,2,3]},"
634 "'param9' :{'type':'number', 'enum':[]},"
635 "'param10':{'type':'integer', 'enum':[]}"
636 "}";
637 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
638 nullptr));
639 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
640 EXPECT_EQ("number", schema.GetProp("param2")->GetTypeAsString());
641 EXPECT_EQ("string", schema.GetProp("param3")->GetTypeAsString());
642 EXPECT_EQ("integer", schema.GetProp("param4")->GetTypeAsString());
643 EXPECT_EQ("number", schema.GetProp("param5")->GetTypeAsString());
644 EXPECT_EQ("string", schema.GetProp("param6")->GetTypeAsString());
645 EXPECT_EQ("integer", schema.GetProp("param7")->GetTypeAsString());
646 EXPECT_EQ("number", schema.GetProp("param8")->GetTypeAsString());
647 EXPECT_EQ("number", schema.GetProp("param9")->GetTypeAsString());
648 EXPECT_EQ("integer", schema.GetProp("param10")->GetTypeAsString());
649
650 EXPECT_EQ(4, schema.GetProp("param1")->GetInt()->GetOneOfValues().size());
651 EXPECT_EQ(3, schema.GetProp("param2")->GetDouble()->GetOneOfValues().size());
652 EXPECT_EQ(2, schema.GetProp("param3")->GetString()->GetOneOfValues().size());
653 EXPECT_EQ(3, schema.GetProp("param4")->GetInt()->GetOneOfValues().size());
654 EXPECT_EQ(3, schema.GetProp("param5")->GetDouble()->GetOneOfValues().size());
655 EXPECT_EQ(2, schema.GetProp("param6")->GetString()->GetOneOfValues().size());
656 EXPECT_EQ(3, schema.GetProp("param7")->GetInt()->GetOneOfValues().size());
657 EXPECT_EQ(3, schema.GetProp("param8")->GetDouble()->GetOneOfValues().size());
658 EXPECT_EQ(0, schema.GetProp("param9")->GetDouble()->GetOneOfValues().size());
659 EXPECT_EQ(0, schema.GetProp("param10")->GetInt()->GetOneOfValues().size());
660
661 EXPECT_EQ(std::vector<int>({0, 1, 2, 3}),
662 schema.GetProp("param1")->GetInt()->GetOneOfValues());
663 EXPECT_EQ(std::vector<double>({0.0, 1.1, 2.2}),
664 schema.GetProp("param2")->GetDouble()->GetOneOfValues());
665 EXPECT_EQ(std::vector<std::string>({"id1", "id2"}),
666 schema.GetProp("param3")->GetString()->GetOneOfValues());
667
668 EXPECT_EQ(std::vector<int>({1, 2, 3}),
669 schema.GetProp("param4")->GetInt()->GetOneOfValues());
670 EXPECT_EQ(std::vector<double>({-1.1, 2.2, 3.0}),
671 schema.GetProp("param5")->GetDouble()->GetOneOfValues());
672 EXPECT_EQ(std::vector<std::string>({"id0", "id1"}),
673 schema.GetProp("param6")->GetString()->GetOneOfValues());
674 EXPECT_EQ(std::vector<int>({1, 2, 3}),
675 schema.GetProp("param7")->GetInt()->GetOneOfValues());
676 EXPECT_EQ(std::vector<double>({1.0, 2.0, 3.0}),
677 schema.GetProp("param8")->GetDouble()->GetOneOfValues());
678}
679
680TEST(CommandSchema, ObjectSchema_FromJson_Inheritance) {
681 const char* base_schema_str = "{"
682 "'param0' :{'minimum':1, 'maximum':5},"
683 "'param1' :{'minimum':1, 'maximum':5},"
684 "'param2' :{'minimum':1, 'maximum':5},"
685 "'param3' :{'minimum':1, 'maximum':5},"
686 "'param4' :{'minimum':1, 'maximum':5},"
687 "'param5' :{'minimum':1.1, 'maximum':5.5},"
688 "'param6' :{'minimum':1.1, 'maximum':5.5},"
689 "'param7' :{'minimum':1.1, 'maximum':5.5},"
690 "'param8' :{'minimum':1.1, 'maximum':5.5},"
691 "'param9' :{'minLength':1, 'maxLength':5},"
692 "'param10':{'minLength':1, 'maxLength':5},"
693 "'param11':{'minLength':1, 'maxLength':5},"
694 "'param12':{'minLength':1, 'maxLength':5},"
695 "'param13':[1,2,3],"
696 "'param14':[1,2,3],"
697 "'param15':[1.1,2.2,3.3],"
698 "'param16':[1.1,2.2,3.3],"
699 "'param17':['id1', 'id2'],"
700 "'param18':['id1', 'id2'],"
701 "'param19':{'minimum':1, 'maximum':5}"
702 "}";
703 buffet::ObjectSchema base_schema;
704 EXPECT_TRUE(base_schema.FromJson(CreateDictionaryValue(base_schema_str).get(),
705 nullptr, nullptr));
706 const char* schema_str = "{"
707 "'param1' :{},"
708 "'param2' :{'minimum':2},"
709 "'param3' :{'maximum':9},"
710 "'param4' :{'minimum':2, 'maximum':9},"
711 "'param5' :{},"
712 "'param6' :{'minimum':2.2},"
713 "'param7' :{'maximum':9.9},"
714 "'param8' :{'minimum':2.2, 'maximum':9.9},"
715 "'param9' :{},"
716 "'param10':{'minLength':3},"
717 "'param11':{'maxLength':8},"
718 "'param12':{'minLength':3, 'maxLength':8},"
719 "'param13':{},"
720 "'param14':[1,2,3,4],"
721 "'param15':{},"
722 "'param16':[1.1,2.2,3.3,4.4],"
723 "'param17':{},"
724 "'param18':['id1', 'id3'],"
725 "'param19':{}"
726 "}";
727 buffet::ObjectSchema schema;
728 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(),
729 &base_schema, nullptr));
730 EXPECT_EQ(nullptr, schema.GetProp("param0"));
731 EXPECT_NE(nullptr, schema.GetProp("param1"));
732 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
733 EXPECT_EQ(1, schema.GetProp("param1")->GetInt()->GetMinValue());
734 EXPECT_EQ(5, schema.GetProp("param1")->GetInt()->GetMaxValue());
735 EXPECT_EQ("integer", schema.GetProp("param2")->GetTypeAsString());
736 EXPECT_EQ(2, schema.GetProp("param2")->GetInt()->GetMinValue());
737 EXPECT_EQ(5, schema.GetProp("param2")->GetInt()->GetMaxValue());
738 EXPECT_EQ("integer", schema.GetProp("param3")->GetTypeAsString());
739 EXPECT_EQ(1, schema.GetProp("param3")->GetInt()->GetMinValue());
740 EXPECT_EQ(9, schema.GetProp("param3")->GetInt()->GetMaxValue());
741 EXPECT_EQ("integer", schema.GetProp("param4")->GetTypeAsString());
742 EXPECT_EQ(2, schema.GetProp("param4")->GetInt()->GetMinValue());
743 EXPECT_EQ(9, schema.GetProp("param4")->GetInt()->GetMaxValue());
744 EXPECT_EQ("number", schema.GetProp("param5")->GetTypeAsString());
745 EXPECT_EQ(1.1, schema.GetProp("param5")->GetDouble()->GetMinValue());
746 EXPECT_EQ(5.5, schema.GetProp("param5")->GetDouble()->GetMaxValue());
747 EXPECT_EQ("number", schema.GetProp("param6")->GetTypeAsString());
748 EXPECT_EQ(2.2, schema.GetProp("param6")->GetDouble()->GetMinValue());
749 EXPECT_EQ(5.5, schema.GetProp("param6")->GetDouble()->GetMaxValue());
750 EXPECT_EQ("number", schema.GetProp("param7")->GetTypeAsString());
751 EXPECT_EQ(1.1, schema.GetProp("param7")->GetDouble()->GetMinValue());
752 EXPECT_EQ(9.9, schema.GetProp("param7")->GetDouble()->GetMaxValue());
753 EXPECT_EQ("number", schema.GetProp("param8")->GetTypeAsString());
754 EXPECT_EQ(2.2, schema.GetProp("param8")->GetDouble()->GetMinValue());
755 EXPECT_EQ(9.9, schema.GetProp("param8")->GetDouble()->GetMaxValue());
756 EXPECT_EQ("string", schema.GetProp("param9")->GetTypeAsString());
757 EXPECT_EQ(1, schema.GetProp("param9")->GetString()->GetMinLength());
758 EXPECT_EQ(5, schema.GetProp("param9")->GetString()->GetMaxLength());
759 EXPECT_EQ("string", schema.GetProp("param10")->GetTypeAsString());
760 EXPECT_EQ(3, schema.GetProp("param10")->GetString()->GetMinLength());
761 EXPECT_EQ(5, schema.GetProp("param10")->GetString()->GetMaxLength());
762 EXPECT_EQ("string", schema.GetProp("param11")->GetTypeAsString());
763 EXPECT_EQ(1, schema.GetProp("param11")->GetString()->GetMinLength());
764 EXPECT_EQ(8, schema.GetProp("param11")->GetString()->GetMaxLength());
765 EXPECT_EQ("string", schema.GetProp("param12")->GetTypeAsString());
766 EXPECT_EQ(3, schema.GetProp("param12")->GetString()->GetMinLength());
767 EXPECT_EQ(8, schema.GetProp("param12")->GetString()->GetMaxLength());
768 EXPECT_EQ("integer", schema.GetProp("param13")->GetTypeAsString());
769 EXPECT_EQ(std::vector<int>({1, 2, 3}),
770 schema.GetProp("param13")->GetInt()->GetOneOfValues());
771 EXPECT_EQ("integer", schema.GetProp("param14")->GetTypeAsString());
772 EXPECT_EQ(std::vector<int>({1, 2, 3, 4}),
773 schema.GetProp("param14")->GetInt()->GetOneOfValues());
774 EXPECT_EQ("number", schema.GetProp("param15")->GetTypeAsString());
775 EXPECT_EQ(std::vector<double>({1.1, 2.2, 3.3}),
776 schema.GetProp("param15")->GetDouble()->GetOneOfValues());
777 EXPECT_EQ("number", schema.GetProp("param16")->GetTypeAsString());
778 EXPECT_EQ(std::vector<double>({1.1, 2.2, 3.3, 4.4}),
779 schema.GetProp("param16")->GetDouble()->GetOneOfValues());
780 EXPECT_EQ("string", schema.GetProp("param17")->GetTypeAsString());
781 EXPECT_EQ(std::vector<std::string>({"id1", "id2"}),
782 schema.GetProp("param17")->GetString()->GetOneOfValues());
783 EXPECT_EQ("string", schema.GetProp("param18")->GetTypeAsString());
784 EXPECT_EQ(std::vector<std::string>({"id1", "id3"}),
785 schema.GetProp("param18")->GetString()->GetOneOfValues());
786 EXPECT_EQ("integer", schema.GetProp("param19")->GetTypeAsString());
787 EXPECT_EQ(1, schema.GetProp("param19")->GetInt()->GetMinValue());
788 EXPECT_EQ(5, schema.GetProp("param19")->GetInt()->GetMaxValue());
789}
790
791TEST(CommandSchema, ObjectSchema_FromJson_BaseSchema_Failures) {
792 buffet::ObjectSchema schema;
Alex Vakulenko5f472062014-08-14 17:54:04 -0700793 chromeos::ErrorPtr error;
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700794 const char* schema_str = "{"
795 "'param1':{}"
796 "}";
797 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
798 &error));
799 EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode());
800 error.reset();
801
802 schema_str = "{"
803 "'param1':{'type':'foo'}"
804 "}";
805 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
806 &error));
807 EXPECT_EQ("unknown_type", error->GetFirstError()->GetCode());
808 error.reset();
809
810 schema_str = "{"
811 "'param1':[]"
812 "}";
813 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
814 &error));
815 EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode());
816 error.reset();
817
818 schema_str = "{"
819 "'param1':{'minimum':'foo'}"
820 "}";
821 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
822 &error));
823 EXPECT_EQ("type_mismatch", error->GetFirstError()->GetCode());
824 error.reset();
825
826 schema_str = "{"
827 "'param1':[1,2.2]"
828 "}";
829 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
830 &error));
831 EXPECT_EQ("type_mismatch", error->GetFirstError()->GetCode());
832 error.reset();
Alex Vakulenko5109b202014-06-20 14:49:41 -0700833
834 schema_str = "{"
835 "'param1':{'minimum':1, 'enum':[1,2,3]}" // can't have min/max & enum.
836 "}";
837 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
838 &error));
839 EXPECT_EQ("unexpected_parameter", error->GetFirstError()->GetCode());
840 error.reset();
841
842 schema_str = "{"
843 "'param1':{'maximum':1, 'blah':2}" // 'blah' is unexpected.
844 "}";
845 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
846 &error));
847 EXPECT_EQ("unexpected_parameter", error->GetFirstError()->GetCode());
848 error.reset();
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700849}
850