blob: d8729950b242790af343819ed05b686cbcb18bea [file] [log] [blame]
Alex Vakulenko66ec2922014-06-17 15:30:22 -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/schema_utils.h"
6
Alex Vakulenko66ec2922014-06-17 15:30:22 -07007#include <memory>
8#include <string>
9#include <vector>
10
Alex Vakulenko66ec2922014-06-17 15:30:22 -070011#include <base/values.h>
Alex Vakulenko576c9792014-09-22 16:49:45 -070012#include <chromeos/variant_dictionary.h>
Alex Vakulenko66ec2922014-06-17 15:30:22 -070013#include <gtest/gtest.h>
14
15#include "buffet/commands/object_schema.h"
16#include "buffet/commands/prop_types.h"
17#include "buffet/commands/prop_values.h"
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -070018#include "buffet/commands/schema_constants.h"
Alex Vakulenko6201d2d2014-07-16 14:46:48 -070019#include "buffet/commands/unittest_utils.h"
Alex Vakulenko66ec2922014-06-17 15:30:22 -070020
Vitaly Buka32005de2015-05-01 12:33:31 -070021namespace buffet {
22
23using unittests::CreateDictionaryValue;
24using unittests::CreateValue;
Alex Vakulenko576c9792014-09-22 16:49:45 -070025using chromeos::VariantDictionary;
Alex Vakulenko66ec2922014-06-17 15:30:22 -070026
27TEST(CommandSchemaUtils, TypedValueToJson_Scalar) {
Vitaly Buka7c82d292015-05-03 18:08:12 -070028 EXPECT_JSON_EQ("true", *TypedValueToJson(true, nullptr));
29 EXPECT_JSON_EQ("false", *TypedValueToJson(false, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070030
Vitaly Buka7c82d292015-05-03 18:08:12 -070031 EXPECT_JSON_EQ("0", *TypedValueToJson(0, nullptr));
32 EXPECT_JSON_EQ("-10", *TypedValueToJson(-10, nullptr));
33 EXPECT_JSON_EQ("20", *TypedValueToJson(20, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070034
Vitaly Buka7c82d292015-05-03 18:08:12 -070035 EXPECT_JSON_EQ("0.0", *TypedValueToJson(0.0, nullptr));
36 EXPECT_JSON_EQ("1.2", *TypedValueToJson(1.2, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070037
Vitaly Buka7c82d292015-05-03 18:08:12 -070038 EXPECT_JSON_EQ("'abc'", *TypedValueToJson(std::string("abc"), nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070039
40 std::vector<bool> bool_array{true, false};
Vitaly Buka7c82d292015-05-03 18:08:12 -070041 EXPECT_JSON_EQ("[true,false]", *TypedValueToJson(bool_array, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070042
43 std::vector<int> int_array{1, 2, 5};
Vitaly Buka7c82d292015-05-03 18:08:12 -070044 EXPECT_JSON_EQ("[1,2,5]", *TypedValueToJson(int_array, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070045
46 std::vector<double> dbl_array{1.1, 2.2};
Vitaly Buka7c82d292015-05-03 18:08:12 -070047 EXPECT_JSON_EQ("[1.1,2.2]", *TypedValueToJson(dbl_array, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070048
49 std::vector<std::string> str_array{"a", "bc"};
Vitaly Buka7c82d292015-05-03 18:08:12 -070050 EXPECT_JSON_EQ("['a','bc']", *TypedValueToJson(str_array, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070051}
52
53TEST(CommandSchemaUtils, TypedValueToJson_Object) {
Vitaly Buka32005de2015-05-01 12:33:31 -070054 IntPropType int_type;
55 native_types::Object object;
Alex Vakulenko66ec2922014-06-17 15:30:22 -070056
Alex Vakulenko157ccaa2014-09-19 14:59:34 -070057 object.insert(std::make_pair("width", int_type.CreateValue(640, nullptr)));
58 object.insert(std::make_pair("height", int_type.CreateValue(480, nullptr)));
Vitaly Buka7c82d292015-05-03 18:08:12 -070059 EXPECT_JSON_EQ("{'height':480,'width':640}",
60 *TypedValueToJson(object, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070061}
62
Alex Vakulenko29e64442015-03-20 13:59:19 -070063TEST(CommandSchemaUtils, TypedValueToJson_Array) {
Vitaly Buka32005de2015-05-01 12:33:31 -070064 IntPropType int_type;
65 native_types::Array arr;
Alex Vakulenko29e64442015-03-20 13:59:19 -070066
67 arr.push_back(int_type.CreateValue(640, nullptr));
68 arr.push_back(int_type.CreateValue(480, nullptr));
Vitaly Buka7c82d292015-05-03 18:08:12 -070069 EXPECT_JSON_EQ("[640,480]", *TypedValueToJson(arr, nullptr));
Alex Vakulenko29e64442015-03-20 13:59:19 -070070}
71
Alex Vakulenko66ec2922014-06-17 15:30:22 -070072TEST(CommandSchemaUtils, TypedValueFromJson_Bool) {
73 bool value;
74
Vitaly Buka32005de2015-05-01 12:33:31 -070075 EXPECT_TRUE(
76 TypedValueFromJson(CreateValue("true").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070077 EXPECT_TRUE(value);
78
Vitaly Buka32005de2015-05-01 12:33:31 -070079 EXPECT_TRUE(
80 TypedValueFromJson(CreateValue("false").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070081 EXPECT_FALSE(value);
82
Alex Vakulenko5f472062014-08-14 17:54:04 -070083 chromeos::ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -070084 EXPECT_FALSE(
85 TypedValueFromJson(CreateValue("0").get(), nullptr, &value, &error));
86 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -070087 error.reset();
88}
89
90TEST(CommandSchemaUtils, TypedValueFromJson_Int) {
91 int value;
92
Vitaly Buka32005de2015-05-01 12:33:31 -070093 EXPECT_TRUE(
94 TypedValueFromJson(CreateValue("0").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070095 EXPECT_EQ(0, value);
96
Vitaly Buka32005de2015-05-01 12:33:31 -070097 EXPECT_TRUE(
98 TypedValueFromJson(CreateValue("23").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070099 EXPECT_EQ(23, value);
100
Vitaly Buka32005de2015-05-01 12:33:31 -0700101 EXPECT_TRUE(
102 TypedValueFromJson(CreateValue("-1234").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700103 EXPECT_EQ(-1234, value);
104
Alex Vakulenko5f472062014-08-14 17:54:04 -0700105 chromeos::ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700106 EXPECT_FALSE(
107 TypedValueFromJson(CreateValue("'abc'").get(), nullptr, &value, &error));
108 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700109 error.reset();
110}
111
112TEST(CommandSchemaUtils, TypedValueFromJson_Double) {
113 double value;
114
Vitaly Buka32005de2015-05-01 12:33:31 -0700115 EXPECT_TRUE(
116 TypedValueFromJson(CreateValue("0").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700117 EXPECT_DOUBLE_EQ(0.0, value);
Vitaly Buka32005de2015-05-01 12:33:31 -0700118 EXPECT_TRUE(
119 TypedValueFromJson(CreateValue("0.0").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700120 EXPECT_DOUBLE_EQ(0.0, value);
121
Vitaly Buka32005de2015-05-01 12:33:31 -0700122 EXPECT_TRUE(
123 TypedValueFromJson(CreateValue("23").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700124 EXPECT_EQ(23.0, value);
Vitaly Buka32005de2015-05-01 12:33:31 -0700125 EXPECT_TRUE(
126 TypedValueFromJson(CreateValue("23.1").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700127 EXPECT_EQ(23.1, value);
128
Vitaly Buka32005de2015-05-01 12:33:31 -0700129 EXPECT_TRUE(TypedValueFromJson(CreateValue("-1.23E+02").get(), nullptr,
130 &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700131 EXPECT_EQ(-123.0, value);
132
Alex Vakulenko5f472062014-08-14 17:54:04 -0700133 chromeos::ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700134 EXPECT_FALSE(
135 TypedValueFromJson(CreateValue("'abc'").get(), nullptr, &value, &error));
136 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700137 error.reset();
138}
139
140TEST(CommandSchemaUtils, TypedValueFromJson_String) {
141 std::string value;
142
Vitaly Buka32005de2015-05-01 12:33:31 -0700143 EXPECT_TRUE(
144 TypedValueFromJson(CreateValue("''").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700145 EXPECT_EQ("", value);
146
Vitaly Buka32005de2015-05-01 12:33:31 -0700147 EXPECT_TRUE(
148 TypedValueFromJson(CreateValue("'23'").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700149 EXPECT_EQ("23", value);
150
Vitaly Buka32005de2015-05-01 12:33:31 -0700151 EXPECT_TRUE(
152 TypedValueFromJson(CreateValue("'abc'").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700153 EXPECT_EQ("abc", value);
154
Alex Vakulenko5f472062014-08-14 17:54:04 -0700155 chromeos::ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700156 EXPECT_FALSE(
157 TypedValueFromJson(CreateValue("12").get(), nullptr, &value, &error));
158 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700159 error.reset();
160}
161
162TEST(CommandSchemaUtils, TypedValueFromJson_Object) {
Vitaly Buka32005de2015-05-01 12:33:31 -0700163 native_types::Object value;
164 std::unique_ptr<ObjectSchema> schema{new ObjectSchema};
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700165
Vitaly Buka32005de2015-05-01 12:33:31 -0700166 IntPropType age_prop;
Alex Vakulenko5ef75792015-03-19 15:50:44 -0700167 age_prop.AddMinMaxConstraint(0, 150);
168 schema->AddProp("age", age_prop.Clone());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700169
Vitaly Buka32005de2015-05-01 12:33:31 -0700170 StringPropType name_prop;
Alex Vakulenko5ef75792015-03-19 15:50:44 -0700171 name_prop.AddLengthConstraint(1, 30);
172 schema->AddProp("name", name_prop.Clone());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700173
Vitaly Buka32005de2015-05-01 12:33:31 -0700174 ObjectPropType type;
Alex Vakulenko5ef75792015-03-19 15:50:44 -0700175 type.SetObjectSchema(std::move(schema));
Vitaly Buka32005de2015-05-01 12:33:31 -0700176 EXPECT_TRUE(TypedValueFromJson(CreateValue("{'age':20,'name':'Bob'}").get(),
177 &type, &value, nullptr));
178 native_types::Object value2;
Alex Vakulenko5ef75792015-03-19 15:50:44 -0700179 value2.insert(std::make_pair("age", age_prop.CreateValue(20, nullptr)));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700180 value2.insert(std::make_pair("name",
Alex Vakulenko5ef75792015-03-19 15:50:44 -0700181 name_prop.CreateValue(std::string("Bob"),
182 nullptr)));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700183 EXPECT_EQ(value2, value);
184
Alex Vakulenko5f472062014-08-14 17:54:04 -0700185 chromeos::ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700186 EXPECT_FALSE(
187 TypedValueFromJson(CreateValue("'abc'").get(), nullptr, &value, &error));
188 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700189 error.reset();
190}
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700191
Alex Vakulenko29e64442015-03-20 13:59:19 -0700192TEST(CommandSchemaUtils, TypedValueFromJson_Array) {
Vitaly Buka32005de2015-05-01 12:33:31 -0700193 native_types::Array arr;
194 StringPropType str_type;
Alex Vakulenko29e64442015-03-20 13:59:19 -0700195 str_type.AddLengthConstraint(3, 100);
Vitaly Buka32005de2015-05-01 12:33:31 -0700196 ArrayPropType type;
Alex Vakulenko29e64442015-03-20 13:59:19 -0700197 type.SetItemType(str_type.Clone());
198
Vitaly Buka32005de2015-05-01 12:33:31 -0700199 EXPECT_TRUE(TypedValueFromJson(CreateValue("['foo', 'bar']").get(), &type,
200 &arr, nullptr));
201 native_types::Array arr2;
Alex Vakulenko29e64442015-03-20 13:59:19 -0700202 arr2.push_back(str_type.CreateValue(std::string{"foo"}, nullptr));
203 arr2.push_back(str_type.CreateValue(std::string{"bar"}, nullptr));
204 EXPECT_EQ(arr2, arr);
205
206 chromeos::ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700207 EXPECT_FALSE(TypedValueFromJson(CreateValue("['baz', 'ab']").get(), &type,
208 &arr, &error));
209 EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
Alex Vakulenko29e64442015-03-20 13:59:19 -0700210 error.reset();
211}
212
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700213TEST(CommandSchemaUtils, PropValueToDBusVariant) {
Vitaly Buka32005de2015-05-01 12:33:31 -0700214 IntPropType int_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700215 auto prop_value = int_type.CreateValue(5, nullptr);
216 EXPECT_EQ(5, PropValueToDBusVariant(prop_value.get()).Get<int>());
217
Vitaly Buka32005de2015-05-01 12:33:31 -0700218 BooleanPropType bool_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700219 prop_value = bool_type.CreateValue(true, nullptr);
220 EXPECT_TRUE(PropValueToDBusVariant(prop_value.get()).Get<bool>());
221
Vitaly Buka32005de2015-05-01 12:33:31 -0700222 DoublePropType dbl_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700223 prop_value = dbl_type.CreateValue(5.5, nullptr);
224 EXPECT_DOUBLE_EQ(5.5, PropValueToDBusVariant(prop_value.get()).Get<double>());
225
Vitaly Buka32005de2015-05-01 12:33:31 -0700226 StringPropType str_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700227 prop_value = str_type.CreateValue(std::string{"foo"}, nullptr);
228 EXPECT_EQ("foo", PropValueToDBusVariant(prop_value.get()).Get<std::string>());
229
Vitaly Buka32005de2015-05-01 12:33:31 -0700230 ObjectPropType obj_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700231 ASSERT_TRUE(obj_type.FromJson(CreateDictionaryValue(
232 "{'properties':{'width':'integer','height':'integer'},"
233 "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}").get(),
234 nullptr, nullptr));
Vitaly Buka32005de2015-05-01 12:33:31 -0700235 native_types::Object obj{
236 {"width", int_type.CreateValue(10, nullptr)},
237 {"height", int_type.CreateValue(20, nullptr)},
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700238 };
239 prop_value = obj_type.CreateValue(obj, nullptr);
Alex Vakulenko576c9792014-09-22 16:49:45 -0700240 VariantDictionary dict =
241 PropValueToDBusVariant(prop_value.get()).Get<VariantDictionary>();
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700242 EXPECT_EQ(20, dict["height"].Get<int>());
243 EXPECT_EQ(10, dict["width"].Get<int>());
Alex Vakulenko72452612015-03-24 09:58:04 -0700244
Vitaly Buka32005de2015-05-01 12:33:31 -0700245 ArrayPropType arr_type;
Alex Vakulenko72452612015-03-24 09:58:04 -0700246 arr_type.SetItemType(str_type.Clone());
Vitaly Buka32005de2015-05-01 12:33:31 -0700247 native_types::Array arr;
Alex Vakulenko72452612015-03-24 09:58:04 -0700248 arr.push_back(str_type.CreateValue(std::string{"foo"}, nullptr));
249 arr.push_back(str_type.CreateValue(std::string{"bar"}, nullptr));
250 arr.push_back(str_type.CreateValue(std::string{"baz"}, nullptr));
251 prop_value = arr_type.CreateValue(arr, nullptr);
252 chromeos::Any any = PropValueToDBusVariant(prop_value.get());
253 ASSERT_TRUE(any.IsTypeCompatible<std::vector<std::string>>());
254 EXPECT_EQ((std::vector<std::string>{"foo", "bar", "baz"}),
255 any.Get<std::vector<std::string>>());
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700256}
257
258TEST(CommandSchemaUtils, PropValueFromDBusVariant_Int) {
Vitaly Buka32005de2015-05-01 12:33:31 -0700259 IntPropType int_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700260 ASSERT_TRUE(int_type.FromJson(CreateDictionaryValue("{'enum':[1,2]}").get(),
261 nullptr, nullptr));
262
263 auto prop_value = PropValueFromDBusVariant(&int_type, 1, nullptr);
264 ASSERT_NE(nullptr, prop_value.get());
265 EXPECT_EQ(1, prop_value->GetValueAsAny().Get<int>());
266
267 chromeos::ErrorPtr error;
268 prop_value = PropValueFromDBusVariant(&int_type, 5, &error);
269 EXPECT_EQ(nullptr, prop_value.get());
270 ASSERT_NE(nullptr, error.get());
Vitaly Buka32005de2015-05-01 12:33:31 -0700271 EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700272}
273
274TEST(CommandSchemaUtils, PropValueFromDBusVariant_Bool) {
Vitaly Buka32005de2015-05-01 12:33:31 -0700275 BooleanPropType bool_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700276 ASSERT_TRUE(bool_type.FromJson(CreateDictionaryValue("{'enum':[true]}").get(),
277 nullptr, nullptr));
278
279 auto prop_value = PropValueFromDBusVariant(&bool_type, true, nullptr);
280 ASSERT_NE(nullptr, prop_value.get());
281 EXPECT_TRUE(prop_value->GetValueAsAny().Get<bool>());
282
283 chromeos::ErrorPtr error;
284 prop_value = PropValueFromDBusVariant(&bool_type, false, &error);
285 EXPECT_EQ(nullptr, prop_value.get());
286 ASSERT_NE(nullptr, error.get());
Vitaly Buka32005de2015-05-01 12:33:31 -0700287 EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700288}
289
290TEST(CommandSchemaUtils, PropValueFromDBusVariant_Double) {
Vitaly Buka32005de2015-05-01 12:33:31 -0700291 DoublePropType dbl_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700292 ASSERT_TRUE(dbl_type.FromJson(CreateDictionaryValue("{'maximum':2.0}").get(),
293 nullptr, nullptr));
294
295 auto prop_value = PropValueFromDBusVariant(&dbl_type, 1.0, nullptr);
296 ASSERT_NE(nullptr, prop_value.get());
297 EXPECT_DOUBLE_EQ(1.0, prop_value->GetValueAsAny().Get<double>());
298
299 chromeos::ErrorPtr error;
300 prop_value = PropValueFromDBusVariant(&dbl_type, 10.0, &error);
301 EXPECT_EQ(nullptr, prop_value.get());
302 ASSERT_NE(nullptr, error.get());
Vitaly Buka32005de2015-05-01 12:33:31 -0700303 EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700304}
305
306TEST(CommandSchemaUtils, PropValueFromDBusVariant_String) {
Vitaly Buka32005de2015-05-01 12:33:31 -0700307 StringPropType str_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700308 ASSERT_TRUE(str_type.FromJson(CreateDictionaryValue("{'minLength': 4}").get(),
309 nullptr, nullptr));
310
311 auto prop_value = PropValueFromDBusVariant(&str_type, std::string{"blah"},
312 nullptr);
313 ASSERT_NE(nullptr, prop_value.get());
314 EXPECT_EQ("blah", prop_value->GetValueAsAny().Get<std::string>());
315
316 chromeos::ErrorPtr error;
317 prop_value = PropValueFromDBusVariant(&str_type, std::string{"foo"}, &error);
318 EXPECT_EQ(nullptr, prop_value.get());
319 ASSERT_NE(nullptr, error.get());
Vitaly Buka32005de2015-05-01 12:33:31 -0700320 EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700321}
322
323TEST(CommandSchemaUtils, PropValueFromDBusVariant_Object) {
Vitaly Buka32005de2015-05-01 12:33:31 -0700324 ObjectPropType obj_type;
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700325 ASSERT_TRUE(obj_type.FromJson(CreateDictionaryValue(
326 "{'properties':{'width':'integer','height':'integer'},"
327 "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}").get(),
328 nullptr, nullptr));
329
Alex Vakulenko576c9792014-09-22 16:49:45 -0700330 VariantDictionary obj{
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700331 {"width", 100},
332 {"height", 200},
333 };
334 auto prop_value = PropValueFromDBusVariant(&obj_type, obj, nullptr);
335 ASSERT_NE(nullptr, prop_value.get());
Vitaly Buka32005de2015-05-01 12:33:31 -0700336 auto value = prop_value->GetValueAsAny().Get<native_types::Object>();
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700337 EXPECT_EQ(100, value["width"].get()->GetValueAsAny().Get<int>());
338 EXPECT_EQ(200, value["height"].get()->GetValueAsAny().Get<int>());
339
340 chromeos::ErrorPtr error;
341 obj["height"] = 20;
342 prop_value = PropValueFromDBusVariant(&obj_type, obj, &error);
343 EXPECT_EQ(nullptr, prop_value.get());
344 ASSERT_NE(nullptr, error.get());
Vitaly Buka32005de2015-05-01 12:33:31 -0700345 EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700346}
Alex Vakulenko72452612015-03-24 09:58:04 -0700347
348TEST(CommandSchemaUtils, PropValueFromDBusVariant_Array) {
Vitaly Buka32005de2015-05-01 12:33:31 -0700349 ArrayPropType arr_type;
350 IntPropType int_type;
Alex Vakulenko72452612015-03-24 09:58:04 -0700351 int_type.AddMinMaxConstraint(0, 100);
352 arr_type.SetItemType(int_type.Clone());
353 std::vector<int> data{0, 1, 1, 100};
354 auto prop_value = PropValueFromDBusVariant(&arr_type, data, nullptr);
355 ASSERT_NE(nullptr, prop_value.get());
Vitaly Buka32005de2015-05-01 12:33:31 -0700356 auto arr = prop_value->GetValueAsAny().Get<native_types::Array>();
Alex Vakulenko72452612015-03-24 09:58:04 -0700357 ASSERT_EQ(4u, arr.size());
358 EXPECT_EQ(0, arr[0]->GetInt()->GetValue());
359 EXPECT_EQ(1, arr[1]->GetInt()->GetValue());
360 EXPECT_EQ(1, arr[2]->GetInt()->GetValue());
361 EXPECT_EQ(100, arr[3]->GetInt()->GetValue());
362
363 chromeos::ErrorPtr error;
364 data.push_back(-1); // This value is out of bounds for |int_type|.
365 prop_value = PropValueFromDBusVariant(&arr_type, data, &error);
366 EXPECT_EQ(nullptr, prop_value.get());
367 ASSERT_NE(nullptr, error.get());
Vitaly Buka32005de2015-05-01 12:33:31 -0700368 EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
Alex Vakulenko72452612015-03-24 09:58:04 -0700369}
Vitaly Buka32005de2015-05-01 12:33:31 -0700370
371} // namespace buffet