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