summaryrefslogtreecommitdiff
path: root/src/components/smart_objects/test/ArraySchemaItem_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/smart_objects/test/ArraySchemaItem_test.cc')
-rw-r--r--src/components/smart_objects/test/ArraySchemaItem_test.cc195
1 files changed, 194 insertions, 1 deletions
diff --git a/src/components/smart_objects/test/ArraySchemaItem_test.cc b/src/components/smart_objects/test/ArraySchemaItem_test.cc
index a22a27399d..b5ba73ea91 100644
--- a/src/components/smart_objects/test/ArraySchemaItem_test.cc
+++ b/src/components/smart_objects/test/ArraySchemaItem_test.cc
@@ -33,8 +33,9 @@
#include <string>
#include "gmock/gmock.h"
-
#include "smart_objects/array_schema_item.h"
+#include "smart_objects/enum_schema_item.h"
+#include "smart_objects/object_schema_item.h"
#include "smart_objects/smart_object.h"
#include "smart_objects/string_schema_item.h"
@@ -42,6 +43,15 @@ namespace test {
namespace components {
namespace smart_object_test {
+namespace ExampleEnum {
+enum eType { INVALID_ENUM = -1, Value0 = 0, Value1, Value2 };
+} // namespace ExampleEnum
+
+namespace Keys {
+const char OPTIONAL_PARAM[] = "optionalParam";
+const char MANDATORY_PARAM[] = "mandatoryParam";
+} // namespace Keys
+
/**
* Test ArraySchemaItem no schema item, no min and max size
**/
@@ -345,6 +355,189 @@ TEST(test_map_validate, test_ArraySchemaItemTest) {
EXPECT_EQ(std::string("Out of array"), obj["array"][4].asString());
}
+TEST(test_array_with_unknown_enum, test_ArraySchemaItemTest) {
+ using namespace ns_smart_device_link::ns_smart_objects;
+ SmartObject obj;
+ std::set<ExampleEnum::eType> enum_values;
+ enum_values.insert(ExampleEnum::Value0);
+ enum_values.insert(ExampleEnum::Value1);
+ enum_values.insert(ExampleEnum::Value2);
+
+ ISchemaItemPtr item = CArraySchemaItem::create(
+ TEnumSchemaItem<ExampleEnum::eType>::create(enum_values),
+ TSchemaItemParameter<size_t>(1));
+
+ obj[0] = "Value0";
+ obj[1] = "Value10";
+ obj[2] = "Value1";
+
+ item->applySchema(obj, true);
+
+ rpc::ValidationReport report("RPC");
+ EXPECT_FALSE(
+ item->filterInvalidEnums(obj, utils::SemanticVersion(), &report));
+ EXPECT_NE(std::string(""), rpc::PrettyFormat(report));
+
+ EXPECT_EQ((size_t)2, obj.length());
+ EXPECT_EQ(0, obj[0].asInt());
+ EXPECT_EQ(1, obj[1].asInt());
+
+ report = rpc::ValidationReport("RPC");
+ EXPECT_EQ(errors::OK, item->validate(obj, &report));
+ EXPECT_EQ(std::string(""), rpc::PrettyFormat(report));
+}
+
+TEST(test_array_with_unknown_enums, test_ArraySchemaItemTest) {
+ using namespace ns_smart_device_link::ns_smart_objects;
+ SmartObject obj;
+ std::set<ExampleEnum::eType> enum_values;
+ enum_values.insert(ExampleEnum::Value0);
+ enum_values.insert(ExampleEnum::Value1);
+ enum_values.insert(ExampleEnum::Value2);
+
+ ISchemaItemPtr item = CArraySchemaItem::create(
+ TEnumSchemaItem<ExampleEnum::eType>::create(enum_values),
+ TSchemaItemParameter<size_t>(1));
+
+ obj[0] = "Value10";
+ obj[1] = "Value11";
+ obj[2] = "Value12";
+
+ item->applySchema(obj, true);
+
+ rpc::ValidationReport report("RPC");
+ EXPECT_TRUE(item->filterInvalidEnums(obj, utils::SemanticVersion(), &report));
+ EXPECT_NE(std::string(""), rpc::PrettyFormat(report));
+
+ EXPECT_EQ((size_t)0, obj.length());
+
+ report = rpc::ValidationReport("RPC");
+ EXPECT_EQ(errors::OUT_OF_RANGE, item->validate(obj, &report));
+ EXPECT_NE(std::string(""), rpc::PrettyFormat(report));
+}
+
+TEST(test_array_of_objects_with_unknown_enum, test_ArraySchemaItemTest) {
+ using namespace ns_smart_device_link::ns_smart_objects;
+ SmartObject obj;
+ std::set<ExampleEnum::eType> enum_values;
+ enum_values.insert(ExampleEnum::Value0);
+ enum_values.insert(ExampleEnum::Value1);
+ enum_values.insert(ExampleEnum::Value2);
+
+ Members structMembersMap;
+ structMembersMap[Keys::OPTIONAL_PARAM] =
+ SMember(TEnumSchemaItem<ExampleEnum::eType>::create(enum_values), false);
+ structMembersMap[Keys::MANDATORY_PARAM] =
+ SMember(TEnumSchemaItem<ExampleEnum::eType>::create(enum_values), true);
+
+ ISchemaItemPtr item =
+ CArraySchemaItem::create(CObjectSchemaItem::create(structMembersMap),
+ TSchemaItemParameter<size_t>(1));
+
+ SmartObject struct1;
+ struct1[Keys::MANDATORY_PARAM] = "Value0";
+ SmartObject struct2;
+ struct2[Keys::MANDATORY_PARAM] = "Value11";
+ SmartObject struct3;
+ struct3[Keys::MANDATORY_PARAM] = "Value2";
+ obj[0] = struct1;
+ obj[1] = struct2;
+ obj[2] = struct3;
+
+ item->applySchema(obj, true);
+
+ rpc::ValidationReport report("RPC");
+ EXPECT_FALSE(
+ item->filterInvalidEnums(obj, utils::SemanticVersion(), &report));
+ EXPECT_NE(std::string(""), rpc::PrettyFormat(report));
+
+ EXPECT_EQ((size_t)2, obj.length());
+ EXPECT_EQ(0, obj[0][Keys::MANDATORY_PARAM].asInt());
+ EXPECT_EQ(2, obj[1][Keys::MANDATORY_PARAM].asInt());
+
+ report = rpc::ValidationReport("RPC");
+ EXPECT_EQ(errors::OK, item->validate(obj, &report));
+ EXPECT_EQ(std::string(""), rpc::PrettyFormat(report));
+}
+
+TEST(test_array_of_objects_with_unknown_optional_enums,
+ test_ArraySchemaItemTest) {
+ using namespace ns_smart_device_link::ns_smart_objects;
+ SmartObject obj;
+ std::set<ExampleEnum::eType> enum_values;
+ enum_values.insert(ExampleEnum::Value0);
+ enum_values.insert(ExampleEnum::Value1);
+ enum_values.insert(ExampleEnum::Value2);
+
+ Members structMembersMap;
+ structMembersMap[Keys::OPTIONAL_PARAM] =
+ SMember(TEnumSchemaItem<ExampleEnum::eType>::create(enum_values), false);
+ structMembersMap[Keys::MANDATORY_PARAM] =
+ SMember(TEnumSchemaItem<ExampleEnum::eType>::create(enum_values), true);
+
+ ISchemaItemPtr item =
+ CArraySchemaItem::create(CObjectSchemaItem::create(structMembersMap),
+ TSchemaItemParameter<size_t>(1));
+
+ SmartObject struct1;
+ struct1[Keys::OPTIONAL_PARAM] = "Value10";
+ struct1[Keys::MANDATORY_PARAM] = "Value0";
+ SmartObject struct2;
+ struct2[Keys::OPTIONAL_PARAM] = "Value0";
+ struct2[Keys::MANDATORY_PARAM] = "Value1";
+ SmartObject struct3;
+ struct3[Keys::OPTIONAL_PARAM] = "Value12";
+ struct3[Keys::MANDATORY_PARAM] = "Value2";
+ obj[0] = struct1;
+ obj[1] = struct2;
+ obj[2] = struct3;
+
+ item->applySchema(obj, true);
+
+ rpc::ValidationReport report("RPC");
+ EXPECT_FALSE(
+ item->filterInvalidEnums(obj, utils::SemanticVersion(), &report));
+ EXPECT_NE(std::string(""), rpc::PrettyFormat(report));
+
+ // Unknown sub-parameter values should be filtered, but not array elements
+ EXPECT_EQ((size_t)3, obj.length());
+ EXPECT_EQ(0, obj[0][Keys::MANDATORY_PARAM].asInt());
+ EXPECT_FALSE(obj[0].keyExists(Keys::OPTIONAL_PARAM));
+ EXPECT_EQ(1, obj[1][Keys::MANDATORY_PARAM].asInt());
+ EXPECT_EQ(0, obj[1][Keys::OPTIONAL_PARAM].asInt());
+ EXPECT_EQ(2, obj[2][Keys::MANDATORY_PARAM].asInt());
+ EXPECT_FALSE(obj[2].keyExists(Keys::OPTIONAL_PARAM));
+
+ report = rpc::ValidationReport("RPC");
+ EXPECT_EQ(errors::OK, item->validate(obj, &report));
+ EXPECT_EQ(std::string(""), rpc::PrettyFormat(report));
+}
+
} // namespace smart_object_test
} // namespace components
} // namespace test
+
+namespace ns_smart_device_link {
+namespace ns_smart_objects {
+
+namespace ExampleEnum = test::components::smart_object_test::ExampleEnum;
+typedef EnumConversionHelper<ExampleEnum::eType> EnumConverter;
+
+template <>
+const EnumConverter::EnumToCStringMap EnumConverter::enum_to_cstring_map_ =
+ EnumConverter::InitEnumToCStringMap();
+
+template <>
+const EnumConverter::CStringToEnumMap EnumConverter::cstring_to_enum_map_ =
+ EnumConverter::InitCStringToEnumMap();
+
+template <>
+const char* const EnumConverter::cstring_values_[] = {
+ "Value0", "Value1", "Value2"};
+
+template <>
+const ExampleEnum::eType EnumConverter::enum_values_[] = {
+ ExampleEnum::Value0, ExampleEnum::Value1, ExampleEnum::Value2};
+
+} // namespace ns_smart_objects
+} // namespace ns_smart_device_link