libweave: Add unittests for dbus_conversion.h

Added DBusConversionTest.DictionaryToDBusVariantDictionary test.
Others moved from schema_utils_unittests.cc.
Added serialization of "[[],[]]" as vector<Any>.

BUG=brillo:1245
TEST='FEATURES=test emerge-gizmo buffet'

Change-Id: Ib93a612d5d8dc45615912325b4f3c1d3877af976
Reviewed-on: https://chromium-review.googlesource.com/287845
Trybot-Ready: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
index ee41d23..7cd6db0 100644
--- a/buffet/buffet.gyp
+++ b/buffet/buffet.gyp
@@ -195,6 +195,7 @@
             '../libweave/src/commands/command_queue_unittest.cc',
             '../libweave/src/commands/dbus_command_dispatcher_unittest.cc',
             '../libweave/src/commands/dbus_command_proxy_unittest.cc',
+            '../libweave/src/commands/dbus_conversion_unittest.cc',
             '../libweave/src/commands/object_schema_unittest.cc',
             '../libweave/src/commands/schema_utils_unittest.cc',
             '../libweave/src/commands/unittest_utils.cc',
diff --git a/libweave/src/commands/dbus_conversion.cc b/libweave/src/commands/dbus_conversion.cc
index 146a46d..4723918 100644
--- a/libweave/src/commands/dbus_conversion.cc
+++ b/libweave/src/commands/dbus_conversion.cc
@@ -25,17 +25,45 @@
   return val;
 }
 
+chromeos::Any ValueToAny(const base::Value& json);
+
 template <typename T>
-chromeos::Any ListToAny(const base::ListValue& list);
+chromeos::Any ListToAny(const base::ListValue& list,
+                        bool (base::Value::*fnc)(T*) const) {
+  std::vector<T> result;
+  result.reserve(list.GetSize());
+  for (const base::Value* v : list) {
+    T val;
+    CHECK((v->*fnc)(&val));
+    result.push_back(val);
+  }
+  return result;
+}
+
+chromeos::Any DictListToAny(const base::ListValue& list) {
+  std::vector<chromeos::VariantDictionary> result;
+  result.reserve(list.GetSize());
+  for (const base::Value* v : list) {
+    const base::DictionaryValue* dict = nullptr;
+    CHECK(v->GetAsDictionary(&dict));
+    result.push_back(DictionaryToDBusVariantDictionary(*dict));
+  }
+  return result;
+}
+
+chromeos::Any ListListToAny(const base::ListValue& list) {
+  std::vector<chromeos::Any> result;
+  result.reserve(list.GetSize());
+  for (const base::Value* v : list)
+    result.push_back(ValueToAny(*v));
+  return result;
+}
 
 // Converts a JSON value into an Any so it can be sent over D-Bus using
 // UpdateState D-Bus method from Buffet.
 chromeos::Any ValueToAny(const base::Value& json) {
   chromeos::Any prop_value;
   switch (json.GetType()) {
-    case base::Value::TYPE_NULL:
-      prop_value = nullptr;
-      break;
     case base::Value::TYPE_BOOLEAN:
       prop_value = ValueToAny<bool>(json, &base::Value::GetAsBoolean);
       break;
@@ -48,9 +76,6 @@
     case base::Value::TYPE_STRING:
       prop_value = ValueToAny<std::string>(json, &base::Value::GetAsString);
       break;
-    case base::Value::TYPE_BINARY:
-      LOG(FATAL) << "Binary values should not happen";
-      break;
     case base::Value::TYPE_DICTIONARY: {
       const base::DictionaryValue* dict = nullptr;
       CHECK(json.GetAsDictionary(&dict));
@@ -61,7 +86,9 @@
       const base::ListValue* list = nullptr;
       CHECK(json.GetAsList(&list));
       if (list->empty()) {
-        prop_value = ListToAny<chromeos::Any>(*list);
+        // We don't know type of objects this list intended for, so we just use
+        // vector<chromeos::Any>.
+        prop_value = ListListToAny(*list);
         break;
       }
       auto type = (*list->begin())->GetType();
@@ -70,19 +97,25 @@
 
       switch (type) {
         case base::Value::TYPE_BOOLEAN:
-          prop_value = ListToAny<bool>(*list);
+          prop_value = ListToAny<bool>(*list, &base::Value::GetAsBoolean);
           break;
         case base::Value::TYPE_INTEGER:
-          prop_value = ListToAny<int>(*list);
+          prop_value = ListToAny<int>(*list, &base::Value::GetAsInteger);
           break;
         case base::Value::TYPE_DOUBLE:
-          prop_value = ListToAny<double>(*list);
+          prop_value = ListToAny<double>(*list, &base::Value::GetAsDouble);
           break;
         case base::Value::TYPE_STRING:
-          prop_value = ListToAny<std::string>(*list);
+          prop_value = ListToAny<std::string>(*list, &base::Value::GetAsString);
           break;
         case base::Value::TYPE_DICTIONARY:
-          prop_value = ListToAny<chromeos::VariantDictionary>(*list);
+          prop_value = DictListToAny(*list);
+          break;
+        case base::Value::TYPE_LIST:
+          // We can't support Any{vector<vector<>>} as the type is only known
+          // in runtime when we need to instantiate templates in compile time.
+          // We can use Any{vector<Any>} instead.
+          prop_value = ListListToAny(*list);
           break;
         default:
           LOG(FATAL) << "Unsupported JSON value type for list element: "
@@ -97,15 +130,6 @@
   return prop_value;
 }
 
-template <typename T>
-chromeos::Any ListToAny(const base::ListValue& list) {
-  std::vector<T> val;
-  val.reserve(list.GetSize());
-  for (const base::Value* v : list)
-    val.push_back(ValueToAny(*v).Get<T>());
-  return val;
-}
-
 bool ErrorMissingProperty(chromeos::ErrorPtr* error,
                           const tracked_objects::Location& location,
                           const char* param_name) {
diff --git a/libweave/src/commands/dbus_conversion_unittest.cc b/libweave/src/commands/dbus_conversion_unittest.cc
new file mode 100644
index 0000000..c25245e
--- /dev/null
+++ b/libweave/src/commands/dbus_conversion_unittest.cc
@@ -0,0 +1,214 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "libweave/src/commands/dbus_conversion.h"
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include <base/values.h>
+#include <chromeos/variant_dictionary.h>
+#include <gtest/gtest.h>
+
+#include "libweave/src/commands/object_schema.h"
+#include "libweave/src/commands/unittest_utils.h"
+
+namespace weave {
+
+using chromeos::Any;
+using chromeos::VariantDictionary;
+using unittests::CreateDictionaryValue;
+
+chromeos::VariantDictionary ToDBus(const base::DictionaryValue& object) {
+  return DictionaryToDBusVariantDictionary(object);
+}
+
+TEST(DBusConversionTest, PropValueToDBusVariant) {
+  IntPropType int_type;
+  auto prop_value = int_type.CreateValue(5, nullptr);
+  EXPECT_EQ(5, PropValueToDBusVariant(prop_value.get()).Get<int>());
+
+  BooleanPropType bool_type;
+  prop_value = bool_type.CreateValue(true, nullptr);
+  EXPECT_TRUE(PropValueToDBusVariant(prop_value.get()).Get<bool>());
+
+  DoublePropType dbl_type;
+  prop_value = dbl_type.CreateValue(5.5, nullptr);
+  EXPECT_DOUBLE_EQ(5.5, PropValueToDBusVariant(prop_value.get()).Get<double>());
+
+  StringPropType str_type;
+  prop_value = str_type.CreateValue(std::string{"foo"}, nullptr);
+  EXPECT_EQ("foo", PropValueToDBusVariant(prop_value.get()).Get<std::string>());
+
+  ObjectPropType obj_type;
+  ASSERT_TRUE(obj_type.FromJson(
+      CreateDictionaryValue(
+          "{'properties':{'width':'integer','height':'integer'},"
+          "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}")
+          .get(),
+      nullptr, nullptr));
+  ValueMap obj{
+      {"width", int_type.CreateValue(10, nullptr)},
+      {"height", int_type.CreateValue(20, nullptr)},
+  };
+  prop_value = obj_type.CreateValue(obj, nullptr);
+  VariantDictionary dict =
+      PropValueToDBusVariant(prop_value.get()).Get<VariantDictionary>();
+  EXPECT_EQ(20, dict["height"].Get<int>());
+  EXPECT_EQ(10, dict["width"].Get<int>());
+
+  ArrayPropType arr_type;
+  arr_type.SetItemType(str_type.Clone());
+  ValueVector arr;
+  arr.push_back(str_type.CreateValue(std::string{"foo"}, nullptr));
+  arr.push_back(str_type.CreateValue(std::string{"bar"}, nullptr));
+  arr.push_back(str_type.CreateValue(std::string{"baz"}, nullptr));
+  prop_value = arr_type.CreateValue(arr, nullptr);
+  chromeos::Any any = PropValueToDBusVariant(prop_value.get());
+  ASSERT_TRUE(any.IsTypeCompatible<std::vector<std::string>>());
+  EXPECT_EQ((std::vector<std::string>{"foo", "bar", "baz"}),
+            any.Get<std::vector<std::string>>());
+}
+
+TEST(DBusConversionTest, PropValueFromDBusVariant_Int) {
+  IntPropType int_type;
+  ASSERT_TRUE(int_type.FromJson(CreateDictionaryValue("{'enum':[1,2]}").get(),
+                                nullptr, nullptr));
+
+  auto prop_value = PropValueFromDBusVariant(&int_type, 1, nullptr);
+  ASSERT_NE(nullptr, prop_value.get());
+  EXPECT_EQ(1, prop_value->GetValueAsAny().Get<int>());
+
+  chromeos::ErrorPtr error;
+  prop_value = PropValueFromDBusVariant(&int_type, 5, &error);
+  EXPECT_EQ(nullptr, prop_value.get());
+  ASSERT_NE(nullptr, error.get());
+  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
+}
+
+TEST(DBusConversionTest, PropValueFromDBusVariant_Bool) {
+  BooleanPropType bool_type;
+  ASSERT_TRUE(bool_type.FromJson(CreateDictionaryValue("{'enum':[true]}").get(),
+                                 nullptr, nullptr));
+
+  auto prop_value = PropValueFromDBusVariant(&bool_type, true, nullptr);
+  ASSERT_NE(nullptr, prop_value.get());
+  EXPECT_TRUE(prop_value->GetValueAsAny().Get<bool>());
+
+  chromeos::ErrorPtr error;
+  prop_value = PropValueFromDBusVariant(&bool_type, false, &error);
+  EXPECT_EQ(nullptr, prop_value.get());
+  ASSERT_NE(nullptr, error.get());
+  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
+}
+
+TEST(DBusConversionTest, PropValueFromDBusVariant_Double) {
+  DoublePropType dbl_type;
+  ASSERT_TRUE(dbl_type.FromJson(CreateDictionaryValue("{'maximum':2.0}").get(),
+                                nullptr, nullptr));
+
+  auto prop_value = PropValueFromDBusVariant(&dbl_type, 1.0, nullptr);
+  ASSERT_NE(nullptr, prop_value.get());
+  EXPECT_DOUBLE_EQ(1.0, prop_value->GetValueAsAny().Get<double>());
+
+  chromeos::ErrorPtr error;
+  prop_value = PropValueFromDBusVariant(&dbl_type, 10.0, &error);
+  EXPECT_EQ(nullptr, prop_value.get());
+  ASSERT_NE(nullptr, error.get());
+  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
+}
+
+TEST(DBusConversionTest, PropValueFromDBusVariant_String) {
+  StringPropType str_type;
+  ASSERT_TRUE(str_type.FromJson(CreateDictionaryValue("{'minLength': 4}").get(),
+                                nullptr, nullptr));
+
+  auto prop_value =
+      PropValueFromDBusVariant(&str_type, std::string{"blah"}, nullptr);
+  ASSERT_NE(nullptr, prop_value.get());
+  EXPECT_EQ("blah", prop_value->GetValueAsAny().Get<std::string>());
+
+  chromeos::ErrorPtr error;
+  prop_value = PropValueFromDBusVariant(&str_type, std::string{"foo"}, &error);
+  EXPECT_EQ(nullptr, prop_value.get());
+  ASSERT_NE(nullptr, error.get());
+  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
+}
+
+TEST(DBusConversionTest, PropValueFromDBusVariant_Object) {
+  ObjectPropType obj_type;
+  ASSERT_TRUE(obj_type.FromJson(
+      CreateDictionaryValue(
+          "{'properties':{'width':'integer','height':'integer'},"
+          "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}")
+          .get(),
+      nullptr, nullptr));
+
+  VariantDictionary obj{
+      {"width", 100}, {"height", 200},
+  };
+  auto prop_value = PropValueFromDBusVariant(&obj_type, obj, nullptr);
+  ASSERT_NE(nullptr, prop_value.get());
+  auto value = prop_value->GetValueAsAny().Get<ValueMap>();
+  EXPECT_EQ(100, value["width"].get()->GetValueAsAny().Get<int>());
+  EXPECT_EQ(200, value["height"].get()->GetValueAsAny().Get<int>());
+
+  chromeos::ErrorPtr error;
+  obj["height"] = 20;
+  prop_value = PropValueFromDBusVariant(&obj_type, obj, &error);
+  EXPECT_EQ(nullptr, prop_value.get());
+  ASSERT_NE(nullptr, error.get());
+  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
+}
+
+TEST(DBusConversionTest, PropValueFromDBusVariant_Array) {
+  ArrayPropType arr_type;
+  IntPropType int_type;
+  int_type.AddMinMaxConstraint(0, 100);
+  arr_type.SetItemType(int_type.Clone());
+  std::vector<int> data{0, 1, 1, 100};
+  auto prop_value = PropValueFromDBusVariant(&arr_type, data, nullptr);
+  ASSERT_NE(nullptr, prop_value.get());
+  auto arr = prop_value->GetValueAsAny().Get<ValueVector>();
+  ASSERT_EQ(4u, arr.size());
+  EXPECT_EQ(0, arr[0]->GetInt()->GetValue());
+  EXPECT_EQ(1, arr[1]->GetInt()->GetValue());
+  EXPECT_EQ(1, arr[2]->GetInt()->GetValue());
+  EXPECT_EQ(100, arr[3]->GetInt()->GetValue());
+
+  chromeos::ErrorPtr error;
+  data.push_back(-1);  // This value is out of bounds for |int_type|.
+  prop_value = PropValueFromDBusVariant(&arr_type, data, &error);
+  EXPECT_EQ(nullptr, prop_value.get());
+  ASSERT_NE(nullptr, error.get());
+  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
+}
+
+TEST(DBusConversionTest, DictionaryToDBusVariantDictionary) {
+  EXPECT_EQ((VariantDictionary{{"bool", true}}),
+            ToDBus(*CreateDictionaryValue("{'bool': true}")));
+  EXPECT_EQ((VariantDictionary{{"int", 5}}),
+            ToDBus(*CreateDictionaryValue("{'int': 5}")));
+  EXPECT_EQ((VariantDictionary{{"double", 6.7}}),
+            ToDBus(*CreateDictionaryValue("{'double': 6.7}")));
+  EXPECT_EQ((VariantDictionary{{"string", std::string{"abc"}}}),
+            ToDBus(*CreateDictionaryValue("{'string': 'abc'}")));
+  EXPECT_EQ((VariantDictionary{{"object", VariantDictionary{{"bool", true}}}}),
+            ToDBus(*CreateDictionaryValue("{'object': {'bool': true}}")));
+  EXPECT_EQ((VariantDictionary{{"emptyList", std::vector<Any>{}}}),
+            ToDBus(*CreateDictionaryValue("{'emptyList': []}")));
+  EXPECT_EQ((VariantDictionary{{"intList", std::vector<int>{5}}}),
+            ToDBus(*CreateDictionaryValue("{'intList': [5]}")));
+  EXPECT_EQ((VariantDictionary{
+                {"intListList", std::vector<Any>{std::vector<int>{5},
+                                                 std::vector<int>{6, 7}}}}),
+            ToDBus(*CreateDictionaryValue("{'intListList': [[5], [6, 7]]}")));
+  EXPECT_EQ((VariantDictionary{{"objList",
+                                std::vector<VariantDictionary>{
+                                    {{"string", std::string{"abc"}}}}}}),
+            ToDBus(*CreateDictionaryValue("{'objList': [{'string': 'abc'}]}")));
+}
+
+}  // namespace weave
diff --git a/libweave/src/commands/schema_utils_unittest.cc b/libweave/src/commands/schema_utils_unittest.cc
index 22e15c7..b3181df 100644
--- a/libweave/src/commands/schema_utils_unittest.cc
+++ b/libweave/src/commands/schema_utils_unittest.cc
@@ -209,165 +209,4 @@
   error.reset();
 }
 
-TEST(CommandSchemaUtils, PropValueToDBusVariant) {
-  IntPropType int_type;
-  auto prop_value = int_type.CreateValue(5, nullptr);
-  EXPECT_EQ(5, PropValueToDBusVariant(prop_value.get()).Get<int>());
-
-  BooleanPropType bool_type;
-  prop_value = bool_type.CreateValue(true, nullptr);
-  EXPECT_TRUE(PropValueToDBusVariant(prop_value.get()).Get<bool>());
-
-  DoublePropType dbl_type;
-  prop_value = dbl_type.CreateValue(5.5, nullptr);
-  EXPECT_DOUBLE_EQ(5.5, PropValueToDBusVariant(prop_value.get()).Get<double>());
-
-  StringPropType str_type;
-  prop_value = str_type.CreateValue(std::string{"foo"}, nullptr);
-  EXPECT_EQ("foo", PropValueToDBusVariant(prop_value.get()).Get<std::string>());
-
-  ObjectPropType obj_type;
-  ASSERT_TRUE(obj_type.FromJson(
-      CreateDictionaryValue(
-          "{'properties':{'width':'integer','height':'integer'},"
-          "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}")
-          .get(),
-      nullptr, nullptr));
-  ValueMap obj{
-      {"width", int_type.CreateValue(10, nullptr)},
-      {"height", int_type.CreateValue(20, nullptr)},
-  };
-  prop_value = obj_type.CreateValue(obj, nullptr);
-  VariantDictionary dict =
-      PropValueToDBusVariant(prop_value.get()).Get<VariantDictionary>();
-  EXPECT_EQ(20, dict["height"].Get<int>());
-  EXPECT_EQ(10, dict["width"].Get<int>());
-
-  ArrayPropType arr_type;
-  arr_type.SetItemType(str_type.Clone());
-  ValueVector arr;
-  arr.push_back(str_type.CreateValue(std::string{"foo"}, nullptr));
-  arr.push_back(str_type.CreateValue(std::string{"bar"}, nullptr));
-  arr.push_back(str_type.CreateValue(std::string{"baz"}, nullptr));
-  prop_value = arr_type.CreateValue(arr, nullptr);
-  chromeos::Any any = PropValueToDBusVariant(prop_value.get());
-  ASSERT_TRUE(any.IsTypeCompatible<std::vector<std::string>>());
-  EXPECT_EQ((std::vector<std::string>{"foo", "bar", "baz"}),
-            any.Get<std::vector<std::string>>());
-}
-
-TEST(CommandSchemaUtils, PropValueFromDBusVariant_Int) {
-  IntPropType int_type;
-  ASSERT_TRUE(int_type.FromJson(CreateDictionaryValue("{'enum':[1,2]}").get(),
-                                nullptr, nullptr));
-
-  auto prop_value = PropValueFromDBusVariant(&int_type, 1, nullptr);
-  ASSERT_NE(nullptr, prop_value.get());
-  EXPECT_EQ(1, prop_value->GetValueAsAny().Get<int>());
-
-  chromeos::ErrorPtr error;
-  prop_value = PropValueFromDBusVariant(&int_type, 5, &error);
-  EXPECT_EQ(nullptr, prop_value.get());
-  ASSERT_NE(nullptr, error.get());
-  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
-}
-
-TEST(CommandSchemaUtils, PropValueFromDBusVariant_Bool) {
-  BooleanPropType bool_type;
-  ASSERT_TRUE(bool_type.FromJson(CreateDictionaryValue("{'enum':[true]}").get(),
-                                 nullptr, nullptr));
-
-  auto prop_value = PropValueFromDBusVariant(&bool_type, true, nullptr);
-  ASSERT_NE(nullptr, prop_value.get());
-  EXPECT_TRUE(prop_value->GetValueAsAny().Get<bool>());
-
-  chromeos::ErrorPtr error;
-  prop_value = PropValueFromDBusVariant(&bool_type, false, &error);
-  EXPECT_EQ(nullptr, prop_value.get());
-  ASSERT_NE(nullptr, error.get());
-  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
-}
-
-TEST(CommandSchemaUtils, PropValueFromDBusVariant_Double) {
-  DoublePropType dbl_type;
-  ASSERT_TRUE(dbl_type.FromJson(CreateDictionaryValue("{'maximum':2.0}").get(),
-                                nullptr, nullptr));
-
-  auto prop_value = PropValueFromDBusVariant(&dbl_type, 1.0, nullptr);
-  ASSERT_NE(nullptr, prop_value.get());
-  EXPECT_DOUBLE_EQ(1.0, prop_value->GetValueAsAny().Get<double>());
-
-  chromeos::ErrorPtr error;
-  prop_value = PropValueFromDBusVariant(&dbl_type, 10.0, &error);
-  EXPECT_EQ(nullptr, prop_value.get());
-  ASSERT_NE(nullptr, error.get());
-  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
-}
-
-TEST(CommandSchemaUtils, PropValueFromDBusVariant_String) {
-  StringPropType str_type;
-  ASSERT_TRUE(str_type.FromJson(CreateDictionaryValue("{'minLength': 4}").get(),
-                                nullptr, nullptr));
-
-  auto prop_value =
-      PropValueFromDBusVariant(&str_type, std::string{"blah"}, nullptr);
-  ASSERT_NE(nullptr, prop_value.get());
-  EXPECT_EQ("blah", prop_value->GetValueAsAny().Get<std::string>());
-
-  chromeos::ErrorPtr error;
-  prop_value = PropValueFromDBusVariant(&str_type, std::string{"foo"}, &error);
-  EXPECT_EQ(nullptr, prop_value.get());
-  ASSERT_NE(nullptr, error.get());
-  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
-}
-
-TEST(CommandSchemaUtils, PropValueFromDBusVariant_Object) {
-  ObjectPropType obj_type;
-  ASSERT_TRUE(obj_type.FromJson(
-      CreateDictionaryValue(
-          "{'properties':{'width':'integer','height':'integer'},"
-          "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}")
-          .get(),
-      nullptr, nullptr));
-
-  VariantDictionary obj{
-      {"width", 100}, {"height", 200},
-  };
-  auto prop_value = PropValueFromDBusVariant(&obj_type, obj, nullptr);
-  ASSERT_NE(nullptr, prop_value.get());
-  auto value = prop_value->GetValueAsAny().Get<ValueMap>();
-  EXPECT_EQ(100, value["width"].get()->GetValueAsAny().Get<int>());
-  EXPECT_EQ(200, value["height"].get()->GetValueAsAny().Get<int>());
-
-  chromeos::ErrorPtr error;
-  obj["height"] = 20;
-  prop_value = PropValueFromDBusVariant(&obj_type, obj, &error);
-  EXPECT_EQ(nullptr, prop_value.get());
-  ASSERT_NE(nullptr, error.get());
-  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
-}
-
-TEST(CommandSchemaUtils, PropValueFromDBusVariant_Array) {
-  ArrayPropType arr_type;
-  IntPropType int_type;
-  int_type.AddMinMaxConstraint(0, 100);
-  arr_type.SetItemType(int_type.Clone());
-  std::vector<int> data{0, 1, 1, 100};
-  auto prop_value = PropValueFromDBusVariant(&arr_type, data, nullptr);
-  ASSERT_NE(nullptr, prop_value.get());
-  auto arr = prop_value->GetValueAsAny().Get<ValueVector>();
-  ASSERT_EQ(4u, arr.size());
-  EXPECT_EQ(0, arr[0]->GetInt()->GetValue());
-  EXPECT_EQ(1, arr[1]->GetInt()->GetValue());
-  EXPECT_EQ(1, arr[2]->GetInt()->GetValue());
-  EXPECT_EQ(100, arr[3]->GetInt()->GetValue());
-
-  chromeos::ErrorPtr error;
-  data.push_back(-1);  // This value is out of bounds for |int_type|.
-  prop_value = PropValueFromDBusVariant(&arr_type, data, &error);
-  EXPECT_EQ(nullptr, prop_value.get());
-  ASSERT_NE(nullptr, error.get());
-  EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
-}
-
 }  // namespace weave