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